| | |
| | | |
| | | @Resource |
| | | private MesProFeedbackMapper feedbackMapper; |
| | | @Resource |
| | | private MesFeedbackParamService feedbackParamService; |
| | | |
| | | @Resource |
| | | private MesProWorkOrderService workOrderService; |
| | |
| | | private MdmItemBatchConfigApi itemBatchConfigApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) { |
| | | // 1. 校验 |
| | | MesProTaskDO task = validateFeedbackData(createReqVO); |
| | | task = feedbackParamService.lockTask(task.getId()); |
| | | validateLockedTaskDimensions(createReqVO, task); |
| | | |
| | | // 2. 插入(主键由数据库自增,忽略请求中可能残留的 id;自动填充 itemId) |
| | | MesProFeedbackDO feedback = BeanUtils.toBean(createReqVO, MesProFeedbackDO.class) |
| | | .setId(null) |
| | | .setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus()) |
| | | .setItemId(task.getItemId()); |
| | | .setItemId(task.getItemId()) |
| | | .setParamSnapshot(feedbackParamService.buildDraft(task, createReqVO.getParamValues())); |
| | | feedbackMapper.insert(feedback); |
| | | return feedback.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) { |
| | | // 1.1 校验存在 + 草稿状态 |
| | | validateFeedbackStatusPrepare(updateReqVO.getId()); |
| | | // 先锁报工再锁任务,与提交顺序一致。 |
| | | MesProFeedbackDO original = feedbackMapper.selectOne(new LambdaQueryWrapperX<MesProFeedbackDO>() |
| | | .eq(MesProFeedbackDO::getId, updateReqVO.getId()).last("FOR UPDATE")); |
| | | if (original == null) throw exception(PRO_FEEDBACK_NOT_EXISTS); |
| | | if (!Objects.equals(original.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) |
| | | throw exception(PRO_FEEDBACK_NOT_PREPARE); |
| | | // 1.2 校验业务数据 |
| | | MesProTaskDO task = validateFeedbackData(updateReqVO); |
| | | task = feedbackParamService.lockTask(task.getId()); |
| | | validateLockedTaskDimensions(updateReqVO, task); |
| | | |
| | | // 2. 更新(自动填充 itemId) |
| | | MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class) |
| | | .setItemId(task.getItemId()); |
| | | if (updateReqVO.getParamValues() != null) { |
| | | String snapshot = feedbackParamService.buildDraft(task, updateReqVO.getParamValues()); |
| | | updateObj.setParamSnapshot(snapshot == null ? "" : snapshot); |
| | | } else if (!Objects.equals(original.getTaskId(), task.getId())) { |
| | | updateObj.setParamSnapshot(""); |
| | | } |
| | | feedbackMapper.updateById(updateObj); |
| | | } |
| | | |
| | | private void validateLockedTaskDimensions(MesProFeedbackSaveReqVO req, MesProTaskDO task) { |
| | | if (!MesProTaskStatusEnum.canFeedback(task.getStatus())) throw exception(PRO_FEEDBACK_CANNOT_CREATE_WHEN_PAUSED); |
| | | if (!Objects.equals(req.getProcessId(), task.getProcessId()) |
| | | || !Objects.equals(req.getWorkOrderId(), task.getWorkOrderId()) |
| | | || !Objects.equals(req.getRouteId(), task.getRouteId())) |
| | | throw exception(PRO_FEEDBACK_PARAM_INVALID, "任务信息已变更,请重新选择任务"); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteFeedback(Long id) { |
| | | // 1. 校验存在 + 草稿状态 |
| | | validateFeedbackStatusPrepare(id); |
| | | |
| | | // 2. 删除 |
| | | MesProFeedbackDO feedback = feedbackMapper.selectOne(new LambdaQueryWrapperX<MesProFeedbackDO>() |
| | | .eq(MesProFeedbackDO::getId, id).last("FOR UPDATE")); |
| | | if (feedback == null) throw exception(PRO_FEEDBACK_NOT_EXISTS); |
| | | if (!Objects.equals(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) |
| | | throw exception(PRO_FEEDBACK_NOT_PREPARE); |
| | | feedbackMapper.deleteById(id); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitFeedback(Long id) { |
| | | // 1. 校验存在 + 草稿状态 |
| | | validateFeedbackStatusPrepare(id); |
| | | |
| | | // 2. 更新状态为审批中(报工人和报工时间由表单保存时确定,提交不覆盖) |
| | | feedbackMapper.updateById(new MesProFeedbackDO().setId(id) |
| | | .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())); |
| | | MesProFeedbackDO feedback = feedbackMapper.selectOne(new LambdaQueryWrapperX<MesProFeedbackDO>() |
| | | .eq(MesProFeedbackDO::getId, id).last("FOR UPDATE")); |
| | | if (feedback == null) throw exception(PRO_FEEDBACK_NOT_EXISTS); |
| | | if (!Objects.equals(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) |
| | | throw exception(PRO_FEEDBACK_NOT_PREPARE); |
| | | MesProTaskDO task = feedbackParamService.lockTask(feedback.getTaskId()); |
| | | String snapshot = feedbackParamService.complete(task, feedback.getParamSnapshot()); |
| | | MesProFeedbackDO update = new MesProFeedbackDO().setId(id) |
| | | .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()); |
| | | if (snapshot != null) update.setParamSnapshot(snapshot); |
| | | feedbackMapper.updateById(update); |
| | | } |
| | | |
| | | @Override |
| | |
| | | .setFeedbackTime(LocalDateTime.now()) |
| | | .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus()) |
| | | .setRemark(reqVO.getRemark()); |
| | | MesProTaskDO lockedTask = feedbackParamService.lockTask(task.getId()); |
| | | if (!MesProTaskStatusEnum.canFeedback(lockedTask.getStatus())) throw exception(PRO_FEEDBACK_CANNOT_CREATE_WHEN_PAUSED); |
| | | if (!Objects.equals(task.getProcessId(), lockedTask.getProcessId()) |
| | | || !Objects.equals(task.getWorkOrderId(), lockedTask.getWorkOrderId()) |
| | | || !Objects.equals(task.getRouteId(), lockedTask.getRouteId())) |
| | | throw exception(PRO_FEEDBACK_PARAM_INVALID, "任务信息已变更,请重新报工"); |
| | | String draftParam = feedbackParamService.buildDraft(lockedTask, reqVO.getParamValues()); |
| | | feedback.setParamSnapshot(feedbackParamService.complete(lockedTask, draftParam)); |
| | | feedbackMapper.insert(feedback); |
| | | // 5. 返回结果 |
| | | MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(task.getWorkOrderId()); |
| | |
| | | int failCount = 0; |
| | | for (Long taskId : reqVO.getTaskIds()) { |
| | | try { |
| | | MesProTaskDO batchTask = feedbackParamService.lockTask(taskId); |
| | | if (Objects.equals(batchTask.getParamCollectMode(), 1) |
| | | || (Objects.equals(batchTask.getParamCollectMode(), 2) && StrUtil.isBlank(batchTask.getParamSharedSnapshot()))) { |
| | | throw exception(PRO_FEEDBACK_PARAM_INVALID, "该任务需要单独填写参数,请使用单笔报工"); |
| | | } |
| | | MesProFeedbackQuickCreateReqVO singleReq = new MesProFeedbackQuickCreateReqVO(); |
| | | singleReq.setTaskId(taskId); |
| | | singleReq.setFeedbackQuantity(reqVO.getFeedbackQuantity()); |