| | |
| | | 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> { |
| | |
| | | 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) |
| | |
| | | .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; |
| | | } |
| | | } |