xiaoyi
4 天以前 883f5e73fbe7458fd760dbe8560dd5d8757e04cd
refactor: 按需求表收敛范围,撤销非需求模块,补齐售后回访闭环

## 背景
需求表 15 条为验收范围。此前把长辉的备件/公司配置/数据库备份/售后问题库一并移植,
这些不在需求表内,按"不是需求的不要"要求撤销。

## 撤销(不在需求表)
- mes/dv/spare 备件管理:controller/service/do/mapper 共 10 个文件
- system/companyconfig 公司配置:7 个文件
- system/database 数据库备份:3 个文件
- aftersales/problem 售后问题库:9 个文件
- 连带:AfterSaleProblemStatusEnum、PROBLEM_* 错误码、PROBLEM_NO_PREFIX、
AfterSaleTicketDO 的 problemId/problemNo

## 保留(对应需求)
- safety 安全生产 -> 需求19安全档案、需求20隐患整改
- aftersales/visit 售后回访 -> 需求12服务管控
- mes/qc/ledger 质检台账 -> 需求16质量追溯的补充

## 补齐(需求12 闭环缺口)
售后回访后端接口已有,但前端无入口、工单详情不显示回访状态:
1. AfterSaleTicketRespVO 补 visitStatus / lastVisitTime / lastVisitSatisfied / lastVisitRecurred
2. .gitignore 加 .local-test/(本地验证配置与库快照不入库)

## 数据库
- 本地:drop mes_dv_spare_part/mes_dv_spare_movement/system_company_config/after_sale_problem,
删除对应 18 条菜单
- 生产:drop 上述 4 张表(均为空表)+ 删除 8 条备件菜单(已备份到 /data/backup/mysql/manual/)

## 验证
全项目编译通过;1286 个 GET 接口,member 之外 0 个 500;
需求19/20 11项、需求12 9项、需求16/10/11/13/14/15/17/18/22 共 10 项全部通过。
已添加1个文件
已删除29个文件
已修改5个文件
2299 ■■■■■ 文件已修改
.gitignore 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/AfterSaleProblemController.java 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemPageReqVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemRespVO.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemSaveReqVO.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/vo/ticket/AfterSaleTicketRespVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/problem/AfterSaleProblemDO.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/ticket/AfterSaleTicketDO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/mysql/problem/AfterSaleProblemMapper.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/redis/no/AfterSaleNoRedisDAO.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/enums/AfterSaleProblemStatusEnum.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/enums/ErrorCodeConstants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/problem/AfterSaleProblemService.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/problem/AfterSaleProblemServiceImpl.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/MesDvSpareController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSpareActionReqVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSpareMovementRespVO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSparePageReqVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSparePartSaveReqVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/spare/MesDvSpareMovementDO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/spare/MesDvSparePartDO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/spare/MesDvSpareMovementMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/spare/MesDvSparePartMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/spare/MesDvSpareService.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/resources/mapper/qc/ledger/MesQcInspectionLedgerMapper.xml 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/SystemCompanyConfigController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/vo/SystemCompanyConfigRespVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/vo/SystemCompanyConfigSaveReqVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/database/DatabaseBackupController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/companyconfig/SystemCompanyConfigDO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/companyconfig/SystemCompanyConfigMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/companyconfig/SystemCompanyConfigService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/companyconfig/SystemCompanyConfigServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java 460 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -73,3 +73,5 @@
.claude/scheduled_tasks.json
/.export_tmp
# æœ¬åœ°éªŒè¯ä¸“用(本地库快照与覆盖配置),绝不入库
.local-test/
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/AfterSaleProblemController.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemPageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemRespVO.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/problem/vo/AfterSaleProblemSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/vo/ticket/AfterSaleTicketRespVO.java
@@ -87,6 +87,18 @@
    @Schema(description = "关闭时间")
    private LocalDateTime closedTime;
    @Schema(description = "回访状态:0-待回访 1-已回访通过", example = "0")
    private Integer visitStatus;
    @Schema(description = "最后回访时间")
    private LocalDateTime lastVisitTime;
    @Schema(description = "最后回访是否满意")
    private Boolean lastVisitSatisfied;
    @Schema(description = "最后回访是否复发")
    private Boolean lastVisitRecurred;
    @Schema(description = "备注")
    private String remark;
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/problem/AfterSaleProblemDO.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/dataobject/ticket/AfterSaleTicketDO.java
@@ -130,15 +130,4 @@
     * æœ€åŽå›žè®¿æ˜¯å¦å¤å‘
     */
    private Boolean lastVisitRecurred;
    /**
     * å…³è”问题记录编号
     *
     * å…³è” {@link cn.iocoder.yudao.module.aftersales.dal.dataobject.problem.AfterSaleProblemDO#getId()}
     */
    private Long problemId;
    /**
     * å…³è”问题单号
     */
    private String problemNo;
}
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/mysql/problem/AfterSaleProblemMapper.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/dal/redis/no/AfterSaleNoRedisDAO.java
@@ -26,10 +26,6 @@
     */
    public static final String RETURN_NO_PREFIX = "RT";
    /**
     * é—®é¢˜è®°å½•编号前缀
     */
    public static final String PROBLEM_NO_PREFIX = "AP";
    @Resource
    private StringRedisTemplate stringRedisTemplate;
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/enums/AfterSaleProblemStatusEnum.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/enums/ErrorCodeConstants.java
@@ -52,14 +52,6 @@
    ErrorCode COMPENSATION_AUDIT_REJECT_REASON_REQUIRED = new ErrorCode(1_022_004_006, "审核不通过时必须填写不通过原因");
    ErrorCode COMPENSATION_UPDATE_FAIL_NOT_EDITABLE = new ErrorCode(1_022_004_007, "只有未提交或审核不通过状态的赔付单才能修改");
    // ========== å”®åŽæœåŠ¡-问题记录(1-022-005-000) ==========
    ErrorCode PROBLEM_NOT_EXISTS = new ErrorCode(1_022_005_000, "问题记录不存在");
    ErrorCode PROBLEM_NO_EXISTS = new ErrorCode(1_022_005_001, "问题单号重复,请重试");
    ErrorCode PROBLEM_UPDATE_FAIL_STATUS = new ErrorCode(1_022_005_002, "问题修改失败,原因:仅草稿状态可编辑");
    ErrorCode PROBLEM_DELETE_FAIL_STATUS = new ErrorCode(1_022_005_003, "问题删除失败,原因:仅草稿状态可删除");
    ErrorCode PROBLEM_PUBLISH_FAIL_STATUS = new ErrorCode(1_022_005_004, "问题发布失败,原因:当前状态不可发布");
    ErrorCode PROBLEM_DISABLE_FAIL_STATUS = new ErrorCode(1_022_005_005, "问题停用失败,原因:当前状态不可停用");
    // ========== å”®åŽæœåŠ¡-回访(1-022-006-000) ==========
    ErrorCode VISIT_NOT_EXISTS = new ErrorCode(1_022_006_000, "回访记录不存在");
    ErrorCode VISIT_CREATE_FAIL_STATUS = new ErrorCode(1_022_006_001, "登记回访失败,原因:工单不是已完结(待回访)状态");
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/problem/AfterSaleProblemService.java
ÎļþÒÑɾ³ý
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/problem/AfterSaleProblemServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/MesDvSpareController.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSpareActionReqVO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSpareMovementRespVO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSparePageReqVO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/spare/vo/MesDvSparePartSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/spare/MesDvSpareMovementDO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/spare/MesDvSparePartDO.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/spare/MesDvSpareMovementMapper.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/spare/MesDvSparePartMapper.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/spare/MesDvSpareService.java
ÎļþÒÑɾ³ý
yudao-module-mes/src/main/resources/mapper/qc/ledger/MesQcInspectionLedgerMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.qc.ledger.MesQcInspectionLedgerMapper">
    <!--
        æ£€æµ‹ç»“果台账查询(四类检验单 UNION ALL)
        ä¸€è¡Œ = ä¸€ä¸ªæ£€æµ‹é¡¹ç»“果;检验单未录入检验结果时该单占一行,检测项相关列为空(LEFT JOIN ä¿è¯ä¸ä¸¢å•)。
        è¯´æ˜Žï¼šæ£€éªŒç»“果的关联键为 (qc_id, qc_type),qc_id ä¸ºå„检验单自身的 id,需按类型过滤 qc_type,否则不同类型的 id ä¼šä¸²å•。
        è¯´æ˜Žï¼šæ£€æµ‹é¡¹åç§°ä¸åšé€»è¾‘删除过滤,已停用/删除的检测项仍展示历史台账名称。
    -->
    <select id="selectInspectionLedgerPage" resultType="cn.iocoder.yudao.module.mes.controller.admin.qc.ledger.vo.MesQcInspectionLedgerRespVO">
        SELECT * FROM (
            <!-- 1. æ¥æ–™æ£€éªŒï¼ˆIQC),批次取供应商批次号 -->
            SELECT
                ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IQC.type} AS qcType,
                q.id AS qcId,
                q.code AS code,
                q.name AS name,
                q.status AS status,
                q.item_id AS itemId,
                q.vendor_batch AS batchNo,
                q.check_quantity AS checkQuantity,
                q.qualified_quantity AS qualifiedQuantity,
                q.unqualified_quantity AS unqualifiedQuantity,
                q.check_result AS checkResult,
                q.inspect_date AS inspectDate,
                q.inspector_user_id AS inspectorUserId,
                q.remark AS remark,
                d.indicator_id AS indicatorId,
                i.name AS indicatorName,
                d.value AS indicatorValue,
                d.remark AS indicatorRemark,
                l.standard_value AS standardValue,
                l.min_threshold AS minThreshold,
                l.max_threshold AS maxThreshold
            FROM mes_qc_iqc q
                LEFT JOIN mes_qc_indicator_result r ON r.qc_id = q.id
                    AND r.qc_type = ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IQC.type}
                    AND r.deleted = 0
                LEFT JOIN mes_qc_indicator_result_detail d ON d.result_id = r.id AND d.deleted = 0
                LEFT JOIN mes_qc_indicator i ON i.id = d.indicator_id
                LEFT JOIN mes_qc_iqc_line l ON l.iqc_id = q.id AND l.indicator_id = d.indicator_id AND l.deleted = 0
            WHERE q.deleted = 0
            UNION ALL
            <!-- 2. è¿‡ç¨‹æ£€éªŒï¼ˆIPQC),无批次号 -->
            SELECT
                ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IPQC.type} AS qcType,
                q.id AS qcId,
                q.code AS code,
                q.name AS name,
                q.status AS status,
                q.item_id AS itemId,
                NULL AS batchNo,
                q.check_quantity AS checkQuantity,
                q.qualified_quantity AS qualifiedQuantity,
                q.unqualified_quantity AS unqualifiedQuantity,
                q.check_result AS checkResult,
                q.inspect_date AS inspectDate,
                q.inspector_user_id AS inspectorUserId,
                q.remark AS remark,
                d.indicator_id AS indicatorId,
                i.name AS indicatorName,
                d.value AS indicatorValue,
                d.remark AS indicatorRemark,
                l.standard_value AS standardValue,
                l.min_threshold AS minThreshold,
                l.max_threshold AS maxThreshold
            FROM mes_qc_ipqc q
                LEFT JOIN mes_qc_indicator_result r ON r.qc_id = q.id
                    AND r.qc_type = ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@IPQC.type}
                    AND r.deleted = 0
                LEFT JOIN mes_qc_indicator_result_detail d ON d.result_id = r.id AND d.deleted = 0
                LEFT JOIN mes_qc_indicator i ON i.id = d.indicator_id
                LEFT JOIN mes_qc_ipqc_line l ON l.ipqc_id = q.id AND l.indicator_id = d.indicator_id AND l.deleted = 0
            WHERE q.deleted = 0
            UNION ALL
            <!-- 3. å‡ºè´§æ£€éªŒï¼ˆOQC),批次取批次号 -->
            SELECT
                ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@OQC.type} AS qcType,
                q.id AS qcId,
                q.code AS code,
                q.name AS name,
                q.status AS status,
                q.item_id AS itemId,
                q.batch_code AS batchNo,
                q.check_quantity AS checkQuantity,
                q.qualified_quantity AS qualifiedQuantity,
                q.unqualified_quantity AS unqualifiedQuantity,
                q.check_result AS checkResult,
                q.inspect_date AS inspectDate,
                q.inspector_user_id AS inspectorUserId,
                q.remark AS remark,
                d.indicator_id AS indicatorId,
                i.name AS indicatorName,
                d.value AS indicatorValue,
                d.remark AS indicatorRemark,
                l.standard_value AS standardValue,
                l.min_threshold AS minThreshold,
                l.max_threshold AS maxThreshold
            FROM mes_qc_oqc q
                LEFT JOIN mes_qc_indicator_result r ON r.qc_id = q.id
                    AND r.qc_type = ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@OQC.type}
                    AND r.deleted = 0
                LEFT JOIN mes_qc_indicator_result_detail d ON d.result_id = r.id AND d.deleted = 0
                LEFT JOIN mes_qc_indicator i ON i.id = d.indicator_id
                LEFT JOIN mes_qc_oqc_line l ON l.oqc_id = q.id AND l.indicator_id = d.indicator_id AND l.deleted = 0
            WHERE q.deleted = 0
            UNION ALL
            <!-- 4. é€€è´§æ£€éªŒï¼ˆRQC),批次取批次号 -->
            SELECT
                ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@RQC.type} AS qcType,
                q.id AS qcId,
                q.code AS code,
                q.name AS name,
                q.status AS status,
                q.item_id AS itemId,
                q.batch_code AS batchNo,
                q.check_quantity AS checkQuantity,
                q.qualified_quantity AS qualifiedQuantity,
                q.unqualified_quantity AS unqualifiedQuantity,
                q.check_result AS checkResult,
                q.inspect_date AS inspectDate,
                q.inspector_user_id AS inspectorUserId,
                q.remark AS remark,
                d.indicator_id AS indicatorId,
                i.name AS indicatorName,
                d.value AS indicatorValue,
                d.remark AS indicatorRemark,
                l.standard_value AS standardValue,
                l.min_threshold AS minThreshold,
                l.max_threshold AS maxThreshold
            FROM mes_qc_rqc q
                LEFT JOIN mes_qc_indicator_result r ON r.qc_id = q.id
                    AND r.qc_type = ${@cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum@RQC.type}
                    AND r.deleted = 0
                LEFT JOIN mes_qc_indicator_result_detail d ON d.result_id = r.id AND d.deleted = 0
                LEFT JOIN mes_qc_indicator i ON i.id = d.indicator_id
                LEFT JOIN mes_qc_rqc_line l ON l.rqc_id = q.id AND l.indicator_id = d.indicator_id AND l.deleted = 0
            WHERE q.deleted = 0
        ) t
        <where>
            <if test="reqVO.qcType != null">
                AND t.qcType = #{reqVO.qcType}
            </if>
            <if test="reqVO.inspectDate != null and reqVO.inspectDate.length > 0 and reqVO.inspectDate[0] != null">
                AND t.inspectDate &gt;= #{reqVO.inspectDate[0]}
            </if>
            <if test="reqVO.inspectDate != null and reqVO.inspectDate.length > 1 and reqVO.inspectDate[1] != null">
                AND t.inspectDate &lt;= #{reqVO.inspectDate[1]}
            </if>
            <if test="reqVO.code != null and reqVO.code != ''">
                AND t.code LIKE CONCAT('%', #{reqVO.code}, '%')
            </if>
            <if test="reqVO.itemId != null">
                AND t.itemId = #{reqVO.itemId}
            </if>
            <if test="reqVO.batchNo != null and reqVO.batchNo != ''">
                AND t.batchNo LIKE CONCAT('%', #{reqVO.batchNo}, '%')
            </if>
            <if test="reqVO.checkResult != null">
                AND t.checkResult = #{reqVO.checkResult}
            </if>
            <if test="reqVO.inspectorUserId != null">
                AND t.inspectorUserId = #{reqVO.inspectorUserId}
            </if>
        </where>
        ORDER BY t.inspectDate DESC, t.qcId DESC, t.qcType ASC
    </select>
</mapper>
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/SystemCompanyConfigController.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/vo/SystemCompanyConfigRespVO.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/companyconfig/vo/SystemCompanyConfigSaveReqVO.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/database/DatabaseBackupController.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/companyconfig/SystemCompanyConfigDO.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/companyconfig/SystemCompanyConfigMapper.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/companyconfig/SystemCompanyConfigService.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/companyconfig/SystemCompanyConfigServiceImpl.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupService.java
ÎļþÒÑɾ³ý
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java
ÎļþÒÑɾ³ý