liu
7 小时以前 6c0fd2cb801554f7999d14e45a94ef0f0d0dfb8d
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
package cn.iocoder.yudao.module.mes.service.pro.qrexport;
 
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO;
import cn.iocoder.yudao.module.mes.framework.qrcode.MesProQrLabelBuilder;
import cn.iocoder.yudao.module.mes.framework.qrcode.QrLabelInfo;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 
/**
 * MES 二维码标签装配器
 * <p>
 * 统一「查出关联数据(批次/品种/责任人)→ 组装标签」的逻辑,供同步导出接口与后台导出任务共用,
 * 避免同一条装配规则在多个入口各写一份而出现口径不一致(历史上标签缺项就是这么来的)。
 */
@Component
public class MesProQrLabelAssembler {
 
    @Resource
    private MesProBatchService batchService;
    @Resource
    private MesMdmItemService mdmItemService;
    @Resource
    private AdminUserApi adminUserApi;
 
    /**
     * 构建袋码二维码标签(对外追溯标签,含国标四要素)
     */
    public List<QrLabelInfo> buildBagCodeLabels(List<MesProBagCodeDO> list) {
        if (list.isEmpty()) {
            return Collections.emptyList();
        }
        // 1. 获得关联数据(批次、品种、责任人);品种集合含袋码自身品种与历史批次品种
        Map<Long, MesProBatchDO> batchMap = convertMap(
                batchService.getBatchList(convertSet(list, MesProBagCodeDO::getBatchId)), MesProBatchDO::getId);
        Set<Long> itemIds = convertSet(list, MesProBagCodeDO::getItemId);
        itemIds.addAll(convertSet(batchMap.values(), MesProBatchDO::getItemId));
        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(itemIds);
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(batchMap.values(), MesProBatchDO::getOwnerUserId));
        // 2. 构建标签
        List<QrLabelInfo> labels = new ArrayList<>(list.size());
        for (MesProBagCodeDO bagCode : list) {
            labels.add(MesProQrLabelBuilder.buildBagCodeLabel(
                    bagCode, batchMap.get(bagCode.getBatchId()), itemMap, userMap));
        }
        return labels;
    }
 
    /**
     * 构建袋码业务二维码标签(二维码仅编码内部业务码值)
     */
    public List<QrLabelInfo> buildBagBusinessLabels(List<MesProBagCodeDO> list) {
        return list.stream().map(MesProQrLabelBuilder::buildBagBusinessCodeLabel).toList();
    }
 
    /**
     * 构建托盘二维码标签
     */
    public List<QrLabelInfo> buildPalletLabels(List<MesProPalletDO> list) {
        if (list.isEmpty()) {
            return Collections.emptyList();
        }
        Map<Long, MesProBatchDO> batchMap = convertMap(
                batchService.getBatchList(convertSet(list, MesProPalletDO::getBatchId)), MesProBatchDO::getId);
        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
                convertSet(batchMap.values(), MesProBatchDO::getItemId));
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(batchMap.values(), MesProBatchDO::getOwnerUserId));
        List<QrLabelInfo> labels = new ArrayList<>(list.size());
        for (MesProPalletDO pallet : list) {
            labels.add(MesProQrLabelBuilder.buildPalletLabel(
                    pallet, batchMap.get(pallet.getBatchId()), itemMap, userMap));
        }
        return labels;
    }
 
    /**
     * 构建托盘业务二维码标签
     */
    public List<QrLabelInfo> buildPalletBusinessLabels(List<MesProPalletDO> list) {
        return list.stream().map(MesProQrLabelBuilder::buildPalletBusinessCodeLabel).toList();
    }
 
    /**
     * 构建批次二维码标签:批次图 + 该批次全部托盘图
     * <p>
     * 批次与托盘同属一批,品种/责任人共用同一份关联数据。
     */
    public List<QrLabelInfo> buildBatchLabels(MesProBatchDO batch, List<MesProPalletDO> pallets) {
        Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap(
                convertSet(Collections.singletonList(batch), MesProBatchDO::getItemId));
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
                convertSet(Collections.singletonList(batch), MesProBatchDO::getOwnerUserId));
        List<QrLabelInfo> labels = new ArrayList<>(pallets.size() + 1);
        labels.add(MesProQrLabelBuilder.buildBatchLabel(batch, itemMap, userMap));
        for (MesProPalletDO pallet : pallets) {
            labels.add(MesProQrLabelBuilder.buildPalletLabel(pallet, batch, itemMap, userMap));
        }
        return labels;
    }
 
    /**
     * 构建批次业务二维码标签:批次业务码 + 全部托盘业务码
     */
    public List<QrLabelInfo> buildBatchBusinessLabels(MesProBatchDO batch, List<MesProPalletDO> pallets) {
        List<QrLabelInfo> labels = new ArrayList<>(pallets.size() + 1);
        labels.add(MesProQrLabelBuilder.buildBatchBusinessCodeLabel(batch));
        for (MesProPalletDO pallet : pallets) {
            labels.add(MesProQrLabelBuilder.buildPalletBusinessCodeLabel(pallet));
        }
        return labels;
    }
 
}