From e49208f2514ccf950164a2d6d590d85f7cecb46a Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期五, 07 六月 2024 16:26:28 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java | 352 ++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 243 insertions(+), 109 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java index ad71444..db25c37 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java @@ -4,8 +4,12 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zy.asrs.common.domain.dto.StartupDto; +import com.zy.asrs.common.domain.param.SearchLocParam; +import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.SnowflakeIdWorker; +import com.zy.asrs.wcs.core.domain.dto.MatDto; import com.zy.asrs.wcs.core.domain.dto.RedisMapDto; import com.zy.asrs.wcs.core.domain.dto.StaDto; import com.zy.asrs.wcs.core.entity.*; @@ -22,6 +26,7 @@ import com.zy.asrs.wcs.rcs.cache.SlaveConnection; import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant; import com.zy.asrs.wcs.rcs.entity.Device; +import com.zy.asrs.wcs.rcs.model.command.LedCommand; import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; @@ -29,6 +34,7 @@ import com.zy.asrs.wcs.rcs.service.DeviceService; import com.zy.asrs.wcs.rcs.thread.BarcodeThread; import com.zy.asrs.wcs.rcs.thread.DevpThread; +import com.zy.asrs.wcs.rcs.thread.LedThread; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; @@ -36,7 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - +import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.util.*; /** @@ -72,6 +78,8 @@ private RedisUtil redisUtil; @Autowired private BasConveyorService basConveyorService; + @Autowired + private BasLedService basLedService; /** * 缁勬墭 @@ -88,7 +96,7 @@ // 閬嶅巻鍏ュ簱鍙� for (StaDto inSta : JSON.parseArray(basConveyor.getInSta(), StaDto.class)) { // 鑾峰彇鍏ュ簱绔欎俊鎭� - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId().intValue()); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; @@ -129,11 +137,11 @@ } // 閫�鍥� if (back) { -// // led 寮傚父鏄剧ず -// LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); -// if (ledThread != null) { -// MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg)); -// } + // led 寮傚父鏄剧ず + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); + if (ledThread != null) { + ledThread.error(errMsg); + } continue; } @@ -150,115 +158,93 @@ } String barcode = barcodeThread.getBarcode(); if (!Cools.isEmpty(barcode)) { -// News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode); + News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", inSta.getBarcode(), barcode); if ("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode) || "00000000".equals(barcode)) { -// staProtocol.setWorkNo((short) 32002); -// staProtocol.setStaNo(inSta.getBackSta().shortValue()); -// devpThread.setPakMk(staProtocol.getSiteId(), false); -// MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); + staProtocol.setWorkNo((short) 32002); + staProtocol.setStaNo(inSta.getBackSta().shortValue()); + devpThread.setPakMk(staProtocol.getSiteId(), false); + devpThread.writeWorkSta(staProtocol.getSiteId(), (short) 32002, inSta.getBackSta().shortValue()); -// // led 寮傚父鏄剧ず -// LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); -// if (ledThread != null) { -// String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯"; -// MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); -// } + // led 寮傚父鏄剧ず + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); + if (ledThread != null) { + String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯"; + ledThread.error(errorMsg); + } continue; } - } else { -// staProtocol.setWorkNo((short) 32002); -// staProtocol.setStaNo(inSta.getBackSta().shortValue()); -// devpThread.setPakMk(staProtocol.getSiteId(), false); -// MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); + } -// // led 寮傚父鏄剧ず -// LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); -// if (ledThread != null) { -// String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯"; -// MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); -// } + //鑾峰彇鍏ュ簱浠诲姟绫诲瀷 + TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>() + .eq(TaskCtg::getFlag, "IN") + .eq(TaskCtg::getStatus, 1)); + + // 鍒ゆ柇閲嶅宸ヤ綔妗� + Task task1 = taskService.getOne(new LambdaQueryWrapper<Task>() + .eq(Task::getOriginSite, inSta.getStaNo()) + .eq(Task::getTaskCtg, taskCtg.getId()) + .in(Task::getTaskSts, 1, 2, 3) + .eq(Task::getZpallet, barcode)); + if (task1 != null) { + News.error("宸ヤ綔妗e凡瀛樺湪,宸ヤ綔鍙�={}", task1.getTaskNo()); continue; } -// // 杩囨护鐩樼偣/鎷f枡/骞舵澘浠诲姟 -// WrkMast wrkMast1 = wrkMastMapper.selectPickStepByBarcode(barcode); -// if (null != wrkMast1) { -// continue; -// } -// -// // 鍒ゆ柇閲嶅宸ヤ綔妗� -// WrkMast wrkMast2 = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); -// if (wrkMast2 != null) { -// News.error("宸ヤ綔妗d腑宸插瓨鍦ㄨ绔欑姸鎬佷负锛� 2.璁惧涓婅蛋 锛夌殑鏁版嵁,宸ヤ綔鍙�={}", wrkMast2.getWrkNo()); -// continue; -// } -// -// try { -// LocTypeDto locTypeDto = new LocTypeDto(staProtocol); -// SearchLocParam param = new SearchLocParam(); -// param.setBarcode(barcode); -// param.setIoType(1); -// param.setSourceStaNo(inSta.getStaNo()); -// param.setLocType1(locTypeDto.getLocType1()); -// String response = new HttpHandler.Builder() -// .setUri(wmsUrl) -// .setPath("/rpc/pakin/loc/v2") -// .setJson(JSON.toJSONString(param)) -// .build() -// .doPost(); -// JSONObject jsonObject = JSON.parseObject(response); -// LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); -// Integer code = jsonObject.getInteger("code"); -// if (code.equals(200)) { -// StartupDto dto = jsonObject.getObject("data", StartupDto.class); -//// staProtocol.setWorkNo(dto.getWorkNo().shortValue()); -//// staProtocol.setStaNo(dto.getStaNo().shortValue()); -//// devpThread.setPakMk(staProtocol.getSiteId(), false); -//// -//// boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); -//// if (!result) { -//// throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触"); -//// } -// -// // 鍒ゆ柇閲嶅宸ヤ綔妗� -// WrkMast wrkMast = wrkMastMapper.selectPakInStep11(inSta.getStaNo()); -// if (wrkMast == null) { -// continue; -// } -// -// // 鏇存柊宸ヤ綔涓绘。 -// wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細2.璁惧涓婅蛋 -// wrkMast.setModiTime(new Date()); -// if (wrkMastMapper.updateById(wrkMast) == 0) { -// News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", wrkMast.getWrkNo()); -// } -// -// } else if (code == 500) { -// if (ledThread != null) { -// String errorMsg = jsonObject.getString("msg"); -// if (!Cools.isEmpty(errorMsg)) { -// MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); -// ledThread.setLedMk(false); -// } -// } -// News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response); -// } else if (code == 700) { -//// staProtocol.setWorkNo((short) 32002); -//// staProtocol.setRollback102(1);//102绔欏洖閫�淇″彿 -//// devpThread.setPakMk(staProtocol.getSiteId(), false); -//// MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(5, staProtocol)); -// -// // led 寮傚父鏄剧ず -// if (ledThread != null) { -// String errorMsg = barcode + "鎵樼洏璇嗗埆寮傚父锛岃鍏堣繘琛岀粍鎵橈紒"; -// MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg)); -// ledThread.setLedMk(false); -// } -// } -// } catch (Exception e) { -// e.printStackTrace(); -// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); -// } + try { + //鑾峰彇WMS鍦板潃 + Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "WMS_URL").eq(Dict::getStatus, 1)); + if (dict == null) { + News.error("WMS鍦板潃鏈厤缃�"); + continue; + } + String wmsUrl = dict.getValue(); + + SearchLocParam param = new SearchLocParam(); + param.setBarcode(barcode); + param.setIoType(1); + param.setSourceStaNo(inSta.getStaNo()); + param.setLocType1(staProtocol.getLocType1().shortValue()); + String response = new HttpHandler.Builder() + .setUri(wmsUrl) + .setPath("/rpc/pakin/loc/v2") + .setJson(JSON.toJSONString(param)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + StartupDto dto = jsonObject.getObject("data", StartupDto.class); + devpThread.writeWorkSta(staProtocol.getSiteId(), dto.getWorkNo().shortValue(), dto.getStaNo().shortValue()); + devpThread.setPakMk(staProtocol.getSiteId(), false); + + } else if (code == 500) { + if (ledThread != null) { + String errorMsg = jsonObject.getString("msg"); + if (!Cools.isEmpty(errorMsg)) { + ledThread.error(errorMsg); + ledThread.setLedMk(false); + } + } + News.error("璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v2", JSON.toJSONString(param), response); + } else if (code == 700) { +// staProtocol.setWorkNo((short) 32002); +// staProtocol.setRollback102(1);//102绔欏洖閫�淇″彿 +// devpThread.setPakMk(staProtocol.getSiteId(), false); +// MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(5, staProtocol)); + + // led 寮傚父鏄剧ず + if (ledThread != null) { + String errorMsg = barcode + "鎵樼洏璇嗗埆寮傚父锛岃鍏堣繘琛岀粍鎵橈紒"; + ledThread.error(errorMsg); + ledThread.setLedMk(false); + } + } + } catch (Exception e) { + e.printStackTrace(); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } } } } @@ -444,7 +430,7 @@ } for (Task task : tasks) { - DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, 1); StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getOriginSite()));//婧愮珯 StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔� if (staProtocol == null || staProtocol1 == null) { @@ -736,4 +722,152 @@ } } + /** + * 鍑哄簱 ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣� + */ + public void ledExecute() { + // 閬嶅巻LED + List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() + .eq(Device::getDeviceType, DeviceCtgType.LED.val()) + .eq(Device::getStatus, 1)); + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .eq(BasLed::getDeviceId, ledDevice.getId())); + List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + + // 鑾峰彇杈撻�佺嚎plc绾跨▼ + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + // 鍛戒护闆嗗悎 + List<LedCommand> commands = new ArrayList<>(); + // 宸ヤ綔妗i泦鍚� + List<Task> tasks = new ArrayList<>(); + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { + continue; + } else { + staProtocol = staProtocol.clone(); + } + // 鑾峰彇宸ヤ綔妗f暟鎹� + Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, staProtocol.getWorkNo())); + if (null == task) { + continue; + } + + tasks.add(task); + // 缁勮鍛戒护 + LedCommand ledCommand = new LedCommand(); + ledCommand.setWorkNo(task.getTaskNo()); + ledCommand.setIoType(task.getTaskCtg().intValue()); + ledCommand.setTitle(task.getTaskCtg$()); + ledCommand.setSourceLocNo(task.getOriginLoc()); + ledCommand.setLocNo(task.getDestLoc()); + ledCommand.setStaNo(Integer.parseInt(task.getDestSite())); + + try { + //鑾峰彇WMS鍦板潃 + Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "WMS_URL").eq(Dict::getStatus, 1)); + if (dict != null) { + String wmsUrl = dict.getValue(); + + HashMap<String, Object> param = new HashMap<>(); + param.put("taskNo", task.getTaskNo()); + String response = new HttpHandler.Builder() + .setUri(wmsUrl) + .setPath("/queryTask") + .setJson(JSON.toJSONString(param)) + .build() + .doPost(); + JSONObject jsonObject = JSON.parseObject(response); + Integer code = jsonObject.getInteger("code"); + if (code.equals(200)) { + List<MatDto> matDtos = JSON.parseArray(jsonObject.getString("data"), MatDto.class); + ledCommand.setMatDtos(matDtos); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + commands.add(ledCommand); + } + // 鑾峰彇LED绾跨▼ + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); + // 鍛戒护涓嬪彂 ------------------------------------------------------------------------------- + if (!commands.isEmpty()) { + ledThread.write(commands); + ledThread.setLedMk(false); + } + } + } + + /** + * 鍏朵粬 ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅 + */ + public void ledReset() { + // 鏍规嵁杈撻�佺嚎plc閬嶅巻 + List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() + .eq(Device::getDeviceType, DeviceCtgType.LED.val()) + .eq(Device::getStatus, 1)); + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .eq(BasLed::getDeviceId, ledDevice.getId())); + List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + + // 鑾峰彇杈撻�佺嚎plc绾跨▼ + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + // 鍛戒护闆嗗悎 + boolean reset = true; + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (staProtocol == null) { + continue; + } + if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) { + reset = false; + break; + } + } + // 鑾峰彇led绾跨▼ + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); + // led鏄剧ず榛樿鍐呭 + if (reset && !ledThread.isLedMk()) { + ledThread.errorReset(); + ledThread.setLedMk(true); + } + } + + for (Device ledDevice : list) { + //鑾峰彇led鏁版嵁 + BasLed led = basLedService.getOne(new LambdaQueryWrapper<BasLed>() + .eq(BasLed::getDeviceId, ledDevice.getId())); + List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class); + + // 鑾峰彇杈撻�佺嚎plc绾跨▼ + DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue()); + // 鍛戒护闆嗗悎 + boolean reset = true; + for (Integer staNo : staArr) { + // 鑾峰彇鍙夎溅绔欑偣 + StaProtocol staProtocol = devpThread.getStation().get(staNo); + if (staProtocol == null) { continue; } + if (staProtocol.getWorkNo() != 0) { + reset = false; + break; + } + } + // 鑾峰彇led绾跨▼ + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, ledDevice.getId().intValue()); + // led鏄剧ず榛樿鍐呭 + if (reset && !ledThread.isLedMk()) { + ledThread.reset(); + ledThread.setLedMk(true); + } + } + } + } -- Gitblit v1.9.1