自动化立体仓库 - WMS系统
*
lsh
8 小时以前 5e098d04e6521bf72a71d0e70724580eca881fab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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();
    }
}