10 天以前 106aaa378126774a2547b6c0d559c62114579f4c
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
package cn.iocoder.yudao.module.mes.service.wm.barcode;
 
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.barcode.MesWmBarcodeMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import java.util.Collection;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
 
/**
 * MES 条码清单 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class MesWmBarcodeServiceImpl implements MesWmBarcodeService {
 
    @Resource
    private MesWmBarcodeMapper barcodeMapper;
 
    @Resource
    private MesWmBarcodeConfigService barcodeConfigService;
 
    @Override
    public Long createBarcode(MesWmBarcodeSaveReqVO createReqVO) {
        // 1. 校验数据
        MesWmBarcodeConfigDO config = validateBarcodeSaveData(createReqVO.getId(),
                createReqVO.getBizType(), createReqVO.getBizId());
 
        // 2. 生成条码内容,并校验唯一性
        String content = generateAndValidateContent(createReqVO.getId(),
                createReqVO.getContent(), config.getContentFormat(), createReqVO.getBizCode());
 
        // 3. 保存条码记录
        MesWmBarcodeDO barcode = BeanUtils.toBean(createReqVO, MesWmBarcodeDO.class).setContent(content)
                .setConfigId(config.getId()).setFormat(config.getFormat());
        barcodeMapper.insert(barcode);
        return barcode.getId();
    }
 
    @Override
    public String generateBarcodeContent(Integer bizType, String bizCode) {
        // 1.1 校验参数
        if (bizType == null) {
            throw exception(BARCODE_BIZ_TYPE_NOT_EXISTS);
        }
        if (StrUtil.isBlank(bizCode)) {
            throw exception(BARCODE_BIZ_CODE_NOT_EXISTS);
        }
        // 1.2 查询条码配置
        MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(bizType);
 
        // 2. 生成条码内容
        return generateBarcodeContent(config.getContentFormat(), bizCode);
    }
 
    @Override
    public void updateBarcode(MesWmBarcodeSaveReqVO updateReqVO) {
        // 1.1 校验存在
        validateBarcodeExists(updateReqVO.getId());
        // 1.2 校验数据
        MesWmBarcodeConfigDO config = validateBarcodeSaveData(updateReqVO.getId(),
                updateReqVO.getBizType(), updateReqVO.getBizId());
 
        // 2. 生成条码内容,并校验唯一性
        String content = generateAndValidateContent(updateReqVO.getId(),
                updateReqVO.getContent(), config.getContentFormat(), updateReqVO.getBizCode());
 
        // 3. 更新(刷新 configId 和 format,确保与最新配置一致)
        MesWmBarcodeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmBarcodeDO.class)
                .setConfigId(config.getId()).setFormat(config.getFormat());
        if (StrUtil.isNotBlank(content)) {
            updateObj.setContent(content);
        }
        barcodeMapper.updateById(updateObj);
    }
 
    /**
     * 校验条码保存数据:条码配置 + 业务对象唯一性
     *
     * @param id 条码编号(新增时为 null)
     * @param bizType 业务类型
     * @param bizId 业务编号
     * @return 条码配置
     */
    private MesWmBarcodeConfigDO validateBarcodeSaveData(Long id, Integer bizType, Long bizId) {
        // 1. 校验条码配置
        MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(bizType);
        // 2. 校验业务对象唯一性
        validateBarcodeUnique(id, bizType, bizId);
        return config;
    }
 
    /**
     * 校验业务对象(bizType + bizId)唯一性
     *
     * @param id 条码编号(新增时为 null,更新时排除自身)
     * @param bizType 业务类型
     * @param bizId 业务编号
     */
    private void validateBarcodeUnique(Long id, Integer bizType, Long bizId) {
        MesWmBarcodeDO barcode = barcodeMapper.selectByBizTypeAndBizId(bizType, bizId);
        if (barcode == null) {
            return;
        }
        if (ObjUtil.notEqual(barcode, id)) {
            throw exception(WM_BARCODE_ALREADY_EXISTS);
        }
    }
 
    /**
     * 生成条码内容(如果前端未传递则自动生成),并校验内容唯一性
     *
     * @param id 条码编号(新增时为 null,更新时排除自身)
     * @param content 前端传递的条码内容(可为空)
     * @param contentFormat 内容格式模板
     * @param bizCode 业务编码
     * @return 最终条码内容
     */
    private String generateAndValidateContent(Long id, String content, String contentFormat, String bizCode) {
        // 1. 如果前端未传递内容,则自动生成
        if (StrUtil.isBlank(content)) {
            content = generateBarcodeContent(contentFormat, bizCode);
        }
        // 2. 校验条码内容唯一性(排除自身)
        if (StrUtil.isNotBlank(content)) {
            MesWmBarcodeDO contentBarcode = barcodeMapper.selectByContent(content);
            if (contentBarcode != null && ObjUtil.notEqual(contentBarcode.getId(), id)) {
                throw exception(WM_BARCODE_CONTENT_DUPLICATE);
            }
        }
        return content;
    }
 
    /**
     * 生成条码内容
     *
     * @param contentFormat 内容格式模板
     * @param bizCode 业务编码
     * @return 条码内容
     */
    private String generateBarcodeContent(String contentFormat, String bizCode) {
        if (StrUtil.isBlank(contentFormat)) {
            return bizCode;
        }
        return contentFormat.replace(MesWmBarcodeConfigDO.PLACEHOLDER_BUSINESS_CODE, bizCode);
    }
 
    @Override
    public void deleteBarcode(Long id) {
        // 校验存在
        validateBarcodeExists(id);
        // 删除
        barcodeMapper.deleteById(id);
    }
 
    @Override
    public void deleteBarcodeByBizTypeAndBizIds(Integer bizType, Collection<Long> bizIds) {
        if (CollUtil.isEmpty(bizIds)) {
            return;
        }
        barcodeMapper.deleteByBizTypeAndBizIds(bizType, bizIds);
    }
 
    private MesWmBarcodeDO validateBarcodeExists(Long id) {
        MesWmBarcodeDO barcode = barcodeMapper.selectById(id);
        if (barcode == null) {
            throw exception(WM_BARCODE_NOT_EXISTS);
        }
        return barcode;
    }
 
    @Override
    public MesWmBarcodeDO getBarcode(Long id) {
        return barcodeMapper.selectById(id);
    }
 
    @Override
    public PageResult<MesWmBarcodeDO> getBarcodePage(MesWmBarcodePageReqVO pageReqVO) {
        return barcodeMapper.selectPage(pageReqVO);
    }
 
    @Override
    public MesWmBarcodeDO getBarcodeByBizTypeAndBizId(Integer bizType, Long bizId) {
        return barcodeMapper.selectByBizTypeAndBizId(bizType, bizId);
    }
 
    @Override
    public void autoGenerateBarcode(Integer bizType, Long bizId, String bizCode, String bizName) {
        // 1.1 检查是否配置自动生成
        MesWmBarcodeConfigDO config = barcodeConfigService.getBarcodeConfigByBizType(bizType);
        if (config == null || Boolean.FALSE.equals(config.getAutoGenerateFlag())
                || CommonStatusEnum.isDisable(config.getStatus())) {
            return;
        }
        // 1.2 检查是否已存在条码
        MesWmBarcodeDO existBarcode = barcodeMapper.selectByBizTypeAndBizId(bizType, bizId);
        if (existBarcode != null) {
            return;
        }
 
        // 2. 创建条码记录
        MesWmBarcodeSaveReqVO createReqVO = new MesWmBarcodeSaveReqVO()
                .setBizType(bizType).setBizId(bizId).setBizCode(bizCode).setBizName(bizName)
                .setStatus(CommonStatusEnum.ENABLE.getStatus());
        createBarcode(createReqVO);
    }
 
    @Override
    public long getBarcodeCountByConfigId(Long configId) {
        return barcodeMapper.selectCountByConfigId(configId);
    }
 
}