xiaoyi
7 天以前 481d8165f26fc7e37f0e87f6444ac0340bb563a3
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -78,6 +78,8 @@
    @Resource
    private MesProFeedbackMapper feedbackMapper;
    @Resource
    private MesFeedbackParamService feedbackParamService;
    @Resource
    private MesProWorkOrderService workOrderService;
@@ -110,30 +112,55 @@
    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
@@ -194,11 +221,13 @@
    }
    @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);
    }
@@ -226,13 +255,19 @@
    }
    @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
@@ -536,6 +571,14 @@
                .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());
@@ -553,6 +596,11 @@
        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());