package cn.iocoder.yudao.module.mes.service.pd.processparamtemplate; 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.pd.processparamtemplate.vo.MesPdProcessParamTemplatePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pd.processparamtemplate.vo.MesPdProcessParamTemplateSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate.MesPdProcessParamTemplateDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.pd.processparamtemplate.MesPdProcessParamTemplateMapper; import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.List; 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 MesPdProcessParamTemplateServiceImpl implements MesPdProcessParamTemplateService { @Resource private MesPdProcessParamTemplateMapper templateMapper; @Resource private MesPdProcessParamTemplateDetailMapper detailMapper; @Resource @Lazy private MesPdProcessParamService processParamService; @Resource @Lazy private MesMdAutoCodeRecordService autoCodeRecordService; @Override @Transactional(rollbackFor = Exception.class) public Long createProcessParamTemplate(MesPdProcessParamTemplateSaveReqVO createReqVO) { // 1. 生成模板编码 String templateCode = autoCodeRecordService.generateAutoCode( MesMdAutoCodeRuleCodeEnum.PD_PROCESS_PARAM_TEMPLATE_CODE.getCode()); // 2. 插入模板主表 MesPdProcessParamTemplateDO template = BeanUtils.toBean(createReqVO, MesPdProcessParamTemplateDO.class); template.setTemplateCode(templateCode); templateMapper.insert(template); // 3. 快照工艺参数值到明细中 createTemplateDetails(template.getId(), createReqVO.getDetails()); return template.getId(); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessParamTemplate(MesPdProcessParamTemplateSaveReqVO updateReqVO) { // 1. 校验存在 validateProcessParamTemplateExists(updateReqVO.getId()); // 2. 更新模板主表 MesPdProcessParamTemplateDO updateObj = BeanUtils.toBean(updateReqVO, MesPdProcessParamTemplateDO.class); templateMapper.updateById(updateObj); // 3. 删除旧明细并重新插入(快照模式:先删后插) detailMapper.deleteByTemplateId(updateReqVO.getId()); createTemplateDetails(updateReqVO.getId(), updateReqVO.getDetails()); } @Override @Transactional(rollbackFor = Exception.class) public void deleteProcessParamTemplate(Long id) { // 1. 校验存在 validateProcessParamTemplateExists(id); // 2. 删除明细 detailMapper.deleteByTemplateId(id); // 3. 删除模板主表 templateMapper.deleteById(id); } @Override public MesPdProcessParamTemplateDO validateProcessParamTemplateExists(Long id) { MesPdProcessParamTemplateDO template = templateMapper.selectById(id); if (template == null) { throw exception(PD_PROCESS_PARAM_TEMPLATE_NOT_EXISTS); } return template; } @Override public MesPdProcessParamTemplateDO getProcessParamTemplate(Long id) { return templateMapper.selectById(id); } @Override public PageResult getProcessParamTemplatePage(MesPdProcessParamTemplatePageReqVO pageReqVO) { return templateMapper.selectPage(pageReqVO); } @Override public List getProcessParamTemplateDetailListByTemplateId(Long templateId) { return detailMapper.selectListByTemplateId(templateId); } /** * 创建模板明细(快照逻辑:从工艺参数主表复制值到明细) * * @param templateId 模板ID * @param detailVOs 明细VO列表 */ private void createTemplateDetails(Long templateId, List detailVOs) { if (detailVOs == null || detailVOs.isEmpty()) { return; } List detailDOs = new ArrayList<>(); for (MesPdProcessParamTemplateSaveReqVO.Detail detailVO : detailVOs) { // 查找源工艺参数 MesPdProcessParamDO param = processParamService.getProcessParam(detailVO.getProcessParamId()); if (param == null) { throw exception(PD_PROCESS_PARAM_NOT_EXISTS); } // 将值从参数复制到明细(快照!) MesPdProcessParamTemplateDetailDO detail = MesPdProcessParamTemplateDetailDO.builder() .templateId(templateId) .processParamId(param.getId()) // 仅作溯源 .paramCode(param.getParamCode()) // 复制 .paramName(param.getParamName()) // 复制 .paramType(param.getParamType()) // 复制 .unitMeasureId(param.getUnitMeasureId()) // 复制 .required(detailVO.getRequired() != null ? detailVO.getRequired() : param.getRequired()) // 允许覆盖 .remark(detailVO.getRemark() != null ? detailVO.getRemark() : param.getRemark()) // 允许覆盖 .build(); detailDOs.add(detail); } detailDOs.forEach(detailMapper::insert); } }