From d0226747665355acecd5b4f2b5c0beb020586729 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 17 一月 2025 15:37:32 +0800
Subject: [PATCH] # 23. PDA拣货单据,勾选或点击确认按钮后,完成当前单据 (已完成) 24. PDA出库成功后,界面数据重置,避免重复操作  (已修复) 25. PDA接口请求,添加一个Loading遮档  (已修复) 27. 非平库单据,在平库可做入库操作  (已修复) 28. 平库已组拖数据,组拖完成后依然可组拖  (已修复) 29. 平库入库后,订单明细没有添加(已修复) 30. 平库入库后,单据类型没有修改(已修复) 31. 没有绑定播种位,不能进行播种,前后端都需加判定(已修复) 33. 平库入库未修改入库已完成数量(已修复) 34. cacheSite缓存站点逻辑需重新梳理,入库生成波次时(已完成) 35. PDA添加发货确认,默认全选 (已修复) 36. 大屏获取任务时,是由容器到达的拖盘码确认通知 (已修复) 37. 拣货单序号不显示 问题修复 (已修复) 42. pda发货确认,添加不同颜色区分是否全部完成拣货,绿色全部拣货完成,红色完成部分拣货(已修复) 43. CTU入库完成后,订单明细没有删除,执行中数量清空(已修复) 44. 平库入库完成后,历史档明细完成数量没有更新 (已修复) 45. PDA料号不显示  (已修复) 46. 发货完成后,波次管理数据未加入历史档 (已修复)

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java | 1335 +++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 873 insertions(+), 462 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 1c6c199..190b579 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,462 +1,873 @@
-package com.zy.asrs.wms.asrs.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-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.OrderSettleType;
-import com.zy.asrs.wms.asrs.entity.param.GeneratePakInParam;
-import com.zy.asrs.wms.asrs.service.*;
-import com.zy.asrs.wms.utils.LocUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-
-@Service("workService")
-public class WorkServiceImpl implements WorkService {
-
-    @Autowired
-    private TaskService taskService;
-    @Autowired
-    private TaskDetlService taskDetlService;
-    @Autowired
-    private WaitPakinService waitPakinService;
-    @Autowired
-    private TaskTypeService taskTypeService;
-    @Autowired
-    private OrderDetlFieldService orderDetlFieldService;
-    @Autowired
-    private TaskDetlFieldService taskDetlFieldService;
-    @Autowired
-    private OrderService orderService;
-    @Autowired
-    private OrderDetlService orderDetlService;
-    @Autowired
-    private LocService locService;
-    @Autowired
-    private LocStsService locStsService;
-    @Autowired
-    private TaskLogService taskLogService;
-    @Autowired
-    private TaskDetlLogService taskDetlLogService;
-    @Autowired
-    private TaskDetlFieldLogService taskDetlFieldLogService;
-    @Autowired
-    private LocUtils locUtils;
-
-    @Override
-    public String generateTaskNo(Long taskType) {
-        Random random = new Random();
-        int nextInt = random.nextInt(99999);
-        return "R" + nextInt;
-    }
-
-    @Override
-    public Integer generateIoPri(Long taskType) {
-        return 10;
-    }
-
-    @Override
-    public Loc generateEmptyLoc(Long taskType, Integer locTypeHeight) {
-        Loc defaultLoc = null;
-
-        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
-        defaultLoc = locUtils.getNeighborEmptyLoc(taskType, locTypeHeight);
-        if (defaultLoc != null) {
-            return defaultLoc;
-        }
-
-        //2.鑾峰彇鎺ㄨ崘搴撲綅
-        List<Loc> suggestLoc = locUtils.getSuggestEmptyLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!suggestLoc.isEmpty()) {
-            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
-            }
-        }
-
-        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
-        List<Loc> globalLoc = locUtils.getGlobalEmptyLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!globalLoc.isEmpty()) {
-            defaultLoc = locUtils.filterAllLoc(globalLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
-            }
-        }
-
-        return defaultLoc;
-    }
-
-    @Override
-    public 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("璁㈠崟鏄庣粏涓嶅瓨鍦�");
-        }
-
-        Mat mat = detl.getMat$();
-        if (mat == null) {
-            throw new CoolException("鍟嗗搧涓嶅瓨鍦�");
-        }
-
-        Loc defaultLoc = null;
-
-        //1.浠庡簱瀛樻垨浠诲姟涓尮閰嶇浉閭诲簱浣�
-        defaultLoc = locUtils.getNeighborLoc(taskType, detl, locTypeHeight);
-        if (defaultLoc != null) {
-            return defaultLoc;
-        }
-
-        //2.鑾峰彇鎺ㄨ崘搴撲綅
-        List<Loc> suggestLoc = locUtils.getSuggestLoc(taskType, mat.getId(), detl.getBatch(), locTypeHeight);
-        //鑾峰彇搴撲綅
-        if (!suggestLoc.isEmpty()) {
-            defaultLoc = locUtils.filterLoc(taskType, suggestLoc);
-            if(defaultLoc != null) {
-                return defaultLoc;
-            }
-        }
-
-        //3.浠庡叏灞�搴撲綅涓幏鍙�(瀹屾暣宸烽亾)
-        List<Loc> globalLoc = locUtils.getGlobalLoc(taskType, locTypeHeight);
-        //鑾峰彇搴撲綅
-        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 (param.getTaskType() != 10 && waitPakins.isEmpty()) {
-            throw new CoolException("鎵樼洏鏈粍鎵�");
-        }
-
-        TaskType taskType = taskTypeService.getById(param.getTaskType());
-        if (taskType == null) {
-            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(), 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.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(param.getBarcode());//鎵樼洏鐮�
-        boolean taskSave = taskService.save(task);
-        if (!taskSave) {
-            throw new CoolException("浠诲姟鐢熸垚澶辫触");
-        }
-
-        //鐢熸垚浠诲姟鏄庣粏
-        for (WaitPakin waitPakin : waitPakins) {
-            TaskDetl taskDetl = new TaskDetl();
-            taskDetl.setTaskId(task.getId());
-            taskDetl.setTaskNo(task.getTaskNo());
-            taskDetl.setAnfme(waitPakin.getAnfme());//鏁伴噺
-            taskDetl.setStock(0D);//搴撳瓨
-            taskDetl.setBatch(waitPakin.getDetl$().getBatch());//鎵瑰彿
-            taskDetl.setBarcode(waitPakin.getBarcode());
-            taskDetl.setOrderId(waitPakin.getOrderId());
-            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("浠诲姟鏄庣粏鐢熸垚澶辫触");
-            }
-
-            //鐢熸垚鏄庣粏鎵╁睍
-            List<OrderDetlField> orderDetlFields = orderDetlFieldService.list(new LambdaQueryWrapper<OrderDetlField>().eq(OrderDetlField::getDetlId, waitPakin.getDetlId()));
-            for (OrderDetlField orderDetlField : orderDetlFields) {
-                TaskDetlField taskDetlField = new TaskDetlField();
-                taskDetlField.setName(orderDetlField.getName());
-                taskDetlField.setFieldId(orderDetlField.getFieldId());
-                taskDetlField.setDetlId(taskDetl.getId());
-                taskDetlField.setValue(orderDetlField.getValue());
-                boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                if(!taskDetlFieldSave){
-                    throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
-                }
-            }
-
-            //鏇存柊缁勬墭閫氱煡妗�
-            waitPakin.setIoStatus(1);
-            waitPakin.setUpdateTime(new Date());
-            boolean waitPakinUpdate = waitPakinService.updateById(waitPakin);
-            if(!waitPakinUpdate){
-                throw new CoolException("缁勬墭閫氱煡妗f洿鏂板け璐�");
-            }
-
-            //鏇存柊璁㈠崟鏄庣粏鏁版嵁
-            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("璁㈠崟鏄庣粏鏇存柊澶辫触");
-            }
-
-            //鑾峰彇璁㈠崟
-            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("璁㈠崟鏁版嵁鏇存柊澶辫触");
-                }
-            }
-        }
-
-        //搴撲綅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 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(1L);//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("浠诲姟涓嶅瓨鍦�");
-        }
-
-        List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
-        if (taskDetls.isEmpty()) {
-            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
-        }
-
-        if (task.getTaskType() < 100) {
-            //鍏ュ簱
-            task.setTaskSts(99L);//99.鍏ュ簱瀹屾垚
-        }else {
-            //鍑哄簱
-            task.setTaskSts(199L);//199.鍑哄簱瀹屾垚
-        }
-
-        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://鐩樼偣
-                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.鍏ュ簱棰勭害");
-                }
-                loc.setLocStsId(LocStsType.O.val());
-                loc.setUpdateTime(new Date());
-                if(!locService.updateById(loc)){
-                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
-                }
-                break;
-            case 101://鍑哄簱
-            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("搴撲綅涓嶅瓨鍦�");
-                }
-                if(loc.getLocStsId() != LocStsType.R.val()){
-                    throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害");
-                }
-                loc.setLocStsId(LocStsType.F.val());
-                loc.setUpdateTime(new Date());
-                if(!locService.updateById(loc)){
-                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
-                }
-                break;
-        }
-
-        if (task.getTaskType() != 10) {
-            List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
-            if (taskDetls.isEmpty()) {
-                throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
-            }
-
-            //鍥炴粴璁㈠崟
-            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洖婊氬け璐�");
-                    }
-                }
-
-                List<TaskDetlField> detlFields = taskDetlFieldService.list(new LambdaQueryWrapper<TaskDetlField>().eq(TaskDetlField::getDetlId, taskDetl.getId()));
-                for (TaskDetlField detlField : detlFields) {
-                    //鏄庣粏鎵╁睍瀛楁鏁版嵁淇濆瓨鑷冲巻鍙叉。
-                    TaskDetlFieldLog taskDetlFieldLog = new TaskDetlFieldLog();
-                    taskDetlFieldLog.sync(detlField);
-                    if (!taskDetlFieldLogService.save(taskDetlFieldLog)) {
-                        throw new CoolException("鏄庣粏鎵╁睍瀛楁杞巻鍙叉。妗堝け璐�");
-                    }
-
-                    //鍒犻櫎鏄庣粏鎵╁睍
-                    boolean removeField = taskDetlFieldService.removeById(detlField.getId());
-                    if(!removeField){
-                        throw new CoolException("鍥炴粴鎵╁睍鏄庣粏澶辫触");
-                    }
-                }
-
-
-                //鏄庣粏鏁版嵁淇濆瓨鑷冲巻鍙叉。
-                TaskDetlLog taskDetlLog = new TaskDetlLog();
-                taskDetlLog.sync(taskDetl);
-                if (!taskDetlLogService.save(taskDetlLog)) {
-                    throw new CoolException("鏄庣粏鏁版嵁杞巻鍙叉。妗堝け璐�");
-                }
-
-                //鍒犻櫎鏄庣粏
-                boolean removeDetl = taskDetlService.removeById(taskDetl.getId());
-                if(!removeDetl){
-                    throw new CoolException("鍥炴粴鏄庣粏澶辫触");
-                }
-            }
-        }
-
-        //鏁版嵁淇濆瓨鑷冲巻鍙叉。
-        TaskLog taskLog = new TaskLog();
-        taskLog.sync(task);
-        if (!taskLogService.save(taskLog)) {
-            throw new CoolException("浠诲姟妗f杞巻鍙叉。妗堝け璐�");
-        }
-
-        //鍒犻櫎浠诲姟
-        boolean removeTask = taskService.removeById(taskId);
-        if(!removeTask){
-            throw new CoolException("鍥炴粴浠诲姟澶辫触");
-        }
-
-        return true;
-    }
-}
+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.*;
+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.*;
+
+@Service("workService")
+public class WorkServiceImpl implements WorkService {
+
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private TaskDetlService taskDetlService;
+    @Autowired
+    private WaitPakinService waitPakinService;
+    @Autowired
+    private TaskTypeService taskTypeService;
+    @Autowired
+    private OrderDetlFieldService orderDetlFieldService;
+    @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) {
+        Random random = new Random();
+        int nextInt = random.nextInt(99999);
+        return "R" + nextInt;
+    }
+
+    @Override
+    public Integer generateIoPri(Long taskType) {
+        return 10;
+    }
+
+    @Override
+    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("鏈厤缃笂鏋惰鍒�");
+        }
+        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(rollbackFor = Exception.class)
+    public boolean generatePakIn(GeneratePakInParam param) {
+        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode()));
+        if (param.getTaskType() != 10 && waitPakins.isEmpty()) {
+            throw new CoolException("鎵樼洏鏈粍鎵�");
+        }
+
+        TaskType taskType = taskTypeService.getById(param.getTaskType());
+        if (taskType == null) {
+            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(), param.getBarcode(), param.getLocTypeHeight());
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+
+        Task task = new Task();
+        //浠诲姟鍙�
+        task.setTaskNo(this.generateTaskNo(taskType.getId()));
+        //1.鐢熸垚鍏ュ簱浠诲姟
+        task.setTaskSts(TaskStsType.GENERATE_IN.id);
+        //浠诲姟绫诲瀷
+        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(param.getBarcode());
+        boolean taskSave = taskService.save(task);
+        if (!taskSave) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触");
+        }
+
+        //鐢熸垚浠诲姟鏄庣粏
+        for (WaitPakin waitPakin : waitPakins) {
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.setTaskId(task.getId());
+            taskDetl.setTaskNo(task.getTaskNo());
+            //鏁伴噺
+            taskDetl.setAnfme(waitPakin.getAnfme());
+            //搴撳瓨
+            taskDetl.setStock(0D);
+            //鎵瑰彿
+            taskDetl.setBatch(waitPakin.getDetl$().getBatch());
+            taskDetl.setBarcode(waitPakin.getBarcode());
+            taskDetl.setOrderId(waitPakin.getOrderId());
+            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("浠诲姟鏄庣粏鐢熸垚澶辫触");
+            }
+
+            //鐢熸垚鏄庣粏鎵╁睍
+            List<OrderDetlField> orderDetlFields = orderDetlFieldService.list(new LambdaQueryWrapper<OrderDetlField>().eq(OrderDetlField::getDetlId, waitPakin.getDetlId()));
+            for (OrderDetlField orderDetlField : orderDetlFields) {
+                TaskDetlField taskDetlField = new TaskDetlField();
+                taskDetlField.setName(orderDetlField.getName());
+                taskDetlField.setFieldId(orderDetlField.getFieldId());
+                taskDetlField.setDetlId(taskDetl.getId());
+                taskDetlField.setValue(orderDetlField.getValue());
+                boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
+                if(!taskDetlFieldSave){
+                    throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                }
+            }
+
+            //鏇存柊缁勬墭閫氱煡妗�
+            waitPakin.setIoStatus(1);
+            waitPakin.setUpdateTime(new Date());
+            boolean waitPakinUpdate = waitPakinService.updateById(waitPakin);
+            if(!waitPakinUpdate){
+                throw new CoolException("缁勬墭閫氱煡妗f洿鏂板け璐�");
+            }
+
+            //鏇存柊璁㈠崟鏄庣粏鏁版嵁
+            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("璁㈠崟鏄庣粏鏇存柊澶辫触");
+            }
+
+            //鑾峰彇璁㈠崟
+            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("璁㈠崟鏁版嵁鏇存柊澶辫触");
+                }
+            }
+        }
+
+        //搴撲綅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 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("浠诲姟涓嶅瓨鍦�");
+        }
+
+        List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(taskId);
+        if (taskDetls.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦�");
+        }
+
+        if (task.getTaskType() < 100) {
+            //鍏ュ簱
+            task.setTaskSts(TaskStsType.COMPLETE_IN.id);//99.鍏ュ簱瀹屾垚
+        }else {
+            //鍑哄簱
+            TaskDetl taskDetl = taskDetls.get(0); //TODO  鍑哄簱娴佺▼寰呯‘璁わ紝ESS鍙栬揣鍚庯紝杈撻�佺嚎娴佽浆鍒版壂鐮佸鐘舵��
+            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(rollbackFor = Exception.class)
+    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://鐩樼偣
+                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.鍏ュ簱棰勭害");
+                }
+                loc.setLocStsId(LocStsType.O.val());
+                loc.setUpdateTime(new Date());
+                if(!locService.updateById(loc)){
+                    throw new CoolException("搴撲綅鐘舵�佸彉鏇村け璐�");
+                }
+                break;
+            case 101://鍑哄簱
+            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("搴撲綅涓嶅瓨鍦�");
+                }
+                if(loc.getLocStsId() != LocStsType.R.val()){
+                    throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害");
+                }
+                loc.setLocStsId(LocStsType.F.val());
+                loc.setUpdateTime(new Date());
+                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;
+        }
+
+        //鏁版嵁淇濆瓨鑷冲巻鍙叉。
+        TaskLog taskLog = new TaskLog();
+        taskLog.sync(task);
+        taskLog.setId(null);
+        if (!taskLogService.save(taskLog)) {
+            throw new CoolException("浠诲姟妗f杞巻鍙叉。妗堝け璐�");
+        }
+
+        //鍒犻櫎浠诲姟
+        boolean removeTask = taskService.removeById(taskId);
+        if(!removeTask){
+            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
+    @Transactional(rollbackFor = Exception.class)
+    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() != 198) {
+            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);
+
+        //鐢熸垚鏂扮殑搴撲綅 !important
+        Loc loc = this.generateLoc(taskType, taskDetl.getMatId(), taskDetl.getBatch(), taskDetl.getUniqueField(), locTypeHeightType.id);
+
+        if(loc == null) {
+            throw new CoolException("娌℃湁绌哄簱浣�");
+        }
+        //102鎷f枡姝ゅ闇�淇敼涓篧CS_CONTAINER_RECEIVE,瀹氭椂浠诲姟鏌ヨ鍚庯紝鑷姩涓嬪彂鍏ュ簱浠诲姟鑷矱SS
+        task.setTaskSts(TaskStsType.WCS_CONTAINER_RECEIVE.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