From 87733eb3623593da247c051593d64b8ff9e1d3a4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 06 十一月 2026 19:00:39 +0800
Subject: [PATCH] feat(crm,mes): 扩展客户字段与重构批次号生成逻辑

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/seedquality/MesQcSeedQualityMapper.java |  140 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 132 insertions(+), 8 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/seedquality/MesQcSeedQualityMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/seedquality/MesQcSeedQualityMapper.java
index 8078d31..fa0b8bb 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/seedquality/MesQcSeedQualityMapper.java
+++ b/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;
+    }
 }

--
Gitblit v1.9.3