From ceab656e93edafbdaa0d908a2f723336af811b5a Mon Sep 17 00:00:00 2001 From: skyouc <958836976@qq.com> Date: 星期三, 03 九月 2025 12:47:23 +0800 Subject: [PATCH] 站点任务功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 212 insertions(+), 14 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java index e6a36bf..6d24142 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java @@ -1,12 +1,26 @@ package com.vincent.rsf.server.api.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.cfg.CoercionAction; +import com.fasterxml.jackson.databind.cfg.CoercionInputShape; import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.api.config.RemotesInfoProperties; +import com.vincent.rsf.server.api.entity.CommonResponse; +import com.vincent.rsf.server.api.entity.constant.RcsConstant; import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; import com.vincent.rsf.server.api.entity.dto.LocTypeDto; import com.vincent.rsf.server.api.controller.erp.params.TaskInParam; +import com.vincent.rsf.server.api.entity.dto.SyncLocsDto; +import com.vincent.rsf.server.api.entity.params.CommonRequest; +import com.vincent.rsf.server.api.entity.params.ExMsgParams; +import com.vincent.rsf.server.api.entity.params.WcsTaskParams; import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.api.service.WcsService; import com.vincent.rsf.server.api.utils.LocUtils; @@ -17,16 +31,27 @@ import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.manager.enums.LocStsType; import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Objects; +import java.util.Random; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +@Slf4j @Service public class WcsServiceImpl implements WcsService { @Autowired @@ -51,6 +76,10 @@ private WaitPakinItemService waitPakinItemService; @Autowired private BasStationService basStationService; + @Autowired + private RestTemplate restTemplate; + @Autowired + private RemotesInfoProperties.RcsApi rcsApi; @Override @@ -361,18 +390,185 @@ //鏍规嵁绔嬪簱绫诲瀷鑾峰彇鑾峰彇搴撲綅 if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_CRN.val)) { //鍫嗗灈鏈� - dto = getLocNoCrn(param.getOrgLoc(),deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); + dto = getLocNoCrn(param.getOrgLoc(), deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); } else if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_FOUR_DIRECTIONS.val)) { //鍥涘悜搴� - } else { + } else { //CTU 搴撲互鍙婂叾瀹� dto = getLocNoCtu(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType()); } return dto; } - private InTaskMsgDto getLocNoCrn(String orgLoc,DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { + /** + * @author Ryan + * @date 2025/8/28 + * @description: Wcs搴撲綅鍚屾 + * @version 1.0 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void syncLocsToWms() { + /**RCS鍩虹閰嶇疆閾炬帴*/ + CommonRequest params = new CommonRequest(); + params.setPageSize(100); + ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1); + scheduled.scheduleWithFixedDelay(new Runnable() { + int current = 1; + + @Override + public void run() { + params.setCurrent(current); + List<SyncLocsDto> dtos = syncLocs(params); + if (dtos.isEmpty()) { + scheduled.shutdown(); + } + for (SyncLocsDto dto : dtos) { + Loc loc = new Loc(); + String string = new Random().nextInt(10000000) + ""; + Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, string)); + if (!Objects.isNull(one)) { + string = new Random().nextInt(10000000) + ""; + } + loc.setCode(dto.getLocNo()) + .setBarcode(dto.getBarcode()) + .setRow(dto.getRow()) + .setLev(dto.getLev()) + .setId(null) + .setAreaId(41L) + .setWarehouseId(27L) + .setBarcode(string) + .setCol(dto.getBay()) + .setType(dto.getLocType()) + .setStatus(dto.getStatusBool()) + .setUseStatus(LocStsType.getLocSts(dto.getLocSts())); + if (!locService.save(loc)) { + scheduled.shutdown(); + throw new CoolException("WCS搴撲綅鍚屾澶辫触锛侊紒"); + } + } + current++; + } + }, 1, 1, TimeUnit.SECONDS); + + } + + /** + * 寮傚父淇℃伅涓婃姤 + * + * @return + */ + @Override + public R receiveExMsg(ExMsgParams params) { + if (Objects.isNull(params)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + + Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSeqNum())); + if (Objects.isNull(task)) { + throw new CoolException("浠诲姟涓嶅瓨鍦ㄥ彲宸茬粨鏉燂紒锛�"); + } + + if (params.getEventType().equals("END")) { + if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { + if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) + .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id))) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + + if (!basStationService.update(new LambdaUpdateWrapper<BasStation>() + .eq(BasStation::getStationName, task.getOrgSite()) + .set(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_O.type))) { + throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) + || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)) { + if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()) + .set(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id))) { + throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + } + } + + log.info(JSONObject.toJSONString(params)); + return R.ok(JSONObject.toJSONString(params)); + } + + /** + * 涓嬪彂浠诲姟鑷充腑杞珹PI + * + * @param params + * @return + */ + @Override + public R pubWcsTask(WcsTaskParams params) { + String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask; + log.info("浠诲姟涓嬪彂锛岃姹傚湴鍧�锛� {}锛� 璇锋眰鍙傛暟锛� {}", rcsUrl, JSONObject.toJSONString(params)); + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/json"); + headers.add("api-version", "v2.0"); + HttpEntity httpEntity = new HttpEntity(params, headers); + ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class); + log.info("浠诲姟涓嬪彂鍚庯紝鍝嶅簲缁撴灉锛� {}", exchange); + if (Objects.isNull(exchange.getBody())) { + throw new CoolException("浠诲姟涓嬪彂澶辫触锛侊紒"); + } else { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.coercionConfigDefaults() + .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); + try { + CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); + if (result.getCode() == 200) { + return R.ok(); + } else { + throw new CoolException("浠诲姟涓嬪彂澶辫触锛侊紒"); + } + } catch (JsonProcessingException e) { + throw new CoolException(e.getMessage()); + } + } + } + + + private List<SyncLocsDto> syncLocs(CommonRequest params) { + String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.syncLocs; + log.info("搴撲綅鍚屾锛岃姹傚湴鍧�锛� {}锛� 璇锋眰鍙傛暟锛� {}", rcsUrl, JSONObject.toJSONString(params)); + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/json"); + headers.add("api-version", "v2.0"); + HttpEntity httpEntity = new HttpEntity(params, headers); + ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class); + log.info("搴撲綅鍚屾锛屽搷搴旂粨鏋滐細 {}", exchange); + if (Objects.isNull(exchange.getBody())) { + throw new CoolException("搴撲綅鍚屾涓嬪彂澶辫触锛侊紒"); + } else { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.coercionConfigDefaults() + .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); + try { + CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class); + if (result.getCode() == 200) { + JSONObject jsonObject = JSONObject.parseObject(exchange.getBody()); + return JSONArray.parseArray(jsonObject.getJSONArray("data").toJSONString(), SyncLocsDto.class); + } else { + throw new CoolException("搴撲綅鍚屾澶辫触锛侊紒"); + } + } catch (JsonProcessingException e) { + throw new CoolException(e.getMessage()); + } + } + } + + private InTaskMsgDto getLocNoCrn(String orgLoc, DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { if (Cools.isEmpty(matnr)) { //鐗╂枡鍙� matnr = ""; } @@ -461,7 +657,7 @@ if (Cools.isEmpty(deviceSite)) { channel = 0; } else { - inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); + inTaskMsgDto.setStaNo(deviceSite.getDeviceSite()); } //鏇存柊褰撳墠鎺� @@ -499,7 +695,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -516,7 +712,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -531,7 +727,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -556,7 +752,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -571,7 +767,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -604,14 +800,14 @@ // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊 if (times < rowCount * 2) { times = times + 1; - return getLocNoCrn(orgLoc,deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); + return getLocNoCrn(orgLoc, deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); } // 2.搴撲綅褰撳墠鎵�灞炲昂瀵告棤绌哄簱浣嶆椂锛岃皟鏁村昂瀵稿弬鏁帮紝鍚戜笂鍏煎妫�绱㈠簱浣� if (locTypeDto.getLocType1() < 3) { int i = locTypeDto.getLocType1() + 1; locTypeDto.setLocType1(i); - return getLocNoCrn(orgLoc,deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); + return getLocNoCrn(orgLoc, deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); } throw new CoolException("娌℃湁绌哄簱浣�"); } @@ -625,7 +821,7 @@ return inTaskMsgDto; } - private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { + private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { if (Cools.isEmpty(matnr)) { //鐗╂枡鍙� matnr = ""; } @@ -639,6 +835,8 @@ .eq(Loc::getAreaId, area) .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) .eq(Loc::getType, locTypeDto.getLocType1()) + .ge(Loc::getRow, deviceBind.getStartRow()) + .le(Loc::getRow, deviceBind.getEndRow()) .orderByAsc(Loc::getLev) .orderByAsc(Loc::getCol) .orderByAsc(Loc::getRow) @@ -654,13 +852,13 @@ DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() .eq(DeviceSite::getType, ioType) .eq(DeviceSite::getSite, sourceStaNo) - .eq(DeviceSite::getDeviceCode, loc.getDeviceNo()) + .eq(!Objects.isNull(loc.getDeviceNo()), DeviceSite::getDeviceCode, loc.getDeviceNo()) ); if (Cools.isEmpty(deviceSite)) { deviceNo = 0; loc = null; } else { - inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); + inTaskMsgDto.setStaNo(deviceSite.getDeviceSite()); } // 閫掑綊鏌ヨ if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { -- Gitblit v1.9.1