cnas-process/src/main/java/com/ruoyi/process/controller/QualityMonitorController.java
@@ -8,9 +8,14 @@
import com.ruoyi.process.dto.QualityMonitorDetailsDto;
import com.ruoyi.process.dto.QualityMonitorDto;
import com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateFileMapper;
import com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateMapper;
import com.ruoyi.process.pojo.*;
import com.ruoyi.process.service.QualityMonitorDetailsService;
import com.ruoyi.process.service.QualityMonitorService;
import com.ruoyi.process.service.QualityMonitorTaskService;
import com.ruoyi.process.service.QualityMonitorInspectionEvaluationService;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.system.mapper.UserMapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
@@ -19,8 +24,11 @@
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -35,6 +43,24 @@
@RequestMapping("/qualityMonitor")
public class QualityMonitorController {
    @Operation(summary = "新建年度质量控制计划")
    @PostMapping("/createAnnualPlan")
    public Result<QualityMonitorDto> createAnnualPlan(@RequestBody QualityMonitor qualityMonitor) {
        return Result.success(qualityMonitorService.createAnnualPlan(qualityMonitor));
    }
    @Operation(summary = "按年度查询当前质量控制计划")
    @GetMapping("/getAnnualPlan")
    public Result<QualityMonitorDto> getAnnualPlan(String monitorYear, Integer qualityMonitorId) {
        return Result.success(qualityMonitorService.getAnnualPlan(monitorYear, qualityMonitorId));
    }
    @Operation(summary = "提交年度质量控制计划审核")
    @PostMapping("/submitAnnualPlan")
    public Result submitAnnualPlan(@RequestBody Map<String, Integer> request) {
        return Result.success(qualityMonitorService.submitAnnualPlan(request.get("qualityMonitorId")));
    }
    @Resource
    private QualityMonitorService qualityMonitorService;
@@ -43,6 +69,58 @@
    @Resource
    private QualityMonitorDetailsEvaluateFileMapper qualityMonitorDetailsEvaluateFileMapper;
    @Resource
    private QualityMonitorDetailsEvaluateMapper qualityMonitorDetailsEvaluateMapper;
    @Resource
    private QualityMonitorTaskService qualityMonitorTaskService;
    @Resource
    private QualityMonitorInspectionEvaluationService inspectionEvaluationService;
    @Resource
    private UserMapper userMapper;
    @Operation(summary = "获取质量监控检验评价")
    @GetMapping("/getInspectionEvaluation")
    public Result<QualityMonitorDetailsEvaluate> getInspectionEvaluation(Integer qualityMonitorDetailsId) {
        return Result.success(inspectionEvaluationService.get(qualityMonitorDetailsId));
    }
    @Operation(summary = "提交质量监控检验评价")
    @PostMapping("/submitInspectionEvaluation")
    public Result<QualityMonitorDetailsEvaluate> submitInspectionEvaluation(@RequestBody QualityMonitorDetailsEvaluate evaluation) {
        return Result.success(inspectionEvaluationService.submit(evaluation));
    }
    @Operation(summary = "批准或退回质量监控检验评价")
    @PostMapping("/approveInspectionEvaluation")
    public Result approveInspectionEvaluation(@RequestBody Map<String, Object> request) {
        Integer detailId = (Integer) request.get("qualityMonitorDetailsId");
        boolean approved = Boolean.TRUE.equals(request.get("approved"));
        inspectionEvaluationService.approve(detailId, approved, (String) request.get("opinion"));
        return Result.success();
    }
    @Operation(summary = "下发质量监控检验任务")
    @PostMapping("/dispatchInspectionTask")
    public Result<InsOrder> dispatchInspectionTask(@RequestBody Map<String, Integer> request) {
        return Result.success(qualityMonitorTaskService.dispatch(request.get("qualityMonitorDetailsId")));
    }
    @Operation(summary = "查询质量监控明细关联的检验任务")
    @GetMapping("/getInspectionTask")
    public Result<InsOrder> getInspectionTask(Integer qualityMonitorDetailsId) {
        return Result.success(qualityMonitorTaskService.getTask(qualityMonitorDetailsId));
    }
    @Operation(summary = "取消未开始的质量监控检验任务")
    @PostMapping("/cancelInspectionTask")
    public Result cancelInspectionTask(@RequestBody Map<String, Integer> request) {
        qualityMonitorTaskService.cancel(request.get("qualityMonitorDetailsId"));
        return Result.success();
    }
    /**
     * 导入监控计划
@@ -116,6 +194,14 @@
        if (qualityMonitorDetails.getQualityMonitorId() == null) {
            throw new ErrorException("缺少监控计划主表id");
        }
        qualityMonitorService.validateDetailEditable(qualityMonitorDetails.getQualityMonitorId());
        normalizeTemplateIds(qualityMonitorDetails);
        validateAnnualDetail(qualityMonitorDetails);
        if (qualityMonitorDetails.getSortNo() == null) {
            qualityMonitorDetails.setSortNo((int) qualityMonitorDetailsService.count(
                    com.baomidou.mybatisplus.core.toolkit.Wrappers.<QualityMonitorDetails>lambdaQuery()
                            .eq(QualityMonitorDetails::getQualityMonitorId, qualityMonitorDetails.getQualityMonitorId())) + 1);
        }
        return Result.success(qualityMonitorDetailsService.save(qualityMonitorDetails));
    }
@@ -126,6 +212,15 @@
    @Operation(summary = "修改监控计划详情")
    @PostMapping("/updateQualityMonitorDetail")
    public Result updateQualityMonitorDetail(@RequestBody QualityMonitorDetails qualityMonitorDetails) {
        QualityMonitorDetails stored = qualityMonitorDetailsService.getById(qualityMonitorDetails.getQualityMonitorDetailsId());
        if (stored == null) throw new ErrorException("质控项目不存在");
        qualityMonitorDetails.setQualityMonitorId(stored.getQualityMonitorId());
        qualityMonitorService.validateDetailEditable(stored.getQualityMonitorId());
        normalizeTemplateIds(qualityMonitorDetails);
        validateAnnualDetail(qualityMonitorDetails);
        if (qualityMonitorTaskService.getTask(qualityMonitorDetails.getQualityMonitorDetailsId()) != null) {
            throw new ErrorException("已下发检验任务的计划明细不可直接修改");
        }
        return Result.success(qualityMonitorDetailsService.updateById(qualityMonitorDetails));
    }
@@ -136,7 +231,64 @@
    @Operation(summary = "删除监控计划详情")
    @DeleteMapping("/delQualityMonitorDetail")
    public Result delQualityMonitorDetail(Integer qualityMonitorDetailsId) {
        QualityMonitorDetails stored = qualityMonitorDetailsService.getById(qualityMonitorDetailsId);
        if (stored == null) throw new ErrorException("质控项目不存在");
        qualityMonitorService.validateDetailEditable(stored.getQualityMonitorId());
        if (qualityMonitorTaskService.getTask(qualityMonitorDetailsId) != null) {
            throw new ErrorException("已下发检验任务的计划明细不可删除");
        }
        return Result.success(qualityMonitorDetailsService.removeById(qualityMonitorDetailsId));
    }
    private void validateAnnualDetail(QualityMonitorDetails detail) {
        if (!org.springframework.util.StringUtils.hasText(detail.getMonitorProject())
                || !org.springframework.util.StringUtils.hasText(detail.getTechnicalStandardText())
                || !org.springframework.util.StringUtils.hasText(detail.getMonitorWay())
                || !org.springframework.util.StringUtils.hasText(detail.getCompletionMonth())
                || !detail.getCompletionMonth().matches("\\d{4}-\\d{2}")
                || detail.getResponsibleUserId() == null) {
            throw new ErrorException("请补齐质控项目、技术标准、质控方式、完成时限和负责人");
        }
        QualityMonitor plan = qualityMonitorService.getById(detail.getQualityMonitorId());
        if (plan == null || !detail.getCompletionMonth().startsWith(plan.getMonitorYear() + "-")) {
            throw new ErrorException("完成时限必须属于当前计划年度");
        }
        int month = Integer.parseInt(detail.getCompletionMonth().substring(5));
        if (month < 1 || month > 12) throw new ErrorException("完成时限月份不正确");
        if (userMapper.selectById(detail.getResponsibleUserId()) == null) {
            throw new ErrorException("负责人不存在");
        }
    }
    private void normalizeTemplateIds(QualityMonitorDetails detail) {
        String rawIds = detail.getTemplateIds();
        if (!org.springframework.util.StringUtils.hasText(rawIds) && detail.getTemplateId() != null) {
            rawIds = String.valueOf(detail.getTemplateId());
        }
        if (!org.springframework.util.StringUtils.hasText(rawIds)) {
            detail.setTemplateIds(null);
            detail.setTemplateId(null);
            return;
        }
        Set<Integer> templateIds = new LinkedHashSet<>();
        try {
            for (String rawId : rawIds.split(",")) {
                if (!org.springframework.util.StringUtils.hasText(rawId)) continue;
                int templateId = Integer.parseInt(rawId.trim());
                if (templateId <= 0) throw new NumberFormatException();
                templateIds.add(templateId);
            }
        } catch (NumberFormatException exception) {
            throw new ErrorException("原始记录模板参数不正确");
        }
        if (templateIds.size() > 50) throw new ErrorException("原始记录模板最多选择50个");
        if (templateIds.isEmpty()) {
            detail.setTemplateIds(null);
            detail.setTemplateId(null);
            return;
        }
        detail.setTemplateIds(templateIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
        detail.setTemplateId(templateIds.iterator().next());
    }
    /**
@@ -211,6 +363,9 @@
    @Operation(summary = "新增监控评价")
    @PostMapping("/addQualityMonitorEvaluate")
    public Result addQualityMonitorEvaluate(@RequestBody QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
        if (qualityMonitorTaskService.getTask(qualityMonitorDetailsEvaluate.getQualityMonitorDetailsId()) != null) {
            throw new ErrorException("质量监控检验评价请使用检验评价入口");
        }
        return Result.success(qualityMonitorService.addQualityMonitorEvaluate(qualityMonitorDetailsEvaluate));
    }
@@ -231,6 +386,10 @@
    @Operation(summary = "监控评价批准意见")
    @PostMapping("/addMonitorEvaluateOpinion")
    public Result addMonitorEvaluateOpinion(@RequestBody QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
        QualityMonitorDetailsEvaluate stored = qualityMonitorDetailsEvaluateMapper.selectById(qualityMonitorDetailsEvaluate.getDetailsEvaluateId());
        if (stored != null && qualityMonitorTaskService.getTask(stored.getQualityMonitorDetailsId()) != null) {
            throw new ErrorException("质量监控检验评价请使用检验评价审批入口");
        }
        return Result.success(qualityMonitorService.addMonitorEvaluateOpinion(qualityMonitorDetailsEvaluate));
    }
@@ -279,6 +438,9 @@
    @Operation(summary = "上传监控完成报告")
    @PostMapping("/uploadFinishReport")
    public Result uploadFinishReport(MultipartFile file, Integer qualityMonitorDetailsId) {
        if (qualityMonitorTaskService.getTask(qualityMonitorDetailsId) != null) {
            throw new ErrorException("质量监控检验任务无需上传完成报告");
        }
        return Result.success(qualityMonitorService.uploadFinishReport(file, qualityMonitorDetailsId));
    }
@@ -290,6 +452,9 @@
    @Operation(summary = "批准完成报告")
    @PostMapping("/ratifyFinishReport")
    public Result ratifyFinishReport(@RequestBody QualityMonitorDetails qualityMonitorDetails) {
        if (qualityMonitorTaskService.getTask(qualityMonitorDetails.getQualityMonitorDetailsId()) != null) {
            throw new ErrorException("质量监控检验任务无需批准完成报告");
        }
        return Result.success(qualityMonitorService.ratifyFinishReport(qualityMonitorDetails));
    }
}