From 3df03c486fde77ab36b9298a94bdbb0aa065a7e2 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期二, 08 四月 2025 09:07:40 +0800
Subject: [PATCH] #
---
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java | 666 ++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 463 insertions(+), 203 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 465703b..ce2f0fd 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
@@ -9,20 +9,15 @@
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.action.LiftAction;
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.*;
import com.zy.asrs.wcs.core.kernel.AnalyzeService;
import com.zy.asrs.wcs.core.model.MapNode;
-import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
-import com.zy.asrs.wcs.core.model.enums.MotionStsType;
-import com.zy.asrs.wcs.core.model.enums.TaskCtgType;
-import com.zy.asrs.wcs.core.model.enums.TaskStsType;
+import com.zy.asrs.wcs.core.model.enums.*;
import com.zy.asrs.wcs.core.service.*;
-import com.zy.asrs.wcs.core.utils.RedisUtil;
-import com.zy.asrs.wcs.core.utils.ShuttleDispatcher;
-import com.zy.asrs.wcs.core.utils.Utils;
+import com.zy.asrs.wcs.core.utils.*;
import com.zy.asrs.wcs.rcs.News;
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
@@ -33,17 +28,13 @@
import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol;
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.rcs.thread.*;
import com.zy.asrs.wcs.system.entity.Dict;
import com.zy.asrs.wcs.system.service.DictService;
import lombok.extern.slf4j.Slf4j;
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.*;
/**
@@ -85,6 +76,18 @@
private BasConveyorPathService basConveyorPathService;
@Autowired
private BasLedService basLedService;
+ @Autowired
+ private DeviceBarcodeService deviceBarcodeService;
+ @Autowired
+ private ShuttleChargeStaService shuttleChargeStaService;
+ @Autowired
+ private OpenUtils openUtils;
+ @Autowired
+ private LiftAction liftAction;
+ @Autowired
+ private LiftDispatcher liftDispatcher;
+ @Autowired
+ private ShuttleStandbyService shuttleStandbyService;
/**
* 缁勬墭
@@ -100,6 +103,11 @@
BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getDeviceId, devp.getId()).eq(BasConveyor::getHostId, devp.getHostId()));
// 閬嶅巻鍏ュ簱鍙�
for (StaDto inSta : JSON.parseArray(basConveyor.getInSta(), StaDto.class)) {
+ BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getStaNo().toString());
+ if(basConveyorSta == null) {
+ continue;
+ }
+
// 鑾峰彇鍏ュ簱绔欎俊鎭�
DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue());
StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
@@ -154,45 +162,45 @@
if (staProtocol.isAutoing() && staProtocol.isLoading()
&& staProtocol.isInEnable()
&& !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999))
+ && staProtocol.isPakMk()
) {
- // 鑾峰彇鏉$爜鎵弿浠俊鎭�
- BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
- if (barcodeThread == null) {
+ Object object = redisUtil.get(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo());
+ if (object != null) {
continue;
}
- String barcode = barcodeThread.getBarcode();
+
+// // 鑾峰彇鏉$爜鎵弿浠俊鎭�
+// DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId());
+// if(deviceBarcode == null) {
+// continue;
+// }
+// BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId()));
+// if (barcodeThread == null) {
+// continue;
+// }
+// String barcode = barcodeThread.getBarcode();
+// if (!Cools.isEmpty(barcode)) {
+// News.info("{}鍙锋潯鐮佹壂鎻忓櫒妫�娴嬫潯鐮佷俊鎭細{}", deviceBarcode.getId(), barcode);
+// }
+
+ String barcode = staProtocol.getBarcode();
if (!Cools.isEmpty(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);
- devpThread.writeWorkSta(staProtocol.getSiteId(), (short) 32002, inSta.getBackSta().shortValue());
-
- // led 寮傚父鏄剧ず
- LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
- if (ledThread != null) {
- String errorMsg = "鎵爜澶辫触锛岃閲嶈瘯";
- ledThread.error(errorMsg);
- }
- continue;
- }
+ News.info("鏉$爜鎵弿鍣ㄦ娴嬫潯鐮佷俊鎭細{}", barcode);
}
-
- //鑾峰彇鍏ュ簱浠诲姟绫诲瀷
- TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
- .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.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)
+ .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts, TaskStsType.ANALYZE_INBOUND.sts, TaskStsType.EXECUTE_INBOUND.sts)
.eq(Task::getZpallet, barcode));
if (task1 != null) {
News.error("宸ヤ綔妗e凡瀛樺湪,宸ヤ綔鍙�={}", task1.getTaskNo());
+ if (staProtocol.getWorkNo().intValue() != Integer.parseInt(task1.getTaskNo())) {
+ devpThread.writeWorkSta(staProtocol.getSiteId(), Short.parseShort(task1.getTaskNo()), Short.parseShort(task1.getOriginSite()));
+ devpThread.setPakMk(staProtocol.getSiteId(), false);
+ News.info("杈撻�佺嚎鍏ュ簱鍛戒护涓嬪彂锛屼换鍔℃暟鎹�={}", JSON.toJSON(task1));
+ }
continue;
}
@@ -212,7 +220,7 @@
param.setLocType1(staProtocol.getLocType1().shortValue());
String response = new HttpHandler.Builder()
.setUri(wmsUrl)
- .setPath("/rpc/pakin/loc/v2")
+ .setPath("/rpc/pakin/loc/v1")
.setJson(JSON.toJSONString(param))
.build()
.doPost();
@@ -222,30 +230,53 @@
if (code.equals(200)) {
StartupDto dto = jsonObject.getObject("data", StartupDto.class);
- //鑾峰彇杈撻�佽矾寰�
- BasConveyorPath conveyorPath = basConveyorPathService.getOne(new LambdaQueryWrapper<BasConveyorPath>()
- .eq(BasConveyorPath::getTypeNo, TaskCtgType.IN.val())
- .eq(BasConveyorPath::getDeviceId, devp.getId())
- .eq(BasConveyorPath::getStnNo, staProtocol.getSiteId()));
- if (conveyorPath == null) {
- News.error("杈撻�佽矾寰勪笉瀛樺湪");
- }else {
- devpThread.writeWorkSta(staProtocol.getSiteId(), dto.getWorkNo().shortValue(), conveyorPath.getDeviceStn().shortValue());
- devpThread.setPakMk(staProtocol.getSiteId(), false);
- }
+// String wmsLocNo = dto.getLocNo();
+// int row = Integer.parseInt(wmsLocNo.substring(0, 2));
+// int bay = Integer.parseInt(wmsLocNo.substring(2, 5));
+// int lev = Integer.parseInt(wmsLocNo.substring(5, 7));
+// String wcsLocNo = Utils.getLocNo(row, bay, lev);
+//
+// CreateInTaskParam createInTaskParam = new CreateInTaskParam();
+// createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo()));
+// createInTaskParam.setDestLoc(wcsLocNo);
+// createInTaskParam.setOriginSite(dto.getSourceStaNo().toString());
+// createInTaskParam.setDestSite(dto.getStaNo().toString());
+// createInTaskParam.setPriority(11);
+// createInTaskParam.setBarcode(barcode);
+//
+// R result = openUtils.createInTask(createInTaskParam);
+// News.info("鍒涘缓鍏ュ簱浠诲姟锛屼换鍔℃暟鎹�={}锛學MS鍝嶅簲={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject), JSON.toJSON(result));
+// try{
+// String msg = "";
+// HashMap<String, String> hashMap = new HashMap<>();
+// hashMap.put("msg", msg);
+// hashMap.put("sta", inSta.getStaNo().toString());
+// new HttpHandler.Builder()
+// .setUri(wmsUrl)
+// .setPath("/rpc/led/getError")
+// .setJson(JSON.toJSONString(hashMap))
+// .build()
+// .doPost();
+// }catch (Exception e){
+//
+// }
+
+ redisUtil.set(DeviceRedisConstant.LIFT_PALLET_INBOUND + inSta.getStaNo(), "in", 10);
}else {
- 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);
+ String msg = jsonObject.getString("msg");
+ HashMap<String, String> hashMap = new HashMap<>();
+ hashMap.put("msg", msg);
+ hashMap.put("sta", inSta.getStaNo().toString());
+ new HttpHandler.Builder()
+ .setUri(wmsUrl)
+ .setPath("/rpc/led/getError")
+ .setJson(JSON.toJSONString(hashMap))
+ .build()
+ .doPost();
+ News.error("鍏ュ簱鐢宠澶辫触锛屼换鍔℃暟鎹�={}锛岃姹傚搷搴�={}", JSON.toJSON(param), JSON.toJSON(jsonObject));
}
} catch (Exception e) {
e.printStackTrace();
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
}
@@ -307,6 +338,17 @@
mapNode.setNo(object.getString("row") + "-" + object.getString("bay"));
mapNode.setXBase(object.getInteger("refx"));
mapNode.setYBase(object.getInteger("refy"));
+
+ if(mapNode.getValue() == MapNodeType.CONVEYOR.id) {
+ //杈撻�佺嚎,鍒ゆ柇灏忚溅鏄惁鍙蛋
+ if (object.containsKey("conveyorHasGo")) {
+ if(object.getBoolean("conveyorHasGo")) {
+ //灏忚溅鍙蛋
+ mapNode.setValue(MapNodeType.CONVEYOR_CAR_GO.id);
+ }
+ }
+ }
+
nodes.add(mapNode);
}
@@ -329,7 +371,7 @@
//瀛樺湪绌虹己鑺傜偣锛岃嚜鍔ㄨˉ瓒�
for (int i = defaultBay; i < node.getBay(); i++) {
MapNode mapNode = new MapNode();
- mapNode.setValue(-1);
+ mapNode.setValue(MapNodeType.DISABLE.id);
mapNode.setTop(1000);
mapNode.setBottom(1000);
mapNode.setLeft(1000);
@@ -356,7 +398,7 @@
ArrayList<ArrayList<MapNode>> lists = entry.getValue();//鑾峰彇鍦板浘
MapNode mapNode = new MapNode();
- mapNode.setValue(-1);
+ mapNode.setValue(MapNodeType.DISABLE.id);
mapNode.setTop(1000);
mapNode.setBottom(1000);
mapNode.setLeft(1000);
@@ -412,6 +454,7 @@
//灏嗗湴鍥炬暟鎹瓨鍏edis
redisUtil.set(DeviceRedisConstant.MAP + lev, JSON.toJSONString(map));
+ redisUtil.set(DeviceRedisConstant.BASE_MAP + lev, JSON.toJSONString(map));
}
} catch (Exception e) {
e.printStackTrace();
@@ -420,38 +463,203 @@
// 瑙f瀽鍏ュ簱宸ヤ綔妗�
public synchronized void analyzeInBoundTask() {
- for (Task task : taskService.selectWaitAnalyzeInBoundTask()) {
- if (Cools.isEmpty(task.getShuttleNo())) {
- //鍒嗛厤灏忚溅
- //鎼滅储绌洪棽杞�
- ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
- if (shuttleThread == null) {
- News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
- continue;
+ try {
+ // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+ List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
+ .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val())
+ .eq(Device::getStatus, 1));
+ for (Device devp : list) {
+ BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getDeviceId, devp.getId()).eq(BasConveyor::getHostId, devp.getHostId()));
+ // 閬嶅巻鍏ュ簱鍙�
+ for (StaDto inSta : JSON.parseArray(basConveyor.getDeviceInSta(), StaDto.class)) {
+ BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getStaNo().toString());
+ if(basConveyorSta == null) {
+ continue;
+ }
+
+ // 鑾峰彇鍏ュ簱绔欎俊鎭�
+ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue());
+ StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+ if (staProtocol == null) {
+ continue;
+ } else {
+ staProtocol = staProtocol.clone();
+ }
+ int workNo = staProtocol.getWorkNo().intValue();
+
+ // 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
+ if (staProtocol.isAutoing()
+ && staProtocol.isLoading()
+ && staProtocol.isInEnable()
+ && (workNo >= 0)
+// && staProtocol.isPakMk()
+ ) {
+
+ Task task = taskService.getOne(new LambdaQueryWrapper<Task>()
+ .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts)
+ .eq(Task::getTaskNo, workNo));
+ if (task != null) {
+ if (!Cools.isEmpty(task.getLiftNo())) {
+ if (task.getLiftNo() > 0) {
+ task.setLiftNo(0);
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.info("{}浠诲姟鏇存柊閲婃斁鎻愬崌鏈哄け璐�", task.getTaskNo());
+ }
+ }
+ }
+
+ //鑾峰彇璺濈鐩爣浣嶇疆鏈�杩戠殑鍙崲灞傛彁鍗囨満(鍙兘涓嶇┖闂�)
+ LiftThread liftThread = liftDispatcher.searchLift(task.getDestLoc(), task.getHostId(), true);
+ if (liftThread == null) {
+ continue;
+ }
+ Device transferLiftDevice = liftThread.getDevice();
+ //鑾峰彇灏忚溅寰呮満搴撲綅 ==> 杩涙彁鍗囨満
+ ShuttleStandby shuttleStandbyTo = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
+ .eq(ShuttleStandby::getDeviceId, transferLiftDevice.getId())
+ .eq(ShuttleStandby::getDeviceLev, Utils.getLev(task.getDestLoc()))
+ .eq(ShuttleStandby::getStatus, 1));
+ //绌挎杞﹁繘鎻愬崌鏈哄簱浣嶅彿
+ String liftLocNoTo = shuttleStandbyTo.getDeviceLoc();
+ //绌挎杞﹁繘鎻愬崌鏈哄緟鏈轰綅搴撲綅鍙� 杈撻�佺嚎浣嶇疆
+ String standbyLocNoTo = shuttleStandbyTo.getDeviceStandbyLoc();
+
+ //涓嶈蛋鎻愬崌鏈�
+ if (staProtocol.getSiteId() == 1015 || staProtocol.getSiteId() == 1026) {
+ standbyLocNoTo = staProtocol.getLocNo();
+ }
+
+ if (Cools.isEmpty(task.getShuttleNo())) {
+ //鍒嗛厤灏忚溅
+ //璋冨害绌洪棽杞﹀幓鍙栬揣寰呮満浣�
+ Device shuttleDevice = shuttleDispatcher.dispatchShuttle(task, standbyLocNoTo);
+ if (shuttleDevice == null) {
+ News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
+ continue;
+ }
+
+ task.setShuttleNo(Integer.valueOf(shuttleDevice.getDeviceNo()));//淇濆瓨绌挎杞﹀彿
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
+ }
+ continue;
+ }
+
+ //鍒ゆ柇灏忚溅鏄惁鍒拌揪鍙栬揣寰呮満浣嶇疆
+ String shuttleLocNo = shuttleDispatcher.findShuttleLocNo(task.getShuttleNo(), task.getHostId());
+ if (shuttleLocNo == null) {
+ continue;
+ }
+
+ if (!standbyLocNoTo.equals(shuttleLocNo)) {
+ continue;
+ }
+
+ // generate motion list
+ List<Motion> motionList = analyzeService.generateMotion(task);
+ if (motionList.isEmpty()) {
+ continue;
+ }
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
+
+ // 鏇存柊宸ヤ綔涓绘。
+ task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵��
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
+ }
+ break;
+ }
+
+ }
}
-
- task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿
- task.setUpdateTime(new Date());
- if (!taskService.updateById(task)) {
- News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
- }
- continue;
}
-
- // generate motion list
- List<Motion> motionList = analyzeService.generateMotion(task);
- if (motionList.isEmpty()) {
- continue;
- }
- motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
-
- // 鏇存柊宸ヤ綔涓绘。
- task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵��
- task.setUpdateTime(new Date());
- if (!taskService.updateById(task)) {
- News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
- }
+ } catch (Exception e) {
+ e.printStackTrace();
}
+
+// for (Task task : taskService.selectWaitAnalyzeInBoundTask()) {
+// BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, task.getDestSite()));
+// if (basConveyorSta == null) {
+// continue;
+// }
+// BasConveyor basConveyor = basConveyorService.getById(basConveyorSta.getConveyorId());
+// if (basConveyor == null) {
+// continue;
+// }
+//// DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId());
+//// if (deviceBarcode == null) {
+//// continue;
+//// }
+//// BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId()));
+//// if (barcodeThread == null) {
+//// continue;
+//// }
+//// if (!barcodeThread.getBarcode().equals(task.getZpallet())) {
+//// continue;
+//// }
+// if (Cools.isEmpty(basConveyorSta.getTaskNo())){
+// continue;
+// }
+// if (!basConveyorSta.getTaskNo().toString().equals(task.getTaskNo())){
+// continue;
+// }
+// DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue());
+// if (devpThread == null) {
+// continue;
+// }
+// StaProtocol staProtocol = devpThread.getStation().get(basConveyorSta.getSiteNo());
+// if (staProtocol == null) {
+// continue;
+// }
+// if (!(staProtocol.isAutoing()
+// && staProtocol.isLoading()
+// && staProtocol.isInEnable())) {
+// continue;
+// }
+//
+// //瑙f瀽鍓嶅垽鏂唴閮ㄧ洰鏍囧�兼槸鍚︽湁鐗� 鏈夊伐浣滃彿
+// StaProtocol staProtocolInside = devpThread.getStation().get(Utils.getStaByLev(Utils.getLev(task.getDestLoc())));
+// if (staProtocolInside == null) {
+// continue;
+// }
+// if (staProtocolInside.isLoading() || staProtocolInside.getWorkNo() !=0) {
+// continue;
+// }
+//
+// if (Cools.isEmpty(task.getShuttleNo())) {
+// //鍒嗛厤灏忚溅
+// //鎼滅储绌洪棽杞�
+// ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
+// if (shuttleThread == null) {
+// News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
+// continue;
+// }
+//
+// task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿
+// task.setUpdateTime(new Date());
+// if (!taskService.updateById(task)) {
+// News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
+// }
+// continue;
+// }
+//
+// // generate motion list
+// List<Motion> motionList = analyzeService.generateMotion(task);
+// if (motionList.isEmpty()) {
+// continue;
+// }
+// motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
+//
+// // 鏇存柊宸ヤ綔涓绘。
+// task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 宸ヤ綔鐘舵��
+// task.setUpdateTime(new Date());
+// if (!taskService.updateById(task)) {
+// News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
+// }
+// }
}
/**
@@ -464,35 +672,26 @@
}
for (Task task : tasks) {
- BasConveyorSta originStaObj = basConveyorStaService.selectBySiteNo(task.getOriginSite());//鑾峰彇婧愮珯
- if (originStaObj == null) {
+ BasConveyorSta destStaObj = basConveyorStaService.selectBySiteNo(task.getDestSite());//鑾峰彇鐩爣绔�
+ if (destStaObj == null) {
continue;
}
- DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, originStaObj.getConveyorId().intValue());
- StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getOriginSite()));//婧愮珯
- StaProtocol staProtocol1 = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔�
- if (staProtocol == null || staProtocol1 == null) {
+ BasConveyor basConveyor = basConveyorService.getById(destStaObj.getConveyorId());
+ if(basConveyor == null) {
+ continue;
+ }
+
+ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue());
+ StaProtocol staProtocol = devpThread.getStation().get(Integer.parseInt(task.getDestSite()));//鐩爣绔�
+ if (staProtocol == null) {
continue;
} else {
staProtocol = staProtocol.clone();
- staProtocol1 = staProtocol1.clone();
}
- // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
+ // 鍒ゆ柇鍑哄簱绔欑姸鎬�
if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
- if (!(staProtocol1.isAutoing() && !staProtocol1.isLoading() && staProtocol1.getWorkNo() == 0 && staProtocol1.isOutEnable())) {
- continue;
- }
-
-// //鍚屽簱浣嶇粍鏍¢獙
-// List<String> outerLoc = Utils.getGroupOuterLoc(wrkMast.getSourceLocNo());
-// List<LocMast> outerLocMasts = locMastService.selectNotEmptyLocNos(outerLoc);
-// if (!outerLocMasts.isEmpty()) {
-// News.info("{}浠诲姟锛屾祬搴撲綅瀛樺湪璐х墿锛岀郴缁熺瓑寰呬腑", wrkMast.getWrkNo());
-// continue;//娴呭簱浣嶅瓨鍦ㄦ湭鎵ц浠诲姟
-// }
-
if (Cools.isEmpty(task.getShuttleNo())) {
//鍒嗛厤灏忚溅
//鎼滅储绌洪棽杞�
@@ -513,10 +712,10 @@
// generate motion list
List<Motion> motionList = analyzeService.generateMotion(task);
if (Cools.isEmpty(motionList)) {
- log.error("鍑哄簱 ===>> 鏆傛椂娌℃湁绌洪棽灏忚溅, 浠诲姟鍙�={}", task.getTaskNo());
+ log.error("鍑哄簱 ===>> 浠诲姟瑙f瀽澶辫触, 浠诲姟鍙�={}", task.getTaskNo());
continue;
}
- motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
// 鏇存柊宸ヤ綔涓绘。
task.setTaskSts(TaskStsType.ANALYZE_OUTBOUND.sts); // 宸ヤ綔鐘舵��
@@ -532,32 +731,63 @@
// 瑙f瀽灏忚溅绉诲姩宸ヤ綔妗�
public synchronized void analyzeMoveTask() {
for (Task task : taskService.selectWaitAnalyzeMoveTask()) {
- if (Cools.isEmpty(task.getShuttleNo())) {
- //鍒嗛厤灏忚溅
- //鎼滅储绌洪棽杞�
- ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
- if (shuttleThread == null) {
- News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
- continue;
- }
+ // generate motion list
+ List<Motion> motionList = analyzeService.generateShuttleMoveMotion(task);
+ if (motionList.isEmpty()) {
+ continue;
+ }
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
- task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿
- task.setUpdateTime(new Date());
- if (!taskService.updateById(task)) {
- News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
- }
+ // 鏇存柊宸ヤ綔涓绘。
+ task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts); // 宸ヤ綔鐘舵��
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
+ }
+ }
+ }
+
+ // 瑙f瀽灏忚溅鍏呯數宸ヤ綔妗�
+ public synchronized void analyzeChargeTask() {
+ List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.NEW_CHARGE.sts));
+ for (Task task : list) {
+ String locNo = task.getDestLoc();
+
+ Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
+ .eq(Device::getDeviceNo, task.getShuttleNo())
+ .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
+ .eq(Device::getHostId, task.getHostId())
+ .eq(Device::getStatus, 1));
+ if (shuttleDevice == null) {
+ continue;
+ }
+
+ ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
+ if (shuttleThread == null) {
+ continue;
+ }
+
+ ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+ if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
+ continue;
+ }
+ String shuttleLocNo = task.getOriginLoc();
+
+ if (Utils.getLev(locNo) != Utils.getLev(shuttleLocNo)) {
+ shuttleDispatcher.dispatchShuttle(task, task.getDestLoc());
continue;
}
// generate motion list
- List<Motion> motionList = analyzeService.generateMotion(task);
- if (motionList.isEmpty()) {
+ List<Motion> motionList = analyzeService.generateChargeMotion(task);
+ if (Cools.isEmpty(motionList)) {
+ News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", task.getTaskNo());
continue;
}
- motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
// 鏇存柊宸ヤ綔涓绘。
- task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts); // 宸ヤ綔鐘舵��
+ task.setTaskSts(TaskStsType.ANALYZE_CHARGE.sts);
task.setUpdateTime(new Date());
if (!taskService.updateById(task)) {
News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
@@ -569,14 +799,6 @@
* 鍥涘悜绌挎杞︾數閲忔娴� ===>> 鍙戣捣鍏呯數
*/
public synchronized void loopShuttleCharge() {
- // 鑾峰彇鍏呯數妗╁簱浣嶇被鍨�
- LocCtg locCtg = locCtgService.getOne(new LambdaQueryWrapper<LocCtg>()
- .eq(LocCtg::getFlag, "CHARGE")
- .eq(LocCtg::getStatus, 1));
- if (locCtg == null) {
- return;
- }
-
//鑾峰彇鍏呯數浠诲姟绫诲瀷
TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
.eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.CHARGE))
@@ -611,20 +833,19 @@
String currentLocNo = shuttleProtocol.getCurrentLocNo();
int lev = Utils.getLev(currentLocNo);//鑾峰彇灏忚溅妤煎眰
//鎼滅储灏忚溅褰撳墠妤煎眰鍏呯數妗�
- ArrayList<Loc> allChargeLoc = new ArrayList<>();
- List<Loc> list1 = locService.list(new LambdaQueryWrapper<Loc>()
- .eq(Loc::getLocCtg, locCtg.getId())
- .eq(Loc::getStatus, 1)
- .eq(Loc::getLev, lev));
+ ArrayList<ShuttleChargeSta> allChargeLoc = new ArrayList<>();
+
+ List<ShuttleChargeSta> list1 = shuttleChargeStaService.list(new LambdaQueryWrapper<ShuttleChargeSta>()
+ .eq(ShuttleChargeSta::getDeviceLev, lev)
+ .eq(ShuttleChargeSta::getStatus, 1));
if (!list1.isEmpty()) {
allChargeLoc.addAll(list1);
}
//鎼滅储鍏朵粬妤煎眰鍏呯數妗�
- List<Loc> list2 = locService.list(new LambdaQueryWrapper<Loc>()
- .eq(Loc::getLocCtg, locCtg.getId())
- .eq(Loc::getStatus, 1)
- .notIn(Loc::getLev, lev));
+ List<ShuttleChargeSta> list2 = shuttleChargeStaService.list(new LambdaQueryWrapper<ShuttleChargeSta>()
+ .notIn(ShuttleChargeSta::getDeviceLev, lev)
+ .eq(ShuttleChargeSta::getStatus, 1));
if (!list2.isEmpty()) {
allChargeLoc.addAll(list2);
}
@@ -635,24 +856,34 @@
}
//閫夋嫨绌洪棽鍏呯數妗�
- Loc chargeLoc = null;
- for (Loc loc : allChargeLoc) {
+ ShuttleChargeSta chargeSta = null;
+ for (ShuttleChargeSta shuttleChargeSta : allChargeLoc) {
// 鍒ゆ柇鍏呯數浣嶆槸鍚﹁鍗犵敤(杞﹁締浣嶇疆)
- if (Utils.hasShuttleInLoc(loc.getLocNo(), device.getId())) {
+ if (Utils.hasShuttleInLoc(shuttleChargeSta.getDeviceLoc(), device.getId())) {
continue;
}
// 鐩樼偣鍏呯數浣嶆槸鍚﹀瓨鍦ㄤ换鍔℃。
- List<Task> tasks = taskService.hasChargeInLoc(loc.getLocNo());
+ List<Task> tasks = taskService.hasChargeInLoc(shuttleChargeSta.getDeviceLoc());
if (!tasks.isEmpty()) {
continue;
}
- chargeLoc = loc;
+ Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()
+ .eq(Loc::getLocNo, shuttleChargeSta.getDeviceLoc()));
+ if (loc == null) {
+ continue;
+ }
+
+ if (!loc.getLocSts().equals(LocStsType.C.val())) {
+ continue;//搴撲綅涓嶆槸鍏呯數妗�
+ }
+
+ chargeSta = shuttleChargeSta;
break;
}
- if (chargeLoc == null) {
+ if (chargeSta == null) {
continue;//鏈壘鍒板厖鐢垫々
}
@@ -673,7 +904,7 @@
continue;
}
- String chargeLocNo = chargeLoc.getLocNo();
+ String chargeLocNo = chargeSta.getDeviceLoc();
Task task = new Task();
task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
task.setTaskNo(String.valueOf(Utils.getTaskNo("CHARGE")));
@@ -691,15 +922,6 @@
task.setMemo("charge");
task.setShuttleNo(Integer.valueOf(device.getDeviceNo()));
- // generate motion list
- List<Motion> motionList = analyzeService.generateChargeMotion(task);
- if (Cools.isEmpty(motionList)) {
- News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo());
- continue;
- }
- motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
-
- task.setTaskSts(TaskStsType.ANALYZE_CHARGE.sts);
if (!taskService.save(task)) {
News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鍏呯數浠诲姟澶辫触!!!", device.getDeviceNo());
continue;
@@ -713,14 +935,6 @@
* 鍥涘悜绌挎杞︾數閲忔娴� ===>> 婊$數鍚庡洖鍒板緟鏈轰綅
*/
public synchronized void loopShuttleToStandbyCauseCharge() {
- Integer enoughPower = 90;
- Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>()
- .eq(Dict::getFlag, "chargeMaxValue")
- .eq(Dict::getStatus, 1));
- if (dict != null) {
- enoughPower = Integer.parseInt(dict.getValue());
- }
-
//鑾峰彇杩佺Щ浠诲姟绫诲瀷
TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
.eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.MOVE))
@@ -766,8 +980,21 @@
continue;
}
+ ShuttleChargeSta chargeSta = shuttleChargeStaService.getOne(new LambdaQueryWrapper<ShuttleChargeSta>()
+ .eq(ShuttleChargeSta::getDeviceLoc, chargeTask.getDestLoc())
+ .eq(ShuttleChargeSta::getStatus, 1));
+ if (chargeSta == null) {
+ continue;//鍏呯數妗╀笉瀛樺湪锛屽紓甯�
+ }
+
+ String standbyLoc = chargeSta.getStandbyLoc();
+ if (standbyLoc == null) {
+ continue;//閬胯浣嶇疆鏁版嵁涓嶅瓨鍦�
+ }
+ List<String> availableLoc = JSON.parseArray(standbyLoc, String.class);
+
//鑾峰彇閬胯浣嶇疆
- String standByLocNo = shuttleDispatcher.searchStandByLocNo(Integer.valueOf(device.getDeviceNo()), device.getHostId(), shuttleThread.getStatus().getCurrentLocNo());
+ String standByLocNo = shuttleDispatcher.searchAvailableLocNo(Integer.valueOf(device.getDeviceNo()), device.getHostId(), shuttleThread.getStatus().getCurrentLocNo(), availableLoc);
Task task = new Task();
task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
@@ -776,7 +1003,7 @@
task.setTaskCtg(taskCtg.getId());
task.setPriority(10);
task.setOriginSite(null);
- task.setOriginLoc(null);
+ task.setOriginLoc(shuttleProtocol.getCurrentLocNo());
task.setDestSite(null);
task.setDestLoc(standByLocNo); // 閬胯浣嶇疆
task.setIoTime(new Date());
@@ -792,7 +1019,7 @@
News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", device.getDeviceNo());
continue;
}
- motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts);
@@ -821,7 +1048,8 @@
.eq(BasLed::getDeviceId, ledDevice.getId()));
List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class);
- BasConveyor basConveyor = basConveyorService.getById(led.getConveyorId().intValue());
+ BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>()
+ .eq(BasConveyor::getDeviceId, led.getConveyorId().intValue()));
if (basConveyor == null) {
continue;
}
@@ -835,26 +1063,26 @@
for (Integer staNo : staArr) {
// 鑾峰彇鍙夎溅绔欑偣
StaProtocol staProtocol = devpThread.getStation().get(staNo);
- if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
+ if (null == staProtocol || null == staProtocol.getWorkNo()) {
continue;
} else {
staProtocol = staProtocol.clone();
}
- // 鑾峰彇宸ヤ綔妗f暟鎹�
- Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, staProtocol.getWorkNo()));
- if (null == task) {
- continue;
- }
+ String taskNo = "0";
+ if (staProtocol.isOutEnable() && staProtocol.getSiteId() == 31001 ){
+ if (0 != staProtocol.getWorkNo()){
+ Motion motion = motionService.getOne(new LambdaQueryWrapper<Motion>().eq(Motion::getMotionCtg, 9).eq(Motion::getTemp, staProtocol.getWorkNo()));
+ // 鑾峰彇宸ヤ綔妗f暟鎹�
+ Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskNo, motion.getTaskNo()));
+ if (null == task) {
+ continue;
+ }
+ taskNo = task.getWmsTaskNo();
+ }
- 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()));
+ } else if (staProtocol.isInEnable() && staProtocol.getSiteId() == 31002) {
+ taskNo = staProtocol.getStaNo().toString();
+ }
try {
//鑾峰彇WMS鍦板潃
@@ -863,32 +1091,24 @@
String wmsUrl = dict.getValue();
HashMap<String, Object> param = new HashMap<>();
- param.put("taskNo", task.getTaskNo());
+ param.put("taskNo", taskNo);
+ param.put("sta",staNo);
String response = new HttpHandler.Builder()
.setUri(wmsUrl)
- .setPath("/queryTask")
+ .setPath("/rpc/led/getTask")
.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);
}
}
}
@@ -942,8 +1162,13 @@
.eq(BasLed::getDeviceId, ledDevice.getId()));
List<Integer> staArr = JSON.parseArray(led.getSta(), Integer.class);
+ BasConveyor basConveyor = basConveyorService.getById(led.getConveyorId());
+ if (basConveyor == null) {
+ continue;
+ }
+
// 鑾峰彇杈撻�佺嚎plc绾跨▼
- DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, led.getConveyorId().intValue());
+ DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue());
// 鍛戒护闆嗗悎
boolean reset = true;
for (Integer staNo : staArr) {
@@ -965,4 +1190,39 @@
}
}
+ // 瑙f瀽灏忚溅杞借揣绉诲姩宸ヤ綔妗�
+ public synchronized void analyzeLadenMoveTask() {
+ for (Task task : taskService.selectWaitAnalyzeLadenMoveTask()) {
+ if (Cools.isEmpty(task.getShuttleNo())) {
+ //鍒嗛厤灏忚溅
+ //鎼滅储绌洪棽杞�
+ ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
+ if (shuttleThread == null) {
+ News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
+ continue;
+ }
+
+ task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
+ }
+ continue;
+ }
+
+ // generate motion list
+ List<Motion> motionList = analyzeService.generateShuttleLadenMoveMotion(task);
+ if (motionList.isEmpty()) {
+ continue;
+ }
+ motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
+
+ // 鏇存柊宸ヤ綔涓绘。
+ task.setTaskSts(TaskStsType.ANALYZE_LADEN_MOVE.sts); // 宸ヤ綔鐘舵��
+ task.setUpdateTime(new Date());
+ if (!taskService.updateById(task)) {
+ News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
+ }
+ }
+ }
}
--
Gitblit v1.9.1