package cn.iocoder.yudao.module.mes.service.md.autocode; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.md.autocode.vo.part.MesMdAutoCodePartSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.autocode.MesMdAutoCodePartDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.autocode.MesMdAutoCodePartMapper; import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodePartTypeEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.AUTO_CODE_PART_NOT_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.AUTO_CODE_PART_SERIAL_NUMBER_DUPLICATE; /** * MES 编码规则组成 Service 实现类 * * @author 芋道源码 */ @Service @Validated public class MesMdAutoCodePartServiceImpl implements MesMdAutoCodePartService { @Resource private MesMdAutoCodePartMapper partMapper; @Resource private MesMdAutoCodeRuleService ruleService; @Override public Long createAutoCodePart(MesMdAutoCodePartSaveReqVO createReqVO) { // 校验规则存在 ruleService.validateAutoCodeRuleExists(createReqVO.getRuleId()); // 校验流水号分段唯一性 validateSerialNumberPartUnique(null, createReqVO.getRuleId(), createReqVO.getType()); // 插入 MesMdAutoCodePartDO part = BeanUtils.toBean(createReqVO, MesMdAutoCodePartDO.class); partMapper.insert(part); return part.getId(); } @Override public void updateAutoCodePart(MesMdAutoCodePartSaveReqVO updateReqVO) { // 校验存在 validatePartExists(updateReqVO.getId()); // 校验规则存在 ruleService.validateAutoCodeRuleExists(updateReqVO.getRuleId()); // 校验流水号分段唯一性 validateSerialNumberPartUnique(updateReqVO.getId(), updateReqVO.getRuleId(), updateReqVO.getType()); // 更新 MesMdAutoCodePartDO updateObj = BeanUtils.toBean(updateReqVO, MesMdAutoCodePartDO.class); partMapper.updateById(updateObj); } @Override public void deleteAutoCodePart(Long id) { // 校验存在 validatePartExists(id); // 删除 partMapper.deleteById(id); } @Override public MesMdAutoCodePartDO getAutoCodePart(Long id) { return partMapper.selectById(id); } @Override public List getAutoCodePartListByRuleId(Long ruleId) { return partMapper.selectListByRuleId(ruleId); } // ==================== 校验方法 ==================== private void validatePartExists(Long id) { if (partMapper.selectById(id) == null) { throw exception(AUTO_CODE_PART_NOT_EXISTS); } } private void validateSerialNumberPartUnique(Long id, Long ruleId, Integer type) { // 只有流水号类型才需要校验 if (ObjUtil.notEqual(MesMdAutoCodePartTypeEnum.SERIAL_NUMBER.getType(), type)) { return; } // 查询该规则下所有流水号分段 List parts = partMapper.selectListByRuleId(ruleId); long count = parts.stream() .filter(part -> MesMdAutoCodePartTypeEnum.SERIAL_NUMBER.getType().equals(part.getType())) .filter(part -> ObjUtil.notEqual(id, part.getId())) // 排除自己 .count(); if (count > 0) { throw exception(AUTO_CODE_PART_SERIAL_NUMBER_DUPLICATE); } } }