From 16f8d56d61ce93930f9f29e8fbd465de5af90370 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期二, 29 四月 2025 09:12:25 +0800
Subject: [PATCH] #wms端生成任务优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java |  366 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 345 insertions(+), 21 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index 263c812..d55b581 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -1,22 +1,36 @@
 package com.vincent.rsf.server.api.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto;
 import com.vincent.rsf.server.api.entity.dto.LocTypeDto;
 import com.vincent.rsf.server.api.controller.params.TaskInParam;
+import com.vincent.rsf.server.api.entity.enums.OrderType;
+import com.vincent.rsf.server.api.entity.enums.TaskStsType;
 import com.vincent.rsf.server.api.entity.enums.TaskType;
 import com.vincent.rsf.server.api.service.WcsService;
 import com.vincent.rsf.server.api.utils.LocUtils;
 import com.vincent.rsf.server.api.utils.SlaveProperties;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.enums.PakinIOStatus;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.service.impl.LocServiceImpl;
+import com.vincent.rsf.server.manager.utils.LocManageUtil;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.enums.LocStsType;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
 public class WcsServiceImpl implements WcsService {
@@ -34,12 +48,256 @@
     private SlaveProperties slaveProperties;
     @Autowired
     private WarehouseAreasService warehouseAreasService;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private TaskItemService taskItemService;
+    @Autowired
+    private WaitPakinItemService waitPakinItemService;
 
     @Override
-    public InTaskMsgDto createInTask(TaskInParam param) {
+    @Transactional(rollbackFor = Exception.class)
+    public InTaskMsgDto createInTask(TaskInParam param, Long loginUserId) {
+        // 鑾峰彇搴撲綅鍙�
         InTaskMsgDto locNo = getLocNo(param);
+
+        // 楠岃瘉璁惧绔欑偣
+        DeviceSite deviceSite = validateDeviceSite(param);
+
+        // 楠岃瘉缁勬嫋鐘舵��
+        WaitPakin waitPakin = validateWaitPakin(param.getBarcode());
+
+        // 鐢熸垚浠诲姟缂栫爜
+        String ruleCode = generateTaskCode();
+
+        // 鍒涘缓骞朵繚瀛樹换鍔�
+        Task task = createTask(ruleCode, locNo.getLocNo(), waitPakin.getBarcode(),
+                deviceSite.getDeviceSite(), param.getSourceStaNo().toString(), loginUserId);
+
+        // 鏇存柊搴撲綅鐘舵��
+        updateLocStatus(task.getTargLoc(), waitPakin.getBarcode());
+
+        // 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
+        List<WaitPakinItem> waitPakinItems = getWaitPakinItems(waitPakin.getId());
+
+        // 鍒涘缓骞朵繚瀛樹换鍔℃槑缁�
+        saveTaskItems(task.getId(), waitPakinItems, loginUserId);
+
+        // 鏇存柊缁勬墭鐘舵��
+        updateWaitPakinStatus(param.getBarcode(), loginUserId);
+
+        // 璁剧疆宸ヤ綔鍗曞彿骞惰繑鍥�
+        locNo.setWorkNo(ruleCode);
         return locNo;
     }
+
+    /**
+     * 楠岃瘉璁惧绔欑偣
+     */
+    private DeviceSite validateDeviceSite(TaskInParam param) {
+        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
+                .eq(DeviceSite::getSite, param.getSourceStaNo())
+                .eq(DeviceSite::getType, param.getIoType()));
+
+        if (Objects.isNull(deviceSite)) {
+            throw new CoolException("绔欑偣涓嶅瓨鍦紒锛�");
+        }
+        return deviceSite;
+    }
+
+    /**
+     * 楠岃瘉缁勬嫋鐘舵��
+     */
+    private WaitPakin validateWaitPakin(String barcode) {
+        WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                .eq(WaitPakin::getBarcode, barcode)
+                .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)));
+
+        if (Cools.isEmpty(waitPakin)) {
+            throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
+        }
+        return waitPakin;
+    }
+
+    /**
+     * 鐢熸垚浠诲姟缂栫爜
+     */
+    private String generateTaskCode() {
+        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
+        if (StringUtils.isBlank(ruleCode)) {
+            throw new CoolException("缂栫爜閿欒锛氳纭缂栫爜銆孲YS_TASK_CODE銆嶆槸鍚﹀凡鐢熸垚!!");
+        }
+        return ruleCode;
+    }
+
+    /**
+     * 鍒涘缓骞朵繚瀛樹换鍔�
+     */
+    private Task createTask(String ruleCode, String targetLoc, String barcode,
+                            String targetSite, String sourceSiteNo, Long loginUserId) {
+        Task task = new Task();
+        task.setTaskCode(ruleCode)
+                .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue())
+                .setTaskType(TaskType.TASK_TYPE_IN.type.shortValue())
+                .setTargLoc(targetLoc)
+                .setBarcode(barcode)
+                .setTargSite(targetSite)
+                .setCreateBy(loginUserId)
+                .setUpdateBy(loginUserId)
+                .setOrgSite(sourceSiteNo);
+
+        if (!taskService.save(task)) {
+            throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒");
+        }
+        return task;
+    }
+
+    /**
+     * 鏇存柊搴撲綅鐘舵��
+     */
+    private void updateLocStatus(String locCode, String barcode) {
+        boolean updated = locService.update(new LambdaUpdateWrapper<Loc>()
+                .eq(Loc::getCode, locCode)
+                .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type)
+                .set(Loc::getBarcode, barcode));
+
+        if (!updated) {
+            throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒");
+        }
+    }
+
+    /**
+     * 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
+     */
+    private List<WaitPakinItem> getWaitPakinItems(Long pakinId) {
+        List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(
+                new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakinId));
+
+        if (waitPakinItems.isEmpty()) {
+            throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪");
+        }
+        return waitPakinItems;
+    }
+
+    /**
+     * 鍒涘缓骞朵繚瀛樹换鍔℃槑缁�
+     */
+    private void saveTaskItems(Long taskId, List<WaitPakinItem> waitPakinItems, Long loginUserId) {
+        List<TaskItem> taskItems = waitPakinItems.stream().map(item -> {
+            TaskItem taskItem = new TaskItem();
+            BeanUtils.copyProperties(item, taskItem);
+
+            return taskItem.setTaskId(taskId)
+                    .setOrderType(OrderType.ORDER_RECEIPT.type)
+                    .setSource(item.getId())
+                    .setTrackCode(item.getTrackCode())
+                    .setCreateBy(loginUserId)
+                    .setUpdateBy(loginUserId)
+                    .setOrderId(item.getAsnId())
+                    .setOrderItemId(item.getAsnItemId());
+        }).collect(Collectors.toList());
+
+        if (!taskItemService.saveBatch(taskItems)) {
+            throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
+        }
+    }
+
+    /**
+     * 鏇存柊缁勬墭鐘舵��
+     */
+    private void updateWaitPakinStatus(String barcode, Long loginUserId) {
+        boolean updated = waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
+                .eq(WaitPakin::getBarcode, barcode)
+                .set(WaitPakin::getUpdateBy, loginUserId)
+                .set(WaitPakin::getCreateBy, loginUserId)
+                .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+
+        if (!updated) {
+            throw new CoolException("缁勬墭鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+    }
+
+//    @Override
+//    public InTaskMsgDto createInTask(TaskInParam param, Long loginUserId) {
+//        InTaskMsgDto locNo = getLocNo(param);
+//        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
+//                .eq(DeviceSite::getSite, param.getSourceStaNo())
+//                .eq(DeviceSite::getType,param.getIoType())
+//        );
+//        if (Objects.isNull(deviceSite)) {
+//            throw new CoolException("绔欑偣涓嶅瓨鍦紒锛�");
+//        }
+//
+//        WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+//                .eq(WaitPakin::getBarcode, param.getBarcode())
+//                .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)));
+//        if (Cools.isEmpty(waitPakin)) {
+//            throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
+//        }
+//
+//            List<TaskItem> taskItems = new ArrayList<>();
+//            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
+//            if (StringUtils.isBlank(ruleCode)) {
+//                throw new CoolException("缂栫爜閿欒锛氳纭缂栫爜銆孲YS_TASK_CODE銆嶆槸鍚﹀凡鐢熸垚!!");
+//            }
+//            Task task = new Task();
+//            task.setTaskCode(ruleCode)
+//                    .setTaskStatus(TaskStsType.GENERATE_IN.id.shortValue())
+//                    .setTaskType(TaskType.TASK_TYPE_IN.type.shortValue())
+//                    .setTargLoc(locNo.getLocNo())
+//                    .setBarcode(waitPakin.getBarcode())
+//                    .setTargSite(deviceSite.getDeviceSite())
+//                    .setCreateBy(loginUserId)
+//                    .setUpdateBy(loginUserId)
+//                    .setOrgSite(param.getSourceStaNo().toString());
+//
+//
+//
+//
+//            if (!taskService.save(task)) {
+//                throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒");
+//            }
+//            if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())
+//                    .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, waitPakin.getBarcode()))) {
+//                throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒");
+//            }
+//            /**鑾峰彇缁勬嫋鏄庣粏**/
+//            List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId()));
+//            if (waitPakinItems.isEmpty()) {
+//                throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪");
+//            }
+//            waitPakinItems.forEach(item -> {
+//                TaskItem taskItem = new TaskItem();
+//                BeanUtils.copyProperties(item, taskItem);
+////                AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, item.getAsnId()));
+////                if (Objects.isNull(order)) {
+////                    throw new CoolException("鏁版嵁閿欒: 鍗曟嵁涓嶅瓨鍦紒锛�");
+////                }
+//                taskItem.setTaskId(task.getId())
+//                        .setOrderType(OrderType.ORDER_RECEIPT.type)
+//                        .setSource(item.getId())
+//                        .setTrackCode(item.getTrackCode())
+//                        .setCreateBy(loginUserId)
+//                        .setUpdateBy(loginUserId)
+//                        .setOrderId(item.getAsnId())
+//                        .setOrderItemId(item.getAsnItemId());
+//                taskItems.add(taskItem);
+//            });
+//            if (!taskItemService.saveBatch(taskItems)) {
+//                throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
+//            }
+//
+//
+//        if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
+//                .eq(WaitPakin::getBarcode, param.getBarcode())
+//                .set(WaitPakin::getUpdateBy, loginUserId)
+//                .set(WaitPakin::getCreateBy, loginUserId)
+//                .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val))) {
+//            throw new CoolException("缁勬墭鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+//        }
+//        locNo.setWorkNo(ruleCode);
+//        return locNo;
+//    }
 
     public InTaskMsgDto getLocNo(TaskInParam param) {
         String matnr = null; String batch = null;
@@ -57,7 +315,11 @@
         if (Cools.isEmpty(deviceSites)) {
             throw new CoolException("鏈壘鍒扮珯鐐硅矾寰勪俊鎭�");
         }
-        WarehouseAreas warehouseArea = warehouseAreasService.getById(param.getArea());
+        DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(param.getSourceStaNo()));
+        if (Cools.isEmpty(deviceBind)) {
+            throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===>搴撲綅瑙勫垯鏈煡");
+        }
+        WarehouseAreas warehouseArea = warehouseAreasService.getById(deviceBind.getTypeId());
         if (Cools.isEmpty(warehouseArea)) {
             throw new CoolException("鏈壘鍒版墍灞炲簱鍖轰俊鎭�");
         }
@@ -65,17 +327,18 @@
         InTaskMsgDto dto = null;
         switch (warehouseArea.getType()) {
             case "CRN": //鍫嗗灈鏈�
-                dto = getLocNoCrn(param.getArea(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType());
+                dto = getLocNoCrn(deviceBind,warehouseArea.getId(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType());
                 break;
             case "SXC": //鍥涘悜搴�
                 break;
-            case "CTU": //鍥涘悜搴�
+            case "CTU": //ctu
+                dto = getLocNoCtu(deviceBind,warehouseArea.getId(), param.getSourceStaNo(), matnr,batch, locTypeDto, 0, param.getIoType());
                 break;
         }
         return dto;
     }
 
-    private InTaskMsgDto getLocNoCrn(Integer area,Integer sourceStaNo, String matnr, String batch,LocTypeDto locTypeDto, int times,Integer ioType){
+    private InTaskMsgDto getLocNoCrn(DeviceBind deviceBind,Long area,Integer sourceStaNo, String matnr, String batch,LocTypeDto locTypeDto, int times,Integer ioType){
         if (Cools.isEmpty(matnr)) {  //鐗╂枡鍙�
             matnr = "";
         }
@@ -90,10 +353,7 @@
         Loc loc = null;     // 鐩爣搴撲綅
 
         InTaskMsgDto inTaskMsgDto = new InTaskMsgDto();
-        DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(sourceStaNo));
-        if (Cools.isEmpty(deviceBind)) {
-            throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===>搴撲綅瑙勫垯鏈煡");
-        }
+
         int sRow = deviceBind.getStartRow();
         int eRow = deviceBind.getEndRow();
         int deviceQty = deviceBind.getDeviceQty();
@@ -115,7 +375,7 @@
             throw new CoolException("鏃犲彲鐢ㄥ爢鍨涙満");
         }
         //鍏ュ簱闈犺繎鎽嗘斁
-        if (ioType== 1 && deviceBind.getBeSimilar().equals("1") && Cools.isEmpty(matnr)) {
+        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) {
@@ -126,7 +386,7 @@
                     String shallowLocNo = LocUtils.getShallowLoc(slaveProperties, loc1.getCode());
                     // 妫�娴嬬洰鏍囧簱浣嶆槸鍚︿负绌哄簱浣�
                     Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode,shallowLocNo));
-                    if (shallowLoc != null && shallowLoc.getUseStatus().equals("O")) {
+                    if (shallowLoc != null && shallowLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
                         if (LocUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
                                 loc = shallowLoc;
                                 deviceNo = shallowLoc.getDeviceNo();
@@ -185,7 +445,7 @@
             List<Loc> locMasts = null;
             locMasts = locService.list(new LambdaQueryWrapper<Loc>()
                     .eq(Loc::getRow, nearRow)
-                    .eq(Loc::getUseStatus, "O")
+                    .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
                     .eq(Loc::getType, locTypeDto.getLocType1())
                     .eq(Loc::getAreaId,area)
                     .orderByAsc(Loc::getLev)
@@ -200,7 +460,7 @@
                     //鐩镐技鐗╂枡鎵撳紑锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾病璐у氨鏀炬繁搴撲綅锛屾湁璐у氨涓嶆搷浣�
                     Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>()
                             .eq(Loc::getRow, shallowLoc)
-                            .eq(Loc::getUseStatus, "O")
+                            .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
                             .eq(Loc::getAreaId,area)
                     );
                     if (!Cools.isEmpty(locMast2)) {
@@ -211,7 +471,7 @@
                     //鐩镐技鐗╂枡鍏抽棴锛屽垽鏂繁搴撲綅鏈夋病鏈夎揣锛屾湁璐у氨鏀炬祬搴撲綅锛屾棤璐у氨涓嶆搷浣�
                     Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>()
                             .eq(Loc::getCode, shallowLoc)
-                            .in(Loc::getUseStatus, "D","F")
+                            .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type,LocStsType.LOC_STS_TYPE_F.type)
                             .eq(Loc::getAreaId,area)
                     );
                     if (!Cools.isEmpty(locMast2)) {
@@ -220,7 +480,7 @@
                     }else{
                         locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>()
                                 .eq(Loc::getCode, shallowLoc)
-                                .eq(Loc::getUseStatus, "O")
+                                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
                                 .eq(Loc::getAreaId,area)
                         );
                         if (!Cools.isEmpty(locMast2)) {
@@ -239,7 +499,7 @@
                         String shallowLoc = LocUtils.getDeepLoc(slaveProperties, locMast1.getCode());
                         Loc locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>()
                                 .eq(Loc::getCode, shallowLoc)
-                                .eq(Loc::getUseStatus, "O")
+                                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
                                 .eq(Loc::getAreaId,area)
                         );
                         if (!Cools.isEmpty(locMast2)) {
@@ -248,7 +508,7 @@
                         } else {
                             locMast2 = locService.getOne(new LambdaQueryWrapper<Loc>()
                                     .eq(Loc::getCode, shallowLoc)
-                                    .in(Loc::getUseStatus, "D","F")
+                                    .in(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type,LocStsType.LOC_STS_TYPE_D.type)
                                     .eq(Loc::getAreaId,area)
                             );
                             if (!Cools.isEmpty(locMast2)) {
@@ -267,7 +527,7 @@
         }
         //鏌ヨ褰撳墠搴撲綅绫诲瀷绌哄簱浣� 灏忎簬5涓垯locmast = null
         List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>()
-                .eq(Loc::getUseStatus, "O")
+                .eq(Loc::getUseStatus,LocStsType.LOC_STS_TYPE_O.type)
                 .eq(Loc::getDeviceNo, deviceNo)
                 .eq(Loc::getType, locTypeDto.getLocType1())
                 .eq(Loc::getAreaId,area)
@@ -276,18 +536,18 @@
             loc = null;
         }
         // 閫掑綊鏌ヨ
-        if (Cools.isEmpty(loc) || !loc.getUseStatus().equals("O")) {
+        if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
             // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊
             if (times < rowCount * 2) {
                 times = times + 1;
-                return getLocNoCrn(area,sourceStaNo,matnr,batch,locTypeDto,times, ioType);
+                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(area,sourceStaNo,matnr,batch,locTypeDto,0, ioType);
+                return getLocNoCrn(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,0, ioType);
             }
             throw new CoolException("娌℃湁绌哄簱浣�");
         }
@@ -300,4 +560,68 @@
         inTaskMsgDto.setLocNo(locNo);
         return inTaskMsgDto;
     }
+
+    private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind,Long area,Integer sourceStaNo, String matnr, String batch,LocTypeDto locTypeDto, int times,Integer ioType){
+        if (Cools.isEmpty(matnr)) {  //鐗╂枡鍙�
+            matnr = "";
+        }
+        if (Cools.isEmpty(batch)) {  //鎵规
+            batch = "";
+        }
+        int deviceNo = 0;
+        Loc loc = new Loc();
+        InTaskMsgDto inTaskMsgDto = new InTaskMsgDto();
+        List<Loc> loc1 = locService.list(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getAreaId, area)
+                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
+                .eq(Loc::getType, locTypeDto.getLocType1())
+                .orderByAsc(Loc::getLev)
+                .orderByAsc(Loc::getCol)
+                .orderByAsc(Loc::getRow)
+        );
+        for (Loc loc2 :loc1){
+            if (!LocUtils.locMoveCheckLocTypeComplete(loc2, locTypeDto)) {
+                continue;
+            }
+            loc = loc2;
+            break;
+        }
+        //鏌ユ壘璺緞
+        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
+                .eq(DeviceSite::getType, ioType)
+                .eq(DeviceSite::getSite, sourceStaNo)
+                .eq(DeviceSite::getDeviceCode, loc.getDeviceNo())
+        );
+        if (Cools.isEmpty(deviceSite)){
+            deviceNo = 0;
+            loc = null;
+        }else {
+            inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite()));
+        }
+        // 閫掑綊鏌ヨ
+        if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
+            // 褰撳墠宸烽亾鏃犵┖搴撲綅鏃讹紝閫掑綊璋冩暣鑷充笅涓�宸烽亾锛屾绱㈠叏閮ㄥ贩閬撴棤鏋滃悗锛岃烦鍑洪�掑綊
+            if (times < 5) {
+                times = times + 1;
+                return getLocNoCtu(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,times, ioType);
+
+            }
+            // 2.搴撲綅褰撳墠鎵�灞炲昂瀵告棤绌哄簱浣嶆椂锛岃皟鏁村昂瀵稿弬鏁帮紝鍚戜笂鍏煎妫�绱㈠簱浣�
+            if (locTypeDto.getLocType1() < 3) {
+                int i = locTypeDto.getLocType1() + 1;
+                locTypeDto.setLocType1(i);
+                return getLocNoCtu(deviceBind,area,sourceStaNo,matnr,batch,locTypeDto,0, ioType);
+            }
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+
+        String locNo = loc.getCode();
+
+        // 杩斿洖dto
+        inTaskMsgDto.setDeviceNo(deviceNo);
+        inTaskMsgDto.setSourceStaNo(sourceStaNo);
+//        inTaskMsgDto.setStaNo();
+        inTaskMsgDto.setLocNo(locNo);
+        return inTaskMsgDto;
+    }
 }

--
Gitblit v1.9.1