From c312a110ee4823a4a1f912a05e9648edc56f96e7 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 06 六月 2025 15:48:42 +0800 Subject: [PATCH] DO 单生成出库单功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java | 365 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 338 insertions(+), 27 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java index dc5064e..0b4fc0b 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java @@ -5,50 +5,110 @@ import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.framework.exception.CoolException; +import com.vincent.rsf.server.api.controller.params.TaskInParam; +import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto; import com.vincent.rsf.server.api.entity.dto.LocTypeDto; -import com.vincent.rsf.server.manager.entity.DeviceBind; -import com.vincent.rsf.server.manager.entity.Loc; -import com.vincent.rsf.server.manager.service.DeviceBindService; +import com.vincent.rsf.server.manager.entity.*; +import com.vincent.rsf.server.manager.enums.LocStsType; +import com.vincent.rsf.server.manager.enums.TaskStsType; +import com.vincent.rsf.server.manager.enums.TaskType; +import com.vincent.rsf.server.manager.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import javax.annotation.RegEx; +import javax.annotation.Resource; import java.util.List; +@Component public class LocUtils { + + public static final Logger logger = LoggerFactory.getLogger(LocUtils.class); + + private static List<Integer> doubleLocs; + + private static Boolean isDoubleDeep; + + @Autowired + private SlaveProperties slavePropertie; + + @PostConstruct + public void init() { + doubleLocs = slavePropertie.getDoubleLocs(); + isDoubleDeep = slavePropertie.isDoubleDeep(); + } + /** * 鑾峰彇 娴呭簱浣嶅搴旂殑娣卞簱浣嶅彿 */ - public static String getDeepLoc(SlaveProperties slaveProperties, String shallowLoc) { - int row = getRow(shallowLoc); - int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); - int targetRow; - if (remainder == 2) { - targetRow = row - 1; - } else if (remainder == 3) { - targetRow = row + 1; - } else { - throw new CoolException(shallowLoc + "涓嶆槸娴呭簱浣嶏紝绯荤粺绻佸繖"); + public static String getDeepLoc(String shallowLoc) { + LocService locService = SpringUtils.getBean(LocService.class); + Loc shaLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc)); + int row = shaLoc.getRow()-1; + boolean contains = doubleLocs.contains(row); + Loc deepLoc = null; + if (contains) { + deepLoc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getAreaId, shaLoc.getAreaId()) + .eq(Loc::getRow, row) + .eq(Loc::getCol, shaLoc.getCol()) + .eq(Loc::getLev, shaLoc.getLev()) + ); + }else { + deepLoc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getAreaId, shaLoc.getAreaId()) + .eq(Loc::getRow, shaLoc.getRow()+1) + .eq(Loc::getCol, shaLoc.getCol()) + .eq(Loc::getLev, shaLoc.getLev()) + ); } - return zerofill(String.valueOf(targetRow), 2) + shallowLoc.substring(2); + return deepLoc.getCode(); } /** * 鑾峰彇 娣卞簱浣嶅搴旂殑娴呭簱浣嶅彿 */ - public static String getShallowLoc(SlaveProperties slaveProperties, String deepLoc) { - int row = getRow(deepLoc); - int remainder = (int) Arith.remainder(row, slaveProperties.getGroupCount()); - int shallowRow = remainder == 1 ? (row + 1) : (row - 1); - return zerofill(String.valueOf(shallowRow), 2) + deepLoc.substring(2); + public static String getShallowLoc(String deepLoc) { + LocService locService = SpringUtils.getBean(LocService.class); + Loc depLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, deepLoc)); + int row; + if (depLoc.getRow() != 1) { + row = depLoc.getRow()-1; + } else { + row = depLoc.getRow(); + } + boolean contains = doubleLocs.contains(row); + Loc shallowLoc = null; + if (!contains) { + shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getAreaId, depLoc.getAreaId()) + .eq(Loc::getRow, row) + .eq(Loc::getCol, depLoc.getCol()) + .eq(Loc::getLev, depLoc.getLev()) + ); + }else { + shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getAreaId, depLoc.getAreaId()) + .eq(Loc::getRow, depLoc.getRow()+1) + .eq(Loc::getCol, depLoc.getCol()) + .eq(Loc::getLev, depLoc.getLev()) + ); + } + return shallowLoc.getCode(); } /** * 鍒ゆ柇鏄惁涓烘祬搴撲綅 */ - public static boolean isShallowLoc(SlaveProperties slaveProperties, String locNo) { - if (slaveProperties.isDoubleDeep()) { + public static boolean isShallowLoc(String locNo) { + if (isDoubleDeep) { int row = getRow(locNo); - return !slaveProperties.getDoubleLocs().contains(row); + return !doubleLocs.contains(row); } else { return false; } @@ -71,13 +131,10 @@ //搴撲綅鎺掑彿鍒嗛厤 public static int[] LocNecessaryParameters(DeviceBind deviceBind, Integer curRow, Integer crnNumber) { - return LocNecessaryParametersDoubleExtension(curRow, crnNumber); //宸插畬鍠� - - } - //缁忓吀鍙屼几搴撲綅 + //缁忓吀鍙屼几搴撲綅, 鑾峰彇鍙屾繁鎺� public static int[] LocNecessaryParametersDoubleExtension( Integer curRow, Integer crnNumber) { int[] necessaryParameters = new int[]{0, 0, 0, 0}; @@ -117,7 +174,12 @@ */ public static int getRow(String locNo) { if (!Cools.isEmpty(locNo)) { - return Integer.parseInt(locNo.substring(0, 2)); + LocService locService = SpringUtils.getBean(LocService.class); + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, locNo)); + if (null == loc) { + throw new RuntimeException("搴撲綅瑙f瀽寮傚父"); + } + return loc.getRow(); } throw new RuntimeException("搴撲綅瑙f瀽寮傚父"); } @@ -150,6 +212,15 @@ // 濡傛灉婧愬簱浣嶆槸楂樺簱浣嶏紝鐩爣搴撲綅鏄綆搴撲綅 return dto.getLocType1().equals(Integer.parseInt(loc.getType())); } + + public static String getCrnLoc() { +// SlaveProperties bean = SpringUtils.getBean(SlaveProperties.class); + System.out.println(doubleLocs); + + return null; + } + + public static String zerofill(String msg, Integer count) { if (msg.length() == count) { return msg; @@ -163,4 +234,244 @@ return msgBuilder.toString(); } } + + /** + * 鑾峰彇鍫嗗灈鏈哄簱浣嶄俊鎭� + * @param deviceBind + * @param area + * @param sourceStaNo + * @param matnr + * @param batch + * @param locTypeDto + * @param times + * @param ioType 浣滀笟绫诲瀷锛�*蹇呬紶鍙傛暟锛� + * @return + */ + public static InTaskMsgDto getLocNoCrn(DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) { + DeviceBindService deviceBindService = SpringUtils.getBean(DeviceBindService.class); + DeviceSiteService deviceSiteService = SpringUtils.getBean(DeviceSiteService.class); + LocService locService = SpringUtils.getBean(LocService.class); + LocItemService locItemService = SpringUtils.getBean(LocItemService.class); + + if (Cools.isEmpty(matnr)) { //鐗╂枡鍙� + matnr = ""; + } + if (Cools.isEmpty(batch)) { //鎵规 + batch = ""; + } + // 鍒濆鍖栧弬鏁� + int channel = 0; //鍫嗗灈鏈哄彿 + int nearRow = 0; //鏈�娴呭簱浣嶆帓 + int curRow = 0; //鏈�娣卞簱浣嶆帓 + int rowCount = 0; //杞杞 + Loc loc = null; // 鐩爣搴撲綅 + + InTaskMsgDto inTaskMsgDto = new InTaskMsgDto(); + + int sRow = deviceBind.getStartRow(); + int eRow = deviceBind.getEndRow(); + int deviceQty = deviceBind.getDeviceQty(); + + // ===============>>>> 寮�濮嬫墽琛� + curRow = deviceBind.getCurrentRow(); + + //姝ょ▼搴忕敤浜庝紭鍖栧爢鍨涙満寮傚父鏃剁殑杩愯鏃堕棿 + for (int i = times; i <= deviceQty * 2; i++) { + int[] locNecessaryParameters = LocUtils.LocNecessaryParameters(deviceBind, curRow, deviceQty); + curRow = locNecessaryParameters[1]; + channel = locNecessaryParameters[2]; + rowCount = locNecessaryParameters[0]; + nearRow = locNecessaryParameters[3]; + break; + } + if (nearRow == 0) { + throw new CoolException("鏃犲彲鐢ㄥ爢鍨涙満"); + } + //鍏ュ簱闈犺繎鎽嗘斁 + if (ioType == 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr)) { + if (nearRow != curRow) { + List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getMatnrCode, matnr)); + for (LocItem locItem : locItems) { + Loc loc1 = locService.getById(locItem.getLocId()); + if (LocUtils.isShallowLoc(loc1.getCode())) { + continue; + } + String shallowLocNo = LocUtils.getShallowLoc(loc1.getCode()); + // 妫�娴嬬洰鏍囧簱浣嶆槸鍚︿负绌哄簱浣� + Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLocNo)); + if (shallowLoc != null && shallowLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { + if (LocUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) { + loc = shallowLoc; + channel = shallowLoc.getChannel(); + break; + } + } + } + } + } + +// // 闈犺繎鎽嗘斁瑙勫垯 --- 绌烘墭 //浜掗�氱増 +// if (ioType == 10 && deviceBind.getEmptySimilar().equals("1")) { +// List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() +// .eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow).eq("whs_type", rowLastnoType.getType().longValue())); +// if (!locMasts.isEmpty()) { +// for (LocMast loc : locMasts) { +// if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) { +// continue; +// } +// String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo()); +// // 妫�娴嬬洰鏍囧簱浣嶆槸鍚︿负绌哄簱浣� +// LocMast shallowLoc = locMastService.selectById(shallowLocNo); +// if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) { +// if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) { +// if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) { +// locMast = shallowLoc; +// crnNo = locMast.getCrnNo(); +// break; +// } +// } +// } +// } +// } +// } + //鏌ユ壘璺緞 + DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() + .eq(DeviceSite::getType, ioType) + .eq(DeviceSite::getSite, sourceStaNo) + .eq(DeviceSite::getChannel, channel) + ); + if (Cools.isEmpty(deviceSite)) { + channel = 0; + } else { + inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite())); + } + + //鏇存柊褰撳墠鎺� + deviceBind.setCurrentRow(curRow); + deviceBindService.updateById(deviceBind); + + // 寮�濮嬫煡鎵惧簱浣� ==============================>> + + // 1.鎸夎鍒欐煡鎵惧簱浣� + if (Cools.isEmpty(loc) && channel != 0) { + List<Loc> locMasts = null; + locMasts = locService.list(new LambdaQueryWrapper<Loc>() + .eq(Loc::getRow, nearRow) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getType, locTypeDto.getLocType1()) + .eq(Loc::getAreaId, area) + .orderByAsc(Loc::getLev) + .orderByAsc(Loc::getCol) + ); + for (Loc locMast1 : locMasts) { + if (!LocUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { + continue; + } + String shallowLoc = LocUtils.getDeepLoc(locMast1.getCode()); + if ((ioType == TaskStsType.GENERATE_IN.id && deviceBind.getBeSimilar().equals("1"))) { + //鐩镐技鐗╂枡鎵撳紑锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾病璐у氨鏀炬繁搴撲綅锛屾湁璐у氨涓嶆搷浣� + Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, shallowLoc) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getAreaId, area) + ); + if (!Cools.isEmpty(locMast2)) { + loc = locMast2; + break; + } + } else { + //鐩镐技鐗╂枡鍏抽棴锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾湁璐у氨鏀炬祬搴撲綅锛屾棤璐у氨涓嶆搷浣� + Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, shallowLoc) + .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type, LocStsType.LOC_STS_TYPE_F.type) + .eq(Loc::getAreaId, area) + ); + if (!Cools.isEmpty(locMast2)) { + loc = locMast1; + break; + } else { + locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, shallowLoc) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getAreaId, area) + ); + if (!Cools.isEmpty(locMast2)) { + loc = locMast2; + break; + } + } + } + } + if (Cools.isEmpty(loc) && deviceBind.getBeSimilar().equals("1")) { + for (Loc locMast1 : locMasts) { + if (!LocUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { + continue; + } + if (deviceBind.getBeSimilar().equals("1")) { + String shallowLoc = LocUtils.getDeepLoc(locMast1.getCode()); + Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, shallowLoc) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getAreaId, area) + ); + if (!Cools.isEmpty(locMast2)) { + loc = locMast2; + break; + } else { + locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getCode, shallowLoc) + .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type, LocStsType.LOC_STS_TYPE_D.type) + .eq(Loc::getAreaId, area) + ); + if (!Cools.isEmpty(locMast2)) { + loc = locMast1; + break; + } + } + } else { + if (!Cools.isEmpty(locMast1)) { + loc = locMast1; + break; + } + } + } + } + } + //鏌ヨ褰撳墠搴撲綅绫诲瀷绌哄簱浣� 灏忎簬5涓垯locmast = null + List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>() + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type) + .eq(Loc::getChannel, channel) + .eq(Loc::getType, locTypeDto.getLocType1()) + .eq(Loc::getAreaId, area) + ); + if (null != locTypeLocMasts && locTypeLocMasts.size() <= 5) { + loc = null; + } + // 閫掑綊鏌ヨ + if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) { + // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊 + if (times < rowCount * 2) { + times = times + 1; + return getLocNoCrn(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, times, ioType); + + } + // 2.搴撲綅褰撳墠鎵�灞炲昂瀵告棤绌哄簱浣嶆椂锛岃皟鏁村昂瀵稿弬鏁帮紝鍚戜笂鍏煎妫�绱㈠簱浣� + if (locTypeDto.getLocType1() < 3) { + int i = locTypeDto.getLocType1() + 1; + locTypeDto.setLocType1(i); + return getLocNoCrn(deviceBind, area, sourceStaNo, matnr, batch, locTypeDto, 0, ioType); + } + throw new CoolException("娌℃湁绌哄簱浣�"); + } + String locNo = loc.getCode(); + + // 杩斿洖dto + inTaskMsgDto.setDeviceNo(channel); + inTaskMsgDto.setSourceStaNo(sourceStaNo); +// inTaskMsgDto.setStaNo(); + inTaskMsgDto.setLocNo(locNo); + return inTaskMsgDto; + } + + } -- Gitblit v1.9.1