5 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package cn.iocoder.yudao.module.qcreport.dal.mysql.instance;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstancePageReqVO;
import cn.iocoder.yudao.module.qcreport.dal.dataobject.instance.QcReportInstanceDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
@Mapper
public interface QcReportInstanceMapper extends BaseMapperX<QcReportInstanceDO> {
 
    default PageResult<QcReportInstanceDO> selectPage(QcReportInstancePageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<QcReportInstanceDO>()
                .eqIfPresent(QcReportInstanceDO::getTemplateId, reqVO.getTemplateId())
                .likeIfPresent(QcReportInstanceDO::getReportNo, reqVO.getReportNo())
                .eqIfPresent(QcReportInstanceDO::getBusinessType, reqVO.getBusinessType())
                .eqIfPresent(QcReportInstanceDO::getBusinessId, reqVO.getBusinessId())
                .eqIfPresent(QcReportInstanceDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(QcReportInstanceDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(QcReportInstanceDO::getId));
    }
 
    default QcReportInstanceDO selectByReportNo(String reportNo) {
        return selectOne(new LambdaQueryWrapperX<QcReportInstanceDO>()
                .eq(QcReportInstanceDO::getReportNo, reportNo));
    }
 
    /**
     * 取当天流水最大的那条编号,用于推出下一个序号。
     * <p>
     * **必须走手写 SQL、把软删除的行也算进来**:条件构造器会自动带上 {@code deleted = 0},
     * 而 {@code uk_report_no} 唯一索引不认 {@code deleted}。删掉当天最大号的那份报告后,
     * 条件构造器看不到它、算回同一个号、插入必然撞唯一索引;重试又是同一套查询同一个结果,
     * 连撞 5 次后报「编号冲突」——用户会以为是自己手气差,实际是删过一份报告就再出不了这一天的件。
     * <p>
     * 排序**不能**只写 {@code ORDER BY report_no DESC}:序号补零到 4 位,
     * 当天一旦超过 9999 条位宽就会变长,字典序会把 {@code ...-9999} 排到 {@code ...-10000} 前面。
     * 先比长度再比字典序,两端对齐才是真的「最大」。
     * <p>
     * 只取编号本身:调用方要的就是它的尾部流水,不必把 JSON 快照一整个列拽出来。
     */
    @Select("SELECT report_no FROM qc_report_instance WHERE report_no LIKE CONCAT(#{prefix}, '%') "
            + "ORDER BY CHAR_LENGTH(report_no) DESC, report_no DESC LIMIT 1")
    String selectLatestReportNoByPrefix(@Param("prefix") String prefix);
 
}