From ac4341ea6b66ae02427d39d35f41d42d78b2eb2e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 14 二月 2025 10:08:32 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java |  721 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 662 insertions(+), 59 deletions(-)

diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
index 92c46ad..c259f0a 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java
@@ -1,18 +1,25 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
-import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
+import com.zy.asrs.wms.asrs.entity.enums.*;
+import com.zy.asrs.wms.asrs.entity.param.FieldParam;
 import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
+import com.zy.asrs.wms.asrs.entity.param.LocAdjustParam;
+import com.zy.asrs.wms.asrs.entity.param.LocTransferParam;
 import com.zy.asrs.wms.asrs.service.*;
+import com.zy.asrs.wms.utils.LocUtils;
+import com.zy.asrs.wms.utils.OrderUtils;
+import com.zy.asrs.wms.utils.Utils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
 
 @Service("workService")
 public class WorkServiceImpl implements WorkService {
@@ -30,11 +37,43 @@
     @Autowired
     private TaskDetlFieldService taskDetlFieldService;
     @Autowired
+    private OrderService orderService;
+    @Autowired
     private OrderDetlService orderDetlService;
     @Autowired
     private LocService locService;
     @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private LocDetlFieldService locDetlFieldService;
+    @Autowired
     private LocStsService locStsService;
+    @Autowired
+    private TaskLogService taskLogService;
+    @Autowired
+    private TaskDetlLogService taskDetlLogService;
+    @Autowired
+    private TaskDetlFieldLogService taskDetlFieldLogService;
+    @Autowired
+    private LocUtils locUtils;
+    @Autowired
+    private ShelvesRuleService shelvesRuleService;
+    @Autowired
+    private LanewayRuleService lanewayRuleService;
+    @Autowired
+    private CircleRuleService circleRuleService;
+    @Autowired
+    private LocTypeBindService locTypeBindService;
+    @Autowired
+    private LocTypeService locTypeService;
+    @Autowired
+    private MatService matService;
+    @Autowired
+    private OrderUtils orderUtils;
+    @Autowired
+    private WaveDetlService waveDetlService;
+    @Autowired
+    private MatFieldService matFieldService;
 
     @Override
     public String generateTaskNo(Long taskType) {
@@ -49,20 +88,177 @@
     }
 
     @Override
-    public Loc generateLoc(Long taskType) {
-        LocSts locSts = locStsService.getOne(new LambdaQueryWrapper<LocSts>().eq(LocSts::getLocSts, String.valueOf(LocStsType.O)));
-        List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, locSts.getId()));
-        if (list.isEmpty()) {
-            throw new CoolException("娌℃湁绌哄簱浣�");
+    public Loc generateEmptyLoc(Long taskType, Integer locTypeHeight) {
+        List<ShelvesRule> shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper<ShelvesRule>().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime));
+        if(shelvesRules.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒�");
         }
-        return list.get(0);
+        ShelvesRule shelvesRule = shelvesRules.get(0);
+        //鍙敤宸烽亾
+        List<Long> laneList = shelvesRule.getLaneList();
+        //鍙敤宸烽亾Row
+        List<Integer> laneRowList = new ArrayList<>();
+        if (laneList != null) {
+            //鑾峰彇宸烽亾
+            List<LanewayRule> lanewayRules = lanewayRuleService.listByIds(laneList);
+            for (LanewayRule lanewayRule : lanewayRules) {
+                laneRowList.addAll(lanewayRule.getLaneX$());
+                laneRowList.addAll(lanewayRule.getLaneY$());
+            }
+        }
+
+        Integer currentLev = null;
+        if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) {
+            //浼樺厛绔嬩綋灞�
+            currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag);
+        }
+
+        List<ShelvesRuleDetl> ruleDetls = shelvesRule.getRuleDetl$();
+        if(ruleDetls.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒欐槑缁�");
+        }
+
+        Loc defaultLoc = null;
+
+        for (ShelvesRuleDetl ruleDetl : ruleDetls) {
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) {
+                //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+                defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight);
+                if (defaultLoc != null) {
+                    return defaultLoc;
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) {
+                //鑾峰彇鎺ㄨ崘搴撲綅
+                List<Loc> suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!suggestLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) {
+                //浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+                List<Loc> globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!globalLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterAllLoc(globalLoc);
+                    if(defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+        }
+
+        return defaultLoc;
+    }
+
+    @Override
+    public synchronized Loc generateLoc(Long taskType, String barcode, Integer locTypeHeight) {
+        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, barcode));
+        if (taskType != 10 && waitPakins.isEmpty()) {
+            throw new CoolException("鎵樼洏鏈粍鎵�");
+        }
+
+        WaitPakin waitPakin = waitPakins.get(0);
+        OrderDetl detl = waitPakin.getDetl$();
+        if (detl == null) {
+            throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
+        }
+        String batch = detl.getBatch();
+        List<FieldParam> uniqueFields = detl.getUniqueField();
+
+        Mat mat = detl.getMat$();
+        if (mat == null) {
+            throw new CoolException("鍟嗗搧涓嶅瓨鍦�");
+        }
+
+        return generateLoc(taskType, mat.getId(), batch, uniqueFields, locTypeHeight);
+    }
+
+    @Override
+    public synchronized Loc generateLoc(Long taskType, Long matId, String batch, List<FieldParam> uniqueFields, Integer locTypeHeight) {
+        Mat mat = matService.getById(matId);
+        if (mat == null) {
+            throw new CoolException("鍟嗗搧涓嶅瓨鍦�");
+        }
+
+        List<ShelvesRule> shelvesRules = shelvesRuleService.list(new LambdaQueryWrapper<ShelvesRule>().eq(ShelvesRule::getStatus, 1).orderByDesc(ShelvesRule::getCreateTime));
+        if (shelvesRules.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒�");
+        }
+        ShelvesRule shelvesRule = shelvesRules.get(0);
+        //鍙敤宸烽亾
+        List<Long> laneList = shelvesRule.getLaneList();
+        //鍙敤宸烽亾Row
+        List<Integer> laneRowList = new ArrayList<>();
+        if (laneList != null) {
+            //鑾峰彇宸烽亾
+            List<LanewayRule> lanewayRules = lanewayRuleService.listByIds(laneList);
+            for (LanewayRule lanewayRule : lanewayRules) {
+                laneRowList.addAll(lanewayRule.getLaneX$());
+                laneRowList.addAll(lanewayRule.getLaneY$());
+            }
+        }
+
+        Integer currentLev = null;
+        if (shelvesRule.getRuleType().equals(ShelvesRuleType.HIGH.id)) {
+            //浼樺厛绔嬩綋灞�
+            currentLev = circleRuleService.getCurrentValueByFlag(CircleRuleType.LEV.flag);
+        }
+
+        List<ShelvesRuleDetl> ruleDetls = shelvesRule.getRuleDetl$();
+        if (ruleDetls.isEmpty()) {
+            throw new CoolException("鏈厤缃笂鏋惰鍒欐槑缁�");
+        }
+
+        Loc defaultLoc = null;
+
+        for (ShelvesRuleDetl ruleDetl : ruleDetls) {
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.TASK_OR_LOC.id)) {
+                //浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
+                defaultLoc = locUtils.getNeighborLoc(taskType, mat.getId(), batch, uniqueFields, locTypeHeight);
+                if (defaultLoc != null) {
+                    return defaultLoc;
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.SUGGEST.id)) {
+                //鑾峰彇鎺ㄨ崘搴撲綅
+                List<Loc> suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), batch, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!suggestLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
+                    if (defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+
+            if (ruleDetl.getDetlType().equals(ShelvesRuleDetlType.COMPLETE.id)) {
+                //浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
+                List<Loc> globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight, laneRowList, currentLev);
+                //鑾峰彇搴撲綅
+                if (!globalLoc.isEmpty()) {
+                    defaultLoc = locUtils.filterAllLoc(globalLoc);
+                    if (defaultLoc != null) {
+                        return defaultLoc;
+                    }
+                }
+            }
+        }
+        return defaultLoc;
     }
 
     @Override
     @Transactional
     public boolean generatePakIn(GeneratePakInParam param) {
         List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode()));
-        if (waitPakins.isEmpty()) {
+        if (param.getTaskType() != 10 && waitPakins.isEmpty()) {
             throw new CoolException("鎵樼洏鏈粍鎵�");
         }
 
@@ -71,12 +267,20 @@
             throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
         }
 
+        Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, param.getBarcode()));
+        if (one != null) {
+            throw new CoolException("浠诲姟宸茬粡鍒涘缓锛岃鍕块噸澶嶈姹�");
+        }
+
         //鐢熸垚搴撲綅
-        Loc loc = this.generateLoc(param.getTaskType());
+        Loc loc = this.generateLoc(param.getTaskType(), param.getBarcode(), param.getLocTypeHeight());
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
 
         Task task = new Task();
         task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
-        task.setTaskSts(1L);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.鐢熸垚鍏ュ簱浠诲姟
         task.setTaskType(taskType.getId());//浠诲姟绫诲瀷
         task.setIoPri(this.generateIoPri(taskType.getId()));//浼樺厛绾�
         task.setOriginLoc(null);
@@ -102,6 +306,7 @@
             taskDetl.setOrderNo(waitPakin.getOrderNo());
             taskDetl.setDetlId(waitPakin.getDetlId());
             taskDetl.setMatId(waitPakin.getDetl$().getMatId());
+            taskDetl.setMatnr(waitPakin.getDetl$().getMat$().getMatnr());
             boolean taskDetlSave = taskDetlService.save(taskDetl);
             if(!taskDetlSave){
                 throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触");
@@ -129,17 +334,32 @@
                 throw new CoolException("缁勬墭閫氱煡妗f洿鏂板け璐�");
             }
 
-            //鏇存柊璁㈠崟鏁版嵁
+            //鏇存柊璁㈠崟鏄庣粏鏁版嵁
             OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId());
             if(orderDetl == null){
-                throw new CoolException("璁㈠崟鏁版嵁寮傚父");
+                throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
             }
 
             orderDetl.setWorkQty(orderDetl.getWorkQty() + taskDetl.getAnfme());
             orderDetl.setUpdateTime(new Date());
             boolean orderDetlUpdate = orderDetlService.updateById(orderDetl);
             if(!orderDetlUpdate){
-                throw new CoolException("璁㈠崟鏇存柊澶辫触");
+                throw new CoolException("璁㈠崟鏄庣粏鏇存柊澶辫触");
+            }
+
+            //鑾峰彇璁㈠崟
+            Order order = orderService.getById(taskDetl.getOrderId());
+            if(order == null){
+                throw new CoolException("璁㈠崟涓嶅瓨鍦�");
+            }
+
+            //鏇存柊璁㈠崟鐘舵��
+            if (order.getOrderSettle().equals(OrderSettleType.WAIT.val())) {
+                order.setOrderSettle(OrderSettleType.WORKING.val());
+                order.setUpdateTime(new Date());
+                if (!orderService.updateById(order)) {
+                    throw new CoolException("璁㈠崟鏁版嵁鏇存柊澶辫触");
+                }
             }
         }
 
@@ -155,8 +375,46 @@
     }
 
     @Override
-    @Transactional
-    public boolean cancelTask(Long taskId) {
+    public boolean generateEmptyPakIn(GeneratePakInParam param) {
+        TaskType taskType = taskTypeService.getById(param.getTaskType());
+        if (taskType == null) {
+            throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
+        }
+
+        //鐢熸垚搴撲綅
+        Loc loc = this.generateEmptyLoc(param.getTaskType(), param.getLocTypeHeight());
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+
+        Task task = new Task();
+        task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskType(taskType.getId());//浠诲姟绫诲瀷
+        task.setIoPri(this.generateIoPri(taskType.getId()));//浼樺厛绾�
+        task.setOriginLoc(null);
+        task.setTargetLoc(loc.getLocNo());
+        task.setOriginSite(param.getOriginSite());
+        task.setTargetSite(null);
+        task.setBarcode(null);//鎵樼洏鐮�
+        boolean taskSave = taskService.save(task);
+        if (!taskSave) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触");
+        }
+
+        //搴撲綅O => S
+        loc.setLocStsId(LocStsType.S.val());
+        loc.setUpdateTime(new Date());
+        boolean locUpdate = locService.updateById(loc);
+        if(!locUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean completeTask(Long taskId) {
         Task task = taskService.getById(taskId);
         if(task == null){
             throw new CoolException("浠诲姟涓嶅瓨鍦�");
@@ -167,10 +425,40 @@
             throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
         }
 
+        if (task.getTaskType() < 100) {
+            //鍏ュ簱
+            task.setTaskSts(TaskStsType.COMPLETE_IN.id);//99.鍏ュ簱瀹屾垚
+        }else {
+            //鍑哄簱
+            TaskDetl taskDetl = taskDetls.get(0);
+            if (taskDetl.getWaveId() == null) {
+                task.setTaskSts(TaskStsType.COMPLETE_OUT.id);//199.鍑哄簱瀹屾垚
+            }else {
+                task.setTaskSts(TaskStsType.WAVE_SEED.id);//198.鎾涓�
+            }
+        }
+
+        task.setUpdateTime(new Date());
+        if (!taskService.updateById(task)) {
+            throw new CoolException("浠诲姟鏇存柊澶辫触");
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public boolean cancelTask(Long taskId) {
+        Task task = taskService.getById(taskId);
+        if(task == null){
+            throw new CoolException("浠诲姟涓嶅瓨鍦�");
+        }
+
         //鏇存柊搴撲綅鐘舵��
         Loc loc = null;
         switch (task.getTaskType().intValue()) {
             case 1://鍏ュ簱
+            case 10://绌烘澘
             case 53://鎷f枡
             case 54://骞舵澘
             case 57://鐩樼偣
@@ -191,6 +479,7 @@
             case 103://鎷f枡
             case 104://骞舵澘
             case 107://鐩樼偣
+            case 110://绌烘澘
                 loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()));
                 if(loc == null){
                     throw new CoolException("搴撲綅涓嶅瓨鍦�");
@@ -203,50 +492,62 @@
                 if(!locService.updateById(loc)){
                     throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
                 }
+
+                List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
+                for (TaskDetl taskDetl : taskDetls) {
+                    if (taskDetl.getWaveId() == null) {
+                        continue;
+                    }
+
+                    String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
+                    WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, taskDetl.getWaveId()));
+                    if(waveDetl == null){
+                        continue;
+                    }
+                    waveDetl.setWorkQty(waveDetl.getWorkQty() - taskDetl.getAnfme());
+                    waveDetl.setUpdateTime(new Date());
+                    if (!waveDetlService.updateById(waveDetl)) {
+                        throw new CoolException("娉㈡鏄庣粏鏇存柊澶辫触");
+                    }
+                }
+                break;
+            case 11://搴撲綅绉昏浆
+                Loc originLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()));
+                if(originLoc == null){
+                    throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+                }
+                if (originLoc.getLocStsId() != LocStsType.R.val()) {
+                    throw new CoolException("婧愬簱浣嶇姸鎬佷笉澶勪簬R.鍑哄簱棰勭害");
+                }
+
+                loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()));
+                if(loc == null){
+                    throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+                }
+                if(loc.getLocStsId() != LocStsType.S.val()){
+                    throw new CoolException("鐩爣搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害");
+                }
+
+                originLoc.setLocStsId(LocStsType.F.val());
+                originLoc.setUpdateTime(new Date());
+                if(!locService.updateById(originLoc)){
+                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
+                }
+
+                loc.setLocStsId(LocStsType.O.val());
+                loc.setUpdateTime(new Date());
+                if(!locService.updateById(loc)){
+                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
+                }
                 break;
         }
 
-        //鍥炴粴璁㈠崟
-        for (TaskDetl taskDetl : taskDetls) {
-            OrderDetl orderDetl = orderDetlService.getById(taskDetl.getDetlId());
-            if(orderDetl == null){
-                throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
-            }
-
-            //鍥炴粴宸ヤ綔鏁伴噺
-            orderDetl.setWorkQty(orderDetl.getWorkQty() - taskDetl.getAnfme());
-            orderDetl.setUpdateTime(new Date());
-            boolean orderDetlUpdate = orderDetlService.updateById(orderDetl);
-            if(!orderDetlUpdate){
-                throw new CoolException("宸ヤ綔鏁伴噺鍥炴粴澶辫触");
-            }
-
-            //鍏ュ簱鍥炴粴缁勬墭閫氱煡妗�
-            if (task.getTaskType() == 1) {
-                WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getDetlId, taskDetl.getDetlId()).eq(WaitPakin::getBarcode, task.getBarcode()));
-                if(waitPakin == null){
-                    throw new CoolException("缁勬墭閫氱煡妗d笉瀛樺湪");
-                }
-
-                waitPakin.setIoStatus(0);
-                waitPakin.setUpdateTime(new Date());
-                boolean updateWaitPakin = waitPakinService.updateById(waitPakin);
-                if(!updateWaitPakin){
-                    throw new CoolException("缁勬墭閫氱煡妗e洖婊氬け璐�");
-                }
-            }
-
-            //鍒犻櫎鏄庣粏鎵╁睍
-            boolean removeField = taskDetlFieldService.remove(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()));
-            if(!removeField){
-                throw new CoolException("鍥炴粴鎵╁睍鏄庣粏澶辫触");
-            }
-
-            //鍒犻櫎鏄庣粏
-            boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
-            if(!removeDetl){
-                throw new CoolException("鍥炴粴鏄庣粏澶辫触");
-            }
+        //鏁版嵁淇濆瓨鑷冲巻鍙叉。
+        TaskLog taskLog = new TaskLog();
+        taskLog.sync(task);
+        taskLog.setId(null);
+        if (!taskLogService.save(taskLog)) {
+            throw new CoolException("浠诲姟妗f杞巻鍙叉。妗堝け璐�");
         }
 
         //鍒犻櫎浠诲姟
@@ -255,6 +556,308 @@
             throw new CoolException("鍥炴粴浠诲姟澶辫触");
         }
 
+        if (task.getTaskType() != 10) {
+            List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
+            if (taskDetls.isEmpty()) {
+                throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+            }
+
+            //鍥炴粴璁㈠崟
+            for (TaskDetl taskDetl : taskDetls) {
+                if (taskDetl.getDetlId() != null) {
+                    orderUtils.updateWorkQty(taskDetl.getDetlId(), taskDetl.getAnfme(), false);
+                }
+
+                //鍏ュ簱鍥炴粴缁勬墭閫氱煡妗�
+                if (task.getTaskType() == 1) {
+                    WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getDetlId, taskDetl.getDetlId()).eq(WaitPakin::getBarcode, task.getBarcode()));
+                    if(waitPakin == null){
+                        throw new CoolException("缁勬墭閫氱煡妗d笉瀛樺湪");
+                    }
+
+                    waitPakin.setIoStatus(0);
+                    waitPakin.setUpdateTime(new Date());
+                    boolean updateWaitPakin = waitPakinService.updateById(waitPakin);
+                    if(!updateWaitPakin){
+                        throw new CoolException("缁勬墭閫氱煡妗e洖婊氬け璐�");
+                    }
+                }
+
+                //鏄庣粏鏁版嵁淇濆瓨鑷冲巻鍙叉。
+                TaskDetlLog taskDetlLog = new TaskDetlLog();
+                taskDetlLog.sync(taskDetl);
+                taskDetlLog.setId(null);
+                taskDetlLog.setTaskId(taskLog.getId());
+                if (!taskDetlLogService.save(taskDetlLog)) {
+                    throw new CoolException("鏄庣粏鏁版嵁杞巻鍙叉。妗堝け璐�");
+                }
+
+                //鍒犻櫎鏄庣粏
+                boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
+                if(!removeDetl){
+                    throw new CoolException("鍥炴粴鏄庣粏澶辫触");
+                }
+
+                List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()));
+                for (TaskDetlField detlField : detlFields) {
+                    //鏄庣粏鎵╁睍瀛楁鏁版嵁淇濆瓨鑷冲巻鍙叉。
+                    TaskDetlFieldLog taskDetlFieldLog = new TaskDetlFieldLog();
+                    taskDetlFieldLog.sync(detlField);
+                    taskDetlFieldLog.setId(null);
+                    taskDetlFieldLog.setDetlId(taskDetlLog.getId());
+                    if (!taskDetlFieldLogService.save(taskDetlFieldLog)) {
+                        throw new CoolException("鏄庣粏鎵╁睍瀛楁杞巻鍙叉。妗堝け璐�");
+                    }
+
+                    //鍒犻櫎鏄庣粏鎵╁睍
+                    boolean removeField = taskDetlFieldService.removeById(detlField.getId());
+                    if(!removeField){
+                        throw new CoolException("鍥炴粴鎵╁睍鏄庣粏澶辫触");
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean pickTask(Long taskId) {
+        Task task = taskService.getById(taskId);
+        if(task == null){
+            throw new CoolException("浠诲姟涓嶅瓨鍦�");
+        }
+
+        if (task.getTaskType() != 103) {
+            throw new CoolException("浠诲姟绫诲瀷涓嶅彲鎷f枡");
+        }
+
+        if (task.getTaskSts() != 200) {
+            throw new CoolException("褰撳墠鐘舵�佷笉鍙嫞鏂�");
+        }
+
+        //鑾峰彇婧愬簱浣�
+        Loc originLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getOriginLoc()));
+        if(originLoc == null){
+            throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+        }
+
+        //鑾峰彇婧愬簱浣嶉珮搴�
+        LocTypeBind locTypeBind = locTypeBindService.getOne(new LambdaQueryWrapper<LocTypeBind>().eq(LocTypeBind::getLocId, originLoc.getId()).in(LocTypeBind::getTypeId, LocBindType.HEIGHT.list()));
+        if(locTypeBind == null){
+            throw new CoolException("搴撲綅绫诲瀷涓嶅瓨鍦�");
+        }
+        LocType locType = locTypeService.getById(locTypeBind.getTypeId());
+        if(locType == null){
+            throw new CoolException("搴撲綅绫诲瀷涓嶅瓨鍦�");
+        }
+        LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locType.getFlag());
+        if(locTypeHeightType == null){
+            throw new CoolException("楂樹綆搴撲綅绫诲瀷涓嶅瓨鍦�");
+        }
+
+        Long taskType = task.getTaskType() - 50;
+
+        List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, taskId).gt(TaskDetl::getAnfme, 0));
+        if (taskDetls.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+        }
+        TaskDetl taskDetl = taskDetls.get(0);
+
+        //鐢熸垚搴撲綅
+        Loc loc = this.generateLoc(taskType, taskDetl.getMatId(), taskDetl.getBatch(), taskDetl.getUniqueField(), locTypeHeightType.id);
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskType(taskType);
+        task.setTargetLoc(loc.getLocNo());
+        task.setUpdateTime(new Date());
+        if (!taskService.updateById(task)) {
+            throw new CoolException("鎷f枡澶辫触");
+        }
+
+        //搴撲綅O => S
+        loc.setLocStsId(LocStsType.S.val());
+        loc.setUpdateTime(new Date());
+        boolean locUpdate = locService.updateById(loc);
+        if(!locUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public boolean locAdjust(LocAdjustParam param) {
+        if (param == null) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        if (Cools.isEmpty(param.getLocNo())) {
+            throw new CoolException("搴撲綅鍙蜂笉鑳戒负绌�");
+        }
+
+        if (param.getDetls() == null) {
+            throw new CoolException("搴撳瓨鏄庣粏涓嶈兘涓虹┖");
+        }
+
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, param.getLocNo()));
+        if (loc == null) {
+            throw new CoolException("搴撲綅涓嶅瓨鍦�");
+        }
+
+        //鍒犻櫎婧愬簱瀛�
+        locDetlService.removeLocDetl(loc.getId());
+
+        List<MatField> matFields = matFieldService.list(new LambdaQueryWrapper<MatField>().eq(MatField::getUnique, 1));
+        for (Map<String, Object> map : param.getDetls()) {
+            LocDetl locDetl = JSON.parseObject(JSON.toJSONString(map), LocDetl.class);
+            HashMap<String, Object> uniqueFields = new HashMap<>();
+            for (Map.Entry<String, Object> entry : map.entrySet()) {
+                for (MatField field : matFields) {
+                    if (entry.getKey().equals(field.getName())) {
+                        uniqueFields.put(entry.getKey(), entry.getValue());
+                    }
+                }
+            }
+            locDetl.setAnfme(Double.parseDouble(map.get("qty").toString()));
+            locDetl.syncFieldMap(uniqueFields);
+
+            if (locDetl.getAnfme() <= 0D) {
+                throw new CoolException("鏁伴噺涓嶈兘灏忎簬0");
+            }
+
+            locDetl.setId(null);
+            locDetl.setLocId(loc.getId());
+            locDetl.setLocNo(loc.getLocNo());
+            boolean save = locDetlService.save(locDetl);
+            if (!save) {
+                throw new CoolException("搴撳瓨璋冩暣澶辫触");
+            }
+
+            //鎻掑叆搴撳瓨鏄庣粏瀛楁
+            for (MatField matField : matFields) {
+                LocDetlField locDetlField = new LocDetlField();
+                locDetlField.setDetlId(locDetl.getId());
+                locDetlField.setFieldId(matField.getId());
+                locDetlField.setName(matField.getName());
+                locDetlField.setValue(Optional.ofNullable(uniqueFields.get(matField.getName()).toString()).orElse(""));
+                locDetlFieldService.save(locDetlField);
+            }
+
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public boolean locTransfer(LocTransferParam param) {
+        if (param == null) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        if (Cools.isEmpty(param.getSourceLocNo())) {
+            throw new CoolException("婧愬簱浣嶄笉鑳戒负绌�");
+        }
+
+        if (Cools.isEmpty(param.getTargetLocNo())) {
+            throw new CoolException("鐩爣搴撲綅涓嶈兘涓虹┖");
+        }
+
+        Loc sourceLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, param.getSourceLocNo()));
+        if (sourceLoc == null) {
+            throw new CoolException("婧愬簱浣嶄笉瀛樺湪");
+        }
+
+        if (sourceLoc.getLocStsId() != LocStsType.F.val()) {
+            throw new CoolException("婧愬簱浣嶉潪鍦ㄥ簱鐘舵��");
+        }
+
+        Loc targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, param.getTargetLocNo()));
+        if (targetLoc == null) {
+            throw new CoolException("鐩爣搴撲綅涓嶅瓨鍦�");
+        }
+
+        if(targetLoc.getLocStsId() != LocStsType.O.val()){
+            throw new CoolException("鐩爣搴撲綅闈炵┖鐘舵��");
+        }
+
+        TaskType taskType = taskTypeService.getById(11);
+        if (taskType == null) {
+            throw new CoolException("浠诲姟绫诲瀷涓嶅瓨鍦�");
+        }
+
+        Task task = new Task();
+        task.setTaskNo(this.generateTaskNo(taskType.getId()));//浠诲姟鍙�
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);//1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskType(taskType.getId());//浠诲姟绫诲瀷
+        task.setIoPri(this.generateIoPri(taskType.getId()));//浼樺厛绾�
+        task.setOriginLoc(param.getSourceLocNo());
+        task.setTargetLoc(param.getTargetLocNo());
+        task.setOriginSite(null);
+        task.setTargetSite(null);
+        task.setBarcode(sourceLoc.getBarcode());//鎵樼洏鐮�
+        boolean taskSave = taskService.save(task);
+        if (!taskSave) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触");
+        }
+
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, sourceLoc.getId()));
+        if(locDetls.isEmpty()){
+            throw new CoolException("婧愬簱浣嶆槑缁嗕笉瀛樺湪");
+        }
+
+        //鐢熸垚浠诲姟鏄庣粏
+        for (LocDetl locDetl : locDetls) {
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.setTaskId(task.getId());
+            taskDetl.setTaskNo(task.getTaskNo());
+            taskDetl.setAnfme(locDetl.getAnfme());//鏁伴噺
+            taskDetl.setStock(0D);//搴撳瓨
+            taskDetl.setBatch(locDetl.getBatch());//鎵瑰彿
+            taskDetl.setBarcode(sourceLoc.getBarcode());
+            taskDetl.setMatId(locDetl.getMatId());
+            taskDetl.setMatnr(locDetl.getMatnr());
+            boolean taskDetlSave = taskDetlService.save(taskDetl);
+            if(!taskDetlSave){
+                throw new CoolException("浠诲姟鏄庣粏鐢熸垚澶辫触");
+            }
+
+            //鐢熸垚鏄庣粏鎵╁睍
+            List<LocDetlField> locDetlFieldList = locDetlFieldService.list(new LambdaQueryWrapper<LocDetlField>().eq(LocDetlField::getDetlId, locDetl.getId()));
+            for (LocDetlField locDetlField : locDetlFieldList) {
+                TaskDetlField taskDetlField = new TaskDetlField();
+                taskDetlField.setName(locDetlField.getName());
+                taskDetlField.setFieldId(locDetlField.getFieldId());
+                taskDetlField.setDetlId(taskDetl.getId());
+                taskDetlField.setValue(locDetlField.getValue());
+                boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
+                if(!taskDetlFieldSave){
+                    throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                }
+            }
+        }
+
+        //搴撲綅F => R
+        sourceLoc.setLocStsId(LocStsType.R.val());
+        sourceLoc.setUpdateTime(new Date());
+        boolean sourceLocUpdate = locService.updateById(sourceLoc);
+        if(!sourceLocUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
+        //搴撲綅O => S
+        targetLoc.setLocStsId(LocStsType.S.val());
+        targetLoc.setUpdateTime(new Date());
+        boolean targetLocUpdate = locService.updateById(targetLoc);
+        if(!targetLocUpdate){
+            throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+        }
+
         return true;
     }
 }

--
Gitblit v1.9.1