package cn.iocoder.yudao.module.mes.service.qc.approver; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.qc.approver.vo.MesQcApproverConfigPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.approver.vo.MesQcApproverConfigSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.approver.MesQcApproverConfigDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.approver.MesQcApproverConfigMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcApproveNodeEnum; import cn.iocoder.yudao.module.system.api.permission.PermissionApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import java.util.Objects; 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 MesQcApproverServiceImpl implements MesQcApproverService { private static final String SUPER_ADMIN_ROLE = "super_admin"; private static final Integer STATUS_ENABLE = 0; @Resource private MesQcApproverConfigMapper approverConfigMapper; @Resource private AdminUserApi adminUserApi; @Resource private PermissionApi permissionApi; @Override public Long createConfig(MesQcApproverConfigSaveReqVO reqVO) { validateConfigData(reqVO, null); MesQcApproverConfigDO config = BeanUtils.toBean(reqVO, MesQcApproverConfigDO.class); approverConfigMapper.insert(config); return config.getId(); } @Override public void updateConfig(MesQcApproverConfigSaveReqVO reqVO) { validateConfigExists(reqVO.getId()); validateConfigData(reqVO, reqVO.getId()); approverConfigMapper.updateById(BeanUtils.toBean(reqVO, MesQcApproverConfigDO.class)); } @Override public void deleteConfig(Long id) { validateConfigExists(id); approverConfigMapper.deleteById(id); } @Override public MesQcApproverConfigDO getConfig(Long id) { return approverConfigMapper.selectById(id); } @Override public PageResult getConfigPage(MesQcApproverConfigPageReqVO pageReqVO) { return approverConfigMapper.selectPage(pageReqVO); } @Override public boolean isApprover(Integer qcType, Integer approveNode, Long userId) { if (userId == null) { return false; } // 超管不受审核人配置限制 if (permissionApi.hasAnyRoles(userId, SUPER_ADMIN_ROLE)) { return true; } MesQcApproverConfigDO config = approverConfigMapper.selectByUnique(qcType, approveNode, userId); return config != null && Objects.equals(config.getStatus(), STATUS_ENABLE); } @Override public void validateApprover(Integer qcType, Integer approveNode, Long userId) { if (!isApprover(qcType, approveNode, userId)) { throw exception(QC_APPROVER_NOT_CONFIGURED); } } @Override public List getApproverUserIds(Integer qcType, Integer approveNode) { return approverConfigMapper.selectList(new LambdaQueryWrapperX() .eq(MesQcApproverConfigDO::getQcType, qcType) .eq(MesQcApproverConfigDO::getApproveNode, approveNode) .eq(MesQcApproverConfigDO::getStatus, STATUS_ENABLE)) .stream().map(MesQcApproverConfigDO::getUserId).toList(); } private MesQcApproverConfigDO validateConfigExists(Long id) { MesQcApproverConfigDO config = approverConfigMapper.selectById(id); if (config == null) { throw exception(QC_APPROVER_CONFIG_NOT_EXISTS); } return config; } private void validateConfigData(MesQcApproverConfigSaveReqVO reqVO, Long excludeId) { if (!MesQcApproveNodeEnum.isValidCombination(reqVO.getQcType(), reqVO.getApproveNode())) { throw exception(QC_APPROVER_NODE_INVALID); } adminUserApi.validateUser(reqVO.getUserId()); MesQcApproverConfigDO existed = approverConfigMapper.selectByUnique( reqVO.getQcType(), reqVO.getApproveNode(), reqVO.getUserId()); if (existed != null && !Objects.equals(existed.getId(), excludeId)) { throw exception(QC_APPROVER_CONFIG_DUPLICATE); } } }