From 897bf0f381e16c51cea0581e8bd8913d8bb9d047 Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期六, 06 十二月 2025 15:46:13 +0800
Subject: [PATCH] 1. 添加AGV站点与堆垛机站点绑定关系 2. 获取并板入库托盘 3. 生成AGV任务 4. 生成堆垛机任务

---
 src/main/java/com/zy/asrs/controller/StationRelaController.java    |  123 +++++++++++++
 src/main/java/com/zy/asrs/service/impl/StationRelaServiceImpl.java |   12 +
 src/main/java/com/zy/common/model/enums/IoWorkType.java            |    1 
 src/main/java/com/zy/asrs/mapper/StationRelaMapper.java            |   12 +
 src/main/java/com/zy/asrs/controller/MobileController.java         |    2 
 src/main/java/com/zy/common/CodeBuilder.java                       |    2 
 src/main/java/com/zy/asrs/enums/CommonStation.java                 |   24 ++
 src/main/java/com/zy/api/enums/MatLocType.java                     |   26 ++
 src/main/java/stationRela.sql                                      |   18 ++
 src/main/java/com/zy/asrs/entity/StationRela.java                  |   60 ++++++
 src/main/java/com/zy/asrs/service/StationRelaService.java          |    8 
 src/main/resources/mapper/StationRelaMapper.xml                    |   14 +
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java      |  164 ++++++++++++++++-
 src/main/java/com/zy/asrs/enums/TaskIOType.java                    |   51 +++++
 src/main/java/com/zy/asrs/service/MobileService.java               |    7 
 15 files changed, 502 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/zy/api/enums/MatLocType.java b/src/main/java/com/zy/api/enums/MatLocType.java
new file mode 100644
index 0000000..faa771c
--- /dev/null
+++ b/src/main/java/com/zy/api/enums/MatLocType.java
@@ -0,0 +1,26 @@
+package com.zy.api.enums;
+
+/**
+ * 鐗╂枡鎵�灞炲簱浣嶇被鍨�
+ * @author Ryan
+ * @date 2025/12/6 10:41
+ * @return null
+ */
+public enum MatLocType {
+
+    /** 灏忎欢 */
+    AUTOMATED("12", "灏忎欢"),
+    /** 涓欢 */
+    SO_HOLDING("13", "涓欢"),
+    /** 澶т欢 */
+    EO_HOLDING("14", "婊よ姱");
+
+    public String type;
+
+    public String desc;
+
+    MatLocType(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/controller/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index cca516c..fabce93 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -177,7 +177,7 @@
     /**
      * @author Ryan
      * @date 2025/11/3
-     * @description: 鍛煎彨AGV鎼繍缂撳瓨鍖�/EO/SO
+     * @description: 鍛煎彨AGV鎼繍鍏ュ簱缂撳瓨鍖�/EO/SO
      * @version 1.0
      */
     @PostMapping("/cache/out/call")
diff --git a/src/main/java/com/zy/asrs/controller/StationRelaController.java b/src/main/java/com/zy/asrs/controller/StationRelaController.java
new file mode 100644
index 0000000..9d5b95b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/StationRelaController.java
@@ -0,0 +1,123 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.asrs.entity.StationRela;
+import com.zy.asrs.service.StationRelaService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class StationRelaController extends BaseController {
+
+    @Autowired
+    private StationRelaService stationRelaService;
+
+    @RequestMapping(value = "/stationRela/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(stationRelaService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/stationRela/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<StationRela> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(stationRelaService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/stationRela/add/auth")
+    @ManagerAuth
+    public R add(StationRela stationRela) {
+        stationRelaService.insert(stationRela);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/stationRela/update/auth")
+	@ManagerAuth
+    public R update(StationRela stationRela){
+        if (Cools.isEmpty(stationRela) || null==stationRela.getId()){
+            return R.error();
+        }
+        stationRelaService.updateById(stationRela);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/stationRela/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            stationRelaService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/stationRela/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<StationRela> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("stationRela"));
+        convert(map, wrapper);
+        List<StationRela> list = stationRelaService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/stationRelaQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<StationRela> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<StationRela> page = stationRelaService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (StationRela stationRela : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", stationRela.getId());
+            map.put("value", stationRela.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/stationRela/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<StationRela> wrapper = new EntityWrapper<StationRela>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != stationRelaService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(StationRela.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/StationRela.java b/src/main/java/com/zy/asrs/entity/StationRela.java
new file mode 100644
index 0000000..9e16dca
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/StationRela.java
@@ -0,0 +1,60 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableField;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("agv_station_rela")
+public class StationRela implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * AGV绔欑偣
+     */
+    @ApiModelProperty(value= "AGV绔欑偣")
+    @TableField("agv_sta")
+    private String agvSta;
+
+    /**
+     * 鍫嗗灈鏈虹珯鐐�
+     */
+    @ApiModelProperty(value= "鍫嗗灈鏈虹珯鐐�")
+    @TableField("crn_sta")
+    private String crnSta;
+
+    /**
+     * 绔欑偣鐘舵��
+     */
+    @ApiModelProperty(value= "绔欑偣鐘舵��")
+    @TableField("use_status")
+    private String useStatus;
+
+    public StationRela() {}
+
+    public StationRela(Long id,String agvSta,String crnSta,String useStatus) {
+        this.id = id;
+        this.agvSta = agvSta;
+        this.crnSta = crnSta;
+        this.useStatus = useStatus;
+    }
+
+//    StationRela stationRela = new StationRela(
+//            null,    // [闈炵┖]
+//            null,    // AGV绔欑偣
+//            null,    // 鍫嗗灈鏈虹珯鐐�
+//            null    // 绔欑偣鐘舵��
+//    );
+
+
+}
diff --git a/src/main/java/com/zy/asrs/enums/CommonStation.java b/src/main/java/com/zy/asrs/enums/CommonStation.java
new file mode 100644
index 0000000..97e4d5b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/CommonStation.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.enums;
+
+/**
+ * 閫氱敤绔欑偣
+ * @author Ryan
+ * @date 2025/12/6 13:56
+ * @return null
+ */
+public enum CommonStation {
+
+    //閫氱敤绫诲瀷
+    COMMON_STATION_Y("Y", "鏄�"),
+    //閫氱敤
+    COMMON_STATION_N("N", "鍚�");
+
+    public String type;
+
+    public String desc;
+
+    CommonStation(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/enums/TaskIOType.java b/src/main/java/com/zy/asrs/enums/TaskIOType.java
new file mode 100644
index 0000000..8b24ea5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/enums/TaskIOType.java
@@ -0,0 +1,51 @@
+package com.zy.asrs.enums;
+
+/**
+ * 浠诲姟鍑哄叆搴撶被鍨�
+ * @author Ryan
+ * @date 2025/12/6 14:55
+ * @param null
+ * @return null
+ */
+public enum TaskIOType {
+
+    //鏂欑
+    ALL_IN("1", "1.鍏ュ簱"),
+    //鎵樼洏
+    STATION_STATION("3", "3.绔欏埌绔�"),
+
+    DEVICE_OUT("6", "6.璁惧涓婇��鍑�"),
+
+    PICKING_MEGER("8", "8.鎷f枡閫斾腑骞舵澘"),
+
+    EMPTY_IN("10", "10.绌烘澘鍏ュ簱"),
+
+    MOVE("11", "11.搴撴牸绉昏浇"),
+
+    PICK_IN("53", "53.鎷f枡鍏ュ簱"),
+
+    MERGE_IN("54", "53.骞舵澘鍏ュ簱"),
+
+    CHECK_IN("57", "57.鐩樼偣鍏ュ簱"),
+
+    ALL_OUT("101", "101.鍑哄簱"),
+
+    PICK_OUT("103", "103.鎷f枡鍑哄簱"),
+
+    MERGE_OUT("104", "104.骞舵澘鍑哄簱"),
+
+    CHECK_OUT("107", "107.鐩樼偣鍑哄簱"),
+
+    EMPTY_OUT("110", "110.绌烘澘鍑哄簱"),
+
+    ;
+
+    public Integer type;
+
+    public String desc;
+
+    TaskIOType(String type, String desc) {
+        this.type = Integer.valueOf(type);
+        this.desc = desc;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/StationRelaMapper.java b/src/main/java/com/zy/asrs/mapper/StationRelaMapper.java
new file mode 100644
index 0000000..1e6ce9f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/StationRelaMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.StationRela;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface StationRelaMapper extends BaseMapper<StationRela> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index f1d2985..16715df 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -2,10 +2,7 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.core.common.R;
-import com.zy.asrs.entity.BasDevp;
-import com.zy.asrs.entity.LocCache;
-import com.zy.asrs.entity.LocDetl;
-import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.*;
 import com.zy.asrs.entity.param.*;
 
 import java.util.Date;
@@ -108,7 +105,7 @@
      * @date 2025/12/3 8:07
      * @param locCaches
      */
-    void generateCRNOutTask(LocCache locCaches);
+    void generateCRNOutTask(BasStation station, LocCache locCaches, Long userId);
 
     R callEmptyCar(AgvCallParams params);
 }
diff --git a/src/main/java/com/zy/asrs/service/StationRelaService.java b/src/main/java/com/zy/asrs/service/StationRelaService.java
new file mode 100644
index 0000000..8e65286
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/StationRelaService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.StationRela;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface StationRelaService extends IService<StationRela> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index 2f151ef..15df4a6 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -11,8 +11,7 @@
 import com.zy.asrs.entity.result.ForwardAGVTaskDTO;
 import com.zy.asrs.entity.result.HIKApiDTO;
 import com.zy.asrs.entity.result.HIKResultDTO;
-import com.zy.asrs.enums.LocAreaType;
-import com.zy.asrs.enums.LocStsType;
+import com.zy.asrs.enums.*;
 import com.zy.asrs.enums.OrderSettle;
 import com.zy.asrs.mapper.LocMastMapper;
 import com.zy.asrs.mapper.ManLocDetlMapper;
@@ -23,7 +22,9 @@
 import com.zy.common.constant.MesConstant;
 import com.zy.common.entity.Parameter;
 import com.zy.common.model.DetlDto;
+import com.zy.common.model.LocDetlDto;
 import com.zy.common.model.MesCombParam;
+import com.zy.common.model.enums.IoWorkType;
 import com.zy.common.model.enums.WorkNoType;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
@@ -121,6 +122,8 @@
     private BasContainerService basContainerService;
     @Autowired
     private BasAreasService basAreasService;
+    @Autowired
+    private StationRelaService stationRelaService;
 
     @Override
     @Transactional
@@ -653,7 +656,7 @@
                 }
 
                 if (elem.getAnfme() > detls.getEnableQty()) {
-                    throw new CoolException(detls.getMatnr() + "鍏ュ簱鏁伴噺涓嶅悎娉�");
+                    throw new CoolException(detls.getMatnr() + "鍏ュ簱鏁伴噺涓嶅悎瑙勫垯");
                 }
                 OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, order.getId(), elem.getMatnr(), elem.getBatch(), elem.getBrand(), elem.getStandby1(), elem.getStandby2(), elem.getStandby3(),
                         elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3(), elem.getAnfme());
@@ -1276,8 +1279,8 @@
         /**鐢熸垚缂撳瓨鍖哄嚭搴撲换鍔�*/
         generateCacheOutTask(station, locCaches, userId);
 
-        /**鐢熸垚绔嬪簱鍑哄簱浠诲姟*/
-        generateCRNOutTask(locCaches);
+//        /**鐢熸垚绔嬪簱鍑哄簱浠诲姟*/
+        generateCRNOutTask(station, locCaches, userId);
 
         return R.ok();
     }
@@ -1314,31 +1317,165 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void generateCRNOutTask(LocCache locCaches) {
+    public void generateCRNOutTask(BasStation station, LocCache locCaches, Long userId) {
         if (Objects.isNull(locCaches)) {
             throw new CoolException("搴撲綅涓嶈兘涓虹┖锛侊紒");
         }
+        //鑾峰彇缂撳瓨鍖轰俊鎭�
         BasAreas basAreas = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_IN_CACHE.type));
         if (Objects.isNull(basAreas)) {
             throw new CoolException("搴撳尯涓嶅瓨鍦紒锛�");
         }
         List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
-                .eq("area_id", basAreas.getAreaNo())
+                .eq("area_id", basAreas.getId())
                 .eq("loc_id", locCaches.getId()));
-
         if (Objects.isNull(locDetls)) {
             throw new CoolException("搴撳瓨鏄庣粏涓嶅瓨鍦紒锛�");
         }
+        //鑾峰彇绔嬪簱鍖轰俊鎭�
+        BasAreas one = basAreasService.selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_CRN.type));
+        if (Objects.isNull(one)) {
+            throw new CoolException("鏁版嵁閿欒锛氬簱鍖轰笉瀛樺湪锛侊紒");
+        }
 
-        //鎸夌墿鏂欑紪鐮佸垎绫�
+        List<StationRela> relas = stationRelaService.selectList(new EntityWrapper<StationRela>().eq("agv_sta", station.getDevNo()));
+        if (Objects.isNull(relas) || relas.isEmpty()) {
+            throw new CoolException("绔欑偣鏈叧鑱斿爢鍨涙満浣滀笟绔欑偣锛侊紒");
+        }
+
+        Set<String> crnStas = relas.stream().map(StationRela::getCrnSta).collect(Collectors.toSet());
+
+        List<BasDevp> devps = basDevpService.selectList(new EntityWrapper<BasDevp>().in("dev_no", crnStas).eq("loading", CommonStation.COMMON_STATION_Y.type));
+        if (Objects.isNull(devps) || devps.isEmpty()) {
+            throw new CoolException("鏃犵珯鐐瑰彲鐢紒");
+        }
+        Collections.shuffle(devps);
+        BasDevp basDevp = devps.stream().findFirst().get();
+
+        List<LocMast> locMasts = new ArrayList<>();
         Map<String, List<LocDetl>> listMap = locDetls.stream().collect(Collectors.groupingBy(LocDetl::getMatnr));
-        listMap.forEach((key, detls) -> {
+        listMap.forEach((matnr, detls) -> {
+            //鏍规嵁supId(渚涘簲鍟�)鍒嗙被锛屽緱鍒板嚭搴撴�绘暟
+            Map<String, List<LocDetl>> supIds = detls.stream().collect(Collectors.groupingBy(LocDetl::getStandby1));
+            supIds.forEach((supId, sups) -> {
+                Double sum = sups.stream().mapToDouble(LocDetl::getAnfme).sum();
+                //鑾峰彇褰撳墠渚涘簲鍟�+ 鐗╂枡鍦ㄥ簱
+                List<LocDetl> detlList = locDetlService.selectList(new EntityWrapper<LocDetl>()
+                        .eq("matnr", matnr)
+                        .eq("area_id", one.getId())
+                        .eq("standby1", supId).orderAsc(Arrays.asList("appe_time")));
+                //TODO銆� 鍒ゆ柇鏄惁鏈夋柊搴撲綅锛屾病鏈夋柊搴撲綅锛屽啀鎵炬湁绌烘牸鐨勪綅缃斁   1. 鍒ゆ柇褰撳墠鐗╂枡鏄惁鏈夊簱瀛� 2. 娌℃湁浣欐枡鏌ヨ鏂板簱浣�
 
+                if (!Objects.isNull(detlList) && !detlList.isEmpty()) {
+                    Map<String, List<LocDetl>> locMaps = detlList.stream().collect(Collectors.groupingBy(LocDetl::getLocNo));
+                    locMaps.forEach((locNo, adetls) -> {
+                        LocMast locMast = locMastService.selectById(locNo);
+                        if (Objects.isNull(locMast)) {
+                            throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄俊鎭笉瀛樺湪锛侊紒");
+                        }
+                        BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", locMast.getBarcode()));
+                        if (Objects.isNull(container)) {
+                            throw new CoolException("鏁版嵁閿欒锛屽鍣ㄤ笉瀛樺湪锛侊紒");
+                        }
+                        Set<String> sets = adetls.stream().map(LocDetl::getMatnr).collect(Collectors.toSet());
+                        //鍒ゆ柇瀹瑰櫒鏄惁杩樺彲娣锋斁,鍙婂綋鍓嶇墿鏂欏彲鏀惧灏�
+                        if (container.getMixMax() > sets.size()) {
+                            int suplus = container.getMixMax() - sets.size();
+                            Mat mats = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", matnr));
+                            if (Objects.isNull(mats)) {
+                                throw new CoolException("鐗╂枡涓嶅瓨鍦紒锛�");
+                            }
+                            Double v = mats.getUpQty() * suplus;
+                            //灏忎簬闆�
+                            if (sum.compareTo(v) <= 0) {
+                                //鍙斁涓�
+                                locMasts.add(locMast);
+                            }
+                        }
+                    });
+                }
+            });
         });
 
-        locDetls.forEach(locDetl -> {
+        if (!locMasts.isEmpty()) {
+            //鐢熸垚鍫嗗灈鏈哄嚭搴撲换鍔�
+            generateOutTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId);
+        }
+    }
 
-        });
+    /**
+     * 鐢熸垚鍫嗗灈鏈哄嚭搴撲换鍔�
+     * @author Ryan
+     * @date 2025/12/6 14:44
+     * @param locMasts
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void generateOutTask(List<LocMast> locMasts, Integer ioType, BasDevp devp, Long userId) {
+        Date now = new Date();
+        for (LocMast locMast : locMasts) {
+            if (Objects.isNull(ioType)) {
+                continue;
+            }
+            Integer outSta = devp.getDevNo();
+            // 鑾峰彇璺緞
+            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
+            // 鐢熸垚宸ヤ綔鍙�
+            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
+            // 鐢熸垚宸ヤ綔妗�
+            WrkMast wrkMast = new WrkMast();
+            wrkMast.setWrkNo(workNo);
+            wrkMast.setIoTime(now);
+            wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
+            wrkMast.setIoType(ioType); // 鍏ュ嚭搴撶被鍨�
+            wrkMast.setIoPri(13D); // 浼樺厛绾э細13
+            wrkMast.setCrnNo(locMast.getCrnNo());
+            wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 婧愮珯
+            wrkMast.setStaNo(staDesc.getStnNo() + ""); // 鐩爣绔�
+            wrkMast.setSourceLocNo(locMast.getLocNo()); // 婧愬簱浣�
+            wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
+            wrkMast.setPicking("N"); // 鎷f枡
+            wrkMast.setExitMk("N"); // 閫�鍑�
+            wrkMast.setEmptyMk("N"); // 绌烘澘
+            wrkMast.setLinkMis("N");
+            wrkMast.setBarcode(locMast.getBarcode());
+            wrkMast.setAppeUser(userId); // 鎿嶄綔浜哄憳鏁版嵁
+            wrkMast.setAppeTime(now);
+            wrkMast.setModiUser(userId);
+            wrkMast.setModiTime(now);
+            if (!wrkMastService.insert(wrkMast)) {
+                throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐ワ紝鍑哄簱搴撲綅鍙凤細" + locMast.getLocNo());
+            }
+
+            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
+
+            // 鐢熸垚宸ヤ綔妗f槑缁�
+            for (LocDetl detlDto : locDetls) {
+                WrkDetl wrkDetl = new WrkDetl();
+                BeanUtils.copyProperties(detlDto, wrkDetl);
+                wrkDetl.setOrderNo(""); // 鎵嬪姩鍑哄簱涓嶉渶瑕佸甫鍑哄簱瀛樹腑鐨勫崟鎹紪鍙�
+                wrkDetl.setWrkNo(workNo);
+                wrkDetl.setIoTime(now);
+                wrkDetl.setAppeTime(now);
+                wrkDetl.setAppeUser(userId);
+                wrkDetl.setModiTime(now);
+                wrkDetl.setModiUser(userId);
+                if (!wrkDetlService.insert(wrkDetl)) {
+                    throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                }
+            }
+            // 淇敼搴撲綅鐘舵��:   F.鍦ㄥ簱 ====>>> R.鍑哄簱棰勭害/P.鎷f枡/鐩樼偣/骞舵澘鍑哄簱涓�
+            locMast = locMastService.selectById(locMast.getLocNo());
+            if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_F.type)) {
+                locMast.setLocSts(ioType == 101 ? "R" : "P");
+                locMast.setModiUser(userId);
+                locMast.setModiTime(now);
+                if (!locMastService.updateById(locMast)) {
+                    throw new CoolException("棰勭害搴撲綅鐘舵�佸け璐ワ紝搴撲綅鍙凤細" + locMast.getLocNo());
+                }
+            } else {
+                throw new CoolException(locMast.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
+            }
+        }
     }
 
     /**
@@ -1397,9 +1534,6 @@
                     .setModiUser(userId);
             taskDetls.add(wrkDetl);
         });
-
-
-
         //淇濆瓨宸ヤ綔妗f槑缁�
         if (!taskDetlService.insertBatch(taskDetls)) {
             throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
diff --git a/src/main/java/com/zy/asrs/service/impl/StationRelaServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/StationRelaServiceImpl.java
new file mode 100644
index 0000000..4735086
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/StationRelaServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.StationRelaMapper;
+import com.zy.asrs.entity.StationRela;
+import com.zy.asrs.service.StationRelaService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("stationRelaService")
+public class StationRelaServiceImpl extends ServiceImpl<StationRelaMapper, StationRela> implements StationRelaService {
+
+}
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 0e31eae..02e069c 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
         generator.url="192.168.4.15:1433;databasename=jsxsasrs";
         generator.username="sa";
         generator.password="sa@123";
-        generator.table="man_check_order_detl";
+        generator.table="agv_station_rela";
         generator.packagePath="com.zy.asrs";
         generator.html = false;
         generator.js = false;
diff --git a/src/main/java/com/zy/common/model/enums/IoWorkType.java b/src/main/java/com/zy/common/model/enums/IoWorkType.java
index 0077d5c..0083e3e 100644
--- a/src/main/java/com/zy/common/model/enums/IoWorkType.java
+++ b/src/main/java/com/zy/common/model/enums/IoWorkType.java
@@ -6,6 +6,7 @@
     PICK_IN,
     ALL_OUT,
     PICK_OUT,
+    MERGE_OUT,
     CHECK_OUT,
     ;
 
diff --git a/src/main/java/stationRela.sql b/src/main/java/stationRela.sql
new file mode 100644
index 0000000..0f7521d
--- /dev/null
+++ b/src/main/java/stationRela.sql
@@ -0,0 +1,18 @@
+-- save stationRela record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela/stationRela.html', 'stationRela绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'stationRela#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela/stationRela.html', N'stationRela绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'stationRela#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/src/main/resources/mapper/StationRelaMapper.xml b/src/main/resources/mapper/StationRelaMapper.xml
new file mode 100644
index 0000000..c9628af
--- /dev/null
+++ b/src/main/resources/mapper/StationRelaMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.StationRelaMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.StationRela">
+        <result column="id" property="id" />
+        <result column="agv_sta" property="agvSta" />
+        <result column="crn_sta" property="crnSta" />
+        <result column="use_status" property="useStatus" />
+
+    </resultMap>
+
+</mapper>

--
Gitblit v1.9.1