云
2 天以前 87733eb3623593da247c051593d64b8ff9e1d3a4
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/seedquality/MesQcSeedQualityMapper.java
@@ -1,13 +1,17 @@
package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Mapper
public interface MesQcSeedQualityMapper extends BaseMapperX<MesQcSeedQualityDO> {
@@ -16,29 +20,79 @@
        return selectPage(reqVO, new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .likeIfPresent(MesQcSeedQualityDO::getCode, reqVO.getCode())
                .likeIfPresent(MesQcSeedQualityDO::getBatchCode, reqVO.getBatchCode())
                .eqIfPresent(MesQcSeedQualityDO::getBatchCode, reqVO.getExactBatchCode())
                .eqIfPresent(MesQcSeedQualityDO::getResult, reqVO.getResult())
                .eqIfPresent(MesQcSeedQualityDO::getWorkflowStatus, reqVO.getWorkflowStatus())
                .eqIfPresent(MesQcSeedQualityDO::getQcLine, reqVO.getQcLine())
                .eqIfPresent(MesQcSeedQualityDO::getBizType, reqVO.getBizType())
                .isNull(Boolean.TRUE.equals(reqVO.getUnbound()), MesQcSeedQualityDO::getBatchCode)
                .orderByAsc(MesQcSeedQualityDO::getCode)
                .orderByAsc(MesQcSeedQualityDO::getQcLine)
                .orderByDesc(MesQcSeedQualityDO::getInspectedAt)
                .orderByDesc(MesQcSeedQualityDO::getId));
    }
    default MesQcSeedQualityDO selectByCode(String code) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getCode, code));
    /** 同一袋码可能同时存在加工部、销售部两条记录,按质检线升序返回 */
    default List<MesQcSeedQualityDO> selectListByCode(String code) {
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getCode, code)
                .orderByAsc(MesQcSeedQualityDO::getQcLine));
    }
    default List<MesQcSeedQualityDO> selectListByCodes(java.util.Collection<String> codes) {
    default List<MesQcSeedQualityDO> selectListByCodeForUpdate(String code) {
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getCode, code)
                .orderByAsc(MesQcSeedQualityDO::getQcLine)
                .last("FOR UPDATE"));
    }
    default MesQcSeedQualityDO selectByCodeAndLine(String code, Integer qcLine) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getCode, code)
                .eq(MesQcSeedQualityDO::getQcLine, qcLine));
    }
    default MesQcSeedQualityDO selectByReturnSalesId(Long returnSalesId) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getReturnSalesId, returnSalesId)
                .orderByDesc(MesQcSeedQualityDO::getId));
    }
    default MesQcSeedQualityDO selectByReturnSalesIdForUpdate(Long returnSalesId) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getReturnSalesId, returnSalesId)
                .orderByDesc(MesQcSeedQualityDO::getId)
                .last("FOR UPDATE"));
    }
    /** 清空同一袋码的公司质检流程实例编号,便于公司审批驳回后重新发起 */
    default void clearCompanyProcessInstance(String code) {
        update(null, new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getCode, code)
                .set(MesQcSeedQualityDO::getCompanyProcessInstanceId, null));
    }
    default void clearLineProcessInstance(Long id) {
        update(null, new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getId, id)
                .set(MesQcSeedQualityDO::getProcessInstanceId, null));
    }
    default List<MesQcSeedQualityDO> selectListByCodes(Collection<String> codes) {
        if (codes.isEmpty()) return List.of();
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>().in(MesQcSeedQualityDO::getCode, codes));
    }
    default List<MesQcSeedQualityDO> selectListByCodesForUpdate(java.util.Collection<String> codes) {
    default List<MesQcSeedQualityDO> selectListByCodesForUpdate(Collection<String> codes) {
        if (codes.isEmpty()) return List.of();
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>().in(MesQcSeedQualityDO::getCode, codes).last("FOR UPDATE"));
    }
    default MesQcSeedQualityDO selectByCodeForUpdate(String code) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getCode, code).last("FOR UPDATE"));
    }
    default MesQcSeedQualityDO selectByIdForUpdate(Long id) {
        return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getId, id).last("FOR UPDATE"));
    }
    default List<MesQcSeedQualityDO> selectListByIdsForUpdate(java.util.Collection<Long> ids) {
    default List<MesQcSeedQualityDO> selectListByIdsForUpdate(Collection<Long> ids) {
        if (ids.isEmpty()) return List.of();
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .in(MesQcSeedQualityDO::getId, ids)
@@ -46,9 +100,79 @@
                .last("FOR UPDATE"));
    }
    default List<MesQcSeedQualityDO> selectListByProcessInstanceId(String processInstanceId) {
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getProcessInstanceId, processInstanceId));
    }
    default List<MesQcSeedQualityDO> selectListByCompanyProcessInstanceId(String processInstanceId) {
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getCompanyProcessInstanceId, processInstanceId));
    }
    default List<MesQcSeedQualityDO> selectListByBatchCode(String batchCode) {
        return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
                .eq(MesQcSeedQualityDO::getBatchCode, batchCode)
                .orderByDesc(MesQcSeedQualityDO::getInspectedAt));
    }
    /** 按生产批次分组的组数(未绑定批次归入空批次组) */
    default long countBatchGroups(MesQcSeedQualityPageReqVO reqVO) {
        QueryWrapper<MesQcSeedQualityDO> wrapper = buildBatchGroupFilter(reqVO);
        wrapper.select("COUNT(DISTINCT IFNULL(batch_code, '')) AS cnt");
        List<Object> values = selectObjs(wrapper);
        if (values.isEmpty() || values.get(0) == null) {
            return 0L;
        }
        return ((Number) values.get(0)).longValue();
    }
    /**
     * 按生产批次分组的分页汇总,offset/limit 由调用方按批次页计算。
     * 同一袋码存在加工部、销售部两条记录,因此按袋码去重统计。
     */
    default List<Map<String, Object>> selectBatchGroups(MesQcSeedQualityPageReqVO reqVO, long offset, int limit) {
        QueryWrapper<MesQcSeedQualityDO> wrapper = buildBatchGroupFilter(reqVO);
        wrapper.select(
                "IFNULL(batch_code, '') AS batchCode",
                "MAX(batch_id) AS batchId",
                "MAX(item_id) AS itemId",
                "COUNT(DISTINCT code) AS totalCount",
                "COUNT(DISTINCT CASE WHEN result = 1 THEN code END) AS passCount",
                "COUNT(DISTINCT CASE WHEN result = 2 THEN code END) AS failCount",
                "COUNT(DISTINCT CASE WHEN result IS NULL OR result = 0 THEN code END) AS processingCount",
                "COUNT(DISTINCT CASE WHEN workflow_status IN (10, 50) THEN code END) AS pendingRetestCount",
                "COUNT(DISTINCT CASE WHEN workflow_status IN (20, 25) THEN code END) AS pendingProcessReviewCount",
                "COUNT(DISTINCT CASE WHEN workflow_status IN (30, 60) THEN code END) AS pendingCompanyReviewCount",
                "COUNT(DISTINCT CASE WHEN workflow_status = 40 THEN code END) AS releasedCount",
                "COUNT(DISTINCT CASE WHEN workflow_status = 70 THEN code END) AS scrappedCount",
                "MAX(inspected_at) AS lastInspectedAt");
        wrapper.groupBy("IFNULL(batch_code, '')");
        wrapper.orderByDesc("MAX(inspected_at)", "MAX(id)");
        wrapper.last("LIMIT " + offset + ", " + limit);
        return selectMaps(wrapper);
    }
    private static QueryWrapper<MesQcSeedQualityDO> buildBatchGroupFilter(MesQcSeedQualityPageReqVO reqVO) {
        QueryWrapper<MesQcSeedQualityDO> wrapper = new QueryWrapper<>();
        if (StrUtil.isNotBlank(reqVO.getCode())) {
            wrapper.like("code", reqVO.getCode());
        }
        if (StrUtil.isNotBlank(reqVO.getBatchCode())) {
            wrapper.like("batch_code", reqVO.getBatchCode());
        }
        if (reqVO.getResult() != null) {
            wrapper.eq("result", reqVO.getResult());
        }
        if (reqVO.getWorkflowStatus() != null) {
            wrapper.eq("workflow_status", reqVO.getWorkflowStatus());
        }
        if (reqVO.getQcLine() != null) {
            wrapper.eq("qc_line", reqVO.getQcLine());
        }
        if (reqVO.getBizType() != null) {
            wrapper.eq("biz_type", reqVO.getBizType());
        }
        return wrapper;
    }
}