From d7020a8f1ec6f55167b4ad14941de0e28ce3d8c1 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期五, 16 一月 2026 14:19:59 +0800
Subject: [PATCH] agv出库逻辑
---
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java | 193 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 193 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 0ab2769..f8883ff 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -9,6 +9,9 @@
import com.zy.asrs.service.impl.BasStationServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.model.enums.WorkNoType;
+import com.zy.common.properties.AgvProperties;
+import com.zy.common.service.CommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +19,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -59,6 +63,15 @@
@Autowired
private LocCacheDetlService locCacheDetlService;
+
+ @Autowired
+ private CommonService commonService;
+
+ @Autowired
+ private AgvProperties agvProperties;
+
+ @Autowired
+ private WrkMastLogService wrkMastLogService;
public ReturnT<String> start(WrkMast wrkMast) {
// 4.鍏ュ簱瀹屾垚
@@ -590,6 +603,9 @@
// 14.鍑哄簱瀹屾垚
} else if (task.getWrkSts() == 14) {
return agvDoOut(task);
+ // 15.鍑哄簱鏇存柊瀹屾垚 - 鐢熸垚绌烘墭/婊℃墭鍑哄簱浠诲姟
+ } else if (task.getWrkSts() == 15) {
+ return generateEmptyOrFullPalletOutTaskForCompleted(task);
}
return SUCCESS;
}
@@ -636,6 +652,7 @@
if (!taskService.updateById(task)) {
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
+ // 娉ㄦ剰锛氱敓鎴愮┖鎵�/婊℃墭鍑哄簱浠诲姟鐨勯�昏緫宸茬Щ鑷崇姸鎬�15鐨勫鐞嗘柟娉曚腑
} else if(task.getIoType().equals(53) || task.getIoType().equals(54) || task.getIoType().equals(57)){
LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", task.getSourceLocNo()));
if (Objects.isNull(locCache)) {
@@ -669,6 +686,182 @@
return SUCCESS;
}
+ /**
+ * 鐘舵��15锛堝嚭搴撴洿鏂板畬鎴愶級鏃讹紝鐢熸垚绌烘墭鍑哄簱鎴栨弧鎵樺嚭搴撲换鍔★紝灏嗘墭鐩樻斁鍏ョ紦瀛樺簱浣�
+ * @param completedTask 宸插畬鎴愬嚭搴撴洿鏂扮殑浠诲姟锛堢姸鎬�15锛�
+ * @return 澶勭悊缁撴灉
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public ReturnT<String> generateEmptyOrFullPalletOutTaskForCompleted(Task completedTask) {
+ // 鍙鐞唅oType=101鐨勫叏鏉垮嚭搴撲换鍔�
+ if (!completedTask.getIoType().equals(101)) {
+ return SUCCESS;
+ }
+
+ // 妫�鏌ユ槸鍚﹀凡缁忕敓鎴愯繃绌烘墭/婊℃墭鍑哄簱浠诲姟锛堥伩鍏嶉噸澶嶇敓鎴愶級
+ List<Task> existingTasks = taskService.selectList(new EntityWrapper<Task>()
+ .eq("barcode", completedTask.getBarcode())
+ .in("io_type", 110, 101) // 绌烘澘鍑哄簱鎴栧叏鏉垮嚭搴�
+ .eq("wrk_sts", 7) // 寰呭懠鍙獳GV鐘舵��
+ );
+ if (!existingTasks.isEmpty()) {
+ log.info("浠诲姟ID锛歿}鐨勬墭鐩樼爜锛歿}宸插瓨鍦ㄧ┖鎵�/婊℃墭鍑哄簱浠诲姟锛岃烦杩囩敓鎴�", completedTask.getId(), completedTask.getBarcode());
+ return SUCCESS;
+ }
+
+ try {
+ generateEmptyOrFullPalletOutTask(completedTask, null);
+ return SUCCESS;
+ } catch (Exception e) {
+ log.error("鐘舵��15鏃剁敓鎴愮┖鎵�/婊℃墭鍑哄簱浠诲姟澶辫触锛屼换鍔D锛歿}锛岄敊璇細{}", completedTask.getId(), e.getMessage(), e);
+ return FAIL.setMsg("鐢熸垚绌烘墭/婊℃墭鍑哄簱浠诲姟澶辫触锛�" + e.getMessage());
+ }
+ }
+
+ /**
+ * 鍑哄簱瀹屾垚鍚庯紝鐢熸垚绌烘墭鍑哄簱鎴栨弧鎵樺嚭搴撲换鍔★紝灏嗘墭鐩樻斁鍏ョ紦瀛樺簱浣�
+ * @param outTask 鍑哄簱浠诲姟
+ * @param sourceLocCache 婧愬簱浣嶏紙鍙负null锛�
+ */
+ private void generateEmptyOrFullPalletOutTask(Task outTask, LocCache sourceLocCache) {
+ // 鍒ゆ柇鎵樼洏绫诲瀷锛氱┖鎵樻垨婊℃墭
+ boolean isEmptyPallet = "Y".equals(outTask.getEmptyMk());
+ Integer ioType = isEmptyPallet ? 110 : 101; // 110=绌烘澘鍑哄簱锛�101=鍏ㄦ澘鍑哄簱锛堟弧鎵樺嚭搴擄級
+
+ log.info("鍑哄簱浠诲姟瀹屾垚锛岀敓鎴恵}浠诲姟锛屼换鍔D锛歿}锛屾墭鐩樼爜锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId(), outTask.getBarcode());
+
+ // 鍒嗛厤缂撳瓨搴撲綅锛坵hs_type=2锛�
+ LocCache cacheLoc = locCacheService.selectOne(new EntityWrapper<LocCache>()
+ .eq("whs_type", agvProperties.getWhsTypeMapping().getCacheArea()) // whs_type=2 缂撳瓨鍖�
+ .eq("frozen", 0)
+ .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type) // O.闂茬疆
+ .ne("full_plt", isEmptyPallet ? "Y" : "N") // 绌烘墭涓嶉�夋弧鏉垮簱浣嶏紝婊℃墭涓嶉�夌┖鏉垮簱浣�
+ .orderAsc(Arrays.asList("row1", "bay1", "lev1"))
+ .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
+
+ if (cacheLoc == null) {
+ log.warn("娌℃湁鍙敤鐨勭紦瀛樺簱浣嶏紝鏃犳硶鐢熸垚{}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+ return;
+ }
+
+ // 鑾峰彇鍑哄簱绔欑偣锛堝嚭搴撲换鍔$殑staNo鏄嚭搴撶珯鐐癸紝灏嗕綔涓虹┖鎵�/婊℃墭鍑哄簱浠诲姟鐨勬簮绔欑偣锛�
+ String outboundStaNo = outTask.getStaNo();
+ if (outboundStaNo == null || outboundStaNo.isEmpty()) {
+ log.warn("鍑哄簱浠诲姟娌℃湁鍑哄簱绔欑偣锛屾棤娉曠敓鎴恵}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+ return;
+ }
+
+ // 鏍规嵁缂撳瓨鍖洪厤缃�夋嫨绔欑偣鍜屾満鍣ㄤ汉缁勶紙瑗夸晶锛�
+ List<String> cacheStations = agvProperties.getWestStations();
+ String robotGroup = agvProperties.getRobotGroupWest();
+
+ if (cacheStations.isEmpty()) {
+ log.warn("缂撳瓨鍖烘病鏈夐厤缃珯鐐癸紝鏃犳硶鐢熸垚{}浠诲姟锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+ return;
+ }
+
+ // 妫�鏌ュ伐浣滄。鏄惁宸插畬鎴愭垨宸茶浆鍘嗗彶妗�
+ boolean workCompleted = false;
+ if (outTask.getWrkNo() != null) {
+ // 妫�鏌ュ伐浣滄。鏄惁瀛樺湪涓斿凡瀹屾垚
+ WrkMast wrkMast = wrkMastService.selectOne(
+ new EntityWrapper<WrkMast>().eq("wrk_no", outTask.getWrkNo())
+ );
+
+ if (wrkMast != null) {
+ Long wrkSts = wrkMast.getWrkSts();
+ // 鍑哄簱浠诲姟瀹屾垚鐘舵�侊細14锛堝凡鍑哄簱鏈‘璁わ級鎴�15锛堝嚭搴撴洿鏂板畬鎴愶級
+ if (wrkSts != null && (wrkSts == 14L || wrkSts == 15L)) {
+ workCompleted = true;
+ log.debug("宸ヤ綔妗}宸插畬鎴愶紝鐘舵�侊細{}", outTask.getWrkNo(), wrkSts);
+ }
+ } else {
+ // 濡傛灉宸ヤ綔妗d笉瀛樺湪锛屾鏌ュ巻鍙叉。
+ WrkMastLog wrkMastLog = wrkMastLogService.selectOne(
+ new EntityWrapper<WrkMastLog>().eq("wrk_no", outTask.getWrkNo())
+ );
+ if (wrkMastLog != null) {
+ long logWrkSts = wrkMastLog.getWrkSts();
+ // 鍑哄簱浠诲姟鍘嗗彶妗e畬鎴愮姸鎬侊細15锛堝嚭搴撴洿鏂板畬鎴愶級
+ if (logWrkSts == 15L) {
+ workCompleted = true;
+ log.debug("宸ヤ綔妗}宸茶浆鍘嗗彶妗e苟瀹岀粨锛屽巻鍙叉。鐘舵�侊細{}", outTask.getWrkNo(), logWrkSts);
+ }
+ }
+ }
+ }
+
+ // 妫�鏌ユ槸鍚︽湁浠庤鍑哄簱绔欑偣鍒扮紦瀛樺尯鐨勬鍦ㄦ惉杩愪换鍔★紙鐘舵��8锛氬凡鍛煎彨AGV锛屾鍦ㄦ惉杩愶級
+ // 鍑哄簱鍒扮紦瀛樺尯鐨勪换鍔$被鍨嬶細101锛堝叏鏉垮嚭搴擄級鎴�110锛堢┖鏉垮嚭搴擄級
+ List<Task> transportingTasks = taskService.selectList(
+ new EntityWrapper<Task>()
+ .eq("source_sta_no", outboundStaNo) // 婧愮珯鐐规槸鍑哄簱绔欑偣
+ .in("sta_no", cacheStations) // 鐩爣绔欑偣鏄紦瀛樺尯绔欑偣
+ .eq("task_type", "agv")
+ .eq("wrk_sts", 8L) // 鍙鏌ユ鍦ㄦ惉杩愮姸鎬佺殑浠诲姟
+ .in("io_type", 101, 110) // 鍑哄簱鍒扮紦瀛樺尯鐨勪换鍔$被鍨�
+ );
+
+ // 濡傛灉鏈夋鍦ㄦ惉杩愮殑浠诲姟锛屼笖宸ヤ綔妗f湭瀹屾垚锛屽垯涓嶅垎閰嶇紦瀛樺簱浣�
+ if (!transportingTasks.isEmpty() && !workCompleted) {
+ log.info("鍑哄簱绔欑偣{}鍒扮紦瀛樺尯鏈墈}涓鍦ㄦ惉杩愮殑AGV浠诲姟锛屼笖宸ヤ綔妗f湭瀹屾垚锛屾殏涓嶅垎閰嶇紦瀛樺簱浣嶏紝绛夊緟鎼繍瀹屾垚銆傚嚭搴撲换鍔D锛歿}",
+ outboundStaNo, transportingTasks.size(), outTask.getId());
+ return; // 鏈夋鍦ㄦ惉杩愮殑浠诲姟涓斿伐浣滄。鏈畬鎴愶紝涓嶅垎閰嶇紦瀛樺簱浣嶏紝绛夊緟涓嬫妫�鏌�
+ }
+
+ if (!transportingTasks.isEmpty() && workCompleted) {
+ log.info("鍑哄簱绔欑偣{}鍒扮紦瀛樺尯鏈墈}涓鍦ㄦ惉杩愮殑AGV浠诲姟锛屼絾宸ヤ綔妗e凡瀹屾垚鎴栧凡杞巻鍙叉。锛屽厑璁稿垎閰嶇紦瀛樺簱浣嶃�傚嚭搴撲换鍔D锛歿}",
+ outboundStaNo, transportingTasks.size(), outTask.getId());
+ }
+
+ // 閫夋嫨缂撳瓨鍖虹洰鏍囩珯鐐癸紙浣跨敤绗竴涓彲鐢ㄧ珯鐐癸紝鎴栧彲浠ヤ紭鍖栦负閫夋嫨浠诲姟鏈�灏戠殑绔欑偣锛�
+ String cacheStaNo = cacheStations.get(0);
+
+ // 鐢熸垚宸ヤ綔鍙�
+ int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
+
+ // 鍒涘缓绌烘墭鍑哄簱/婊℃墭鍑哄簱浠诲姟
+ Task cacheTask = new Task();
+ Date now = new Date();
+ cacheTask.setWrkNo(workNo)
+ .setIoTime(now)
+ .setWrkSts(7L) // 宸ヤ綔鐘舵�侊細7.寰呭懠鍙獳GV
+ .setIoType(ioType) // 110=绌烘澘鍑哄簱锛�101=鍏ㄦ澘鍑哄簱
+ .setTaskType("agv")
+ .setIoPri(10D)
+ .setStaNo(cacheStaNo) // 鐩爣绔欑偣锛堢紦瀛樺尯绔欑偣锛�
+ .setSourceStaNo(outboundStaNo) // 婧愮珯鐐癸紙鍑哄簱绔欑偣锛�
+ .setInvWh(robotGroup) // 鏈哄櫒浜虹粍锛堣タ渚э級
+ .setFullPlt(isEmptyPallet ? "N" : "Y") // 婊℃澘锛氱┖鎵�=N锛屾弧鎵�=Y
+ .setPicking("N")
+ .setExitMk("N")
+ .setSourceLocNo(null) // 鍑哄簱浠诲姟涓嶉渶瑕佹簮搴撲綅
+ .setLocNo(cacheLoc.getLocNo()) // 鐩爣搴撲綅锛堢紦瀛樺簱浣嶏級
+ .setEmptyMk(isEmptyPallet ? "Y" : "N") // 绌烘澘鏍囪
+ .setBarcode(outTask.getBarcode()) // 鎵樼洏鐮�
+ .setLinkMis("N")
+ .setAppeTime(now)
+ .setModiTime(now);
+
+ if (!taskService.insert(cacheTask)) {
+ log.error("鐢熸垚{}浠诲姟澶辫触锛屼换鍔D锛歿}", isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", outTask.getId());
+ return;
+ }
+
+ // 鏇存柊缂撳瓨搴撲綅鐘舵�侊細O.闂茬疆 鈫� S.鍏ュ簱棰勭害
+ cacheLoc.setLocSts(LocStsType.LOC_STS_TYPE_S.type);
+ cacheLoc.setBarcode(outTask.getBarcode());
+ cacheLoc.setModiTime(now);
+ if (!locCacheService.updateById(cacheLoc)) {
+ log.error("鏇存柊缂撳瓨搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛歿}", cacheLoc.getLocNo());
+ // 鍥炴粴浠诲姟
+ taskService.deleteById(cacheTask.getId());
+ return;
+ }
+
+ log.info("鎴愬姛鐢熸垚{}浠诲姟锛屼换鍔D锛歿}锛屽伐浣滃彿锛歿}锛屾簮绔欑偣锛歿}锛岀洰鏍囩珯鐐癸細{}锛岀紦瀛樺簱浣嶏細{}",
+ isEmptyPallet ? "绌烘墭鍑哄簱" : "婊℃墭鍑哄簱", cacheTask.getId(), workNo, outboundStaNo, cacheStaNo, cacheLoc.getLocNo());
+ }
@Transactional(rollbackFor = Exception.class)
public ReturnT<String> agvDoIn(Task wrkMast) {
--
Gitblit v1.9.1