| | |
| | | @Validated |
| | | public class MesQcIpqcServiceImpl implements MesQcIpqcService { |
| | | |
| | | /** |
| | | * IPQC 保存数据校验上下文 |
| | | * |
| | | * @param workstation 工位 |
| | | * @param task 生产任务(可选,指定 taskId 时非空) |
| | | */ |
| | | private record SaveDataContext(MesMdWorkstationDO workstation, MesProTaskDO task) {} |
| | | |
| | | @Resource |
| | | private MesQcIpqcMapper ipqcMapper; |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createIpqc(MesQcIpqcSaveReqVO createReqVO) { |
| | | // 1.1 校验数据 |
| | | MesMdWorkstationDO workstation = validateIpqcSaveData(createReqVO); |
| | | SaveDataContext ctx = validateIpqcSaveData(createReqVO); |
| | | // 1.2 校验工单存在 |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); |
| | | // 1.3 根据产品 + 检验类型自动匹配模板 |
| | | // 1.3 确定检验物料:有任务时取任务的物料,无任务时取工单的产品 |
| | | Long itemId = (ctx.task() != null) ? ctx.task().getItemId() : workOrder.getProductId(); |
| | | // 1.4 根据物料 + 检验类型自动匹配模板 |
| | | MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType( |
| | | workOrder.getProductId(), MesQcTypeEnum.IPQC.getType()); |
| | | itemId, MesQcTypeEnum.IPQC.getType()); |
| | | Long templateId = templateItem.getTemplateId(); |
| | | // 1.4 获取来源单据编号 |
| | | // 1.5 获取来源单据编号 |
| | | String sourceDocCode = validateAndGetSourceDocCode( |
| | | createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); |
| | | |
| | | // 2. 插入主表 |
| | | MesQcIpqcDO ipqc = BeanUtils.toBean(createReqVO, MesQcIpqcDO.class) |
| | | .setItemId(workOrder.getProductId()) |
| | | .setProcessId(getProcessId(workOrder.getProductId(), workstation.getProcessId())) |
| | | .setItemId(itemId) |
| | | .setProcessId(getProcessId(itemId, ctx.workstation().getProcessId())) |
| | | .setTemplateId(templateId) |
| | | .setSourceDocCode(sourceDocCode) |
| | | .setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | |
| | | // 1.1 校验存在 + 草稿状态 |
| | | validateIpqcStatusPrepare(updateReqVO.getId()); |
| | | // 1.2 校验数据 |
| | | MesMdWorkstationDO workstation = validateIpqcSaveData(updateReqVO); |
| | | SaveDataContext ctx = validateIpqcSaveData(updateReqVO); |
| | | |
| | | // 2. 更新主表 |
| | | MesQcIpqcDO existIpqc = validateIpqcExists(updateReqVO.getId()); |
| | |
| | | updateObj.setTemplateId(null); // 不允许修改模板 |
| | | updateObj.setItemId(null); // 不允许修改物料 |
| | | updateObj.setWorkOrderId(null); // 不允许修改工单 |
| | | updateObj.setProcessId(getProcessId(existIpqc.getItemId(), workstation.getProcessId())); |
| | | updateObj.setProcessId(getProcessId(existIpqc.getItemId(), ctx.workstation().getProcessId())); |
| | | ipqcMapper.updateById(updateObj); |
| | | } |
| | | |
| | | private MesMdWorkstationDO validateIpqcSaveData(MesQcIpqcSaveReqVO reqVO) { |
| | | private SaveDataContext validateIpqcSaveData(MesQcIpqcSaveReqVO reqVO) { |
| | | // 校验编号唯一 |
| | | validateIpqcCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // 校验工位、检测人员存在 |
| | |
| | | adminUserApi.validateUser(reqVO.getInspectorUserId()); |
| | | // 校验工单存在 |
| | | MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | | if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), workOrder.getProductId())) { |
| | | throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); |
| | | } |
| | | if (reqVO.getProcessId() != null && ObjUtil.notEqual(workstation.getProcessId(), reqVO.getProcessId())) { |
| | | throw exception(PRO_WORKSTATION_PROCESS_MISMATCH); |
| | | } |
| | | // 校验任务关系(如果指定了任务) |
| | | MesProTaskDO task = null; |
| | | if (reqVO.getTaskId() != null) { |
| | | MesProTaskDO task = taskService.validateTaskNotFinished(reqVO.getTaskId()); |
| | | task = taskService.validateTaskNotFinished(reqVO.getTaskId()); |
| | | validateTaskRelation(task, workstation, workOrder, reqVO); |
| | | } else { |
| | | // 无任务时,itemId 仍需与工单产品一致 |
| | | if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), workOrder.getProductId())) { |
| | | throw exception(PRO_WORK_ORDER_PRODUCT_MISMATCH); |
| | | } |
| | | } |
| | | return workstation; |
| | | return new SaveDataContext(workstation, task); |
| | | } |
| | | |
| | | private void validateTaskRelation(MesProTaskDO task, MesMdWorkstationDO workstation, |
| | |
| | | if (expectedProcessId != null && ObjUtil.notEqual(task.getProcessId(), expectedProcessId)) { |
| | | throw exception(PRO_TASK_ROUTE_PROCESS_MISMATCH); |
| | | } |
| | | if (ObjUtil.notEqual(task.getItemId(), workOrder.getProductId())) { |
| | | // 校验检验物料与任务物料一致(有任务时,IPQC 检验的物料应与任务加工的物料一致) |
| | | if (reqVO.getItemId() != null && ObjUtil.notEqual(reqVO.getItemId(), task.getItemId())) { |
| | | throw exception(PRO_TASK_ITEM_MISMATCH); |
| | | } |
| | | } |