From 2ea1c479596a2b5417319de0d230d79040491c0a Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期六, 10 一月 2026 19:21:30 +0800
Subject: [PATCH] 修复bug-深库位出库,浅库位有货时卡住并且锁表的情况
---
src/main/java/com/zy/service/impl/MainServiceImpl.java | 195 +++++++++++++++++++++++++++++++-----------------
1 files changed, 127 insertions(+), 68 deletions(-)
diff --git a/src/main/java/com/zy/service/impl/MainServiceImpl.java b/src/main/java/com/zy/service/impl/MainServiceImpl.java
index 776e312..f80a683 100644
--- a/src/main/java/com/zy/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -50,7 +50,6 @@
*/
@Slf4j
@Service("mainService")
-@Transactional
public class MainServiceImpl {
@Autowired
@@ -106,6 +105,7 @@
* 缁勬墭
* 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗o紝宸ヤ綔鐘舵�� 2
*/
+ @Transactional(rollbackFor = Exception.class)
public synchronized void generateStoreWrkFile() {
String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
// 鏍规嵁杈撻�佺嚎plc閬嶅巻
@@ -159,7 +159,7 @@
back = true;
}
// 閫�鍥�
- if (back && (staProtocol.getWorkNo() == 9999 || staProtocol.getWorkNo() == 9998) && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()) {
+ if (back && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && !staProtocol.isEmptyMk() ) {
MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
staProtocol.setWorkNo(wrkNo);
wrkNo++;
@@ -172,11 +172,12 @@
}
// 鍒ゆ柇鏄惁婊¤冻鍏ュ簱鏉′欢
- if (staProtocol.isAutoing()
- && staProtocol.isLoading()
- && staProtocol.isInEnable()
- && !staProtocol.isEmptyMk()
- && staProtocol.isPakMk() && staProtocol.getWorkNo() == 9999) {
+ if (staProtocol.isAutoing() //鑷姩
+ && staProtocol.isLoading() //鏈夌墿
+ && staProtocol.isInEnable() //鍙叆
+ && !staProtocol.isEmptyMk() // 闈炵┖鏉�
+ && staProtocol.isPakMk() //闃叉閲嶅涓嬪彂淇″彿 绔欑偣鏃犵墿 鏃犱换鍔″彿浼氳嚜鍔ㄥ彉鎴恡rue
+ ) {
if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
News.info("{}鏉$爜鎵弿閿欒锛歿}",barcodeThread.getSlave().getId(),barcode);
continue;
@@ -227,6 +228,7 @@
devpThread.setPakMk(staProtocol.getSiteId(), false);
MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
String errorMsg = jsonObject.getString("msg");
+ log.error("鍏ㄧ増鍏ュ簱鍥為��,"+wrkNo+","+errorMsg);
if (!Cools.isEmpty(errorMsg)) {
MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
}
@@ -247,6 +249,7 @@
/**
* 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
*/
+ @Transactional(rollbackFor = Exception.class)
public synchronized void stnToCrnStnPick(Integer mark) {
for (DevpSlave devp : slaveProperties.getDevp()) {
// 閬嶅巻鎷f枡鍏ュ簱鍙�
@@ -441,54 +444,74 @@
/**
* 鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
+ * 娉ㄦ剰锛氫娇鐢� REQUIRES_NEW 璁╂瘡涓爢鍨涙満鐨勫鐞嗗湪鐙珛浜嬪姟涓墽琛岋紝閬垮厤闀挎椂闂存寔鏈夐攣瀵艰嚧姝婚攣
*/
public synchronized void crnIoExecute(Integer mark) {
-
- for (CrnSlave crn : slaveProperties.getCrn()) {
- // 鑾峰彇鍫嗗灈鏈轰俊鎭�
- CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
- CrnProtocol crnProtocol = crnThread.getCrnProtocol();
- if (crnProtocol == null) {
- continue;
- }
- BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
- if (basCrnp == null) {
- News.error(""+mark+" - 1"+" - {}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
- continue;
- }
-
- // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
- if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
- && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
- News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛屽爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�");
- // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
- if (crnProtocol.getLastIo().equals("I")) {
- if (basCrnp.getInEnable().equals("Y")) {
- //mark - 1 - ....
- this.crnStnToLoc(crn, crnProtocol,mark); // 鍏ュ簱
- crnProtocol.setLastIo("O");
- } else if (basCrnp.getOutEnable().equals("Y")) {
- //mark - 2 - ....
- this.locToCrnStn(crn, crnProtocol,mark); // 鍑哄簱
- crnProtocol.setLastIo("I");
- }
- }
- // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
- else if (crnProtocol.getLastIo().equals("O")) {
- if (basCrnp.getOutEnable().equals("Y")) {
- this.locToCrnStn(crn, crnProtocol,mark); // 鍑哄簱
- crnProtocol.setLastIo("I");
- } else if (basCrnp.getInEnable().equals("Y")) {
- this.crnStnToLoc(crn, crnProtocol,mark); // 鍏ュ簱
- crnProtocol.setLastIo("O");
- }
+ try {
+ for (CrnSlave crn : slaveProperties.getCrn()) {
+ try {
+ // 姣忎釜鍫嗗灈鏈虹殑澶勭悊鍦ㄧ嫭绔嬩簨鍔′腑鎵ц锛屽揩閫熸彁浜ら噴鏀鹃攣
+ processCrnIo(crn, mark);
+ } catch (Exception e) {
+ News.error(""+mark+" - crnIoExecute"+" - 澶勭悊鍫嗗灈鏈簕}鏃跺彂鐢熷紓甯�", crn.getId(), e);
+ // 缁х画澶勭悊涓嬩竴涓爢鍨涙満锛屼笉涓柇鏁翠釜娴佺▼
}
}
- // 搴撲綅绉昏浆
- //mark - 3 - ....
- this.locToLoc(crn, crnProtocol,mark);
+ } catch (Exception e) {
+ News.error(""+mark+" - crnIoExecute"+" - 鎵ц鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂鏃跺彂鐢熷紓甯�", e);
+ }
+ }
+ /**
+ * 澶勭悊鍗曚釜鍫嗗灈鏈虹殑鍏ュ嚭搴撲綔涓氾紙浣跨敤鐙珛浜嬪姟锛屽揩閫熸彁浜ら噴鏀鹃攣锛�
+ */
+ @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+ public void processCrnIo(CrnSlave crn, Integer mark) {
+ // 鑾峰彇鍫嗗灈鏈轰俊鎭�
+ CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
+ if (crnThread == null) {
+ return;
}
+ CrnProtocol crnProtocol = crnThread.getCrnProtocol();
+ if (crnProtocol == null) {
+ return;
+ }
+ BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
+ if (basCrnp == null) {
+ News.error(""+mark+" - 1"+" - {}鍙峰爢鍨涙満灏氭湭鍦ㄦ暟鎹簱杩涜缁存姢锛�", crn.getId());
+ return;
+ }
+
+ // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
+ if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
+ && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
+ News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛屽爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�");
+ // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
+ if (crnProtocol.getLastIo().equals("I")) {
+ if (basCrnp.getInEnable().equals("Y")) {
+ //mark - 1 - ....
+ this.crnStnToLoc(crn, crnProtocol,mark); // 鍏ュ簱
+ crnProtocol.setLastIo("O");
+ } else if (basCrnp.getOutEnable().equals("Y")) {
+ //mark - 2 - ....
+ this.locToCrnStn(crn, crnProtocol,mark); // 鍑哄簱
+ crnProtocol.setLastIo("I");
+ }
+ }
+ // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
+ else if (crnProtocol.getLastIo().equals("O")) {
+ if (basCrnp.getOutEnable().equals("Y")) {
+ this.locToCrnStn(crn, crnProtocol,mark); // 鍑哄簱
+ crnProtocol.setLastIo("I");
+ } else if (basCrnp.getInEnable().equals("Y")) {
+ this.crnStnToLoc(crn, crnProtocol,mark); // 鍏ュ簱
+ crnProtocol.setLastIo("O");
+ }
+ }
+ }
+ // 搴撲綅绉昏浆
+ //mark - 3 - ....
+ this.locToLoc(crn, crnProtocol,mark);
}
/**
@@ -575,15 +598,22 @@
} else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F銆丏 搴撲綅鐘舵��={}",shallowLoc.getLocSts());
+ // 妫�鏌ユ槸鍚﹀凡瀛樺湪绉诲簱浠诲姟
+ WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
// 姝ゆ爣璁伴伩鍏嶅娆℃墽琛岀Щ搴撲换鍔�
- if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
+ if (Cools.isEmpty(waitWrkMast) && (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk()))) {
wrkMast.setUpdMk("Y");
wrkMast.setIoPri(14D);
wrkMastMapper.updateById(wrkMast);
// 鐢熸垚宸ヤ綔妗�,灏嗘祬搴撲綅绉昏浆鍒版柊鐨勫簱浣嶄腑
- moveLocForDeepLoc(slave, shallowLoc,mark);
- // 鐢熸垚宸ヤ綔妗c�佹敼鍙樻祬搴撲綅鐨勬簮搴�/鐩爣搴� 搴撲綅鐘舵�併�佷笅鍙戝爢鍨涙満鍛戒护锛堢珛椹墽琛�)
-// moveLocForDeepLocPakin(slave, shallowLoc, wrkMast);
+ try {
+ moveLocForDeepLoc(slave, shallowLoc,mark);
+ News.warnNoLog("{}浠诲姟宸茬敓鎴愭祬搴撲綅绉昏浆浠诲姟锛屾祬搴撲綅鍙�:{}锛岀户缁鐞嗕笅涓�涓换鍔�", wrkMast.getWrkNo(), shallowLocNo);
+ } catch (Exception e) {
+ News.error("{}浠诲姟鐢熸垚娴呭簱浣嶇Щ杞换鍔″け璐ワ紝娴呭簱浣嶅彿:{}", wrkMast.getWrkNo(), shallowLocNo, e);
+ }
+ } else if (!Cools.isEmpty(waitWrkMast)) {
+ News.warnNoLog("{}浠诲姟鍏ュ簱绛夊緟涓紝娴呭簱浣嶅凡鏈夌Щ搴撲换鍔★紝娴呭簱浣嶅彿:{}锛岀Щ搴撲换鍔″彿:{}", wrkMast.getWrkNo(), shallowLocNo, waitWrkMast.getWrkNo());
}
continue;
} else if (shallowLoc.getLocSts().equals("Q")) {
@@ -676,9 +706,25 @@
// continue;
}
- // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
- if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
- && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
+ boolean outStationAvailable = true;
+ // 鏄惁妫�鏌ュ爢鍨涙満鍑哄簱绔欑姸鎬侊紙true: 妫�鏌ワ紝false: 涓嶆鏌ワ級
+ if (slaveProperties.isCheckOutStationStatus()) {
+ // 妫�鏌ュ嚭搴撶珯鐘舵��
+ outStationAvailable =
+ //鑷姩
+ staProtocol.isAutoing()
+ //!鏈夌墿
+ && !staProtocol.isLoading()
+ //鑳藉嚭
+ && staDetl.getCanouting() != null
+ && staDetl.getCanouting().equals("Y")
+ //宸ヤ綔鍙�
+ && staProtocol.getWorkNo() == 0
+ //鍙嚭
+ && staProtocol.isOutEnable();
+ }
+ // 鍑哄簱绔欏彲鐢ㄦ椂缁х画鎵ц
+ if (outStationAvailable) {
// 鍫嗗灈鏈烘帶鍒惰繃婊�
if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
// continue;
@@ -720,10 +766,19 @@
wrkMast.setUpdMk("Y");
wrkMastMapper.updateById(wrkMast);
// 鐢熸垚宸ヤ綔妗�,灏嗘祬搴撲綅绉昏浆鍒版柊鐨勫簱浣嶄腑
- moveLocForDeepLoc(slave, shallowLoc,mark);
+ try {
+ moveLocForDeepLoc(slave, shallowLoc,mark);
+ News.warnNoLog("{}浠诲姟宸茬敓鎴愭祬搴撲綅绉昏浆浠诲姟锛屾祬搴撲綅鍙�:{}锛岀户缁鐞嗕笅涓�涓换鍔�", wrkMast.getWrkNo(), shallowLocNo);
+ continue; // 宸茬敓鎴愮Щ搴撲换鍔★紝缁х画澶勭悊涓嬩竴涓换鍔�
+ } catch (Exception e) {
+ News.error("{}浠诲姟鐢熸垚娴呭簱浣嶇Щ杞换鍔″け璐ワ紝娴呭簱浣嶅彿:{}", wrkMast.getWrkNo(), shallowLocNo, e);
+ continue; // 鐢熸垚澶辫触锛岀户缁鐞嗕笅涓�涓换鍔�
+ }
+ } else {
+ // 宸插瓨鍦ㄧЩ搴撲换鍔★紝绛夊緟绉诲簱瀹屾垚
+ News.warnNoLog("{}浠诲姟鍑哄簱绛夊緟涓紝娴呭簱浣嶅凡鏈夌Щ搴撲换鍔★紝娴呭簱浣嶅彿:{}锛岀Щ搴撲换鍔″彿:{}", wrkMast.getWrkNo(), shallowLocNo, waitWrkMast.getWrkNo());
+ continue; // 缁х画澶勭悊涓嬩竴涓换鍔★紝涓嶉樆濉炲綋鍓嶅惊鐜�
}
- News.error("{}浠诲姟鍑哄簱澶辫触锛屾祬搴撲綅鍫靛锛佹祬搴撲綅鍙�:{}", wrkMast.getWrkNo(), shallowLocNo);
- break;
} else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
News.warnNoLog(""+mark+" - 2"+" - 10"+" - // Q銆丼 搴撲綅鐘舵��={}",shallowLoc.getLocSts());
WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo);
@@ -1023,6 +1078,7 @@
/**
* 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
*/
+ @Transactional(rollbackFor = Exception.class)
public synchronized void storeEmptyPlt(Integer mark) {
for (DevpSlave devp : slaveProperties.getDevp()) {
@@ -1047,13 +1103,13 @@
}
// 绔欑偣鏉′欢鍒ゆ柇
- if (staProtocol.isAutoing()
- && staProtocol.isLoading()
- && staProtocol.isInEnable()
- && staProtocol.isEmptyMk()
- && staProtocol.isPakMk()
- && staProtocol.getWorkNo() == 9998 // 9997 鍥為�� 9998 绌� 9999 婊�
- ) {
+ if (staProtocol.isAutoing() //鑷姩
+ && staProtocol.isLoading() //鏈夌墿
+ && staProtocol.isInEnable() //鍙叆
+ && staProtocol.isEmptyMk()// 绌烘澘
+ && staProtocol.isPakMk() //闃叉閲嶅涓嬪彂淇″彿 绔欑偣鏃犵墿 鏃犱换鍔″彿浼氳嚜鍔ㄥ彉鎴恡rue
+
+ ) {
News.warnNoLog(""+mark+" - 0"+" - 寮�濮嬫墽琛岋細绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�");
try {
@@ -1091,7 +1147,7 @@
LedCommand ledCommand = new LedCommand();
ledCommand.setWorkNo(dto.getWorkNo());
ledCommand.setIoType(1);
- ledCommand.setTitle("鍏ㄦ澘鍏ュ簱");
+ ledCommand.setTitle("绌烘澘鍏ュ簱");
ledCommand.setLocNo(dto.getLocNo());
ledCommand.setStaNo(dto.getStaNo());
commands.add(ledCommand);
@@ -1104,13 +1160,15 @@
staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
devpThread.setPakMk(staProtocol.getSiteId(), false);
boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
+ String errorMsg = jsonObject.getString("msg");
+ log.error("绌烘澘鍏ュ簱鍥為��"+wrkNo+","+errorMsg);
if (!result) {
News.errorNoLog(""+mark+" - 2"+" - 鏇存柊plc绔欑偣淇℃伅澶辫触");
throw new CoolException("鏇存柊plc绔欑偣淇℃伅澶辫触");
}
if (ledThread != null) {
- String errorMsg = jsonObject.getString("msg");
+
if (!Cools.isEmpty(errorMsg)) {
MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
}
@@ -1302,6 +1360,7 @@
/**
* 鍑哄簱 ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
*/
+ @Transactional(rollbackFor = Exception.class)
public synchronized void ledExecute() {
for (LedSlave led : slaveProperties.getLed()) {
// 鑾峰彇杈撻�佺嚎plc绾跨▼
--
Gitblit v1.9.1