From f4d88f2a2317c2f08391173856b81ec3083ae29a Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期三, 29 四月 2026 15:52:08 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java | 466 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 442 insertions(+), 24 deletions(-)
diff --git a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
index 2c70265..eb3a3a7 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -8,6 +8,9 @@
import com.core.exception.CoolException;
import com.zy.api.controller.params.ReceviceTaskParams;
import com.zy.api.controller.params.WorkTaskParams;
+import com.zy.api.entity.CrnProtocol;
+import com.zy.api.entity.DeviceStatusVo;
+import com.zy.api.entity.StationProtocol;
import com.zy.api.service.WcsApiService;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
@@ -23,15 +26,17 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Service
public class WcsApiServiceImpl implements WcsApiService {
+
+ private static final Long WCS_SYNC_USER = 9999L;
+ private static final String YES = "Y";
+ private static final String NO = "N";
@Autowired
private BasDeviceService basDeviceService;
@@ -62,6 +67,18 @@
private String createLocMoveTask;
@Autowired
private CommonService commonService;
+
+ @Value("${wcs.address.getDeviceStatus:/openapi/getDeviceStatus}")
+ private String getDeviceStatus;
+ @Value("${wcs.status-sync.method:GET}")
+ private String deviceStatusMethod;
+ @Value("${wcs.switch}")
+ private String switchValue;
+
+ @Autowired
+ private BasDevpService basDevpService;
+ @Autowired
+ private BasCrnpService basCrnpService;
/**
* 閫氱煡WCS閿佸畾搴撲綅锛屽強绂佹褰撳墠搴撲綅鐨勪竴鍒囨搷浣�
@@ -123,6 +140,25 @@
// if (!wrkMastService.updateById(mast)) {
// throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�");
// }
+
+ return workService.backLocOperation(mast.getWrkNo() + "", mast.getAppeUser());
+
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R backLocsV2(String params) {
+ WrkMast mast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", params));
+ if (Objects.isNull(mast)) {
+ throw new CoolException("浠诲姟涓嶅瓨鍦紒锛�");
+ }
+ if(Cools.isEmpty(mast.getIsSuplus())){
+ throw new CoolException("鏈寚瀹氬洖搴撶被鍨嬶紒锛�");
+ }
+ LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",mast.getLocNo()));
+ if((mast.getCrnNo() != locMast.getCrnNo()) && mast.getIsSuplus()!=0){ //鑻ユ簮搴撲綅涓嶅湪鏈贩閬�/绌烘澘鐩存帴鍥炴湰宸烽亾
+ return workService.backLocOperationV2(mast.getWrkNo() + "", mast.getAppeUser());
+ }
return workService.backLocOperation(mast.getWrkNo() + "", mast.getAppeUser());
@@ -207,23 +243,25 @@
wrkMastService.updateById(wrkMast);
//鍑哄簱涓烘満鍙板伐浣嶆椂锛屽喕缁撶浉瀵规湁鐨勫簱浣�,鍙婄浉閭诲簱浣�
String s = Utils.convertLocFormat(params.getLocNo());
- LocAroundBind bind = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>()
- .eq("b_loc_no", s));
- if (!Objects.isNull(bind)) {
- bind.setFreeze(1);
- locAroundBindService.updateById(bind);
- //鍐荤粨鐩搁偦搴撲綅
- Integer[] aroundIds = freezeLocAround(bind.getOrderNo());
- if (aroundIds != null) {
- for (Integer id : aroundIds) {
- if (id != null && id > 0) {
- LocAroundBind aroundBind = locAroundBindService.selectOne(
- new EntityWrapper<LocAroundBind>()
- .eq("dev_id", bind.getDevId())
- .eq("order_no", id));
- if (aroundBind != null) {
- aroundBind.setFreeze(1);
- locAroundBindService.updateById(aroundBind);
+ if(Cools.isEmpty(wrkMast.getLocNo())){
+ LocAroundBind bind = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>()
+ .eq("b_loc_no", s));
+ if (!Objects.isNull(bind)) {
+ bind.setFreeze(1);
+ locAroundBindService.updateById(bind);
+ //鍐荤粨鐩搁偦搴撲綅
+ Integer[] aroundIds = freezeLocAround(bind.getOrderNo());
+ if (aroundIds != null) {
+ for (Integer id : aroundIds) {
+ if (id != null && id > 0) {
+ LocAroundBind aroundBind = locAroundBindService.selectOne(
+ new EntityWrapper<LocAroundBind>()
+ .eq("dev_id", bind.getDevId())
+ .eq("order_no", id));
+ if (aroundBind != null) {
+ aroundBind.setFreeze(1);
+ locAroundBindService.updateById(aroundBind);
+ }
}
}
}
@@ -311,7 +349,7 @@
//浠诲姟
if (params.getMsgType().equals("task_complete")) {
//绉伴噸
- if ((mast.getIoType()==1||mast.getIoType()==10)&&mast.getWrkSts() == 2 && Cools.isEmpty(mast.getStaNo())) {
+ if ((mast.getIoType()==1||mast.getIoType()==10) && mast.getWrkSts() == 2 && Cools.isEmpty(mast.getStaNo())) {
Double weight = 0.0;
if (!Cools.isEmpty(params.getData())){
JSONObject jsonObject = JSONObject.parseObject(params.getData());
@@ -346,6 +384,7 @@
}
if (!Cools.isEmpty(weight)) {
Double val = Math.round((weight - matnr.getSafeQty()) * 10000) / 10000.0;
+ //TODO 閲嶉噺鍒ゆ柇璁$畻
if (val.compareTo(0.0) > 0) {
WrkDetl wrkDetl = new WrkDetl();
if (Objects.isNull(locDetl)) {
@@ -398,7 +437,7 @@
} else {
throw new CoolException("浠诲姟鍙锋埅鍙栧け璐ワ紝璇锋鏌ヤ富浠诲姟妗d换妗rkCode瀛楁");
}
- }else{
+ }else{ //TODO 璁$畻寮傚父鍚庤繖閲屾槸浠�涔堟祦绋�
String wrkNo = mast.getWrkCode();
WrkMast orgWrk = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
if (Objects.isNull(orgWrk)) {
@@ -422,7 +461,7 @@
}
Double realQty = Math.round((wrkDetl.getStockQty() - wrkDetl.getAnfme()) * 10000) / 10000.0;
if (!Cools.isEmpty(weight)) {
- Double val = Math.round((weight - 2.5) * 10000) / 10000.0;
+ Double val = Math.round((weight - matnr.getSafeQty()) * 10000) / 10000.0;
//绉伴噸鍚庯紝璁$畻鍑虹湡瀹為暱搴�
realQty = val * matnr.getVolume();
if (realQty<matnr.getSafeQty()){
@@ -513,6 +552,249 @@
}
return R.ok();
}
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R receviceTaskFromWcsV2(ReceviceTaskParams params) {
+ log.info("wcs浠诲姟鍙嶉="+JSON.toJSONString(params));
+ if (Objects.isNull(params.getSuperTaskNo())) {
+ throw new CoolException("WMS浠诲姟鍙蜂笉鑳戒负绌猴紒锛�");
+ }
+ if (Objects.isNull(params.getNotifyType())) {
+ throw new CoolException("鍔ㄤ綔绫诲瀷涓嶈兘涓虹┖锛侊紒");
+ }
+ WrkMast mast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getSuperTaskNo()));
+ if (Objects.isNull(mast)) {
+ throw new CoolException("浠诲姟妗d笉瀛樺湪锛侊紒");
+ }
+ log.info("浠诲姟鍩虹淇℃伅: wrkNo={}, ioType={}, wrkSts={}, staNo={}, locNo={}, sourceLocNo={}, barcode={}, wrkCode={}, oveMk={}, isSuplus={}, exitMk={}",
+ mast.getWrkNo(), mast.getIoType(), mast.getWrkSts(), mast.getStaNo(), mast.getLocNo(), mast.getSourceLocNo(),
+ mast.getBarcode(), mast.getWrkCode(), mast.getOveMk(), mast.getIsSuplus(), mast.getExitMk());
+
+
+ if ("task".equals(params.getNotifyType())) {
+ //浠诲姟
+ if (Objects.isNull(params.getMsgType())) {
+ throw new CoolException("娑堟伅绫诲瀷涓嶈兘涓虹┖锛侊紒");
+ }
+ if ("task_complete".equals(params.getMsgType())) {
+ //绉伴噸
+ if ((mast.getIoType()==1||mast.getIoType()==10||mast.getIoType()==2) && mast.getWrkSts() == 2 && Cools.isEmpty(mast.getStaNo())) {
+ Double weight = 0.0;
+ if (!Cools.isEmpty(params.getData())){
+ JSONObject jsonObject = JSONObject.parseObject(params.getData());
+ weight=jsonObject.getDouble("weight");
+ }
+ log.info("绉伴噸鏁版嵁瑙f瀽: wrkNo={}, ioType={}, rawData={}, weight={}", mast.getWrkNo(), mast.getIoType(), params.getData(), weight);
+ if (mast.getIoType() == 10) {//绌烘澘浠诲姟瀹屾垚
+ //绌烘澘鍏ュ簱浠诲姟妗�
+ LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>()
+ .eq("zpallet", mast.getBarcode())
+ .eq("loc_no", mast.getSourceLocNo()));
+ WrkDetl mainWrkDetl = null;
+ if (Objects.isNull(locDetl) && !Cools.isEmpty(mast.getWrkCode())) {
+ mainWrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>()
+ .eq("wrk_no", mast.getWrkCode())
+ .eq("zpallet", mast.getBarcode()));
+ if (Objects.isNull(mainWrkDetl)) {
+ mainWrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>()
+ .eq("wrk_no", mast.getWrkCode()));
+ }
+ if (!Objects.isNull(mainWrkDetl)) {
+ log.info("locDetl涓虹┖锛屽洖閫�鏌ヨ涓讳换鍔℃槑缁嗭紝wrkNo={}, mainWrkNo={}, barcode={}",
+ mast.getWrkNo(), mast.getWrkCode(), mast.getBarcode());
+ }
+ }
+ if (Objects.isNull(locDetl) && Objects.isNull(mainWrkDetl)) {
+ throw new CoolException("鏄庣粏鏁版嵁涓嶅瓨鍦紒锛�");
+ }
+ String matnrNo = Objects.isNull(locDetl) ? mainWrkDetl.getMatnr() : locDetl.getMatnr();
+ Mat matnr = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", matnrNo));
+ if (Objects.isNull(matnr)) {
+ throw new CoolException("鐗╂枡鍩虹淇℃伅涓嶅瓨鍦紒锛�");
+ }
+ log.info("绌烘澘浠诲姟绉伴噸璁$畻鍓嶇疆: wrkNo={}, matnr={}, safeQty={}, volume={}, weight={}",
+ mast.getWrkNo(), matnrNo, matnr.getSafeQty(), matnr.getVolume(), weight);
+ if (!Cools.isEmpty(weight)) {
+ //鍙栨秷閲嶉噺鍒ゆ柇鏀瑰彉鍥炲簱绫诲瀷
+ String wrkNo = mast.getWrkCode();
+ WrkMast orgWrk = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
+ if (Objects.isNull(orgWrk)) {
+ throw new CoolException("鏁版嵁閿欒锛屼富浠诲姟妗d笉瀛樺湪鎴栧凡鍒犻櫎锛侊紒");
+ }
+ mast.setOveMk("Y");
+ orgWrk.setOveMk("Y");
+ log.info("绌烘澘浠诲姟绉伴噸澶勭悊: childWrkNo={}, mainWrkNo={}, setOveMk=Y", mast.getWrkNo(), wrkNo);
+ if (!wrkMastService.updateById(orgWrk)) {
+ throw new CoolException("浠诲姟妗d慨鏀瑰け璐ワ紒锛�");
+ }
+ }
+ } else { //鍏ュ簱/鍥炲簱鏈夋枡浠诲姟瀹屾垚
+ if(mast.getIoType() !=2){
+ WrkDetl wrkDetl = selectWrkDetlByWrkNo(String.valueOf(mast.getWrkNo()), "鏁版嵁閿欒锛屼换鍔℃槑缁嗕笉瀛樺湪锛侊紒");
+ Mat matnr = selectMatByMatnr(wrkDetl.getMatnr());
+ applyWeightAndUpdateDetl("瀛愪换鍔�", String.valueOf(mast.getWrkNo()), wrkDetl, matnr, weight, "浠诲姟妗f槑缁嗕慨鏀瑰け璐ワ紒锛�");
+
+
+ mast.setOveMk("Y");
+ log.info("瀛愪换鍔℃洿鏂�: wrkNo={}, setOveMk=Y", mast.getWrkNo());
+ if (!wrkMastService.updateById(mast)) {
+ throw new CoolException("浠诲姟妗d慨鏀瑰け璐ワ紒锛�");
+ }
+ }
+
+ if (!Cools.isEmpty(mast.getWrkCode())) {
+ String wrkNo = mast.getWrkCode();
+ WrkMast orgWrk = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
+
+ if (Objects.isNull(orgWrk)) {
+ throw new CoolException("鏁版嵁閿欒锛屼富浠诲姟妗d笉瀛樺湪鎴栧凡鍒犻櫎锛侊紒");
+ }
+ orgWrk.setOveMk("Y");
+ log.info("涓讳换鍔℃洿鏂�: wrkNo={}, setOveMk=Y", wrkNo);
+ if (!wrkMastService.updateById(orgWrk)) {
+ throw new CoolException("浠诲姟妗d慨鏀瑰け璐ワ紒锛�");
+ }
+ WrkDetl detl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkNo));
+ if (Objects.isNull(detl)) {
+ throw new CoolException("瀛愪换鍔℃。鏄庣粏涓嶅瓨鍦紒锛�");
+ }
+ Mat matnr = selectMatByMatnr(detl.getMatnr());
+ Double realQty = applyWeightAndUpdateDetl("涓讳换鍔�", wrkNo, detl, matnr, weight, "浠诲姟妗f槑缁嗕慨鏀瑰け璐ワ紒锛�");
+ updateDetlRemainAfterWeight("涓讳换鍔℃槑缁嗗洖鍐�", wrkNo, detl, matnr, weight, realQty, "鍘熶换鍔℃。鏄庣粏淇敼澶辫触锛侊紒");
+ } else if(!Cools.isEmpty(mast.getPacked())){
+ String wrkNo = mast.getPacked();
+ WrkMast orgWrk = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkNo));
+ if (Objects.isNull(orgWrk)) {
+ throw new CoolException("鏁版嵁閿欒锛屽洖搴撲富浠诲姟妗d笉瀛樺湪鎴栧凡鍒犻櫎锛侊紒");
+ }
+ orgWrk.setOveMk("Y");
+ log.info("鍥炲簱涓讳换鍔℃洿鏂�: wrkNo={}, setOveMk=Y", wrkNo);
+ if (!wrkMastService.updateById(orgWrk)) {
+ throw new CoolException("浠诲姟妗d慨鏀瑰け璐ワ紒锛�");
+ }
+ WrkDetl detl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkNo));
+ if (Objects.isNull(detl)) {
+ throw new CoolException("涓讳换鍔℃。鏄庣粏涓嶅瓨鍦紒锛�");
+ }
+ Mat matnr = selectMatByMatnr(detl.getMatnr());
+ Double realQty = applyWeightAndUpdateDetl("鍥炲簱涓讳换鍔�", wrkNo, detl, matnr, weight, "浠诲姟妗f槑缁嗕慨鏀瑰け璐ワ紒锛�");
+ updateDetlRemainAfterWeight("鍥炲簱涓讳换鍔℃槑缁嗗洖鍐�", wrkNo, detl, matnr, weight, realQty, "鍘熶换鍔℃。鏄庣粏淇敼澶辫触锛侊紒");
+ }else{
+ throw new CoolException("浠诲姟鍙锋埅鍙栧け璐ワ紝璇锋鏌ヤ富浠诲姟妗d换妗rkCode瀛楁");
+ }
+ }
+ }
+
+ if (!Objects.isNull(mast.getWrkCode())) {
+ if (mast.getOveMk().equals("N") && !Cools.isEmpty(mast.getIsSuplus())) {
+ throw new CoolException("浠诲姟鏈笂鎶ラ噸閲忥紝鏃犳硶瀹岀粨浠诲姟锛侊紒");
+ }
+ }
+ if (mast.getIoType() == 1 || mast.getIoType() == 2 ||mast.getIoType() == 10) {
+ mast.setWrkSts(4L);
+ } else if ((mast.getIoType() == 101||mast.getIoType()==110) && mast.getWrkSts()<14) {
+ mast.setWrkSts(14L);
+ if(Cools.isEmpty(mast.getStaNo())){
+ mast.setOveMk("Y");
+ }
+ }
+ log.info("浠诲姟鐘舵�佸彉鏇�: wrkNo={}, ioType={}, msgType={}, setWrkSts={}, oveMk={}",
+ mast.getWrkNo(), mast.getIoType(), params.getMsgType(), mast.getWrkSts(), mast.getOveMk());
+ if (!wrkMastService.updateById(mast)) {
+ throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ } else if ("task_cancel".equals(params.getMsgType())) {
+ //todo 鍙栨秷浠诲姟
+ }else if ("task_arrive".equals(params.getMsgType())) {
+ //鍒拌揪鐩殑鍦�
+ //濡傛灉鍑哄簱浠诲姟鏄法鍖哄垯闇�瑕佺敓鎴愭柊鐨勫叆搴撲换鍔″叆搴�
+ if(!Cools.isEmpty(mast.getLocNo()) ){
+ mast.setOnlineYn("N");//绛夊緟鐢熸垚璺ㄥ尯鍏ュ簱浠诲姟
+ }
+ mast.setWrkSts(14L);
+ if(Cools.isEmpty(mast.getStaNo())){
+ mast.setOveMk("Y");
+ }
+ mast.setModiTime(new Date());
+ if (!wrkMastService.updateById(mast)) {
+ throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ }
+ } else if ("weight".equals(params.getNotifyType())) {
+
+ }
+ return R.ok();
+ }
+
+ private WrkDetl selectWrkDetlByWrkNo(String wrkNo, String errMsg) {
+ WrkDetl detl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkNo));
+ if (Objects.isNull(detl)) {
+ throw new CoolException(errMsg);
+ }
+ return detl;
+ }
+
+ private Mat selectMatByMatnr(String matnrNo) {
+ Mat matnr = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", matnrNo));
+ if (Objects.isNull(matnr)) {
+ throw new CoolException("鐗╂枡鍩虹淇℃伅涓嶅瓨鍦紒锛�");
+ }
+ return matnr;
+ }
+
+ private Double applyWeightAndUpdateDetl(String scene, String wrkNo, WrkDetl detl, Mat matnr, Double weight, String errMsg) {
+ Double realQty = round4(detl.getStockQty() - detl.getAnfme());
+ log.info("鏈夋枡浠诲姟绉伴噸璁$畻鍒濆��: scene={}, wrkNo={}, matnr={}, stockQty={}, anfme={}, realQty(init)={}, safeQty={}, volume={}, weight={}",
+ scene, wrkNo, detl.getMatnr(), detl.getStockQty(), detl.getAnfme(), realQty, matnr.getSafeQty(), matnr.getVolume(), weight);
+ if (!Cools.isEmpty(weight)) {
+ Double val = round4(weight - matnr.getSafeQty());
+ realQty = val * matnr.getVolume();
+ log.info("鏈夋枡浠诲姟绉伴噸璁$畻杩囩▼: scene={}, wrkNo={}, val=(weight-safeQty)={}, realQty=val*volume={}", scene, wrkNo, val, realQty);
+ if (realQty < matnr.getSafeQty()) {
+ detl.setAnfme(matnr.getSafeQty() * matnr.getVolume());
+ log.info("鏈夋枡浠诲姟绉伴噸淇: scene={}, wrkNo={}, realQty<safeQty, setAnfme={}", scene, wrkNo, detl.getAnfme());
+ } else {
+ detl.setAnfme(realQty);
+ log.info("鏈夋枡浠诲姟绉伴噸淇: scene={}, wrkNo={}, realQty>=safeQty, setAnfme={}", scene, wrkNo, detl.getAnfme());
+ }
+ detl.setWeight(weight);
+ if (!wrkDetlService.update(detl, new EntityWrapper<WrkDetl>()
+ .eq("wrk_no", wrkNo)
+ .eq("matnr", detl.getMatnr())
+ .eq("barcode", detl.getBarcode()))) {
+ throw new CoolException(errMsg);
+ }
+ }
+ return realQty;
+ }
+
+ private void updateDetlRemainAfterWeight(String scene, String wrkNo, WrkDetl detl, Mat matnr, Double weight, Double realQty, String errMsg) {
+ Double v = round4(detl.getStockQty() - realQty);
+ log.info("涓讳换鍔℃槑缁嗗洖鍐欒绠�: scene={}, wrkNo={}, v=(stockQty-realQty)={}, stockQty={}, realQty={}",
+ scene, wrkNo, v, detl.getStockQty(), realQty);
+ if (v <= 0) {
+ detl.setAnfme(matnr.getSafeQty());
+ log.info("涓讳换鍔℃槑缁嗗洖鍐欎慨姝�: scene={}, wrkNo={}, v<=0, setAnfme(safeQty)={}", scene, wrkNo, detl.getAnfme());
+ } else {
+ detl.setAnfme(v);
+ log.info("涓讳换鍔℃槑缁嗗洖鍐欎慨姝�: scene={}, wrkNo={}, v>0, setAnfme={}", scene, wrkNo, detl.getAnfme());
+ }
+ detl.setWeight(weight);
+ if (!wrkDetlService.update(detl, new EntityWrapper<WrkDetl>()
+ .eq("wrk_no", wrkNo)
+ .eq("matnr", detl.getMatnr())
+ .eq("barcode", detl.getBarcode()))) {
+ throw new CoolException(errMsg);
+ }
+ }
+
+ private Double round4(Double value) {
+ if (value == null) {
+ return null;
+ }
+ return Math.round(value * 10000) / 10000.0;
+ }
//杈撳叆搴撲綅鑷姩鍐荤粨绠楀嚭鐩搁偦搴撲綅搴忓彿
@Override
public Integer[] freezeLocAround(Integer locId) {
@@ -546,6 +828,142 @@
}
return locAround;
}
+
+ @Override
+ public R syncDeviceStatusFromWcs() {
+ if (!Boolean.parseBoolean(String.valueOf(switchValue))) {
+ return R.ok("WCS寮�鍏冲叧闂�");
+ }
+ String response = null;
+ try {
+ response = requestDeviceStatusFromWcs();
+ JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response);
+ Integer code = jsonObject.getInteger("code");
+ if (!Objects.equals(code, 200)) {
+ String msg = jsonObject.getString("msg");
+ return R.error(Cools.isEmpty(msg) ? "鑾峰彇WCS璁惧鐘舵�佸け璐�" : msg);
+ }
+ JSONObject data = jsonObject.getJSONObject("data");
+ DeviceStatusVo deviceStatusVo = data == null
+ ? new DeviceStatusVo()
+ : JSON.parseObject(data.toJSONString(), DeviceStatusVo.class);
+
+ int stationCount = syncStationStatus(deviceStatusVo.getStationList());
+ int crnCount = syncCrnStatus(deviceStatusVo.getCrnList());
+
+ Map<String, Object> result = new LinkedHashMap<>();
+ result.put("stationCount", stationCount);
+ result.put("crnCount", crnCount);
+ log.info("鍚屾WCS璁惧鐘舵�佹垚鍔�, stationCount={}, crnCount={}", stationCount, crnCount);
+ return R.ok("鍚屾鎴愬姛").add(result);
+ } catch (Exception e) {
+ log.error("鍚屾WCS璁惧鐘舵�佸紓甯�, response={}", response, e);
+ return R.error("鍚屾WCS璁惧鐘舵�佸け璐�: " + e.getMessage());
+ }
+ }
+
+ private String requestDeviceStatusFromWcs() throws IOException {
+ HttpHandler.Builder builder = new HttpHandler.Builder()
+ .setUri(wcs_address)
+ .setPath(getDeviceStatus)
+ .setTimeout(10, TimeUnit.SECONDS);
+ String method = Cools.isEmpty(deviceStatusMethod) ? "POST" : deviceStatusMethod.trim().toUpperCase(Locale.ROOT);
+ if ("POST".equals(method)) {
+ return builder.setJson("{}").build().doPost();
+ }
+ return builder.build().doGet();
+ }
+
+ private int syncStationStatus(List<StationProtocol> stationList) {
+ if (stationList == null || stationList.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ Date now = new Date();
+ for (StationProtocol stationProtocol : stationList) {
+ if (stationProtocol == null || stationProtocol.getStationId() == null) {
+ continue;
+ }
+ BasDevp basDevp = basDevpService.selectById(stationProtocol.getStationId());
+ boolean isNew = Objects.isNull(basDevp);
+ if (isNew) {
+ basDevp = new BasDevp();
+ basDevp.setDevNo(stationProtocol.getStationId());
+ basDevp.setAppeUser(WCS_SYNC_USER);
+ basDevp.setAppeTime(now);
+ }
+ basDevp.setInEnable(toFlag(stationProtocol.isInEnable()));
+ basDevp.setOutEnable(toFlag(stationProtocol.isOutEnable()));
+ basDevp.setAutoing(toFlag(stationProtocol.isAutoing()));
+ basDevp.setLoading(toFlag(stationProtocol.isLoading()));
+ basDevp.setCanining(toFlag(stationProtocol.isEnableIn()));
+ basDevp.setCanouting(toFlag(!stationProtocol.isRunBlock()));
+ basDevp.setWrkNo(defaultZero(stationProtocol.getTaskNo()));
+ basDevp.setBarcode(normalizeText(stationProtocol.getBarcode()));
+ basDevp.setGrossWt(stationProtocol.getWeight() == null ? 0D : stationProtocol.getWeight());
+ basDevp.setModiUser(WCS_SYNC_USER);
+ basDevp.setModiTime(now);
+ if (isNew) {
+ if (!basDevpService.insert(basDevp)) {
+ throw new CoolException("鏂板绔欑偣鐘舵�佸け璐�, stationId=" + stationProtocol.getStationId());
+ }
+ } else if (!basDevpService.updateById(basDevp)) {
+ throw new CoolException("鏇存柊绔欑偣鐘舵�佸け璐�, stationId=" + stationProtocol.getStationId());
+ }
+ count++;
+ }
+ return count;
+ }
+
+ private int syncCrnStatus(List<CrnProtocol> crnList) {
+ if (crnList == null || crnList.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ Date now = new Date();
+ for (CrnProtocol crnProtocol : crnList) {
+ if (crnProtocol == null || crnProtocol.getCrnNo() == null) {
+ continue;
+ }
+ BasCrnp basCrnp = basCrnpService.selectById(crnProtocol.getCrnNo());
+ boolean isNew = Objects.isNull(basCrnp);
+ if (isNew) {
+ basCrnp = new BasCrnp();
+ basCrnp.setCrnNo(crnProtocol.getCrnNo());
+ basCrnp.setInEnable(YES);
+ basCrnp.setOutEnable(YES);
+ basCrnp.setAppeUser(WCS_SYNC_USER);
+ basCrnp.setAppeTime(now);
+ }
+ // crn_sts 鏈湴琛ㄥ瓨鐨勬槸鈥滃爢鍨涙満妯″紡(鎵嬪姩/鑷姩/鐢佃剳)鈥濓紝鍥犳蹇呴』鍐� mode锛屼笉鑳藉啓 status銆�
+ basCrnp.setCrnSts(defaultZero(crnProtocol.getMode()));
+ basCrnp.setWrkNo(defaultZero(crnProtocol.getTaskNo()));
+ basCrnp.setCrnErr(crnProtocol.getAlarm() == null ? 0L : Long.valueOf(crnProtocol.getAlarm()));
+ basCrnp.setModiUser(WCS_SYNC_USER);
+ basCrnp.setModiTime(now);
+ if (isNew) {
+ if (!basCrnpService.insert(basCrnp)) {
+ throw new CoolException("鏂板鍫嗗灈鏈虹姸鎬佸け璐�, crnNo=" + crnProtocol.getCrnNo());
+ }
+ } else if (!basCrnpService.updateById(basCrnp)) {
+ throw new CoolException("鏇存柊鍫嗗灈鏈虹姸鎬佸け璐�, crnNo=" + crnProtocol.getCrnNo());
+ }
+ count++;
+ }
+ return count;
+ }
+
+ private Integer defaultZero(Integer value) {
+ return value == null ? 0 : value;
+ }
+
+ private String normalizeText(String value) {
+ return Cools.isEmpty(value) ? "" : value;
+ }
+
+ private String toFlag(boolean value) {
+ return value ? YES : NO;
+ }
}
--
Gitblit v1.9.1