自动化立体仓库 - WMS系统
*
lsh
7 小时以前 5e098d04e6521bf72a71d0e70724580eca881fab
*
8个文件已修改
1个文件已添加
408 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/DocType.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderMesXGHYParam.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/DocType.java
@@ -189,5 +189,30 @@
    }
    public String getDocName$(String outOrIn){
        if (Cools.isEmpty(this.docName)){
            if (outOrIn.equals("out")){
                return "成品出库";
            } else {
                return "成品入库";
            }
        }else {
            switch (this.docName){
                case "拆包装检出库":
                case "退货入库":
                    return this.docName;
                case "组货单":
                    return "成品出库";
                default:
                    if (outOrIn.equals("out")){
                        return "成品出库";
                    } else {
                        return "成品入库";
                    }
            }
        }
    }
}
src/main/java/com/zy/asrs/entity/param/OrderMesXGHYParam.java
New file
@@ -0,0 +1,195 @@
package com.zy.asrs.entity.param;
import com.core.common.DateUtils;
import com.zy.asrs.entity.WrkDetl;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/*
 *  Created by Monkey D. Luffy on 2025.10.28
 * */
@Data
public class OrderMesXGHYParam {
    private String barcode ;    //托盘条码(徐工时间戳)  = snowflakeIdWorker.nextId()  zpallet
    private int palletizingNo;    //码垛位编号(位置)
    private List<Box> matList;    //木箱集合
    @Data
    public static class Box {
        private String packageGroupNo;    //包装组号(徐工没有,只有箱号卷号一对一)  //null
        private String outOrIn;    //out 出;in入;
        /*
         * 接口1=》不合格品出库二楼: 不合格品出库
         * 接口2=》正常出库二楼: 拆包装检出库
         * 2楼机械臂入库:成品入库
         * 1楼退库:退货入库
         * 盘点出库:盘点出库
         * 盘点入库:盘点入库
         * 1楼手动出库:成品出库
         * 组货单出:成品出库
         * */
        private String stockType;    //单据类型
        private String boxNo;    //箱号
        private String boxPos;    //位置  1  2  3   origin 木箱位置
        private String boxType;    //木箱类型  木箱类型  brand  brand$
        private String wideInWidth;    // 4.5μm×588mm  matnr  中的  4.5
        private String thickness;    //4.5μm×588mm  matnr  中的  588
        private String rollType = "纸轴";    //木箱类型  brand  brand$
        private List<Roll> rolls;    //卷集合
        @Data
        public static class Roll {
            private String boxNo;    //箱号  batch
            private String rollNo;    //卷号  model
            private String specs;    //规格  4.5μm×588mm  matnr
            private String length;    //长度  price
            private String splices;    //接头  specs
            private String netWeight;    //净重  weight
            private String grossWeight;    //毛重  volume
            private String fqTime = DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F);    //
            private String orderSerialNumber;    //WMS流水号  ERP无需理会
            private String orderSerialNumberMsg = "orderSerialNumber为WMS流水号===ERP无需理会";    //
            public Roll() {
            }
            public Roll(WrkDetl sampleWrkDetl) {
                this.boxNo = sampleWrkDetl.getBatch();
                this.rollNo = sampleWrkDetl.getModel();
                this.specs = sampleWrkDetl.getMatnr();
                this.length = sampleWrkDetl.getPrice().toString();
                this.splices = sampleWrkDetl.getSpecs();
                this.netWeight = sampleWrkDetl.getWeight().toString();
                this.grossWeight = sampleWrkDetl.getVolume().toString();
                this.orderSerialNumber = sampleWrkDetl.getOrderNo();
            }
            @Override
            public String toString() {
                return String.format(
                        "\tRoll(rollNo=%s, specs=%s, length=%s, splices=%s, netWeight=%s, grossWeight=%s, fqTime=%s, boxNo=%s, orderSerialNumber=%s, orderSerialNumberMsg=%s)\n",
                        rollNo, specs, length, splices, netWeight, grossWeight, fqTime, boxNo, orderSerialNumber, orderSerialNumberMsg
                );
            }
        }
        @Override
        public String toString() {
            return String.format(
                    "Box(boxNo=%s, boxPos=%s, packageGroupNo=%s, outOrIn=%s, stockType=%s, boxType=%s, rollType=%s, wideInWidth=%s, thickness=%s, rolls=\n%s)",
                    boxNo, boxPos, packageGroupNo, outOrIn, stockType, boxType, rollType, wideInWidth, thickness, rolls.toString()
            );
        }
    }
    public OrderMesXGHYParam() {
    }
    public OrderMesXGHYParam(List<WrkDetl> wrkDetls,String outOrIn) {
        // 按batch字段分组,每个batch对应一个Box
        Map<String, List<WrkDetl>> batchGroup = wrkDetls.stream()
                .collect(Collectors.groupingBy(WrkDetl::getBatch));
        List<OrderMesXGHYParam.Box> boxList = new ArrayList<>();
        // 处理每个batch分组
        for (Map.Entry<String, List<WrkDetl>> entry : batchGroup.entrySet()) {
            String batch = entry.getKey();
            List<WrkDetl> batchWrkDetls = entry.getValue();
            // 创建Box对象
            OrderMesXGHYParam.Box box = new OrderMesXGHYParam.Box();
            box.setBoxNo(batch); // batch对应boxNo
            box.setOutOrIn(outOrIn); // batch对应boxNo
            // 按model字段分组,每个model对应一个roll
            Map<String, List<WrkDetl>> modelGroup = batchWrkDetls.stream()
                    .collect(Collectors.groupingBy(WrkDetl::getModel));
            List<OrderMesXGHYParam.Box.Roll> rollList = new ArrayList<>();
            String wideInWidth = null;
            String thickness = null;
            String boxPos = null;
            String boxType = null;
            String stockType = null;    //单据类型
            String packageGroupNo = null;    //包装组号(徐工没有,只有箱号卷号一对一)  //null
            // 处理每个model分组
            for (Map.Entry<String, List<WrkDetl>> modelEntry : modelGroup.entrySet()) {
                List<WrkDetl> modelWrkDetls = modelEntry.getValue();
                // 取第一个WrkDetl来创建roll(因为同一个model的roll信息应该相同)
                WrkDetl sampleWrkDetl = modelWrkDetls.get(0);
                String matnr = sampleWrkDetl.getMatnr();
                // 使用正则表达式提取数字部分
                // 先按"μm×"分割,再按"mm"分割
                String[] firstSplit = matnr.split("μm×");
                if (firstSplit.length == 2) {
                    wideInWidth = firstSplit[0];  // 5.2
                    String[] secondSplit = firstSplit[1].split("mm");
                    if (secondSplit.length > 0) {
                        thickness = secondSplit[0];  // 834.1
                    }
                }
                boxPos = sampleWrkDetl.getOrigin();
                boxType = sampleWrkDetl.getBrand$();
                stockType = sampleWrkDetl.getManu();
                packageGroupNo = sampleWrkDetl.getDeadTime();
                OrderMesXGHYParam.Box.Roll roll = new OrderMesXGHYParam.Box.Roll(sampleWrkDetl);
                rollList.add(roll);
            }
            box.setWideInWidth(wideInWidth);
            box.setThickness(thickness);
            box.setBoxPos(boxPos);
            box.setBoxType(boxType);
            box.setStockType(stockType);
            box.setPackageGroupNo(packageGroupNo);
            box.setRolls(rollList);
            boxList.add(box);
        }
        // 设置到主对象中
        this.matList = boxList;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("OrderMesXGHYParam(\n");
        sb.append("  barcode=").append(barcode).append(",\n");
        sb.append("  palletizingNo=").append(palletizingNo).append(",\n");
        sb.append("  matList=[\n");
        if (matList != null) {
            for (int i = 0; i < matList.size(); i++) {
                sb.append("\t").append(matList.get(i).toString().replace("\n", "\n\t"));
                if (i < matList.size() - 1) {
                    sb.append(",\n");
                } else {
                    sb.append("\n");
                }
            }
        }
        sb.append("  ]\n");
        sb.append(")");
        return sb.toString();
    }
}
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -18,6 +18,7 @@
    List<WrkMast> selectToBeCompleteData202();
    List<WrkMast> selectToBeHistoryData();
    List<WrkMast> selectToBeHistoryDataV1();
    List<WrkMast> selectToBeHistoryData2();
    int orderAddPri(@Param("orderNo") String orderNo);
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -13,6 +13,7 @@
    List<WrkMast> selectToBeCompleteData202();
    List<WrkMast> selectToBeHistoryData();
    List<WrkMast> selectToBeHistoryDataV1();
    List<WrkMast> selectToBeHistoryData2();
    WrkMast selectByBarcode(String barcode);
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -36,6 +36,11 @@
    }
    @Override
    public List<WrkMast> selectToBeHistoryDataV1() {
        return this.baseMapper.selectToBeHistoryDataV1();
    }
    @Override
    public List<WrkMast> selectToBeHistoryData2() {
        return this.baseMapper.selectToBeHistoryData2();
    }
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,9 +1,15 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.OrderSyncHandler;
import com.zy.common.entity.Parameter;
@@ -13,6 +19,7 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
@@ -28,6 +35,10 @@
    private OrderService orderService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private WrkMastService wrkMastService;
    @Scheduled(cron = "0 0 1 * * ? ")
    public void clearApiLog(){
@@ -39,7 +50,7 @@
    }
//    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("orderThreadPool")
//    @Async("orderThreadPool")
    public void completeAndReport(){
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
@@ -58,4 +69,48 @@
        }
    }
    @Scheduled(cron = "0 0 * * * *")
    public void completeAndReport2(){
        List<Order> orders = orderService.selectComplete();
        for (Order order : orders) {
            try{
                if (!Cools.isEmpty(order.getOrderNo())) {
                    int selectCount = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no", order.getOrderNo()));
                    if (selectCount > 0) {
                        // 修改订单状态 4.完成 ===>> 6.已上报
                        orderService.updateSettle(order.getId(), 6L, null);
                        continue;
                    }
                }
                order.setCreateTime(new Date());
                orderService.updateById(order);
            }catch (Exception e){
                log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                log.error("订单"+order+"处理失败,异常信息:"+e);
            }
        }
    }
    @Scheduled(cron = "0/5 * * * * ? ")
    private void executeV1(){
        List<WrkMast> wrkMasts = wrkMastService.selectToBeHistoryDataV1();
        if (Cools.isEmpty(wrkMasts) || wrkMasts.size()==0) {
            return;
        }
        for (WrkMast wrkMast : wrkMasts) {
            try{
                ReturnT<String> result = orderSyncHandler.startV1(wrkMast);
                if (!result.isSuccess()) {
                    log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo());
                } else {
                    wrkMast.setLogMk("Y");
                    wrkMastService.updateById(wrkMast);
                }
            }catch (Exception e){
                log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo());
                log.error("处理失败,异常信息:"+e);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -2,16 +2,18 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OrderMesXGHYParam;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.impl.WrkDetlServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
@@ -24,6 +26,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -43,6 +46,10 @@
    private ApiLogService apiLogService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private WrkDetlServiceImpl wrkDetlService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Transactional
    public ReturnT<String> start(Order order) {
@@ -157,4 +164,89 @@
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> startV1(WrkMast wrkMast) {
//        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<>());
        if (wrkDetls.isEmpty()) {
            return SUCCESS;
        }
        String packageGroupNo;    //包装组号(徐工没有,只有箱号卷号一对一)  //null
        String outOrIn;    //out 出;in入;
        /*
         * 接口1=》不合格品出库二楼: 不合格品出库
         * 盘点出库:盘点出库
         * 盘点入库:盘点入库
         *
         *
         * 接口2=》正常出库二楼: 拆包装检出库
         * 1楼退库:退货入库
         *
         * 组货单出:成品出库
         *
         * 2楼机械臂入库:成品入库
         * 1楼手动出库:成品出库
         * */
        String stockType = null;    //单据类型
//        and (wrk_sts=5 or wrk_sts=15 or (wrk_sts!=5 and (io_type = 53 or io_type = 57)) or io_type = 107)
        if (wrkMast.getIoType()==1){
            outOrIn = "in";
        } else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==53) {
            outOrIn = "out";
        } else if (wrkMast.getIoType()==107) {
            outOrIn = "out";
            stockType = "盘点出库";
        } else if (wrkMast.getIoType()==57) {
            outOrIn = "in";
            stockType = "盘点入库";
        } else {
            return SUCCESS;
        }
        for (WrkDetl wrkDetl : wrkDetls) {
            if (outOrIn.equals("out")){
                if (!Cools.isEmpty(stockType) && stockType.equals("盘点出库")){
                    wrkDetl.setManu("盘点出库");
                } else if (!Cools.isEmpty(wrkDetl.getOrderNo()) && !wrkDetl.getOrderNo().equals("不合格品出库")){
                    Order order = orderService.selectByNo(wrkDetl.getOrderNo());
                    if (!Cools.isEmpty(order)){
                        DocType docType = docTypeService.selectById(order.getDocType());
                        if (!Cools.isEmpty(docType)) {
                            if (docType.getDocName().equals("组货单")){
//                                packageGroupNo = order.getItemName();
                                wrkDetl.setDeadTime(order.getItemName());
                            }
                            wrkDetl.setManu(docType.getDocName$());
                        } else {
                            wrkDetl.setManu("成品出库");
                        }
                    } else {
                        wrkDetl.setManu("成品出库");
                    }
                } else if (wrkDetl.getOrderNo().equals("不合格品出库")){
                    wrkDetl.setManu("不合格品出库");
                }
            } else {
                wrkDetl.setManu("成品入库");
                if (!Cools.isEmpty(stockType) && stockType.equals("盘点入库")){
                    wrkDetl.setManu("盘点入库");
                } else if (!Cools.isEmpty(wrkDetl.getOrderNo())){
                    Order order = orderService.selectByNo(wrkDetl.getOrderNo());
                    if (!Cools.isEmpty(order)){
                        DocType docType = docTypeService.selectById(order.getDocType());
                        if (!Cools.isEmpty(docType)) {
                            wrkDetl.setManu(docType.getDocName$());
                        }
                    }
                }
            }
        }
        OrderMesXGHYParam orderMesXGHYParam = new OrderMesXGHYParam(wrkDetls,outOrIn);
        orderMesXGHYParam.setBarcode(String.valueOf(snowflakeIdWorker.nextId()));
        orderMesXGHYParam.setPalletizingNo(1);
        System.out.println(orderMesXGHYParam.toString());
        return SUCCESS;
    }
}
src/main/resources/mapper/OrderMapper.xml
@@ -54,7 +54,7 @@
    </update>
    <select id="selectComplete" resultMap="BaseResultMap">
        select top 5 *
        select top 10 *
        from man_order
        where 1=1
        and settle = 4
src/main/resources/mapper/WrkMastMapper.xml
@@ -72,13 +72,23 @@
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
        select * from asr_wrk_mast
        where wrk_sts=5
        or wrk_sts=44
        or wrk_sts=64
        or (wrk_sts=57 and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,15,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
        where 1=1
        and (wrk_sts=5
            or wrk_sts=44
            or wrk_sts=64
            or (wrk_sts=57 and wrk_no not in (select wrk_no from asr_bas_devp))
            or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
            or (wrk_sts=15 and dateadd(mi,15,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
            or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp)))
        and log_mk = 'Y'
        order by io_time,wrk_no asc
    </select>
    <select id="selectToBeHistoryDataV1" resultMap="BaseResultMap">
        select * from asr_wrk_mast
        where 1=1
        and (wrk_sts=5 or wrk_sts=15 or io_type = 107 or (wrk_sts!=5 and (io_type = 53 or io_type = 57)))
        and log_mk != 'Y'
        order by io_time,wrk_no asc
    </select>