From 8359572be2164aec32219fafd5e72f4035067dff Mon Sep 17 00:00:00 2001
From: zyx <zyx123456>
Date: 星期二, 01 八月 2023 08:52:26 +0800
Subject: [PATCH] agv 订单出库功能

---
 src/main/java/com/zy/asrs/controller/OutController.java |  216 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 211 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OutController.java b/src/main/java/com/zy/asrs/controller/OutController.java
index 528b9e3..79c18af 100644
--- a/src/main/java/com/zy/asrs/controller/OutController.java
+++ b/src/main/java/com/zy/asrs/controller/OutController.java
@@ -3,9 +3,9 @@
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.annotations.ManagerAuth;
-import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.service.*;
 import com.zy.common.model.LocDto;
@@ -17,7 +17,9 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -43,6 +45,15 @@
     private BasDevpService basDevpService;
     @Autowired
     private MatService matService;
+    @Autowired
+    private AgvLocMastService agvLocMastService;
+    @Autowired
+    private AgvBasDevpService agvBasDevpService;
+    @Autowired
+    private AgvWorkService agvWorkService;
+
+    @Autowired
+    private AgvLocDetlService agvLocDetlService;
 
     @PostMapping("/out/pakout/orderDetlIds/auth")
     @ManagerAuth
@@ -51,9 +62,34 @@
         return R.ok().add(orderDetlService.selectByOrderId(orderId).stream().map(OrderDetl::getId).distinct().collect(Collectors.toList()));
     }
 
+    //鍑哄簱
     @PostMapping("/out/pakout/preview/auth")
     @ManagerAuth
     public R pakoutPreview(@RequestBody List<Long> ids) {
+
+        List<OrderDetl> orderDetlList = orderDetlService.selectBatchIds(ids);
+        //杩斿洖缁欏墠绔殑搴撲綅浠ュ強绔欑偣淇℃伅
+        List<LocDto> locDtoList = new ArrayList<>();
+
+        for (OrderDetl orderDetl : orderDetlList) {
+            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
+            if (issued <= 0.0D) { continue; }
+
+            //鍏堟壘AGV鐨勫簱瀛橈紝濡傛灉杩斿洖鐨刬ssued澶т簬0锛屽垯鍘诲洓椤瑰簱鎵�
+            issued = agvLocDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued);
+
+            //浠庡洓椤瑰簱鐨勫簱瀛橀噷闈㈡壘锛�
+            issued = locDetlService.queryStockAndSetLocDto(orderDetl.getMatnr(),orderDetl.getBatch(),orderDetl.getOrderNo(),locDtoList,issued);
+
+            if (issued > 0) {
+                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
+                locDto.setLack(Boolean.TRUE);
+                locDtoList.add(locDto);
+            }
+        }
+        return R.ok().add(locDtoList);
+
+        /*
         if (Cools.isEmpty(ids)) {
             return R.parse(BaseRes.PARAM);
         }
@@ -90,13 +126,54 @@
                 locDtos.add(locDto);
             }
         }
-        return R.ok().add(locDtos);
+        return R.ok().add(locDtos); */
     }
 
     @PostMapping("/out/pakout/auth")
     @ManagerAuth(memo = "璁㈠崟鍑哄簱")
     @Transactional
     public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
+
+        //鍒ゆ柇鏄惁鍙互鐢熸垚鍑哄簱宸ヤ綔妗�
+        boolean lack = true;
+        for (LocDto locDto : locDtos) {
+            //濡傛灉AGV鍑哄簱绔欎负绌� 鍜� 鍥涢」搴撳嚭搴撶珯涓虹┖ 骞朵笖 鏈夊簱瀛樼殑鎯呭喌涓� 鍒欒繑鍥�
+            if (Cools.isEmpty(locDto.getStaNo()) && Cools.isEmpty(locDto.getAgvStaNo()) &&!locDto.isLack()) {
+                return R.error(locDto.getLocNo()+"搴撲綅璇烽�夋嫨鍑哄簱绔�");
+            }
+        }
+        //濡傛灉鎵�鏈夊簱閮芥病鏈夊簱瀛橈紝鍒欒繑鍥�
+        for (LocDto locDto : locDtos) {
+            if (!locDto.isLack()) {
+                lack = false;
+                break;
+            }
+        }
+        if (lack) {
+            return R.error("搴撳瓨涓嶈冻");
+        }
+        Thread.sleep(500L);
+
+        // 璁㈠崟棰勬牎楠�  ===>> 1.璁㈠崟鐘舵�侊紱 2.璁㈠崟甯﹀嚭鏁伴噺
+        List<OrderDto> orderDtos = orderPreVerification(locDtos);
+
+        List<TaskDto> taskDtos = new ArrayList<>();
+        List<TaskDto> agvTaskDtos = new ArrayList<>();
+        generateTaskDto(locDtos,taskDtos,agvTaskDtos);
+
+        //鐢熸垚AGV鍑哄簱浠诲姟
+        agvWorkService.stockOutWrkMast(agvTaskDtos, getUserId());
+
+        // 鐢熸垚鍑哄簱浠诲姟
+        List<String> excludeLocNos = taskDtos.stream().map(TaskDto::getLocNo).distinct().collect(Collectors.toList());
+        for (TaskDto taskDto : taskDtos) {
+            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
+            workService.stockOut(staNo, taskDto, getUserId());
+            locMastService.breakUp(taskDto.getLocNo(), excludeLocNos);
+        }
+        return R.ok();
+
+        /*
         if (Cools.isEmpty(locDtos)) {
             return R.parse(BaseRes.PARAM);
         }
@@ -184,7 +261,7 @@
             workService.stockOut(staNo, taskDto, getUserId());
             locMastService.breakUp(taskDto.getLocNo(), excludeLocNos);
         }
-        return R.ok();
+        return R.ok();*/
     }
 
 
@@ -200,6 +277,31 @@
     @PostMapping("/out/pakout/preview/merge/auth")
     @ManagerAuth
     public R pakoutPreviewMerge(@RequestBody List<OrderMergeVo> list) {
+
+        //杩斿洖缁欏墠绔殑搴撲綅浠ュ強绔欑偣淇℃伅
+        List<LocDto> locDtoList = new ArrayList<>();
+
+        for (OrderMergeVo vo : list) {
+            double issued = Optional.of(vo.getAnfme()).orElse(0.0D);
+            if (issued <= 0.0D) {
+                continue;
+            }
+            //鍏堟壘AGV鐨勫簱瀛橈紝濡傛灉杩斿洖鐨刬ssued澶т簬0锛屽垯鍘诲洓椤瑰簱鎵�
+            issued = agvLocDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),null,locDtoList,issued);
+            //浠庡洓椤瑰簱鐨勫簱瀛橀噷闈㈡壘锛�
+            issued = locDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),null,locDtoList,issued);
+
+            if (issued > 0) {
+                LocDto locDto = new LocDto(null, vo.getMatnr(), vo.getMaktx(), vo.getBatch(), null, issued);
+                locDto.setLack(Boolean.TRUE);
+                locDtoList.add(locDto);
+            }
+
+        }
+
+        return R.ok().add(locDtoList);
+
+        /*
         if (Cools.isEmpty(list)) {
             return R.parse(BaseRes.PARAM);
         }
@@ -236,7 +338,111 @@
             assert mat != null;
             locDto.setSpecs(mat.getSpecs());
         }
-        return R.ok().add(locDtos);
+        return R.ok().add(locDtos);*/
     }
 
+
+    /*
+    鐢熸垚鍑哄簱浠诲姟dto
+     */
+    private void generateTaskDto(List<LocDto> locDtos, List<TaskDto> taskDtos, List<TaskDto> agvTaskDtos){
+        // 鏍规嵁 锛堝簱浣� & 鍑哄簱绔欙級 鍒嗙粍锛� 鐞嗘兂鐘舵�侊細涓�缁勪负涓�娆″嚭搴撲换鍔�
+        for (LocDto locDto : locDtos) {
+            if (locDto.isLack()) { continue; }
+            //AGV搴�
+            if(!Cools.isEmpty(locDto.getAgvStaNos())){
+                generateTaskDtoForAgv(locDto,agvTaskDtos);
+
+                //鍥涢」搴�
+            }else{
+                generateTaskDtoForBase(locDto,taskDtos);
+            }
+
+        }
+    }
+
+    /*
+    鐢熸垚AGV鐨勪换鍔to
+     */
+    private void generateTaskDtoForAgv(LocDto locDto, List<TaskDto> agvTaskDtos){
+        // 闃叉鍓嶇椤甸潰鎻愬彇搴撲綅淇℃伅鍚庯紝鍦ㄥ叾浠栧湴鏂瑰璇ュ簱浣嶇敓鎴愪簡鍑哄簱浠诲姟(搴撲綅鐘舵�侀潪F鐘舵��)
+        AgvLocMast agvLocMast = agvLocMastService.selectById(locDto.getLocNo());
+        if(!Cools.isEmpty(agvLocMast) && !agvLocMast.getLocSts().equals("F")){
+            throw new CoolException("搴撲綅鍙烽潪鍦ㄥ簱鐘舵�侊紝璇烽噸鏂伴�夋嫨鍑哄簱搴撲綅===>>" + locDto.getLocNo());
+        }
+        AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                .eq("station_code", locDto.getAgvStaNo())
+                .eq("loc_sts", "O"));
+        if(Cools.isEmpty(agvBasDevp)){
+            //TODO 鍋囧鍑哄簱绔欑偣涓嶈冻锛岃褰曟湭鍑哄簱鐨勫簱浣嶏紱
+            return;
+        }
+        TaskDto taskDto = new TaskDto(locDto.getLocNo(), agvBasDevp.getDevNo(), locDto);
+        //TODO 鏆備笉鑰冭檻搴撲綅娣疯浇鐘舵�侊紙鍚庣画鐪嬫儏鍐垫槸鍚﹂渶瑕佸垽鏂級
+        agvTaskDtos.add(taskDto);
+
+    }
+
+    /*
+    鐢熸垚鍥涢」搴撶殑浠诲姟dto
+     */
+    private void generateTaskDtoForBase(LocDto locDto, List<TaskDto> taskDtos){
+        // 闃叉鍓嶇椤甸潰鎻愬彇搴撲綅淇℃伅鍚庯紝鍦ㄥ叾浠栧湴鏂瑰璇ュ簱浣嶇敓鎴愪簡鍑哄簱浠诲姟(搴撲綅鐘舵�侀潪F鐘舵��)
+        LocMast locMast = locMastService.selectById(locDto.getLocNo());
+        if(!Cools.isEmpty(locMast) && !locMast.getLocSts().equals("F")){
+            throw new CoolException("搴撲綅鍙烽潪鍦ㄥ簱鐘舵�侊紝璇烽噸鏂伴�夋嫨鍑哄簱搴撲綅===>>" + locDto.getLocNo());
+        }
+
+        TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto);
+        //濡傛灉搴撲綅瀛樺湪娣疯浇
+        if (TaskDto.has(taskDtos, taskDto)) {
+            TaskDto dto = TaskDto.find(taskDtos, taskDto);
+            assert dto != null;
+            dto.getLocDtos().addAll(taskDto.getLocDtos());
+        } else {
+            taskDtos.add(taskDto);
+        }
+    }
+
+    /*
+    璁㈠崟棰勬牎楠�  ===>> 1.璁㈠崟鐘舵�侊紱 2.璁㈠崟甯﹀嚭鏁伴噺
+     */
+    private List<OrderDto> orderPreVerification(List<LocDto> locDtos){
+        List<OrderDto> orderDtos = new ArrayList<>();
+        for (LocDto locDto : locDtos) {
+            if (!isJSON(locDto.getOrderNo())) {
+            //if (!Cools.isEmpty(locDto.getOrderNo())) {
+                if (Cools.isEmpty(locDto.getOrderNo())) { continue; }
+                OrderDto orderDto = new OrderDto(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(), locDto.getAnfme());
+                if (OrderDto.has(orderDtos, orderDto)) {
+                    OrderDto dto = OrderDto.find(orderDtos, orderDto);
+                    assert dto != null;
+                    dto.setAnfme(dto.getAnfme() + orderDto.getAnfme());
+                } else {
+                    orderDtos.add(orderDto);
+                }
+            } else {
+                // 璁㈠崟鍚堝苟鍑哄簱
+                List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
+                for (OrderDto one : orderDtoList) {
+                    OrderDto orderDto = new OrderDto(one.getOrderNo(), locDto.getMatnr(), locDto.getBatch(), one.getAnfme());
+                    if (OrderDto.has(orderDtos, orderDto)) {
+                        OrderDto dto = OrderDto.find(orderDtos, orderDto);
+                        assert dto != null;
+                        dto.setAnfme(dto.getAnfme() + orderDto.getAnfme());
+                    } else {
+                        orderDtos.add(orderDto);
+                    }
+                }
+            }
+        }
+        for (OrderDto orderDto : orderDtos) {
+            Order order = orderService.selectByNo(orderDto.getOrderNo());
+            if (order.getSettle() > 2) {
+                throw new CoolException(orderDto.getOrderNo() + "璁㈠崟宸插け鏁堬紝璇峰強鏃跺埛鏂伴〉闈�");
+                //return R.error(orderDto.getOrderNo() + "璁㈠崟宸插け鏁堬紝璇峰強鏃跺埛鏂伴〉闈�");
+            }
+        }
+        return orderDtos;
+    }
 }

--
Gitblit v1.9.1