Merge remote-tracking branch 'origin/master'

hwmom-htk
wanghao 4 months ago
commit c94d198b14

@ -39,7 +39,7 @@ public class AiBaseModel {
/**
* ai_model_type
*/
private Long modelTypeCode;
private String modelTypeCode;
/**
* : DeepSeek-V3, Qwen1.5-72B, ChatGLM3

@ -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

@ -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

@ -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);
}
}

@ -38,4 +38,12 @@ public class AIProviderProcessorFactory {
AIProviderEnum provider = AIProviderEnum.fromString(providerName);
return getProcessor(provider);
}
/**
* base_model_idAPI
*/
public IUnifiedAIProviderProcessor getProcessor(Long baseModelId) {
AIProviderEnum provider = AIProviderEnum.fromCode(baseModelId);
return getProcessor(provider);
}
}

@ -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);

@ -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<String, IUnifiedAIProviderProcessor> 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<AIMessage> 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<Double> queryEmbedding = tencentLkeProcessor.getEmbedding(aiRequest);
int topK = 5;
int topK = aiRequest.getRetrieveLimit() == null || aiRequest.getRetrieveLimit() <= 0 ?
5 : aiRequest.getRetrieveLimit();//retrieveLimit检索限制
List<String> 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 "";
}
}

@ -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;

@ -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;
// /**
// * 打印数量
// */
@ -146,21 +147,6 @@ public class WmsInstockDetail{
private String materialCategoryName;//字段映射
/**
* AGV01
*/
private String isAgv;
/**
*
*/
private BigDecimal completeQty;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
/**
* ()

@ -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;//字段映射

@ -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;
/**
@ -125,6 +125,18 @@ public class WmsInstockPrint{
*/
private Date actualInboundTime;
/**
* AGV01
*/
private String isAgv;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
/**
*
*/

@ -191,21 +191,6 @@ public class WmsInstockDetailBo{
*/
private String inspectionRequest;
/**
* AGV01
*/
private String isAgv;
/**
*
*/
private BigDecimal completeQty;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
/**
* >1使

@ -111,4 +111,15 @@ public class WmsInstockPrintBo extends BaseEntity {
*/
private Date actualInboundTime;
/**
* AGV01
*/
private String isAgv;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
}

@ -161,21 +161,6 @@ public class WmsInstockDetailVo implements Serializable {
private String inspectionRequest;
/**
* AGV01
*/
private String isAgv;
/**
*
*/
private BigDecimal completeQty;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
/**
* ()

@ -142,5 +142,15 @@ public class WmsInstockPrintVo implements Serializable {
*/
private Date createTime;
/**
* AGV01
*/
private String isAgv;
/**
* AGV0 / 1 / 2
*/
private String agvStatus;
}

@ -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)
//关联物料大类信息(物料大类从字典改为了数据库表)

@ -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<WmsInstockDetail> 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,8 @@ 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())
.orderByDesc(WmsInstockDetail::getCreateTime);
return lqw;
}
@ -230,70 +233,42 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
String baseOrder = generateOrder(printSeq);
BigDecimal totalPackaged = BigDecimal.ZERO;
if (splitInt > 1) {
// 分包逻辑 - 支持平均分包和自定义分包两种模式
// 分包逻辑 - 统一处理模式
List<Integer> 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 +346,5 @@ public class WmsInstockDetailServiceImpl implements IWmsInstockDetailService {
// }
return baseMapper.deleteByIds(ids) > 0;
}
}

Loading…
Cancel
Save