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 { default PageResult selectPage(QcReportInstancePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .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() .eq(QcReportInstanceDO::getReportNo, reportNo)); } /** * 取当天流水最大的那条编号,用于推出下一个序号。 *

* **必须走手写 SQL、把软删除的行也算进来**:条件构造器会自动带上 {@code deleted = 0}, * 而 {@code uk_report_no} 唯一索引不认 {@code deleted}。删掉当天最大号的那份报告后, * 条件构造器看不到它、算回同一个号、插入必然撞唯一索引;重试又是同一套查询同一个结果, * 连撞 5 次后报「编号冲突」——用户会以为是自己手气差,实际是删过一份报告就再出不了这一天的件。 *

* 排序**不能**只写 {@code ORDER BY report_no DESC}:序号补零到 4 位, * 当天一旦超过 9999 条位宽就会变长,字典序会把 {@code ...-9999} 排到 {@code ...-10000} 前面。 * 先比长度再比字典序,两端对齐才是真的「最大」。 *

* 只取编号本身:调用方要的就是它的尾部流水,不必把 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); }