From f55ed1d2a1bdf4ad80930e879631d6d95d4b6c3c Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 28 八月 2025 18:57:38 +0800 Subject: [PATCH] RCS 库位同步接口调用 RCS任务下发接口功能调用 RCS 取消任务接口功能开发 RCS异常功回调功能开发 --- rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 180 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 142 insertions(+), 38 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 1789ec9..11a9ab3 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,25 @@ 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.params.TaskInParam; +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.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 +30,26 @@ 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.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 +74,10 @@ private WaitPakinItemService waitPakinItemService; @Autowired private BasStationService basStationService; + @Autowired + private RestTemplate restTemplate; + @Autowired + private RemotesInfoProperties.RcsApi rcsApi; @Override @@ -361,18 +388,94 @@ //鏍规嵁绔嬪簱绫诲瀷鑾峰彇鑾峰彇搴撲綅 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 R 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(); + } + dtos.forEach(dto -> { + Loc loc = new Loc(); + loc.setCode(dto.getLocNo()) + .setBarcode(dto.getBarcode()) + .setRow(dto.getRow()) + .setLev(dto.getLev()) + .setId(null) + .setAreaId(41L) + .setWarehouseId(27L) + .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 R.ok(); + } + + 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()).getJSONObject("data"); + return JSONArray.parseArray(jsonObject.getJSONArray("records").toJSONString(), SyncLocsDto.class); + } else { + throw new CoolException("浠诲姟涓嬪彂澶辫触锛侊紒"); + } + } catch (JsonProcessingException e) { + throw new CoolException(e.getMessage()); + } + } + } + + private InTaskMsgDto getLocNoCrn(String orgLoc, DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { if (Cools.isEmpty(matnr)) { //鐗╂枡鍙� matnr = ""; } @@ -388,23 +491,20 @@ InTaskMsgDto inTaskMsgDto = new InTaskMsgDto(); - int sRow = deviceBind.getStartRow(); - int eRow = deviceBind.getEndRow(); int deviceQty = deviceBind.getDeviceQty(); // ===============>>>> 寮�濮嬫墽琛� curRow = deviceBind.getCurrentRow(); - //姝ょ▼搴忕敤浜庝紭鍖栧爢鍨涙満寮傚父鏃剁殑杩愯鏃堕棿 - for (int i = times; i <= deviceQty * 2; i++) { - int[] locNecessaryParameters = LocUtils.LocNecessaryParameters(deviceBind, curRow, deviceQty); - curRow = locNecessaryParameters[1]; - channel = locNecessaryParameters[2]; - rowCount = locNecessaryParameters[0]; - nearRow = locNecessaryParameters[3]; - break; - } + //鑾峰彇鎺� + int[] locNecessaryParameters = LocUtils.LocNecessaryParameters(deviceBind, curRow, deviceQty); + curRow = locNecessaryParameters[1]; + channel = locNecessaryParameters[2]; + rowCount = locNecessaryParameters[0]; + nearRow = locNecessaryParameters[3]; + + if (nearRow == 0) { throw new CoolException("鏃犲彲鐢ㄥ爢鍨涙満"); } @@ -500,12 +600,13 @@ .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) .eq(Loc::getAreaId, area) ); - if (null != orgMoveLoc){ - if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { - break; - } - } + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc) { + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast2; break; } @@ -518,7 +619,7 @@ ); if (!Cools.isEmpty(locMast2)) { - if (null != orgMoveLoc){ + if (null != orgMoveLoc) { if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { break; } @@ -531,12 +632,13 @@ .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) .eq(Loc::getAreaId, area) ); - if (null != orgMoveLoc){ - if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { - break; - } - } + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc) { + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast2; break; } @@ -555,12 +657,13 @@ .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) .eq(Loc::getAreaId, area) ); - if (null != orgMoveLoc){ - if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { - break; - } - } + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc) { + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast2; break; } else { @@ -569,12 +672,13 @@ .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type, LocStsType.LOC_STS_TYPE_D.type) .eq(Loc::getAreaId, area) ); - if (null != orgMoveLoc){ - if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { - break; - } - } + if (!Cools.isEmpty(locMast2)) { + if (null != orgMoveLoc) { + if (!locMast2.getChannel().equals(orgMoveLoc.getChannel())) { + break; + } + } loc = locMast1; break; } @@ -603,14 +707,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("娌℃湁绌哄簱浣�"); } -- Gitblit v1.9.1