package cn.iocoder.yudao.module.mes.service.pd.product; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; import cn.iocoder.yudao.module.mes.controller.admin.pd.product.vo.MesPdProductPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pd.product.vo.MesPdProductRespVO; import cn.iocoder.yudao.module.mes.controller.admin.pd.product.vo.MesPdProductSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pd.product.MesPdProductDO; import cn.iocoder.yudao.module.mes.dal.mysql.pd.product.MesPdProductMapper; import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; import cn.iocoder.yudao.module.mes.enums.pd.MesPdAuditStatusEnum; import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; 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.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PD_PRODUCT_AUDIT_STATUS_INVALID; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PD_PRODUCT_NOT_EXISTS; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PD_PRODUCT_SUBMIT_DUPLICATE; /** * MES 产品档案 Service 实现类 * * @author 超级管理员 */ @Service @Validated @Slf4j public class MesPdProductServiceImpl implements MesPdProductService { @Resource private MesPdProductMapper productMapper; @Resource @Lazy private MesMdAutoCodeRecordService autoCodeRecordService; @Override @Transactional(rollbackFor = Exception.class) public Long createProduct(MesPdProductSaveReqVO createReqVO) { MesPdProductDO product = BeanUtils.toBean(createReqVO, MesPdProductDO.class); product.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PD_PRODUCT_CODE.getCode())); product.setAuditStatus(MesPdAuditStatusEnum.DRAFT.getStatus()); productMapper.insert(product); return product.getId(); } @Override @Transactional(rollbackFor = Exception.class) public void updateProduct(MesPdProductSaveReqVO updateReqVO) { MesPdProductDO product = validateProductExists(updateReqVO.getId()); validateEditable(product); MesPdProductDO updateObj = BeanUtils.toBean(updateReqVO, MesPdProductDO.class); updateObj.setCode(product.getCode()); productMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) public void deleteProduct(Long id) { MesPdProductDO product = validateProductExists(id); validateEditable(product); productMapper.deleteById(id); } @Override public MesPdProductRespVO getProduct(Long id) { MesPdProductDO product = productMapper.selectById(id); return product == null ? null : convertToRespVO(product); } @Override public PageResult getProductPage(MesPdProductPageReqVO pageReqVO) { PageResult page = productMapper.selectPage(pageReqVO); PageResult result = BeanUtils.toBean(page, MesPdProductRespVO.class); result.getList().forEach(this::fillDictName); return result; } @Override @Transactional(rollbackFor = Exception.class) public void submitProduct(Long id) { MesPdProductDO product = validateProductExists(id); // 仅未提交/驳回可提交审批 if (!MesPdAuditStatusEnum.DRAFT.getStatus().equals(product.getAuditStatus()) && !MesPdAuditStatusEnum.REJECT.getStatus().equals(product.getAuditStatus())) { throw exception(PD_PRODUCT_SUBMIT_DUPLICATE); } productMapper.updateById(MesPdProductDO.builder() .id(id) .auditStatus(MesPdAuditStatusEnum.PROCESS.getStatus()) .auditRemark(null) .auditTime(null) .build()); } @Override @Transactional(rollbackFor = Exception.class) public void auditProduct(Long id, Boolean pass, String auditRemark) { MesPdProductDO product = validateProductExists(id); // 仅审批中可审核 if (!MesPdAuditStatusEnum.PROCESS.getStatus().equals(product.getAuditStatus())) { throw exception(PD_PRODUCT_AUDIT_STATUS_INVALID); } productMapper.updateById(MesPdProductDO.builder() .id(id) .auditStatus(pass ? MesPdAuditStatusEnum.APPROVE.getStatus() : MesPdAuditStatusEnum.REJECT.getStatus()) .auditRemark(auditRemark) .auditTime(LocalDateTime.now()) .build()); } @Override public MesPdProductDO validateProductExists(Long id) { MesPdProductDO product = productMapper.selectById(id); if (product == null) { throw exception(PD_PRODUCT_NOT_EXISTS); } return product; } private void validateEditable(MesPdProductDO product) { // 审批中/已通过不可修改或删除 if (!MesPdAuditStatusEnum.DRAFT.getStatus().equals(product.getAuditStatus()) && !MesPdAuditStatusEnum.REJECT.getStatus().equals(product.getAuditStatus())) { throw exception(PD_PRODUCT_AUDIT_STATUS_INVALID); } } private MesPdProductRespVO convertToRespVO(MesPdProductDO product) { MesPdProductRespVO respVO = BeanUtils.toBean(product, MesPdProductRespVO.class); fillDictName(respVO); return respVO; } private void fillDictName(MesPdProductRespVO respVO) { respVO.setArchiveTypeName(DictFrameworkUtils.parseDictDataLabel( DictTypeConstants.MES_PD_PRODUCT_ARCHIVE_TYPE, respVO.getArchiveType())); respVO.setAuditStatusName(DictFrameworkUtils.parseDictDataLabel( DictTypeConstants.MES_PD_PRODUCT_AUDIT_STATUS, respVO.getAuditStatus())); } }