From ffc4d0526bf02e7e00a7872d05a1e67e520e59d6 Mon Sep 17 00:00:00 2001
From: yangyang
Date: 星期一, 02 六月 2025 12:06:40 +0800
Subject: [PATCH] 新增自动盘点功能

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java    |  102 +++++++++++++++++++++++++++++++--
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/WorkServiceImpl.java |    9 +-
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java             |    2 
 zy-asrs-admin/src/views/task/task/index.vue                                      |    3 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java              |    7 +
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java          |   19 ++++--
 6 files changed, 121 insertions(+), 21 deletions(-)

diff --git a/zy-asrs-admin/src/views/task/task/index.vue b/zy-asrs-admin/src/views/task/task/index.vue
index 342cc03..6643796 100644
--- a/zy-asrs-admin/src/views/task/task/index.vue
+++ b/zy-asrs-admin/src/views/task/task/index.vue
@@ -401,6 +401,9 @@
             <a-button v-if="record.taskType == 103" type="link" primary @click="handlePick(record)">{{
               formatMessage('page.pick', '鎷f枡')
             }}</a-button>
+            <a-button v-if="record.taskType == 107 && record.taskSts == 198" type="link" primary @click="handlePick(record)">{{
+              formatMessage('page.pick', '鐩樼偣')
+            }}</a-button>
             <a-button type="link" primary @click="handleComplete(record)">{{ formatMessage('page.complete', '瀹屾垚')
               }}</a-button>
             <a-button type="link" danger @click="handleCancel(record)">{{ formatMessage('page.cancel', '鍙栨秷')
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java
index b86c0bd..e962018 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/apis/wcs/schedule/ScheduleJobs.java
@@ -15,10 +15,13 @@
 import com.zy.asrs.wms.apis.wcs.entity.request.TaskDescribe;
 import com.zy.asrs.wms.apis.wcs.entity.request.TaskParam;
 import com.zy.asrs.wms.apis.wcs.entity.response.CommonReponse;
-import com.zy.asrs.wms.asrs.entity.Task;
+import com.zy.asrs.wms.asrs.entity.*;
+import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto;
+import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
 import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
-import com.zy.asrs.wms.asrs.service.TaskService;
-import com.zy.asrs.wms.asrs.service.WorkService;
+import com.zy.asrs.wms.asrs.service.*;
+import com.zy.asrs.wms.asrs.service.impl.LocServiceImpl;
+import com.zy.asrs.wms.utils.Utils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
@@ -49,9 +52,22 @@
     private RestTemplate restTemplate;
     @Autowired
     private WorkService workService;
-
     @Resource
     private SystemProperties properties;
+    @Autowired
+    private LocServiceImpl locService;
+    @Autowired
+    private LocDetlService locDetlService;
+    @Autowired
+    private TaskDetlService taskDetlService;
+    @Autowired
+    private LocDetlFieldService locDetlFieldService;
+    @Autowired
+    private TaskDetlFieldService taskDetlFieldService;
+    @Autowired
+    private CacheSiteService cacheSiteService;
+    @Autowired
+    private OperationPortService operationPortService;
 
     /***
      * 鍏ュ簱浠诲姟---閫氱煡ESS杈撻�佺嚎娴佸姩
@@ -98,6 +114,78 @@
             }
         });
 
+    }
+
+    /**
+     * 鐢熸垚鑷姩鐩樼偣浠诲姟
+     */
+    @Scheduled(cron = "0/50 * * * * ?")
+    @Transactional(rollbackFor = Exception.class)
+    public void genCheckTask() {
+        Loc locs = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.F.val()).orderByAsc(Loc::getLocNo).last("limit 1"));
+        if (Objects.isNull(locs)) {
+            return;
+        }
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().select(Task::getId).eq(Task::getTaskType, 107L));
+        if (!tasks.isEmpty() && tasks.size() >= 4) {
+            //榛樿鐢熸垚鍥涗釜鐩樼偣浠诲姟锛岃秴杩�4涓紝鍋滄鐢熸垚鐩樼偣浠诲姟;
+            return;
+        }
+        OperationPort operationPort = operationPortService.getOne(new LambdaQueryWrapper<OperationPort>().last("ORDER BY RAND() LIMIT 1;"));
+        if (operationPort == null || Objects.isNull(operationPort)) {
+            throw new CoolException("浣滀笟鍙d笉瀛樺湪");
+        }
+        Task task = new Task();
+        task.setTaskNo(workService.generateTaskNo(TaskStsType.GENERATE_OUT.id));
+        task.setTaskSts(TaskStsType.GENERATE_OUT.id);
+        task.setTaskType(107L); //榛樿107鐩樼偣浠诲姟锛岀洏鐐逛换鍔℃病鏈夛紝鎸�103澶勭悊
+        task.setIoPri(workService.generateIoPri(TaskStsType.GENERATE_OUT.id));
+        task.setOriginLoc(locs.getLocNo());
+        task.setTargetSite(operationPort.getFlag());
+        task.setBarcode(locs.getBarcode());
+
+        if (!taskService.save(task)) {
+            throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒");
+        }
+
+        List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, locs.getId()));
+        if (locDetls.isEmpty()) {
+            throw new CoolException("鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+
+        for (LocDetl locDetl : locDetls) {
+            TaskDetl taskDetl = new TaskDetl();
+            taskDetl.sync(locDetl);
+            taskDetl.setId(null);
+            taskDetl.setTaskId(task.getId());
+            taskDetl.setTaskNo(task.getTaskNo());
+            taskDetl.setAnfme(locDetl.getAnfme());
+            taskDetl.setStock(locDetl.getAnfme());
+            taskDetl.setWaveId(null);
+            taskDetl.setWaveNo(null);
+            taskDetl.setOrderId(null);
+            taskDetl.setOrderNo(null);
+            if (!taskDetlService.save(taskDetl)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+            }
+
+            List<LocDetlField> locDetlFields = locDetlFieldService.list(new LambdaQueryWrapper<LocDetlField>().eq(LocDetlField::getDetlId, locDetl.getId()));
+            for (LocDetlField locDetlField : locDetlFields) {
+                TaskDetlField taskDetlField = new TaskDetlField();
+                taskDetlField.sync(locDetlField);
+                taskDetlField.setId(null);
+                taskDetlField.setDetlId(taskDetl.getId());
+                if (!taskDetlFieldService.save(taskDetlField)) {
+                    throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                }
+            }
+        }
+
+        if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getId, locs.getId())
+                .set(Loc::getUpdateTime, new Date())
+                .set(Loc::getLocStsId, LocStsType.R.val()))) {
+            throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
     }
 
 
@@ -211,7 +299,7 @@
 //                } else {
 //                    CommonReponse commonReponse = JSON.toJavaObject(JSON.parseObject(exchange.getBody()), CommonReponse.class);
 //                    if (commonReponse.getCode() == 0) {
-                        //娴佸姩閫氱煡涓嬪彂瀹屾垚鍚庯紝淇敼浠诲姟鐘舵�佷负杈撻�佺嚎娴佸姩涓�傘��
+            //娴佸姩閫氱煡涓嬪彂瀹屾垚鍚庯紝淇敼浠诲姟鐘舵�佷负杈撻�佺嚎娴佸姩涓�傘��
 //                        taskService.update(new LambdaUpdateWrapper<Task>()
 //                                .eq(Task::getId, task.getId())
 //                                .set(Task::getTaskSts, TaskStsType.COMPLETE_OUT.id));
@@ -244,8 +332,8 @@
     public void waveToTask() throws JsonProcessingException {
         //鑾峰彇褰撳墠浠诲姟妗d腑锛屾墍鏈変负寰呭嚭搴撶姸鎬佺殑浠诲姟妗o紝鎸夋椂闂村崌搴忔帓鍒�
         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
-                        .ge(Task::getTaskType, 101) //TODO 濡備綍纭鏄�101锛岃繕鏄�103
-                        .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT.id));
+                .ge(Task::getTaskType, 101) //TODO 濡備綍纭鏄�101锛岃繕鏄�103
+                .eq(Task::getTaskSts, TaskStsType.GENERATE_OUT.id));
         if (tasks.isEmpty()) {
             return;
         }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
index e3cc7d2..2f98da3 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -584,7 +584,7 @@
                     locDto.setWorkQty(detl.getWorkQty());
                     locDtos.add(locDto);
                     //搴撲綅瀹為檯鍙敤鏁伴噺
-                    double surplusQty = detl.getAnfme() - detl.getWorkQty();
+                    Double surplusQty = Math.round((detl.getAnfme() - detl.getWorkQty()) * 10000) / 10000.0;
                     if (surplusQty <= 0) {
                         continue;
                     }
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 04a9034..a4255b7 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
@@ -441,13 +441,12 @@
         } else {
             //鍑哄簱
             TaskDetl taskDetl = taskDetls.get(0); //TODO  鍑哄簱娴佺▼寰呯‘璁わ紝ESS鍙栬揣鍚庯紝杈撻�佺嚎娴佽浆鍒版壂鐮佸鐘舵��
-            if (taskDetl.getWaveId() == null) {
+            if (taskDetl.getWaveId() == null && task.getTaskType() != 103 && task.getTaskType() != 107) {
                 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("浠诲姟鏇存柊澶辫触");
@@ -639,7 +638,7 @@
             throw new CoolException("浠诲姟涓嶅瓨鍦�");
         }
 
-        if (task.getTaskType() != 103) {
+        if (task.getTaskType() != 103 && task.getTaskType() != 107) {
             throw new CoolException("浠诲姟绫诲瀷涓嶅彲鎷f枡");
         }
 
@@ -654,7 +653,9 @@
         }
 
         //鑾峰彇婧愬簱浣嶉珮搴�
-        LocTypeBind locTypeBind = locTypeBindService.getOne(new LambdaQueryWrapper<LocTypeBind>().eq(LocTypeBind::getLocId, originLoc.getId()).in(LocTypeBind::getTypeId, LocBindType.HEIGHT.list()));
+        LocTypeBind locTypeBind = locTypeBindService.getOne(new LambdaQueryWrapper<LocTypeBind>()
+                .eq(LocTypeBind::getLocId, originLoc.getId())
+                .in(LocTypeBind::getTypeId, LocBindType.HEIGHT.list()));
         if (locTypeBind == null) {
             throw new CoolException("搴撲綅绫诲瀷涓嶅瓨鍦�");
         }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
index fb292e4..6036add 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskTimer.java
@@ -87,6 +87,7 @@
                         executeTask11(task);
                         break;
                     case 53://鎷f枡鍐嶅叆搴�
+                    case 57:
                         executeTask53(task);
                         break;
                     default:
@@ -147,6 +148,7 @@
                         executeTask101(task);
                         break;
                     case 103://鎷f枡
+                    case 107:
                         executeTask103(task);
                         break;
                     default:
@@ -323,7 +325,8 @@
      * @param task
      */
     //鎷f枡鍐嶅叆搴�
-    private void executeTask53(Task task) {
+    @Transactional(rollbackFor = Exception.class)
+    public void executeTask53(Task task) {
         Long hostId = task.getHostId();
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, task.getTargetLoc()).eq(Loc::getHostId, hostId));
         if (loc == null) {
@@ -431,7 +434,7 @@
         if (loc == null) {
             throw new CoolException("搴撲綅涓嶅瓨鍦�");
         }
-        if (loc.getLocStsId() != LocStsType.S.val()) {
+        if (loc.getLocStsId() != LocStsType.R.val()) {
             throw new CoolException("搴撲綅鐘舵�佷笉澶勪簬R.鍑哄簱棰勭害");
         }
         List<TaskDetl> taskDetls = taskDetlService.getTaskDetlByTaskId(task.getId());
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
index bf8d372..704f4c3 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/timer/TaskWaveTimer.java
@@ -63,7 +63,8 @@
             }
             //鏌ヨ鐘舵�佷负RCS浠诲姟瀹屾垚鎵�鏈変换鍔″崟鎹�
 //            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
-            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id));            HashSet<String> sycMatnrs = new HashSet<>();
+            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id));
+            HashSet<String> sycMatnrs = new HashSet<>();
             if (taskList.isEmpty()) {
 //                throw new CoolException("娌℃湁鍙挱绉嶄换鍔★紒锛�");
             } else {
@@ -84,7 +85,7 @@
                         //鍒嗛厤璁㈠崟
                         Long waveId = taskDetl.getWaveId();
                         //鍚屼竴涓墿鏂欏彧娣诲姞涓�娆℃挱绉嶄换鍔�
-                        if(sycMatnrs.contains(taskDetl.getMatnr())) {
+                        if (sycMatnrs.contains(taskDetl.getMatnr())) {
                             continue;
                         }
                         sycMatnrs.add(taskDetl.getMatnr());
@@ -104,7 +105,7 @@
                                 .in(OrderDetl::getOrderId, orderIds)
                                 .eq(OrderDetl::getStockIndex, matUniqueKey)
                                 .eq(OrderDetl::getHostId, hostId));
-                        if(orderDetls.isEmpty()){
+                        if (orderDetls.isEmpty()) {
                             throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                         }
 
@@ -112,11 +113,15 @@
                         for (OrderDetl orderDetl : orderDetls) {
                             //fixme 浣滀笟涓暟閲忚皟鏁存斁鑷筹紝鐢熸垚鍑哄簱浠诲姟鎴愬姛鍚�
                             double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D);
-                            if (issued <= 0.0D) { continue; }
-                            if (anfme <= 0.0D) { break; }
+                            if (issued <= 0.0D) {
+                                continue;
+                            }
+                            if (anfme <= 0.0D) {
+                                break;
+                            }
 
                             double workQty = issued;
-                            if(anfme - issued < 0){
+                            if (anfme - issued < 0) {
                                 workQty = anfme;
                             }
                             anfme -= workQty;
@@ -168,7 +173,7 @@
         } catch (Exception e) {
             e.printStackTrace();
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-        }finally {
+        } finally {
             InterceptorIgnoreHelper.clearIgnoreStrategy();
         }
     }

--
Gitblit v1.9.1