| | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { |
| | | |
| | | /** |
| | | * BPM 生产工单审批流程标识 |
| | | */ |
| | | public static final String BPM_PROCESS_DEFINITION_KEY = "mes-pro-work-order-audit"; |
| | | |
| | | @Resource |
| | | private MesProWorkOrderMapper workOrderMapper; |
| | |
| | | private MesWmBarcodeService barcodeService; |
| | | @Resource |
| | | private MesProTaskService taskService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | private CrmCustomerApi customerApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | |
| | | @Override |
| | | public PageResult<MesProWorkOrderDO> getWorkOrderPage(MesProWorkOrderPageReqVO pageReqVO) { |
| | | return workOrderMapper.selectPage(pageReqVO); |
| | | // 获取用户有权限的客户 ID 列表 |
| | | List<Long> permittedClientIds = customerApi.getPermittedCustomerIds(); |
| | | return workOrderMapper.selectPage(pageReqVO, permittedClientIds); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public Long getWorkOrderCountByVendorId(Long vendorId) { |
| | | return workOrderMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | // ==================== BPM 流程审批 ==================== |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitWorkOrder(Long id, Long userId) { |
| | | // 1. 校验工单处于草稿状态 |
| | | MesProWorkOrderDO workOrder = validateWorkOrderExists(id); |
| | | if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) { |
| | | throw exception(PRO_WORK_ORDER_SUBMIT_FAIL_NOT_PREPARE); |
| | | } |
| | | |
| | | // 2. 创建生产工单审批流程实例 |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. 更新工单工作流编号、状态为审批中 |
| | | workOrderMapper.updateById(new MesProWorkOrderDO() |
| | | .setId(id) |
| | | .setProcessInstanceId(processInstanceId) |
| | | .setStatus(MesProWorkOrderStatusEnum.AUDITING.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateWorkOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. 校验工单存在 |
| | | MesProWorkOrderDO workOrder = validateWorkOrderExists(id); |
| | | |
| | | // 2. 校验工单处于审批中 |
| | | if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.AUDITING.getStatus())) { |
| | | log.error("[updateWorkOrderAuditStatus][workOrder({}) 不处于审批中,无法更新审批结果({})]", |
| | | workOrder.getId(), bpmResult); |
| | | throw exception(PRO_WORK_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_AUDITING); |
| | | } |
| | | |
| | | // 3. 更新工单审批结果 |
| | | Integer auditStatus = convertBpmResultToWorkOrderStatus(bpmResult); |
| | | workOrderMapper.updateById(new MesProWorkOrderDO() |
| | | .setId(id) |
| | | .setStatus(auditStatus)); |
| | | } |
| | | |
| | | /** |
| | | * 将 BPM 审批结果转换为 MES 工单状态 |
| | | * |
| | | * @param bpmResult BPM 审批结果 |
| | | * @return MES 工单状态 |
| | | */ |
| | | private Integer convertBpmResultToWorkOrderStatus(Integer bpmResult) { |
| | | // BPM 审批结果:2=通过,3=不通过,4=已取消 |
| | | if (bpmResult == 2) { |
| | | return MesProWorkOrderStatusEnum.CONFIRMED.getStatus(); |
| | | } else if (bpmResult == 3) { |
| | | return MesProWorkOrderStatusEnum.REJECTED.getStatus(); |
| | | } else if (bpmResult == 4) { |
| | | return MesProWorkOrderStatusEnum.PREPARE.getStatus(); |
| | | } else { |
| | | log.warn("[convertBpmResultToWorkOrderStatus][未知的 BPM 审批结果({})]", bpmResult); |
| | | return MesProWorkOrderStatusEnum.AUDITING.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |