From 8f04077a44cea20af371c87d8de66e79e7eb93ba Mon Sep 17 00:00:00 2001 From: xs Date: Wed, 3 Sep 2025 09:09:35 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1.5.2=E5=90=8E=E7=AB=AF=20=E5=AE=8C?= =?UTF-8?q?=E5=96=84AI=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/ai/domain/AiBaseModel.java | 2 +- .../dromara/ai/domain/bo/AiBaseModelBo.java | 2 +- .../dromara/ai/domain/vo/AiBaseModelVo.java | 2 +- .../ai/process/enums/AIProviderEnum.java | 28 +++++-- .../processor/AIProviderProcessorFactory.java | 8 ++ .../processor/impl/DeepSeekProcessor.java | 4 +- .../service/impl/AIAssistantServiceImpl.java | 73 +++++++++++-------- .../impl/AiChatMessageServiceImpl.java | 3 +- 8 files changed, 80 insertions(+), 42 deletions(-) diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java index c5a956b6..b0be3130 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java @@ -39,7 +39,7 @@ public class AiBaseModel { /** * 模型类型编码,同ai_model_type中的编码 */ - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java index 65727f7f..bd40a2e0 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java @@ -42,7 +42,7 @@ public class AiBaseModelBo { * 模型类型编码,同ai_model_type中的编码 */ @NotNull(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java index 5d5bb357..dac9a41f 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java @@ -53,7 +53,7 @@ public class AiBaseModelVo implements Serializable { * 模型类型编码,同ai_model_type中的编码 */ @ExcelProperty(value = "模型类型编码") - private Long modelTypeCode; + private String modelTypeCode; /** * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3 diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java index 0dee18e9..77ab4402 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/enums/AIProviderEnum.java @@ -1,21 +1,27 @@ package org.dromara.ai.process.enums; public enum AIProviderEnum { - DEEPSEEK("DeepSeek"), - TONGYI_QIANWEN("TongYi-QianWen"),//阿里通义千问 - TENCENT_LKE("Tencent-LKE"),//腾讯云智能体开发平台 - WENXIN_YIYAN("WenXin-YiYan");//百度文心一言 + DEEPSEEK("DeepSeek", 1L), + TENCENT_LKE("Tencent-LKE", 2L),//腾讯云智能体开发平台 + TONGYI_QIANWEN("TongYi-QianWen", 3L);//阿里通义千问 private final String name; - AIProviderEnum(String name) { + private final Long code;//等于ai_base_model表的base_model_id + + AIProviderEnum(String name, Long code) { this.name = name; + this.code = code; } public String getName() { return name; } + public Long getCode() { + return code; + } + /** * 从字符串转换为枚举 */ @@ -28,4 +34,16 @@ public enum AIProviderEnum { } throw new IllegalArgumentException("未知的大模型提供商: " + text); } + + /** + * 从code(baseModeId)转换为枚举 + */ + public static AIProviderEnum fromCode(Long code) { + for (AIProviderEnum provider : AIProviderEnum.values()) { + if (provider.getCode().equals(code)) { + return provider; + } + } + throw new IllegalArgumentException("未知的大模型提供商: " + code); + } } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java index b03f9d2c..223bffc4 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/AIProviderProcessorFactory.java @@ -38,4 +38,12 @@ public class AIProviderProcessorFactory { AIProviderEnum provider = AIProviderEnum.fromString(providerName); return getProcessor(provider); } + + /** + * 根据base_model_id获取对应的API实现 + */ + public IUnifiedAIProviderProcessor getProcessor(Long baseModelId) { + AIProviderEnum provider = AIProviderEnum.fromCode(baseModelId); + return getProcessor(provider); + } } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java index bba240d3..5cd9ee63 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/process/provider/processor/impl/DeepSeekProcessor.java @@ -259,8 +259,8 @@ public class DeepSeekProcessor extends BaseAIProviderProcessor { AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail(); aiChatMessageDetail.setChatMessageId(aiChatMessage.getChatMessageId()); aiChatMessageDetail.setSessionId(request.getSessionId()); - aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(messages.get(messages.size() - 1).getContent())); - aiChatMessageDetail.setAnswerContent(fullResponse); + aiChatMessageDetail.setQuestionContent(objectMapper.writeValueAsString(request.getQuestionContent())); + aiChatMessageDetail.setAnswerContent(objectMapper.writeValueAsString(fullResponse)); // aiChatMessageDetail.setPromptToken(1L); // aiChatMessageDetail.setCompletionToken(1L); // aiChatMessageDetail.setTotalToken(1L); diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java index 2006e515..8983bf2c 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AIAssistantServiceImpl.java @@ -1,11 +1,10 @@ package org.dromara.ai.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; -import org.dromara.ai.service.IAiChatMessageDetailService; -import org.dromara.ai.service.IAiChatMessageService; -import org.dromara.ai.service.IAiModelService; +import org.dromara.ai.domain.AiModel; +import org.dromara.ai.mapper.AiModelMapper; import org.dromara.ai.test.vectorization.process.IEmbeddingProcessor; -import org.dromara.ai.mapper.DatabaseMetaMapper; +import org.dromara.ai.mapper.SQLServerDatabaseMetaMapper; import org.dromara.ai.process.dto.AIMessage; import org.dromara.ai.process.dto.AIRequest; import org.dromara.ai.process.dto.AIResponse; @@ -33,7 +32,10 @@ import java.util.*; public class AIAssistantServiceImpl implements IAIAssistantService { @Autowired - private DatabaseMetaMapper databaseMetaMapper; + private SQLServerDatabaseMetaMapper databaseMetaMapper; + + @Autowired + private AiModelMapper aiModelMapper; @Autowired private Map aiProviderProcessorMap; @@ -70,7 +72,8 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } final String messageTopic = messages.get(messages.size() - 1).getContent(); - finalAiRequest.setMessageTopic(messageTopic); + finalAiRequest.setMessageTopic(messageTopic);//暂时跟提问的内容相同,后续可以总结 + finalAiRequest.setQuestionContent(messageTopic); // 尝试获取处理器,如果找不到则抛出异常 return Flux.defer(() -> { @@ -96,6 +99,12 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } + /** + * 知识库检索 + * + * @param aiRequest + * @return + */ private AIRequest knowledgeChatInfo(AIRequest aiRequest) { try { List messages = aiRequest.getMessages(); @@ -110,13 +119,22 @@ public class AIAssistantServiceImpl implements IAIAssistantService { aiRequest.setText(messageContent); StringBuilder sb = new StringBuilder(messageContent); - String embeddingProcessor = "Tencent-LKE"; - aiRequest.setApiKey("AKIDyvlTyJTRDmCTXs56uUvDJNK6h9SZVDlB"); - aiRequest.setApiSecret("IOXloeHrCLH4iw30lKjxynPq7rPlwugF"); - IUnifiedAIProviderProcessor tencentLkeProcessor = aiProviderProcessorFactory.getProcessor(embeddingProcessor); + Long embeddingModelId = aiRequest.getEmbeddingModelId(); + AiModel aiModel = aiModelMapper.selectById(embeddingModelId); + if (aiModel == null) { + throw new RuntimeException("未找到对应的模型信息"); + } + +// String embeddingProcessor = "Tencent-LKE"; + //todo:后续从redis中获取 + aiRequest.setApiKey(EncryptUtils.decryptByBase64(aiModel.getApiKey())); + aiRequest.setApiSecret(EncryptUtils.decryptByBase64(aiModel.getApiSecret())); + IUnifiedAIProviderProcessor tencentLkeProcessor = aiProviderProcessorFactory.getProcessor(aiModel.getBaseModelId()); List queryEmbedding = tencentLkeProcessor.getEmbedding(aiRequest); - int topK = 5; + int topK = aiRequest.getRetrieveLimit() == null || aiRequest.getRetrieveLimit() <= 0 ? + 5 : aiRequest.getRetrieveLimit();//retrieveLimit,检索限制 + List searchResultList = vectorDBService. search(queryEmbedding, aiRequest.getKnowledgeBaseId(), topK); @@ -170,26 +188,6 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } } - - public String aiFillForm() { - String aiClient = "deepSeek"; - IUnifiedAIProviderProcessor service = aiProviderProcessorMap.get(aiClient); - if (service == null) { - throw new IllegalArgumentException("Unsupported payment type"); - } - - return ""; - } - - - public String uploadContent() { - String embeddingProcessor = "tencentlke"; - IEmbeddingProcessor service = embeddingProcessorMap.get(embeddingProcessor); - - return ""; - } - - @Override public boolean testAIModel(String provider, AIRequest aiRequest) { IUnifiedAIProviderProcessor processor = aiProviderProcessorMap.get(provider); @@ -215,4 +213,17 @@ public class AIAssistantServiceImpl implements IAIAssistantService { } + + public String aiFillForm() { + String aiClient = "deepSeek"; + IUnifiedAIProviderProcessor service = aiProviderProcessorMap.get(aiClient); + if (service == null) { + throw new IllegalArgumentException("Unsupported payment type"); + } + + return ""; + } + + + } diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java index 723f1478..823bc132 100644 --- a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java +++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/service/impl/AiChatMessageServiceImpl.java @@ -86,7 +86,8 @@ public class AiChatMessageServiceImpl implements IAiChatMessageService { .eq(bo.getDeductCost() != null, AiChatMessage::getDeductCost, bo.getDeductCost()) .eq(bo.getTotalToken() != null, AiChatMessage::getTotalToken, bo.getTotalToken()) .eq(bo.getModelId() != null, AiChatMessage::getModelId, bo.getModelId()) - .eq(bo.getKnowledgeBaseId() != null, AiChatMessage::getKnowledgeBaseId, bo.getKnowledgeBaseId()) + .eq(bo.getKnowledgeBaseId() != null && !bo.getKnowledgeBaseId().equals(-1L), AiChatMessage::getKnowledgeBaseId, bo.getKnowledgeBaseId()) + .isNull(bo.getKnowledgeBaseId() != null && bo.getKnowledgeBaseId().equals(-1L), AiChatMessage::getKnowledgeBaseId) .eq(StringUtils.isNotBlank(bo.getMessageType()), AiChatMessage::getMessageType, bo.getMessageType()) .orderByDesc(AiChatMessage::getCreateTime); return lqw; From e3d8ec89417adf7d539598020b2ca057130be841 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 3 Sep 2025 09:34:30 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refactor(wms):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 WmsInstockDetail、WmsInstockOrder 和 WmsInstockPrint 类中的字段填充策略 - 优化 WmsInstockDetailServiceImpl 中的分包逻辑,移除平均分包和自定义分包的区分 - 新增 AGV 相关的字段和方法 - 修复了一些潜在的 bug,如分包数量总计不等于入库数量的问题 - 优化了代码结构,提高了代码的可读性和可维护性 --- .../dromara/wms/domain/WmsInstockDetail.java | 5 +- .../dromara/wms/domain/WmsInstockOrder.java | 9 +- .../dromara/wms/domain/WmsInstockPrint.java | 4 +- .../impl/WmsInstockDetailServiceImpl.java | 120 ++++++++---------- 4 files changed, 63 insertions(+), 75 deletions(-) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java index fbff6cbf..e5e67325 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java @@ -105,14 +105,15 @@ public class WmsInstockDetail{ /** * 更新者 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private String updateBy; /** * 更新时间 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private Date updateTime; + // /** // * 打印数量 // */ diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockOrder.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockOrder.java index 1828aa3e..facfeb0a 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockOrder.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockOrder.java @@ -99,22 +99,21 @@ public class WmsInstockOrder{ /** * 更新者 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private String updateBy; /** * 更新时间 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private Date updateTime; - - - /** * 租户id */ private String tenantId; + + @TableField(exist = false) private String warehouseCode;//字段映射 diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java index 97de1a32..318771f0 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java @@ -96,13 +96,13 @@ public class WmsInstockPrint{ /** * 更新者 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private String updateBy; /** * 更新时间 */ - @TableField(fill = FieldFill.INSERT_UPDATE) + @TableField(fill = FieldFill.UPDATE) private Date updateTime; /** diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java index 4cdc05f0..d638335b 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java @@ -30,8 +30,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; @@ -96,14 +96,15 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { MPJLambdaWrapper lqw = JoinWrappers.lambda(WmsInstockDetail.class) .selectAll(WmsInstockDetail.class) - // 关联表查询物料大类名称 .select(BaseMaterialCategory::getMaterialCategoryName) .leftJoin(BaseMaterialCategory.class, BaseMaterialCategory::getMaterialCategoryId, WmsInstockDetail::getMaterialCategoryId) - - .select(BaseMaterialInfo::getInspectionRequest)//质检要求(0必检,1免检) + //质检要求(0必检,1免检) + .select(BaseMaterialInfo::getInspectionRequest) .leftJoin(BaseMaterialInfo.class, BaseMaterialInfo::getMaterialId, WmsInstockDetail::getMaterialId) + + .eq(StringUtils.isNotBlank(bo.getIsInspection()), WmsInstockDetail::getIsInspection, bo.getIsInspection()) .eq(bo.getInstockQty() != null, WmsInstockDetail::getInstockQty, bo.getInstockQty()) @@ -120,6 +121,11 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { .like(StringUtils.isNotBlank(bo.getUnitName()), WmsInstockDetail::getUnitName, bo.getUnitName()) .eq(StringUtils.isNotBlank(bo.getCodeYesNo()), WmsInstockDetail::getCodeYesNo, bo.getCodeYesNo()) .eq(StringUtils.isNotBlank(bo.getMaterialCategoryId()), WmsInstockDetail::getMaterialCategoryId, bo.getMaterialCategoryId()) + //新增 + .eq(StringUtils.isNotBlank(bo.getInspectionRequest()), BaseMaterialInfo::getInspectionRequest, bo.getInspectionRequest()) + .eq(StringUtils.isNotBlank(bo.getIsAgv()), WmsInstockDetail::getIsAgv, bo.getIsAgv())//agv + .eq(bo.getCompleteQty() != null, WmsInstockDetail::getCompleteQty, bo.getCompleteQty())//agv + .eq(StringUtils.isNotBlank(bo.getAgvStatus()), WmsInstockDetail::getAgvStatus, bo.getAgvStatus())//agv .orderByDesc(WmsInstockDetail::getCreateTime); return lqw; } @@ -230,70 +236,42 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { String baseOrder = generateOrder(printSeq); BigDecimal totalPackaged = BigDecimal.ZERO; if (splitInt > 1) { - // 分包逻辑 - 支持平均分包和自定义分包两种模式 + // 分包逻辑 - 统一处理模式 List packageQtyList = bo.getPackageQtyList(); - String packageMode = bo.getPackageMode(); - - // 默认为平均分包模式 - if (packageMode == null) { - packageMode = "average"; + + // 验证分包数据 + if (packageQtyList == null || packageQtyList.size() != splitInt) { + throw new ServiceException("分包数量列表与分包数量不匹配"); } - - if ("custom".equals(packageMode) && packageQtyList != null && packageQtyList.size() == splitInt) { - // 自定义模式:使用用户指定的每包数量 - BigDecimal totalCustomQty = packageQtyList.stream() - .map(BigDecimal::valueOf) - .reduce(BigDecimal.ZERO, BigDecimal::add); - - if (totalCustomQty.compareTo(remaining) > 0) { - throw new ServiceException("每包数量总计不能超过剩余数量"); - } - - for (int i = 1; i <= splitInt; i++) { - String order = baseOrder + String.format("%03d", i); - String batchCode = generateBatchCode(bo, bo.getBatchCode(), order); - - BigDecimal currentPackageQty = BigDecimal.valueOf(packageQtyList.get(i - 1)); - - WmsInstockPrint print = new WmsInstockPrint(); - BeanUtils.copyProperties(bo, print); - print.setBatchCode(batchCode); - print.setApportionQty(currentPackageQty); - print.setMaterialQty(1L); // 每个包打印1份 - print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中) - - wmsInstockPrintService.insertWmsInstockPrint(print); - - totalPackaged = totalPackaged.add(currentPackageQty); - } - } else { - // 平均分包模式(默认模式)或自定义模式但数据不完整 - if ("average".equals(packageMode) || packageQtyList == null || packageQtyList.size() != splitInt) { - // 使用平均分包逻辑 - if (remaining.compareTo(split) < 0 || remaining.remainder(split).compareTo(BigDecimal.ZERO) != 0) { - throw new ServiceException("无法平均分包,剩余数量不能被平均分配"); - } - BigDecimal per = remaining.divide(split, 0, RoundingMode.DOWN); - - for (int i = 1; i <= splitInt; i++) { - String order = baseOrder + String.format("%03d", i); - String batchCode = generateBatchCode(bo, bo.getBatchCode(), order); - - WmsInstockPrint print = new WmsInstockPrint(); - BeanUtils.copyProperties(bo, print); - print.setBatchCode(batchCode); - print.setApportionQty(per); - print.setMaterialQty(1L); // 每个包打印1份 - print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中) - - wmsInstockPrintService.insertWmsInstockPrint(print); - - totalPackaged = totalPackaged.add(per); - } - } else { - // 使用自定义数量但数据验证失败 - throw new ServiceException("自定义分包数量数据验证失败"); - } + + // 验证每包数量总计是否等于入库数量 + BigDecimal totalCustomQty = packageQtyList.stream() + .map(BigDecimal::valueOf) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + if (totalCustomQty.compareTo(detail.getInstockQty()) != 0) { + throw new ServiceException("分包数量总计必须等于入库数量" + detail.getInstockQty() + ",当前总计:" + totalCustomQty); + } + + // 遍历packageQtyList创建打印记录 + for (int i = 1; i <= splitInt; i++) { + String order = baseOrder + String.format("%03d", i); + String batchCode = generateBatchCode(bo, bo.getBatchCode(), order); + + BigDecimal currentPackageQty = BigDecimal.valueOf(packageQtyList.get(i - 1)); + + WmsInstockPrint print = new WmsInstockPrint(); + BeanUtils.copyProperties(bo, print); + print.setBatchCode(batchCode); + print.setApportionQty(currentPackageQty); + print.setMaterialQty(1L); // 每个包打印1份 + print.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中) + print.setCreateBy(LoginHelper.getUsername()); + print.setCreateTime(new Date()); + + wmsInstockPrintService.insertWmsInstockPrint(print); + + totalPackaged = totalPackaged.add(currentPackageQty); } } else { // 重复打印逻辑(split == 1) @@ -371,4 +349,14 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { // } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 启动AGV + * @param bo + * @return boolean + * 暂时默认启动成功 + */ + private Boolean actionAGV(WmsInstockDetailBo bo) { + return true; + } } From 64a3c9c32ece7c4598aab89a59a3a413bacd683a Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 3 Sep 2025 10:04:38 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor(wms):=20=E7=A7=BB=E9=99=A4=20WmsIn?= =?UTF-8?q?stockDetail=20=E4=B8=AD=E7=9A=84=20AGV=20=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=B8=BAprint?= =?UTF-8?q?=E4=B8=BAagv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -从 WmsInstockDetail、WmsInstockDetailBo、WmsInstockDetailVo 中移除了 isAgv、completeQty 和 agvStatus 字段 - 在 WmsInstockPrint、WmsInstockPrintBo 和 WmsInstockPrintVo 中添加了 isAgv 和 agvStatus 字段 - 删除了 WmsInstockDetailServiceImpl 中的 actionAGV 方法 --- .../org/dromara/wms/domain/WmsInstockDetail.java | 15 --------------- .../org/dromara/wms/domain/WmsInstockPrint.java | 12 ++++++++++++ .../dromara/wms/domain/bo/WmsInstockDetailBo.java | 15 --------------- .../dromara/wms/domain/bo/WmsInstockPrintBo.java | 11 +++++++++++ .../dromara/wms/domain/vo/WmsInstockDetailVo.java | 15 --------------- .../dromara/wms/domain/vo/WmsInstockPrintVo.java | 10 ++++++++++ .../service/impl/WmsInstockDetailServiceImpl.java | 12 ------------ 7 files changed, 33 insertions(+), 57 deletions(-) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java index e5e67325..68515c21 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockDetail.java @@ -147,21 +147,6 @@ public class WmsInstockDetail{ private String materialCategoryName;//字段映射 - /** - * 是否为AGV任务(0是,1否) - */ - private String isAgv; - - /** - * 完成数量 - */ - private BigDecimal completeQty; - - /** - * AGV状态(0待拾取 / 1运输中 / 2完成) - */ - private String agvStatus; - /** * 打印时间(打印记录的创建时间按) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java index 318771f0..37b4c7c5 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/WmsInstockPrint.java @@ -125,6 +125,18 @@ public class WmsInstockPrint{ */ private Date actualInboundTime; + + /** + * 是否为AGV任务(0是,1否) + */ + private String isAgv; + + + /** + * AGV状态(0待拾取 / 1运输中 / 2完成) + */ + private String agvStatus; + /** * 物料大类 */ diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java index 745818f7..87f59762 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockDetailBo.java @@ -191,21 +191,6 @@ public class WmsInstockDetailBo{ */ private String inspectionRequest; - /** - * 是否为AGV任务(0是,1否) - */ - private String isAgv; - - /** - * 完成数量 - */ - private BigDecimal completeQty; - - /** - * AGV状态(0待拾取 / 1运输中 / 2完成) - */ - private String agvStatus; - /** * 每包数量列表(当分包数量>1时使用) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockPrintBo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockPrintBo.java index c1730b90..54a28be9 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockPrintBo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/bo/WmsInstockPrintBo.java @@ -111,4 +111,15 @@ public class WmsInstockPrintBo extends BaseEntity { */ private Date actualInboundTime; + /** + * 是否为AGV任务(0是,1否) + */ + private String isAgv; + + + /** + * AGV状态(0待拾取 / 1运输中 / 2完成) + */ + private String agvStatus; + } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockDetailVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockDetailVo.java index 26c33b83..cc3c8b09 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockDetailVo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockDetailVo.java @@ -161,21 +161,6 @@ public class WmsInstockDetailVo implements Serializable { private String inspectionRequest; - /** - * 是否为AGV任务(0是,1否) - */ - private String isAgv; - - /** - * 完成数量 - */ - private BigDecimal completeQty; - - /** - * AGV状态(0待拾取 / 1运输中 / 2完成) - */ - private String agvStatus; - /** * 打印时间(打印记录的创建时间按) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockPrintVo.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockPrintVo.java index 5e2e924a..1a9a48e5 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockPrintVo.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/domain/vo/WmsInstockPrintVo.java @@ -142,5 +142,15 @@ public class WmsInstockPrintVo implements Serializable { */ private Date createTime; + /** + * 是否为AGV任务(0是,1否) + */ + private String isAgv; + + + /** + * AGV状态(0待拾取 / 1运输中 / 2完成) + */ + private String agvStatus; } diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java index d638335b..7924a412 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/WmsInstockDetailServiceImpl.java @@ -123,9 +123,6 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { .eq(StringUtils.isNotBlank(bo.getMaterialCategoryId()), WmsInstockDetail::getMaterialCategoryId, bo.getMaterialCategoryId()) //新增 .eq(StringUtils.isNotBlank(bo.getInspectionRequest()), BaseMaterialInfo::getInspectionRequest, bo.getInspectionRequest()) - .eq(StringUtils.isNotBlank(bo.getIsAgv()), WmsInstockDetail::getIsAgv, bo.getIsAgv())//agv - .eq(bo.getCompleteQty() != null, WmsInstockDetail::getCompleteQty, bo.getCompleteQty())//agv - .eq(StringUtils.isNotBlank(bo.getAgvStatus()), WmsInstockDetail::getAgvStatus, bo.getAgvStatus())//agv .orderByDesc(WmsInstockDetail::getCreateTime); return lqw; } @@ -350,13 +347,4 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService { return baseMapper.deleteByIds(ids) > 0; } - /** - * 启动AGV - * @param bo - * @return boolean - * 暂时默认启动成功 - */ - private Boolean actionAGV(WmsInstockDetailBo bo) { - return true; - } } From 31d82120a582b2053b5c5c41fec360e23597a683 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 3 Sep 2025 10:19:35 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor(wms):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2=E7=9A=84?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -将 BaseMeasurementUnitInfo 的 unitName 字段关联到 BaseMaterialInfo 的 materialUnit 字段 - 优化了物料信息查询的关联逻辑,提高了查询效率和准确性 --- .../dromara/wms/service/impl/BaseMaterialInfoServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/BaseMaterialInfoServiceImpl.java b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/BaseMaterialInfoServiceImpl.java index 3c4f0693..00391b95 100644 --- a/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/BaseMaterialInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-wms/src/main/java/org/dromara/wms/service/impl/BaseMaterialInfoServiceImpl.java @@ -90,7 +90,7 @@ public class BaseMaterialInfoServiceImpl implements IBaseMaterialInfoService { .leftJoin(BaseMaterialType.class, BaseMaterialType::getMatrialTypeId, BaseMaterialInfo::getMaterialTypeId) //关联计量单位信息 - .select(BaseMeasurementUnitInfo::getUnitName) + .selectAs(BaseMeasurementUnitInfo::getUnitName, BaseMaterialInfo::getMaterialUnit) .leftJoin(BaseMeasurementUnitInfo.class, BaseMeasurementUnitInfo::getUnitId, BaseMaterialInfo::getMaterialUnitId) //关联物料大类信息(物料大类从字典改为了数据库表)