From a1db2ea6ccdafdffdf2ed4e52844179e72dc77a5 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 20 一月 2026 10:25:09 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java | 955 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 829 insertions(+), 126 deletions(-)
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index e6f38ce..d3b8244 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -1,5 +1,7 @@
package com.zy.asrs.service.impl;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.BaseRes;
@@ -8,10 +10,9 @@
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
-import com.zy.asrs.entity.param.EmptyPlateOutParam;
-import com.zy.asrs.entity.param.FullStoreParam;
-import com.zy.asrs.entity.param.LocDetlAdjustParam;
-import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.entity.param.*;
+import com.zy.asrs.entity.result.FindLocNoAttributeVo;
+import com.zy.asrs.entity.result.WrkCancel;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.*;
@@ -19,14 +20,19 @@
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
+import com.zy.common.utils.HttpHandler;
import com.zy.common.web.WcsController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
@@ -77,6 +83,14 @@
private SlaveProperties slaveProperties;
@Autowired
private WaitPakinService waitPakinService;
+ @Autowired
+ private ApiLogService apiLogService;
+ @Value("${wcs-slave.cancel}")
+ private String cancel;
+ @Value("${wcs-slave.url}")
+ private String url;
+ @Value("${wcs-slave.warehouse}")
+ private String warehouse;
@Override
@Transactional
@@ -91,8 +105,11 @@
// 妫�绱㈠簱浣�
LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
- List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
- StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), matnrs.get(0), batchs.get(0), null,locTypeDto);
+// List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
+ StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), matnrs.get(0), null, null,locTypeDto);
+ if (Cools.isEmpty(dto)){
+ throw new CoolException("鏌ヨ搴撲綅澶辫触锛侊紒==銆媠tartupFullPutStore ==銆� commonService.getLocNo");
+ }
// 鐢熸垚宸ヤ綔鍙�
int workNo = dto.getWorkNo();
// 鐢熸垚宸ヤ綔妗�
@@ -169,23 +186,90 @@
}
}
if (!locDetlDtos.isEmpty()) {
- LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
- if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D") ){
- // 鍚姩鍑哄簱寮�濮� 101.鍑哄簱
- stockOut(staNo, locDetlDtos, null, userId);
- }else {
- throw new CoolException("鎵�閫夊簱浣嶅瓨鍦ㄧ姸鎬佷笉涓篎銆丏鐨勫簱浣嶏紝搴撲綅鍙凤細"+locMast.getLocNo()+" 銆佸綋鍓嶇姸鎬侊細"+locMast.getLocSts()+"-"+locMast.getLocSts$());
- }
+ // 鍚姩鍑哄簱寮�濮� 101.鍑哄簱
+ stockOut(staNo, locDetlDtos, null, userId);
} else {
throw new CoolException("搴撳瓨涓嶅瓨鍦�");
}
}
+ private boolean isInNormalRule(LocMast lm) {
+ List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+ if (locGroupAscOrder == null || locGroupAscOrder.isEmpty()) {
+ return false;
+ }
+ Integer row = lm.getRow1();
+ if (row == null) return false;
+ return locGroupAscOrder.stream()
+ .anyMatch(group ->
+ group.getRowList() != null &&
+ group.getRowList().contains(row)
+ );
+ }
+
+ /**
+ * 妫�鏌ユ甯稿簱浣嶅墠鏂规槸鍚﹀牭濉烇紙娣卞簱浣嶈鍒欙細鍓嶆柟鎺掓槸鍚︽湁璐ф垨鍏ュ簱浠诲姟锛�
+ *
+ * 鍙灞炰簬鍑哄簱鍒嗙粍瑙勫垯鍐呯殑搴撲綅杩涜妫�鏌�
+ * 濡傛灉搴撲綅涓嶅湪鍒嗙粍瑙勫垯鍐咃紝鍒欒涓轰笉闇�瑕佷弗鏍兼鏌ワ紙杩斿洖 false锛屼笉瑙﹀彂琛ラ綈锛�
+ *
+ * @param normalMasts 闇�瑕佹鏌ョ殑姝e父搴撲綅鍒楄〃锛堝凡閫氳繃 isInNormalRule 杩囨护锛�
+ * @return true = 鍓嶆柟鏈夊牭濉烇紙闇�瑕佽ˉ榻愶級锛宖alse = 鍓嶆柟娓呯┖鎴栨棤闇�妫�鏌�
+ */
+ private boolean checkDeepLocationBlocked(List<LocMast> normalMasts) {
+ if (normalMasts == null || normalMasts.isEmpty()) {
+ return false;
+ }
+ // 鑾峰彇鍑哄簱鍒嗙粍閰嶇疆锛堢敤浜庣‘璁よ鍒欒寖鍥达級
+ List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+ if (locGroupAscOrder == null || locGroupAscOrder.isEmpty()) {
+ return false; // 鏃犻厤缃椂榛樿涓嶆鏌�
+ }
+
+ // 閬嶅巻姣忎釜姝e父搴撲綅
+ for (LocMast lm : normalMasts) {
+ Integer currentRow = lm.getRow1();
+ Integer bay1 = lm.getBay1();
+ Integer lev1 = lm.getLev1();
+
+ if (currentRow == null || bay1 == null || lev1 == null) {
+ continue;
+ }
+
+ // 娣卞簱浣嶆鏌ユ柟鍚戯細鍋囪 row 瓒婂ぇ瓒婃繁锛堝墠鏂规槸鏇村ぇ row 鐨勪綅缃級
+ // 浣犲彲浠ユ牴鎹疄闄呭嚭搴撴柟鍚戣皟鏁村惊鐜潯浠讹紙渚嬪浠庡皬 row 鍒板ぇ row 鎴栧弽涔嬶級
+ for (int row = currentRow + 1; row <= 5; row++) { // 鍋囪娣卞簱浣嶈寖鍥村埌 5 鎺掞紝鍙皟鏁�
+ LocMast front = getLocMastByRow(row, bay1, lev1);
+ if (front == null) {
+ continue;
+ }
+
+ // 鏈夎揣锛團鐘舵�侊級 鈫� 鍫靛
+ if ("F".equals(front.getLocSts())) {
+ return true;
+ }
+
+ // 鏈夊叆搴撲换鍔� 鈫� 鍫靛
+ WrkMast frontTask = wrkMastService.selectOne(
+ new EntityWrapper<WrkMast>()
+ .eq("source_loc_no", front.getLocNo())
+ .eq("io_type", 100) // 鍋囪 100 涓哄叆搴撶被鍨嬶紝鍙皟鏁�
+ );
+ if (frontTask != null) {
+ return true;
+ }
+ }
+ }
+
+ // 鎵�鏈夋甯稿簱浣嶅墠鏂归兘娓呯┖锛堟垨鏃犲墠鏂癸級
+ return false;
+ }
@Override
@Transactional
public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
Date now = new Date();
- // 鍚堝苟鍚岀被椤�
+
+ // 淇濈暀锛氬悎骞跺悓绫婚」锛堝悓涓�搴撲綅鍚堝苟鏄庣粏锛�
Set<String> locNos = new HashSet<>();
List<OutLocDto> dtos = new ArrayList<>();
for (LocDetlDto locDetlDto : locDetlDtos) {
@@ -202,82 +286,316 @@
dtos.add(new OutLocDto(locNo, locDetlDto));
}
}
- Integer ioType = null;
- // 鐢熸垚宸ヤ綔妗�
- for (OutLocDto dto : dtos) {
- // 鍒ゆ柇鍏ュ嚭搴撶被鍨嬶細101.鍏ㄦ澘鍑哄簱 or 103.鎷f枡鍑哄簱
- if (ioWorkType == null) {
- ioType = dto.isAll() ? 101 : 103;
- } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) {
- ioType = 107;
- }
- assert ioType != null;
- // 鑾峰彇搴撲綅
- LocMast locMast = locMastService.selectById(dto.getLocNo());
+ // 浣跨敤鍑哄簱涓撶敤鍒嗙粍閰嶇疆
+ List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+ // 纭畾姝e父鍑哄簱绫诲瀷锛堝拰鍘熸潵淇濇寔绫讳技锛�
+ int ioTypeNormal = 101; // 榛樿鏁存墭鍑哄簱
+ if (ioWorkType != null && ioWorkType.equals(IoWorkType.CHECK_OUT)) {
+ ioTypeNormal = 107;
+ } else if (!dtos.isEmpty() && !dtos.get(0).isAll()) {
+ ioTypeNormal = 103; // 閮ㄥ垎鍑哄簱
+ }
+ // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄富淇℃伅
+ List<LocMast> allSelectedMasts = locMastService.selectList(
+ new EntityWrapper<LocMast>().in("loc_no", locNos)
+ );
+
+ if (allSelectedMasts.size() != locNos.size()) {
+ throw new CoolException("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+ }
+
+ // 2. 鍖哄垎姝e父搴撲綅锛堥渶瑕佷弗鏍兼繁搴撲綅妫�鏌ワ級涓庤ˉ鍏呭簱浣�
+ List<LocMast> normalMasts = new ArrayList<>();
+ List<LocMast> supplementMasts = new ArrayList<>();
+
+ // 鍋囪鎴戜滑鏈夋煇绉嶁�滃垎缁勮鍒欌�濓紙濡傛寜鍒楀眰鎴栨帓鑼冨洿锛夛紝杩欓噷绠�鍖栫敤涓�涓ず渚嬪垽鏂�
+ // 浣犲彲浠ユ浛鎹㈡垚瀹為檯鐨勮鍒欙紙濡� getLocGroupOrderOut() 鎴栧叾浠栵級
+ for (LocMast lm : allSelectedMasts) {
+ boolean isNormal = isInNormalRule(lm); // 鈫� 浣犻渶瑕佸疄鐜拌繖涓垽鏂柟娉�
+ if (isNormal) {
+ normalMasts.add(lm);
+ } else {
+ supplementMasts.add(lm);
+ }
+ }
+
+ // 3. 瀵规甯稿簱浣嶈繘琛屾繁搴撲綅鍓嶆柟妫�鏌ワ紙绫讳技涔嬪墠鐨勮繛缁 + 娓呯┖锛�
+ AtomicReference<Boolean> isLeftSideSupplement = new AtomicReference<>(false);
+
+ if (!normalMasts.isEmpty()) {
+ // 杩欓噷妯℃嫙娣卞簱浣嶅墠鏂规鏌ワ紙浣犲彲浠ユ浛鎹㈡垚浣犲疄闄呯殑妫�鏌ユ柟娉曪級
+ boolean hasBlockage = checkDeepLocationBlocked(normalMasts);
+
+ if (hasBlockage) {
+ // 鍓嶆柟鍫靛 鈫� 鑷姩琛ュ厖鏈�灏戜竴渚�
+ supplementBothSidesBlocked(normalMasts, locGroupAscOrder, supplementMasts, isLeftSideSupplement);
+ }
+ }
+
+ // 4. 鍚堝苟鎵�鏈夎鍑哄簱鐨勫簱浣�
+ List<LocMast> allMasts = new ArrayList<>();
+ allMasts.addAll(normalMasts);
+ allMasts.addAll(supplementMasts);
+
+ if (allMasts.isEmpty()) {
+ throw new CoolException("娌℃湁鏈夋晥鐨勫嚭搴撳簱浣�");
+ }
+
+ // 5. 缁熶竴鎸夋帓鍙凤紙row锛夊�掑簭鎺掑簭锛堥珮鎺掑厛鍑猴級
+ List<LocMast> sortedAll = allMasts.stream()
+ .sorted(Comparator.comparing(LocMast::getRow1, Comparator.reverseOrder()))
+ .collect(Collectors.toList());
+
+ // 6. 鐢熸垚浠诲姟锛堜粠鍚庡線鍓嶉亶鍘嗭級
+ double basePriority = 100.0;
+ for (int index = sortedAll.size() - 1; index >= 0; index--) {
+ LocMast locMast = sortedAll.get(index);
+ String locNo = locMast.getLocNo();
+
+ boolean isSupplement = supplementMasts.contains(locMast);
+ int ioType = isSupplement ? 11 : ioTypeNormal;
+ // 浼樺厛绾ц绠�
+ double priority;
+ if (isSupplement) {
+ if (Boolean.TRUE.equals(isLeftSideSupplement.get())) {
+ // 宸︿晶琛ュ厖 鈫� 鏅氬嚭
+ priority = basePriority - index * 1.0;
+ } else {
+ // 鍙充晶琛ュ厖 鈫� 鏃╁嚭
+ priority = basePriority + index * 1.0;
+ }
+ } else {
+ priority = basePriority - index * 1.0;
+ }
+ OutLocDto dto;
Integer outSta = staNo.getDevNo();
-// //2鍙峰爢鍨涙満鍏ㄦ澘鍑哄簱绔欐寚瀹氫负204绔欙紝鎷f枡绔欐寚瀹氫负202
-// if(locMast.getCrnNo()==2){
-// outSta = ioType == 101 ? 204 : 202;
-// }
-
- // 鑾峰彇璺緞
- StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
- // 鐢熸垚宸ヤ綔鍙�
- int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
- // 鐢熸垚宸ヤ綔妗�
- WrkMast wrkMast = new WrkMast();
- wrkMast.setWrkNo(workNo);
- wrkMast.setIoTime(now);
- wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
- wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶姸鎬�
- wrkMast.setIoPri(13D); // 浼樺厛绾э細13
- wrkMast.setCrnNo(locMast.getCrnNo());
- wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 婧愮珯
- wrkMast.setStaNo(staDesc.getStnNo()); // 鐩爣绔�
- wrkMast.setSourceLocNo(dto.getLocNo()); // 婧愬簱浣�
- wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
- wrkMast.setPicking("N"); // 鎷f枡
- wrkMast.setExitMk("N"); // 閫�鍑�
- wrkMast.setEmptyMk("N"); // 绌烘澘
- wrkMast.setLinkMis("N");
- wrkMast.setBarcode(locMast.getBarcode());
- wrkMast.setAppeUser(userId); // 鎿嶄綔浜哄憳鏁版嵁
- wrkMast.setAppeTime(now);
- wrkMast.setModiUser(userId);
- wrkMast.setModiTime(now);
- if (!wrkMastService.insert(wrkMast)) {
- throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細"+dto.getLocNo());
+ StaDesc staDesc = null;
+ if(ioType != 11){
+ staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
}
- // 鐢熸垚宸ヤ綔妗f槑缁�
- for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
- if (detlDto.getCount()==null || detlDto.getCount() <= 0.0D) {continue;}
- WrkDetl wrkDetl = new WrkDetl();
- wrkDetl.sync(detlDto.getLocDetl());
- wrkDetl.setOrderNo(""); // 鎵嬪姩鍑哄簱涓嶉渶瑕佸甫鍑哄簱瀛樹腑鐨勫崟鎹紪鍙�
- wrkDetl.setWrkNo(workNo);
- wrkDetl.setIoTime(now);
- Double anfme = ioType==101?detlDto.getLocDetl().getAnfme():detlDto.getCount();
- wrkDetl.setAnfme(anfme); // 鏁伴噺
- wrkDetl.setAppeTime(now);
- wrkDetl.setAppeUser(userId);
- wrkDetl.setModiTime(now);
- wrkDetl.setModiUser(userId);
- if (!wrkDetlService.insert(wrkDetl)) {
- throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+ LocMast locMastNew = null;
+ WrkMast wrkMast = new WrkMast();
+ String locSts;
+ int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
+ String pick = (ioType == 101) ? "N" : "Y";
+ if((ioType == 101 || ioType == 103 || ioType == 107) && staDesc != null) {
+ // 鎵惧埌瀵瑰簲鐨� OutLocDto
+ dto = dtos.stream()
+ .filter(d -> d.getLocNo().equals(locNo))
+ .findFirst()
+ .orElseThrow(() -> new CoolException("鎵句笉鍒板搴旂殑鍑哄簱鏄庣粏锛�" + locNo));
+ // 鐢熸垚宸ヤ綔妗�
+ wrkMast.setWrkNo(workNo);
+ wrkMast.setIoTime(now);
+ wrkMast.setWrkSts(0L);
+ wrkMast.setIoType(ioType);
+ wrkMast.setIoPri(priority);
+ wrkMast.setCrnNo(locMast.getCrnNo());
+ wrkMast.setSourceStaNo(staDesc.getCrnStn());
+ wrkMast.setStaNo(staDesc.getStnNo());
+ wrkMast.setSourceLocNo(locNo);
+ wrkMast.setFullPlt("Y");
+ wrkMast.setPicking(pick);
+ wrkMast.setExitMk("N");
+ wrkMast.setEmptyMk("N");
+ wrkMast.setLinkMis("N");
+ wrkMast.setBarcode(locMast.getBarcode());
+ wrkMast.setAppeUser(userId);
+ wrkMast.setAppeTime(now);
+ wrkMast.setModiUser(userId);
+ wrkMast.setModiTime(now);
+ locSts = ioType != 101? "R" : "P";
+ // 鐢熸垚宸ヤ綔妗f槑缁嗭紙淇濈暀鍘熼�昏緫锛�
+ for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
+ if (detlDto.getCount() == null || detlDto.getCount() <= 0.0D) {
+ continue;
+ }
+ WrkDetl wrkDetl = new WrkDetl();
+ wrkDetl.sync(detlDto.getLocDetl());
+ wrkDetl.setOrderNo("");
+ wrkDetl.setWrkNo(workNo);
+ wrkDetl.setIoTime(now);
+ Double anfme = ioType == 101 ? detlDto.getLocDetl().getAnfme() : detlDto.getCount();
+ wrkDetl.setAnfme(anfme);
+ wrkDetl.setAppeTime(now);
+ wrkDetl.setAppeUser(userId);
+ wrkDetl.setModiTime(now);
+ wrkDetl.setModiUser(userId);
+ if (!wrkDetlService.insert(wrkDetl)) {
+ throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+ }
+ }
+ }else{
+ List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no",locNo));
+ FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
+ findLocNoAttributeVo.setMatnr(locDetls.get(0).getMatnr());
+ findLocNoAttributeVo.setBatch(locDetls.get(0).getBatch());
+ LocTypeDto locTypeDto = new LocTypeDto();
+ locTypeDto.setLocType1(locMast.getLocType1());
+ locMastNew = commonService.searchMaxPallet(findLocNoAttributeVo,locTypeDto);
+ // 鐢熸垚宸ヤ綔妗�
+ wrkMast.setWrkNo(workNo);
+ wrkMast.setIoTime(now);
+ wrkMast.setWrkSts(0L);
+ wrkMast.setIoType(ioType);
+ wrkMast.setIoPri(priority);
+ wrkMast.setCrnNo(locMast.getCrnNo());
+ wrkMast.setSourceStaNo(null);
+ wrkMast.setStaNo(null);
+ wrkMast.setSourceLocNo(locNo);
+ wrkMast.setLocNo(locMastNew.getLocNo());
+ wrkMast.setFullPlt("Y");
+ wrkMast.setPicking(pick);
+ wrkMast.setExitMk("N");
+ wrkMast.setEmptyMk("N");
+ wrkMast.setLinkMis("N");
+ wrkMast.setBarcode(locMast.getBarcode());
+ wrkMast.setAppeUser(userId);
+ wrkMast.setAppeTime(now);
+ wrkMast.setModiUser(userId);
+ wrkMast.setModiTime(now);
+ locSts = "R";
+ // 鐢熸垚宸ヤ綔妗f槑缁嗭紙淇濈暀鍘熼�昏緫锛�
+ if(locDetls != null && locDetls.size() > 0) {
+ for (LocDetl locDetl : locDetls) {
+ WrkDetl wrkDetl = new WrkDetl();
+ wrkDetl.sync(locDetl);
+ wrkDetl.setWrkNo(workNo);
+ wrkDetl.setIoTime(now);
+
+ wrkDetl.setAppeTime(now);
+ wrkDetl.setAppeUser(userId);
+ wrkDetl.setModiTime(now);
+ wrkDetl.setModiUser(userId);
+ if (!wrkDetlService.insert(wrkDetl)) {
+ throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+ }
+ }
}
}
- // 淇敼搴撲綅鐘舵��: F.鍦ㄥ簱 ====>>> R.鍑哄簱棰勭害/P.鎷f枡/鐩樼偣/骞舵澘鍑哄簱涓�
- locMast = locMastService.selectById(dto.getLocNo());
- if (locMast.getLocSts().equals("F")) {
- locMast.setLocSts(ioType==101?"R":"P");
+ if (!wrkMastService.insert(wrkMast)) {
+ throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝搴撲綅锛�" + locNo);
+ }
+
+ if(locMastNew != null){
+ if ("O".equals(locMastNew.getLocSts())) {
+ locMastNew.setLocSts("S");
+ locMastNew.setModiUser(userId);
+ locMastNew.setModiTime(now);
+ if (!locMastService.updateById(locMastNew)) {
+ throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
+ }
+ } else {
+ throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
+ }
+ }
+ // 鏇存柊搴撲綅鐘舵��
+ locMast = locMastService.selectById(locNo);
+ if ("F".equals(locMast.getLocSts())) {
+ locMast.setLocSts(locSts);
locMast.setModiUser(userId);
locMast.setModiTime(now);
if (!locMastService.updateById(locMast)) {
- throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細"+dto.getLocNo());
+ throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細" + locNo);
}
} else {
- throw new CoolException(dto.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+ throw new CoolException(locNo + " 搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+ }
+ }
+ }
+
+ private void supplementBothSidesBlocked(
+ List<LocMast> normalMasts,
+ List<LocMast> supplementMasts,
+ AtomicReference<Boolean> isLeftSideSupplement) {
+
+ if (normalMasts.isEmpty()) {
+ isLeftSideSupplement.set(true); // 榛樿宸︿晶
+ return;
+ }
+
+ // 鍋囪鎵�鏈� normalMasts 鍦ㄥ悓涓� bay/lev锛堝缁勬儏鍐靛彲寰幆澶勭悊锛�
+ LocMast rep = normalMasts.get(0);
+ Integer bay1 = rep.getBay1();
+ Integer lev1 = rep.getLev1();
+
+ if (bay1 == null || lev1 == null) {
+ throw new CoolException("搴撲綅 bay1 鎴� lev1 涓虹┖锛屾棤娉曡ˉ榻愬墠鏂�");
+ }
+
+ // 鎵惧嚭閫変腑娈电殑鏈�灏�/鏈�澶ф帓鍙�
+ int minRow = normalMasts.stream()
+ .mapToInt(LocMast::getRow1)
+ .min()
+ .orElseThrow(() -> new CoolException("姝e父搴撲綅鍒楄〃涓虹┖锛屾棤娉曡幏鍙栨渶灏忔帓鍙�"));
+
+ int maxRow = normalMasts.stream()
+ .mapToInt(LocMast::getRow1)
+ .max()
+ .orElseThrow(() -> new CoolException("姝e父搴撲綅鍒楄〃涓虹┖锛屾棤娉曡幏鍙栨渶澶ф帓鍙�"));
+
+ // 鍋囪娣卞簱浣嶈寖鍥达細1~5 鎺掞紙鍙牴鎹疄闄呰皟鏁达級
+ final int MIN_ROW = 1;
+ final int MAX_ROW = 5;
+
+ // ---------------- 璁$畻宸︿晶锛堝皬鎺掑彿鏂瑰悜锛岃緝娴呬綅缃級闇�瑕佽ˉ澶氬皯 ----------------
+ int leftCount = 0;
+ List<LocMast> leftToAdd = new ArrayList<>();
+ for (int r = minRow - 1; r >= MIN_ROW; r--) {
+ LocMast loc = getLocMastByRow(r, bay1, lev1);
+ if (loc == null) continue;
+
+ // 鍙ˉ绌烘澘锛圖鐘舵�侊級
+ if ("D".equals(loc.getLocSts())) {
+ leftCount++;
+ leftToAdd.add(loc);
+ }
+ // 鍙�夛細閬囧埌鍏朵粬闃诲鐘舵�佸彲鍋滄锛堣涓氬姟闇�姹傦級
+ // else if ("F".equals(loc.getLocSts()) || "鍏朵粬闃诲".equals(...)) break;
+ }
+
+ // ---------------- 璁$畻鍙充晶锛堝ぇ鎺掑彿鏂瑰悜锛屾洿娣变綅缃級闇�瑕佽ˉ澶氬皯 ----------------
+ int rightCount = 0;
+ List<LocMast> rightToAdd = new ArrayList<>();
+ for (int r = maxRow + 1; r <= MAX_ROW; r++) {
+ LocMast loc = getLocMastByRow(r, bay1, lev1);
+ if (loc == null) continue;
+
+ if ("D".equals(loc.getLocSts())) {
+ rightCount++;
+ rightToAdd.add(loc);
+ }
+ // else if (闃诲鐘舵��) break;
+ }
+
+ // ---------------- 閫夋嫨琛ュ摢涓�杈� ----------------
+ List<LocMast> chosen;
+ boolean chooseLeft;
+
+ if (leftCount == 0 && rightCount == 0) {
+ // 涓や晶閮芥病绌烘澘鍙ˉ 鈫� 鏃犳硶鎵撻��
+ throw new CoolException("鍓嶆柟涓や晶鍧囨棤绌烘澘鍙ˉ鍏咃紝鏃犳硶鎵撻�氬嚭搴撹矾寰�");
+ }
+
+ if (leftCount <= rightCount) {
+ // 宸︿晶琛ユ洿灏戯紙鎴栫浉绛夐粯璁ゅ乏渚э級
+ chosen = leftToAdd;
+ chooseLeft = true;
+ log.info("閫夋嫨琛ュ厖宸︿晶锛堝皬鎺掓柟鍚戯級锛屽叡 {} 涓┖鏉垮簱浣�", leftCount);
+ } else {
+ chosen = rightToAdd;
+ chooseLeft = false;
+ log.info("閫夋嫨琛ュ厖鍙充晶锛堝ぇ鎺掓柟鍚戯級锛屽叡 {} 涓┖鏉垮簱浣�", rightCount);
+ }
+
+ // 璁剧疆鏍囪锛堢敤浜庡悗缁紭鍏堢骇璋冩暣锛�
+ isLeftSideSupplement.set(chooseLeft);
+
+ // 鍔犲叆琛ュ厖鍒楄〃锛堝幓閲嶏級
+ for (LocMast supp : chosen) {
+ if (!supplementMasts.contains(supp) && !normalMasts.contains(supp)) {
+ supplementMasts.add(supp);
}
}
}
@@ -423,66 +741,406 @@
return dto.getLocNo();
}
+ /**
+ * 妫�鏌ョ┖鏉垮嚭搴撳垎缁勫唴閫変腑杩炵画娈电殑鍙屽悜鍓嶆柟娓呯┖鎯呭喌锛屽苟杩斿洖鍑哄簱鏂瑰悜涓庢帓搴忓悗鐨勫簱浣嶅垪琛�
+ *
+ * @param selectedLocNos 閫変腑鐨勫簱浣嶅彿鍒楄〃
+ * @param locGroupAscOrder 鍑哄簱鍒嗙粍閰嶇疆
+ * @return LockingCheckResultParam 鍖呭惈鏍¢獙缁撴灉銆佹柟鍚戙�佹帓搴忓悗搴撲綅鍒楄〃
+ */
+ private LockingCheckResultParam checkEmptyPlateBlocking(
+ List<String> selectedLocNos,
+ List<LocGroupOrder> locGroupAscOrder) {
+
+ if (Cools.isEmpty(selectedLocNos)) {
+ return LockingCheckResultParam.success(Collections.emptyList());
+ }
+
+ // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄俊鎭�
+ List<LocMast> selectedMasts = locMastService.selectList(
+ new EntityWrapper<LocMast>().in("loc_no", selectedLocNos)
+ );
+
+ if (selectedMasts.size() != selectedLocNos.size()) {
+ return LockingCheckResultParam.fail("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+ }
+
+ // 2. 鎸夊垎缁勮仛鍚堥�変腑鐨勫簱浣嶏紙鏀寔澶氬垎缁勶級
+ Map<LocGroupOrder, List<LocMast>> groupSelected = new HashMap<>();
+ for (LocMast lm : selectedMasts) {
+ LocGroupOrder group = locGroupAscOrder.stream()
+ .filter(g -> g.getRowList().contains(lm.getRow1()))
+ .findFirst()
+ .orElseThrow(() -> new CoolException("鎺掍笉鍦ㄥ嚭搴撳垎缁勯厤缃腑: row=" + lm.getRow1()));
+
+ groupSelected.computeIfAbsent(group, k -> new ArrayList<>()).add(lm);
+ }
+
+ // 鐢变簬閫氬父涓�娆¤姹傚湪涓�涓垎缁勫唴锛岃繖閲屽彇绗竴涓垎缁勭殑缁撴灉
+ // 濡傛灉闇�瑕佹敮鎸佸鍒嗙粍鍚屾椂鍑哄簱锛屽彲鏀逛负杩斿洖 Map<LocGroupOrder, LockingCheckResultParam>
+ LockingCheckResultParam result = null;
+
+ for (Map.Entry<LocGroupOrder, List<LocMast>> entry : groupSelected.entrySet()) {
+ LocGroupOrder group = entry.getKey();
+ List<LocMast> selected = entry.getValue();
+
+ List<Integer> fullRows = group.getRowList(); // 濡� [3,4,5,6,7,8,9,10]
+
+ // 鑾峰彇閫変腑鐨� row锛屽苟鎸夊垎缁勯『搴忔帓搴�
+ List<Integer> selectedRows = selected.stream()
+ .map(LocMast::getRow1)
+ .distinct()
+ .sorted(Comparator.comparingInt(fullRows::indexOf))
+ .collect(Collectors.toList());
+
+ // 妫�鏌ユ槸鍚﹂噸澶嶆垨鏃犳晥
+ if (selectedRows.size() != selected.size()) {
+ return LockingCheckResultParam.fail("閫変腑搴撲綅瀛樺湪閲嶅鎴栨棤鏁堟帓");
+ }
+
+ int minIndex = fullRows.indexOf(selectedRows.get(0));
+ int maxIndex = fullRows.indexOf(selectedRows.get(selectedRows.size() - 1));
+
+ // 1. 蹇呴』鏄繛缁锛堟棤缂哄彛锛�
+ if (maxIndex - minIndex + 1 != selectedRows.size()) {
+ return LockingCheckResultParam.fail(
+ "閫変腑鎺掑繀椤昏繛缁紝鏃犵己鍙c�備粠 " + fullRows.get(minIndex) + " 鍒� " + fullRows.get(maxIndex)
+ );
+ }
+
+ // 2. 妫�鏌ュ乏鍓嶆柟锛堟搴忔柟鍚戯細浠庡乏鍒板彸锛屽墠鏂规槸绱㈠紩灏忕殑浣嶇疆锛�
+ boolean leftClear = true;
+ for (int i = 0; i < minIndex; i++) {
+ LocMast prev = getLocMastByRow(fullRows.get(i), selected.get(0).getBay1(), selected.get(0).getLev1());
+ if (prev != null && ("D".equals(prev.getLocSts()) || "F".equals(prev.getLocSts()))) {
+ leftClear = false;
+ break;
+ }
+ }
+
+// // 3. 妫�鏌ュ彸鍓嶆柟锛堝�掑簭鏂瑰悜锛氫粠鍙冲埌宸︼紝鍓嶆柟鏄储寮曞ぇ鐨勪綅缃級
+// boolean rightClear = true;
+// for (int i = maxIndex + 1; i < fullRows.size(); i++) {
+// LocMast prev = getLocMastByRow(fullRows.get(i), selected.get(0).getBay1(), selected.get(0).getLev1());
+// if (prev != null && ("D".equals(prev.getLocSts()) || "F".equals(prev.getLocSts()))) {
+// rightClear = false;
+// break;
+// }
+// }
+
+ // 4. 鑷冲皯鏈変竴渚ф竻绌烘墠鍏佽鍑哄簱锛堜慨鏀癸細鏀惧锛屽鏋滀袱渚ч兘鍫碉紝杩斿洖鐗瑰畾閿欒鐮佹垨缁х画锛�
+// if (!leftClear && !rightClear) {
+// return LockingCheckResultParam.fail(
+// "閫変腑娈� " + fullRows.get(minIndex) + "~" + fullRows.get(maxIndex) +
+// " 涓や晶鍓嶆柟閮芥湁绌烘澘/鏁呴殰锛屾棤娉曞嚭搴擄紙姝e簭鎴栧�掑簭鏂瑰悜閮藉牭濉烇級"
+// );
+// }
+ if (!leftClear ) {
+ return LockingCheckResultParam.fail(
+ "閫変腑娈� " + fullRows.get(minIndex) + "~" + fullRows.get(maxIndex) +
+ " 涓や晶鍓嶆柟閮芥湁绌烘澘/鏁呴殰锛屾棤娉曞嚭搴擄紙姝e簭鎴栧�掑簭鏂瑰悜閮藉牭濉烇級"
+ );
+ }
+
+ // 5. 閫変腑娈靛唴鎵�鏈夊簱浣嶅繀椤绘槸 D 鐘舵��
+ for (LocMast lm : selected) {
+ if (!"D".equals(lm.getLocSts())) {
+ return LockingCheckResultParam.fail("閫変腑搴撲綅闈炵┖鏉跨姸鎬�: " + lm.getLocNo());
+ }
+ }
+
+ // 6. 鍐冲畾鍑哄簱鏂瑰悜鍜屾帓搴忛『搴�
+ String direction;
+ List<LocMast> sortedSelected;
+
+ // 浼樺厛閫夋嫨姝e簭锛堝鏋滀袱渚ч兘娓呯┖锛岄粯璁ゆ搴忥級
+ if (leftClear) {
+ direction = "ASC";
+ sortedSelected = selected.stream()
+ .sorted(Comparator.comparingInt(m -> fullRows.indexOf(m.getRow1())))
+ .collect(Collectors.toList());
+ } else {
+ direction = "DESC";
+ sortedSelected = selected.stream()
+ .sorted(Comparator.comparingInt(m -> -fullRows.indexOf(m.getRow1()))) // 鍊掑簭
+ .collect(Collectors.toList());
+ }
+
+ result = LockingCheckResultParam.success(direction, sortedSelected);
+ }
+
+ // 濡傛灉娌℃湁鍒嗙粍锛堢悊璁轰笂涓嶄細鍙戠敓锛夛紝杩斿洖榛樿鎴愬姛
+ return result != null ? result : LockingCheckResultParam.success(Collections.emptyList());
+ }
+
+ // 杈呭姪鏂规硶锛氭牴鎹� row 鑾峰彇 LocMast
+ private LocMast getLocMastByRow(Integer row, Integer bay1, Integer lev1) {
+ return locMastService.selectOne(new EntityWrapper<LocMast>()
+ .eq("bay1", bay1)
+ .eq("lev1", lev1)
+ .eq("row1", row));
+ }
+
+ /**
+ * 褰撻�変腑娈典袱渚у墠鏂归兘鍫靛鏃讹紝鍒ゆ柇琛ュ摢涓�渚ч渶瑕佺殑绌烘澘鏈�灏戯紝骞舵妸閭d簺搴撲綅鍔犲叆琛ュ厖鍒楄〃
+ */
+ private void supplementBothSidesBlocked(
+ List<LocMast> normalMasts,
+ List<LocGroupOrder> locGroupAscOrder,
+ List<LocMast> supplementMasts,
+ AtomicReference<Boolean> isLeftSideSupplement) {
+
+ // 鍋囪鎵�鏈� normalMasts 鍦ㄥ悓涓�涓垎缁勶紙濡傛灉澶氬垎缁勶紝鍙惊鐜鐞嗘瘡涓垎缁勶級
+ LocGroupOrder group = locGroupAscOrder.stream()
+ .filter(g -> g.getRowList().contains(normalMasts.get(0).getRow1()))
+ .findFirst()
+ .orElseThrow(() -> new CoolException("鍒嗙粍寮傚父"));
+
+ List<Integer> fullRows = group.getRowList();
+
+ // 鍙栭�変腑娈电殑 min/max row
+ Set<Integer> selectedRowSet = normalMasts.stream()
+ .map(LocMast::getRow1)
+ .collect(Collectors.toSet());
+
+ int minRow = Collections.min(selectedRowSet);
+ int maxRow = Collections.max(selectedRowSet);
+
+ int minIndex = fullRows.indexOf(minRow);
+ int maxIndex = fullRows.indexOf(maxRow);
+
+ // 鍋囪鎵�鏈夊簱浣嶅湪鍚� bay 鍜� lev
+ Integer bay1 = normalMasts.get(0).getBay1();
+ Integer lev1 = normalMasts.get(0).getLev1();
+
+ // 璁$畻宸︿晶鍓嶆柟闇�瑕佽ˉ鍏呯殑 D 鐘舵�佸簱浣嶆暟閲忥紙浠� 0 鍒� minIndex-1 鐨� D 鐘舵�佸簱浣嶏級
+ int leftSupplementCount = 0;
+ List<LocMast> leftSupplementLocs = new ArrayList<>();
+ for (int i = 0; i < minIndex; i++) {
+ LocMast loc = getLocMastByRow(fullRows.get(i), bay1, lev1);
+ if (loc != null && ("D".equals(loc.getLocSts()) || "F".equals(loc.getLocSts()))) {
+ leftSupplementCount++;
+ leftSupplementLocs.add(loc);
+ }
+ }
+
+// // 璁$畻鍙充晶鍓嶆柟闇�瑕佽ˉ鍏呯殑 D 鐘舵�佸簱浣嶆暟閲忥紙浠� maxIndex+1 鍒� end 鐨� D 鐘舵�佸簱浣嶏級
+// int rightSupplementCount = 0;
+// List<LocMast> rightSupplementLocs = new ArrayList<>();
+// for (int i = maxIndex + 1; i < fullRows.size(); i++) {
+// LocMast loc = getLocMastByRow(fullRows.get(i), bay1, lev1);
+// if (loc != null && "D".equals(loc.getLocSts())) {
+// rightSupplementCount++;
+// rightSupplementLocs.add(loc);
+// }
+// }
+
+ // 閫夋嫨闇�瑕佽ˉ鍏呮渶灏戠殑涓�渚э紙濡傛灉鐩哥瓑锛屼紭鍏堝乏渚э級
+ List<LocMast> chosenSupplementLocs;
+ boolean isLeft = false;
+ if (true) {
+ chosenSupplementLocs = leftSupplementLocs;
+ isLeft = true;
+ log.info("閫夋嫨琛ュ厖宸︿晶鍓嶆柟锛屽叡 {} 涓簱浣�", leftSupplementCount);
+ }
+// else {
+// chosenSupplementLocs = rightSupplementLocs;
+// isLeft = false;
+// log.info("閫夋嫨琛ュ厖鍙充晶鍓嶆柟锛屽叡 {} 涓簱浣�", rightSupplementCount);
+// }
+ // 璁板綍閫夋嫨鐨勪晶
+ isLeftSideSupplement.set(isLeft);
+ // 娣诲姞鍒� supplementMasts锛堥伩鍏嶉噸澶嶆坊鍔狅級
+ for (LocMast supp : chosenSupplementLocs) {
+ if (!supplementMasts.contains(supp) && !normalMasts.contains(supp)) {
+ supplementMasts.add(supp);
+ }
+ }
+ }
+
@Override
@Transactional
public void emptyPlateOut(EmptyPlateOutParam param, Long userId) {
if (Cools.isEmpty(param.getOutSite())) {
throw new CoolException("绔欑偣涓嶅瓨鍦�");
}
- for (String locNo : param.getLocNos()) {
+
+ // 浣跨敤鍑哄簱涓撶敤鍒嗙粍閰嶇疆
+ List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
+
+ // 1. 鏌ヨ鎵�鏈夐�変腑鐨勫簱浣嶄俊鎭�
+ List<LocMast> selectedMasts = locMastService.selectList(
+ new EntityWrapper<LocMast>().in("loc_no", param.getLocNos())
+ );
+
+ if (selectedMasts.size() != param.getLocNos().size()) {
+ throw new CoolException("閮ㄥ垎閫変腑搴撲綅涓嶅瓨鍦ㄦ垨鏁版嵁寮傚父");
+ }
+
+ // 2. 鍖哄垎姝e父鍒嗙粍鍐呯殑搴撲綅 鍜� 闇�瑕佽ˉ鍏呯殑搴撲綅锛堣鍒欏鐨勶級
+ List<LocMast> normalMasts = new ArrayList<>();
+ List<LocMast> supplementMasts = new ArrayList<>();
+ for (LocMast lm : selectedMasts) {
+ boolean inAnyGroup = locGroupAscOrder.stream()
+ .anyMatch(g -> g.getRowList().contains(lm.getRow1()));
+ if (inAnyGroup) {
+ normalMasts.add(lm);
+ } else {
+ supplementMasts.add(lm);
+ }
+ }
+ // 鏂板锛氳褰曟槸鍚﹀洜涓哄乏渚у墠鏂硅琛ュ厖
+ AtomicReference<Boolean> isLeftSideSupplement = new AtomicReference<>(false);
+ // 3. 瀵规甯稿垎缁勫唴鐨勫簱浣嶈繘琛屾鏌ワ紙鏀惧涓や晶鍫靛瑙勫垯锛�
+ if (!normalMasts.isEmpty()) {
+ List<String> normalLocNos = normalMasts.stream()
+ .map(LocMast::getLocNo)
+ .collect(Collectors.toList());
+
+ LockingCheckResultParam checkResult = checkEmptyPlateBlocking(
+ normalLocNos,
+ locGroupAscOrder
+ );
+
+ if (!checkResult.isSuccess()) {
+ String errMsg = checkResult.getErrorMessage();
+ if (errMsg.contains("涓や晶鍓嶆柟閮芥湁绌烘澘/鏁呴殰")) {
+ // 涓や晶閮藉牭 鈫� 杩涘叆琛ラ綈閫昏緫
+ supplementBothSidesBlocked(normalMasts, locGroupAscOrder, supplementMasts, isLeftSideSupplement);
+ } else {
+ // 鍏朵粬閿欒锛堝涓嶈繛缁�侀潪D鐘舵�侊級鎶涘嚭
+ throw new CoolException(errMsg);
+ }
+ }
+ // 濡傛灉鏈変竴渚ф竻绌猴紝鍒欐甯哥户缁�
+ }
+
+ // 4. 鍚堝苟鎵�鏈夊簱浣嶏紙姝e父 + 琛ュ厖鐨勶紝鍖呮嫭瑙勫垯澶栫殑鍜屽墠鏂硅ˉ鐨勶級
+ List<LocMast> allMasts = new ArrayList<>();
+ allMasts.addAll(normalMasts);
+ allMasts.addAll(supplementMasts);
+
+ if (allMasts.isEmpty()) {
+ throw new CoolException("娌℃湁鏈夋晥鐨勭┖鏉垮簱浣嶅彲鍑哄簱");
+ }
+
+ // 5. 缁熶竴鎸� row 鈫� bay 鈫� lev 鎺掑簭锛堜粠灏忓埌澶э級
+ List<LocMast> sortedAll = allMasts.stream()
+ .sorted(Comparator.comparing(LocMast::getRow1)
+ .thenComparing(LocMast::getBay1)
+ .thenComparing(LocMast::getLev1))
+ .collect(Collectors.toList());
+
+ Date now = new Date();
+
+ // 6. 鎸夋帓搴忓悗鐨勯『搴忕敓鎴愬嚭搴撲换鍔★紙浠庡悗寰�鍓嶇敓鎴愶級
+ for (int index = 0; index <sortedAll.size() ; index ++) {
+ LocMast locMast = sortedAll.get(index);
+ String locNo = locMast.getLocNo();
+
+ // 鍒ゆ柇鏄惁涓鸿ˉ鍏呭簱浣嶏紙瑙勫垯澶栫殑 鎴� 鍓嶆柟琛ョ殑锛�
+ boolean isSupplement = supplementMasts.contains(locMast);
+
+ int ioType = isSupplement ? 11 : 110;
+
// 鑾峰彇宸ヤ綔鍙�
int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
- // 鑾峰彇搴撲綅
- LocMast locMast = locMastService.selectById(locNo);
- if (Cools.isEmpty(locMast)) {
- throw new CoolException(locNo+"搴撲綅涓嶅瓨鍦�");
- }
- if (!locMast.getLocSts().equals("D")){
- throw new CoolException("鎵�閫夊簱浣嶅瓨鍦ㄧ姸鎬佷笉涓篋鐨勫簱浣嶏紝搴撲綅鍙凤細"+locMast.getLocNo()+" 銆佸綋鍓嶇姸鎬侊細"+locMast.getLocSts()+"-"+locMast.getLocSts$());
- }
+
// 鑾峰彇婧愮珯
Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
.eq("type_no", 110)
.eq("stn_no", param.getOutSite())
.eq("crn_no", locMast.getCrnNo());
StaDesc staDesc = staDescService.selectOne(wrapper);
- Integer sourceStaNo = staDesc.getCrnStn();
+ Integer sourceStaNo = staDesc != null ? staDesc.getCrnStn() : null;
+
if (Cools.isEmpty(sourceStaNo)) {
- throw new CoolException("妫�绱㈡簮绔欏け璐�");
+ throw new CoolException("妫�绱㈡簮绔欏け璐ワ紝搴撲綅锛�" + locNo);
}
- Date now = new Date();
- // 淇濆瓨宸ヤ綔妗�
+
+ // 璁$畻浼樺厛绾э紙绀轰緥锛氳ˉ鍏呯殑浼樺厛绾х◢浣庯級
+ double BASE_PRI = 200.0;
+ double ioPri;
WrkMast wrkMast = new WrkMast();
- wrkMast.setWrkNo(workNo);
- wrkMast.setIoTime(now);
- wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
- wrkMast.setIoType(110); // 鍏ュ嚭搴撶姸鎬侊細 110.绌烘澘鍑哄簱
- wrkMast.setIoPri(10D);
- wrkMast.setSourceStaNo(sourceStaNo); // 婧愮珯
- wrkMast.setStaNo(param.getOutSite()); // 鐩爣绔�
- wrkMast.setCrnNo(locMast.getCrnNo());
- wrkMast.setSourceLocNo(locNo); // 婧愬簱浣�
- wrkMast.setFullPlt("N"); // 婊℃澘锛歒
- wrkMast.setPicking("N"); // 鎷f枡
- wrkMast.setExitMk("N"); // 閫�鍑�
- wrkMast.setEmptyMk("Y"); // 绌烘澘
- wrkMast.setLinkMis("N");
- wrkMast.setAppeUser(userId);
- wrkMast.setAppeTime(now);
- wrkMast.setModiUser(userId);
- wrkMast.setModiTime(now);
- boolean res = wrkMastService.insert(wrkMast);
- if (!res) {
- throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+ LocMast locMastNew = null;
+ if(isSupplement){
+ // 琛ュ厖鐨勫簱浣嶏細鏍规嵁鏄乏渚ц繕鏄彸渚цˉ鍏咃紝鍐冲畾浼樺厛绾ф柟鍚�
+ if (Boolean.TRUE.equals(isLeftSideSupplement.get())) {
+ // 宸︿晶琛ュ厖 鈫� 浼樺厛绾ц緝浣庯紙鏅氬嚭锛�
+ ioPri = BASE_PRI + index * 1.0;
+ } else {
+ // 鍙充晶琛ュ厖 鈫� 浼樺厛绾ц緝楂橈紙鏃╁嚭锛�
+ ioPri = BASE_PRI - index * 1.0;
+ }
+ locMastNew = commonService.searchEmptyPallet(null);
+ wrkMast.setWrkNo(workNo);
+ wrkMast.setIoTime(now);
+ wrkMast.setWrkSts(0L);
+ wrkMast.setIoType(ioType);
+ wrkMast.setIoPri(ioPri);
+ wrkMast.setSourceStaNo(null);
+ wrkMast.setLocNo(locMastNew.getLocNo());
+ wrkMast.setStaNo(null);
+ wrkMast.setCrnNo(locMast.getCrnNo());
+ wrkMast.setSourceLocNo(locNo);
+ wrkMast.setFullPlt("N");
+ wrkMast.setPicking("N");
+ wrkMast.setExitMk("N");
+ wrkMast.setEmptyMk("Y");
+ wrkMast.setLinkMis("N");
+ wrkMast.setAppeUser(userId);
+ wrkMast.setAppeTime(now);
+ wrkMast.setModiUser(userId);
+ wrkMast.setModiTime(now);
+ }else{
+ ioPri = BASE_PRI + index * 1.0;
+ wrkMast.setWrkNo(workNo);
+ wrkMast.setIoTime(now);
+ wrkMast.setWrkSts(0L);
+ wrkMast.setIoType(ioType);
+ wrkMast.setIoPri(ioPri);
+ wrkMast.setSourceStaNo(sourceStaNo);
+ wrkMast.setStaNo(param.getOutSite());
+ wrkMast.setCrnNo(locMast.getCrnNo());
+ wrkMast.setSourceLocNo(locNo);
+ wrkMast.setFullPlt("N");
+ wrkMast.setPicking("N");
+ wrkMast.setExitMk("N");
+ wrkMast.setEmptyMk("Y");
+ wrkMast.setLinkMis("N");
+ wrkMast.setAppeUser(userId);
+ wrkMast.setAppeTime(now);
+ wrkMast.setModiUser(userId);
+ wrkMast.setModiTime(now);
}
- // 鏇存柊搴撲綅鐘舵�� D.绌烘澘 -> R.鍑哄簱棰勭害
- if (locMast.getLocSts().equals("D")){
+
+ if (!wrkMastService.insert(wrkMast)) {
+ throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝搴撲綅锛�" + locNo);
+ }
+
+ if(locMastNew != null){
+ if ("O".equals(locMastNew.getLocSts())) {
+ locMastNew.setLocSts("S");
+ locMastNew.setModiUser(userId);
+ locMastNew.setModiTime(now);
+ if (!locMastService.updateById(locMastNew)) {
+ throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
+ }
+ } else {
+ throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
+ }
+ }
+
+ // 鏇存柊搴撲綅鐘舵�� D 鈫� R
+ if ("D".equals(locMast.getLocSts())) {
locMast.setLocSts("R");
locMast.setModiUser(userId);
locMast.setModiTime(now);
if (!locMastService.updateById(locMast)) {
- throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐�");
+ throw new CoolException("鏇存柊搴撲綅鐘舵�佸け璐ワ紝搴撲綅锛�" + locNo);
}
+ } else {
+ throw new CoolException("搴撲綅鐘舵�佸紓甯革紝闈炵┖鏉跨姸鎬侊細" + locNo);
}
}
}
@@ -671,12 +1329,13 @@
if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
throw new CoolException("褰撳墠宸ヤ綔妗e凡瀹屾垚");
}
- // 鍏ュ簱 + 搴撲綅杞Щ
- if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
- wrkMast.setWrkSts(4L);
// 鍑哄簱
- } else if (wrkMast.getWrkSts() > 10) {
+ if (wrkMast.getIoType() > 100) {
wrkMast.setWrkSts(14L);
+ // 鍏ュ簱 + 搴撲綅杞Щ
+ } else if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10 || wrkMast.getIoType()==11) {
+ wrkMast.setWrkSts(4L);
+
}
Date now = new Date();
wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
@@ -822,7 +1481,7 @@
String locNo = ""; // 寰呬慨鏀圭洰鏍囧簱浣�
String locSts = ""; // 寰呬慨鏀圭洰鏍囧簱浣嶇姸鎬�
// 鍏ュ簱鍙栨秷锛堜慨鏀圭洰鏍囧簱浣嶏級
- if (wrkMast.getWrkSts() < 4) {
+ if (wrkMast.getIoType() < 100) {
locNo = wrkMast.getLocNo();
locSts = "O";
@@ -839,10 +1498,10 @@
locMastService.updateById(locMast);
}
// 鍑哄簱鍙栨秷锛堜慨鏀规簮搴撲綅锛�
- } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
+ } else if (wrkMast.getIoType() > 100 && wrkMast.getWrkSts() != 14) {
locNo = wrkMast.getSourceLocNo();
// 鍑哄簱 ===>> F.鍦ㄥ簱
- if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
+ if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
locSts = "F";
// 绌烘澘鍑哄簱 ===>> D.绌烘《/绌烘爤鏉�
} else if (wrkMast.getIoType() == 110) {
@@ -874,8 +1533,7 @@
waitPakinService.update(waitPakin, new EntityWrapper<WaitPakin>()
// .eq("order_no", waitPakin.getOrderNo())
.eq("zpallet",waitPakin.getZpallet())
- .eq("matnr", waitPakin.getMatnr())
- .eq("batch", waitPakin.getBatch()));
+ .eq("matnr", waitPakin.getMatnr()));
}
}
}
@@ -960,6 +1618,51 @@
if (!wrkMastRes || !locMastRes) {
throw new CoolException("淇濆瓨鏁版嵁澶辫触");
}
+
+ //wms鍙栨秷浠诲姟 鍚屾椂璋冪敤wcs浠诲姟鍙栨秷鎺ュ彛閫氱煡wcs
+ WrkCancel wrkCancel = new WrkCancel();
+ Date date = new Date();
+ DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ wrkCancel.setTaskId(workNo); // 浠诲姟鍙�
+ wrkCancel.setMsgTime(dateFormat.format(date)); // 鍙栨秷鏃堕棿
+ wrkCancel.setWarehouse(warehouse); // 浠撳簱缂栫爜
+
+ String response = "";
+ boolean flag = false;
+ try {
+ response = new HttpHandler.Builder()
+ .setUri(url)
+ .setPath(cancel)
+ .setJson(JSON.toJSONString(wrkCancel))
+ .build()
+ .doPost();
+ JSONObject jsonObject = JSON.parseObject(response);
+ if (jsonObject.getInteger("returnStatus") == 0){
+ flag = true;
+ }else {
+ log.error("wms鍙栨秷浠诲姟涓嬪彂wcs澶辫触--->url锛歿}锛況equest锛歿}锛況esponse锛歿}", url+"/"+cancel, JSON.toJSONString(wrkCancel), response);
+ throw new CoolException("wms鍙栨秷浠诲姟涓嬪彂wcs澶辫触");
+ }
+ }catch (Exception e){
+ log.error("fail", e);
+ }finally {
+ try {
+ //淇濆瓨鎺ュ彛鏃ュ織
+ apiLogService.save(
+ "wms涓嬪彂浠诲姟缁檞cs",
+ url+"/"+cancel,
+ null,
+ "127.0.0.1",
+ JSON.toJSONString(wrkCancel),
+ response,
+ flag
+ );
+ }catch (Exception e){
+ log.error("",e);
+ }
+ }
+
+
}
@Override
--
Gitblit v1.9.1