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