| 6 days ago | Administrator | ![]() |
| 6 days ago | Administrator | ![]() |
| 6 days ago | Administrator | ![]() |
| 6 days ago | Administrator | ![]() |
src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
@@ -7,6 +7,7 @@ import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.yinhe.req.AiRequestDto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; @@ -255,4 +256,9 @@ throw new FebsException(StrUtil.format("百炼工作流输出失败:{}",error)); }); } @Override public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto) { return null; } } src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java
@@ -5,166 +5,147 @@ import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.yinhe.req.AiRequestDto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationParam; import com.alibaba.dashscope.aigc.generation.GenerationResult; import com.alibaba.dashscope.app.*; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.Role; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.JsonUtils; import io.reactivex.Flowable; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; @Slf4j @Component("AliLlmStrategyService") public class AliLlmStrategyServiceImpl implements LlmStrategyService { private GenerationParam generationParam; private static final String apiKey = "sk-4b97b556ba7c4350a41f2856f75b9377"; private static final String model = "qwen-plus"; // private static final String model = "qwen3-14b-ft-202509031002-7446"; @PostConstruct public void init() { this.generationParam = GenerationParam.builder() // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx") .apiKey(apiKey) // 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models .model(model) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .build(); } private List<Message> getMessages(List<LlmStrategyDto> dto) { List<Message> messages = new ArrayList<>(); for (LlmStrategyDto dtoItem : dto){ if (StrUtil.equals(dtoItem.getRole(),Role.SYSTEM.getValue())){ messages.add(Message.builder() .role(Role.SYSTEM.getValue()) .content(dtoItem.getContent()) .build()); } if (StrUtil.equals(dtoItem.getRole(),Role.USER.getValue())){ messages.add(Message.builder() .role(Role.USER.getValue()) .content(dtoItem.getContent()) .build()); } if (StrUtil.equals(dtoItem.getRole(),Role.ASSISTANT.getValue())){ messages.add(Message.builder() .role(Role.ASSISTANT.getValue()) .content(dtoItem.getContent()) .build()); } } return messages; } @Override public FebsResponse llmInvokeNonStreaming(List<LlmStrategyDto> dto) { if (CollUtil.isEmpty(dto)){ throw new FebsException("百炼大模型初始化异常"); } List<Message> messages = getMessages(dto); Generation gen = new Generation(); generationParam.setMessages(messages); generationParam.setEnableThinking( false); FebsResponse febsResponse = new FebsResponse(); try { GenerationResult result = gen.call(generationParam); if (result != null && result.getOutput() != null && result.getOutput().getChoices().size() > 0){ febsResponse.success().data(result.getOutput().getChoices().get(0).getMessage().getContent()); }else{ febsResponse.fail().message("百炼大模型调用失败"); } } catch (NoApiKeyException e) { throw new FebsException(StrUtil.format("百炼大模型调用失败:{}",e.getMessage())); } catch (InputRequiredException e) { throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage())); } return febsResponse; return new FebsResponse().success(); } @Override public Flux<FebsResponse> llmInvokeStreamingWithThink(List<LlmStrategyDto> dto) { if (CollUtil.isEmpty(dto)){ throw new FebsException("百炼大模型初始化异常"); } List<Message> messages = getMessages(dto); long startTime = System.currentTimeMillis(); Generation gen = new Generation(); generationParam.setMessages(messages); generationParam.setResultFormat(GenerationParam.ResultFormat.MESSAGE); generationParam.setEnableThinking( true); generationParam.setIncrementalOutput( true); Flowable<GenerationResult> result; try { result = gen.streamCall(generationParam); } catch (NoApiKeyException | InputRequiredException e) { throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage())); } return Flux.from(result) .map(message -> { HashMap<String, String> stringStringHashMap = new HashMap<>(); if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getReasoningContent())){ stringStringHashMap.put(LlmStrategyContextEnum.THINK.name(),message.getOutput().getChoices().get(0).getMessage().getReasoningContent()); System.out.print(message.getOutput().getChoices().get(0).getMessage().getReasoningContent()); } if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getContent())){ stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),message.getOutput().getChoices().get(0).getMessage().getContent()); System.out.print(message.getOutput().getChoices().get(0).getMessage().getContent()); } return new FebsResponse().success().data(stringStringHashMap); }) .doOnComplete(() -> { long endTime = System.currentTimeMillis(); System.out.println("百炼大模型输出:" + (endTime - startTime) + "毫秒"); }) .doOnError(error -> { throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",error)); }); return null; } @Override public Flux<FebsResponse> llmInvokeStreamingNoThink(List<LlmStrategyDto> dto) { if (CollUtil.isEmpty(dto)){ throw new FebsException("百炼大模型初始化异常"); } List<Message> messages = getMessages(dto); return null; } private ApplicationParam applicationParam; @Autowired private RedisUtils redisUtils; @PostConstruct public void init() { this.applicationParam = ApplicationParam.builder() // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。 .apiKey(YHapiKey) .appId(YHappId) .build(); } private static final String YHapiKey = "sk-4b97b556ba7c4350a41f2856f75b9377"; // private static final String appId = "71022536aca048528b61ac43c77f0e94"; private static final String YHappId = "04beff88c50d4ccaaf1814231b02d2bb"; @Override public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto dto) { long startTime = System.currentTimeMillis(); Generation gen = new Generation(); generationParam.setMessages(messages); generationParam.setResultFormat(GenerationParam.ResultFormat.MESSAGE); generationParam.setIncrementalOutput( true); generationParam.setEnableThinking( false); Flowable<GenerationResult> result; if (ObjectUtil.isEmpty(dto)){ throw new FebsException("参数异常"); } String talkId = dto.getTalkId(); String rolePrompt = dto.getRolePrompt(); List<Message> messages = dto.getMessages(); HashMap<String, Object> userPromptParams = new HashMap<>(); userPromptParams.put("role_prompt", rolePrompt); if(CollUtil.isNotEmpty( messages)){ userPromptParams.put("message_list", messages); } HashMap<String, Object> bizParams = new HashMap<>(); bizParams.put("user_prompt_params", userPromptParams); List<String> knowledgeIds = dto.getKnowledgeIds(); List<String> fileIds = dto.getFileIds(); String prompt = dto.getPrompt(); Application application = new Application(); applicationParam.setPrompt(prompt); applicationParam.setBizParams(JsonUtils.toJsonObject( bizParams)); // 获取当前的系统时间 applicationParam.setEnableSystemTime( true); // 增量输出 applicationParam.setIncrementalOutput( true); // 思考过程 applicationParam.setEnableThinking( false); // 多轮对话 // applicationParam.setMessages(messages); // 上下文seesionId // String sessionId = (String) redisCache.getCacheObject(talkId); // if (ObjectUtil.isNotEmpty(sessionId)){ // applicationParam.setSessionId(talkId); // } RagOptions ragOptions = null; if (CollUtil.isEmpty(fileIds)){ ragOptions = RagOptions.builder() .pipelineIds(knowledgeIds) .build(); }else{ ragOptions = RagOptions.builder() .pipelineIds(knowledgeIds) .fileIds(fileIds) .build(); } applicationParam.setRagOptions(ragOptions); Flowable<ApplicationResult> result; try { result = gen.streamCall(generationParam); result = application.streamCall(applicationParam); } catch (NoApiKeyException | InputRequiredException e) { throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage())); } return Flux.from(result) .map(message -> { HashMap<String, String> stringStringHashMap = new HashMap<>(); if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getContent())){ String content = message.getOutput().getChoices().get(0).getMessage().getContent(); System.out.print( content); stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),content); HashMap<String, Object> stringStringHashMap = new HashMap<>(); if (!message.getOutput().getFinishReason().equals("stop")){ stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),message.getOutput().getText()); } if (message.getOutput().getFinishReason().equals("stop")){ log.info("百炼大模型输出:{}",message.getOutput().getSessionId()); List<ApplicationUsage.ModelUsage> models = message.getUsage().getModels(); long outputTokens = models.stream().mapToLong(ApplicationUsage.ModelUsage::getOutputTokens).sum(); log.info("百炼大模型输出:{}",outputTokens); long inputTokens = models.stream().mapToLong(ApplicationUsage.ModelUsage::getInputTokens).sum(); log.info("百炼大模型输出:{}",inputTokens); redisUtils.set(talkId, message.getOutput().getSessionId(), 5*60); stringStringHashMap.put("inputTokens:",inputTokens); stringStringHashMap.put("outputTokens:",outputTokens); } return new FebsResponse().success().data(stringStringHashMap); }) .doOnComplete(() -> { @@ -174,5 +155,7 @@ .doOnError(error -> { throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",error)); }); } } src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java
@@ -5,6 +5,7 @@ import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.yinhe.req.AiRequestDto; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -201,4 +202,9 @@ throw new FebsException(StrUtil.format("火山大模型流式调用AI服务失:{}",throwable)); }); } @Override public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto) { return null; } } src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java
@@ -2,6 +2,7 @@ import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.yinhe.req.AiRequestDto; import reactor.core.publisher.Flux; import java.util.List; @@ -13,4 +14,6 @@ Flux<FebsResponse> llmInvokeStreamingWithThink(List<LlmStrategyDto> dto); Flux<FebsResponse> llmInvokeStreamingNoThink(List<LlmStrategyDto> dto); Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto); } src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -4,6 +4,7 @@ import cc.mrbird.febs.rabbit.constants.QueueConstants; import cc.mrbird.febs.rabbit.constants.RouteKeyConstants; import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -19,6 +20,7 @@ * @author wzy * @date 2021-09-25 **/ @Slf4j @Configuration public class RabbitConfigure { @@ -32,242 +34,17 @@ } @Bean public DirectExchange defaultExchange() { return new DirectExchange(ExchangeConstants.EXCHANGE_DEFAULT); public DirectExchange pcCompanyAddExchange() { return new DirectExchange(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getExchange()); } @Bean public Queue defaultQueue() { return new Queue(QueueConstants.QUEUE_DEFAULT); public Queue pcCompanyAddQueue() { return new Queue(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getQueue()); } @Bean public Binding defaultBind() { return BindingBuilder.bind(defaultQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT); public Binding pcCompanyAddBind() { return BindingBuilder.bind(pcCompanyAddQueue()).to(pcCompanyAddExchange()).with(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getRoute()); } @Bean public DirectExchange delayTtlExchangeClothes() { return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getExchange()); } @Bean public Queue orderDelayQueueTtlClothes() { return QueueBuilder.durable(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getQueue()) //到期后转发的交换机 .withArgument("x-dead-letter-exchange", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange()) //到期后转发的路由键 .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute()) .build(); } @Bean public Binding orderDelayBindTtlClothes() { return BindingBuilder.bind(orderDelayQueueTtlClothes()).to(delayTtlExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getRoute()); } @Bean public DirectExchange orderDelayExchangeClothes() { return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange()); } @Bean public Queue orderDelayQueueClothes() { return new Queue(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getQueue()); } @Bean public Binding orderDelayBindClothes() { return BindingBuilder.bind(orderDelayQueueClothes()).to(orderDelayExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute()); } @Bean public DirectExchange delayTtlExchange() { return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange()); } @Bean public DirectExchange orderDelayExchange() { return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange()); } @Bean public Queue orderDelayQueue() { return new Queue(RabbitQueueEnum.ORDER_CANCEL_DELAY.getQueue()); } @Bean public Queue orderDelayQueueTtl() { return QueueBuilder.durable(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getQueue()) //到期后转发的交换机 .withArgument("x-dead-letter-exchange", RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange()) //到期后转发的路由键 .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute()) .build(); } @Bean public Binding orderDelayBind() { return BindingBuilder.bind(orderDelayQueue()).to(orderDelayExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute()); } @Bean public Binding orderDelayBindTtl() { return BindingBuilder.bind(orderDelayQueueTtl()).to(delayTtlExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute()); } @Bean public Queue autoLevelUpAgentQueue() { return new Queue(QueueConstants.AGENT_AUTO_LEVEL_UP); } @Bean public Binding autoLevelUpBind() { return BindingBuilder.bind(autoLevelUpAgentQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT); } @Bean public DirectExchange agentReturnMoneyExchange() { return new DirectExchange(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange()); } @Bean public Queue agentReturnMoneyQueue() { return new Queue(QueueConstants.AGENT_RETURN_MONEY); } @Bean public Binding agentReturnMoneyBind() { return BindingBuilder.bind(agentReturnMoneyQueue()).to(agentReturnMoneyExchange()).with(RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute()); } @Bean public DirectExchange orderReturnMoneyExchange() { return new DirectExchange(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange()); } @Bean public Queue orderReturnMoneyQueue() { return new Queue(QueueConstants.ORDER_RETURN_MONEY); } @Bean public Binding orderReturnMoneyBind() { return BindingBuilder.bind(orderReturnMoneyQueue()).to(orderReturnMoneyExchange()).with(RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute()); } @Bean public DirectExchange orderCouponExchange() { return new DirectExchange(RabbitQueueEnum.ORDER_COUPON.getExchange()); } @Bean public Queue orderCouponQueue() { return new Queue(QueueConstants.ORDER_COUPON); } @Bean public Binding orderCouponBind() { return BindingBuilder.bind(orderCouponQueue()).to(orderCouponExchange()).with(RabbitQueueEnum.ORDER_COUPON.getRoute()); } @Bean public DirectExchange getScoreMsgExchange() { return new DirectExchange(RabbitQueueEnum.GET_SCORE_MSG.getExchange()); } @Bean public Queue getScoreMsgQueue() { return new Queue(QueueConstants.GET_SCORE_MSG); } @Bean public Binding getScoreMsgBind() { return BindingBuilder.bind(getScoreMsgQueue()).to(getScoreMsgExchange()).with(RabbitQueueEnum.GET_SCORE_MSG.getRoute()); } @Bean public DirectExchange vipLevelUp() { return new DirectExchange(RabbitQueueEnum.VIP_LEVEL_UP.getExchange()); } @Bean public Queue vipLevelUpQueue() { return new Queue(QueueConstants.VIP_LEVEL_UP); } @Bean public Binding vipLevelUpBind() { return BindingBuilder.bind(vipLevelUpQueue()).to(vipLevelUp()).with(RabbitQueueEnum.VIP_LEVEL_UP.getRoute()); } @Bean public DirectExchange saleLevelUp() { return new DirectExchange(RabbitQueueEnum.SALE_LEVEL_UP.getExchange()); } @Bean public Queue saleLevelUpQueue() { return new Queue(RabbitQueueEnum.SALE_LEVEL_UP.getQueue()); } @Bean public Binding saleLevelUpBind() { return BindingBuilder.bind(saleLevelUpQueue()).to(saleLevelUp()).with(RabbitQueueEnum.SALE_LEVEL_UP.getRoute()); } @Bean public DirectExchange activityOrderCheckExchange() { return new DirectExchange(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange()); } @Bean public Queue activityOrderCheckQueue() { return new Queue(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getQueue()); } @Bean public Binding activityOrderCheckBind() { return BindingBuilder.bind(activityOrderCheckQueue()).to(activityOrderCheckExchange()).with(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute()); } @Bean public DirectExchange clothesAddLikeExchange() { return new DirectExchange(RabbitQueueEnum.CLOTHES_ADD_LIKE.getExchange()); } @Bean public Queue clothesAddLikeQueue() { return new Queue(RabbitQueueEnum.CLOTHES_ADD_LIKE.getQueue()); } @Bean public Binding clothesAddLikeBind() { return BindingBuilder.bind(clothesAddLikeQueue()).to(clothesAddLikeExchange()).with(RabbitQueueEnum.CLOTHES_ADD_LIKE.getRoute()); } @Bean public DirectExchange clothesAddCollectExchange() { return new DirectExchange(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getExchange()); } @Bean public Queue clothesAddCollectQueue() { return new Queue(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getQueue()); } @Bean public Binding clothesAddCollectBind() { return BindingBuilder.bind(clothesAddCollectQueue()).to(clothesAddCollectExchange()).with(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getRoute()); } } src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
@@ -11,7 +11,6 @@ import cc.mrbird.febs.mall.service.IMallAchieveService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.service.IMemberProfitService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java
@@ -18,7 +18,6 @@ import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; @@ -67,7 +66,6 @@ private final MallGoodsCouponMapper mallGoodsCouponMapper; private final MallExpressInfoMapper mallExpressInfoMapper; private final AgentProducer agentProducer; private final IXcxPayService iXcxPayService; private final IPayService payService; private final MallMemberMapper mallMemberMapper; @@ -568,9 +566,6 @@ BigDecimal realAmount = total.subtract(discountAmount).add(deliveryAmount).setScale(2, RoundingMode.DOWN); orderInfo.setRealAmount(realAmount); clothesOrderMapper.updateById(orderInfo); //过期时间修改成24小时 agentProducer.sendClothesOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L); ApiClothesOrderInfoVo apiClothesOrderInfoVo = new ApiClothesOrderInfoVo(); apiClothesOrderInfoVo.setOrderId(orderInfo.getId()); src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java
@@ -11,7 +11,6 @@ import cc.mrbird.febs.mall.service.ApiClothesSocialService; import cc.mrbird.febs.mall.vo.activity.ApiScCategoryInfoVo; import cc.mrbird.febs.mall.vo.clothes.*; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -64,7 +63,6 @@ private final ClothesLocationRemarkMapper clothesLocationRemarkMapper; private final ClothesPatternRemarkMapper clothesPatternRemarkMapper; private final ClothesSocialCommentMapper clothesSocialCommentMapper; private final AgentProducer agentProducer; @Override @@ -421,7 +419,6 @@ clothesSocialFollow.setType(SocialTypeEnum.LIKE.getValue()); clothesSocialFollowMapper.insert(clothesSocialFollow); agentProducer.sendAddLike(socialId); } return new FebsResponse().success().message("操作成功"); } @@ -467,7 +464,6 @@ clothesSocialFollow.setType(SocialTypeEnum.COLLECT.getValue()); clothesSocialFollowMapper.insert(clothesSocialFollow); agentProducer.sendAddCollect(socialId); } return new FebsResponse().success().message("操作成功"); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -19,7 +19,6 @@ import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.pay.util.WeixinServiceUtil; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService; import cc.mrbird.febs.vip.service.IMallVipConfigService; import cn.hutool.core.collection.CollUtil; @@ -74,7 +73,6 @@ private final IMallMoneyFlowService mallMoneyFlowService; private final RedisUtils redisUtils; private final AgentProducer agentProducer; private final IPayService payService; private final IXcxPayService iXcxPayService; private final IMallAchieveService mallAchieveService; @@ -314,7 +312,6 @@ this.baseMapper.updateById(orderInfo); //过期时间修改成24小时 agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L); return orderInfo.getId(); } @@ -748,7 +745,6 @@ StrUtil.format(ScoreFlowTypeEnum.PAY_BALANCE.getDesc(),orderInfo.getAmount()), 2 ); agentProducer.sendOrderCoupon(orderInfo.getId()); break; case "4": if (orderInfo.getOrderType() != 2) { @@ -938,7 +934,6 @@ orderInfo.setReceivingTime(new Date()); this.baseMapper.updateById(orderInfo); agentProducer.sendGetScoreMsg(orderInfo.getId()); } @Override src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -18,7 +18,6 @@ import cc.mrbird.febs.mall.vo.activity.*; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; @@ -59,7 +58,6 @@ private final IXcxPayService iXcxPayService; private final IApiMallMemberWalletService iApiMallMemberWalletService; private final HappyActivityCategoryMapper happyActivityCategoryMapper; private final AgentProducer agentProducer; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final HappyMemberLevelMapper happyMemberLevelMapper; private final IMallMoneyFlowService mallMoneyFlowService; @@ -1024,12 +1022,9 @@ ); // 更新会员钱包中的分数 iApiMallMemberWalletService.add(multiply, memberId, "score"); // 发送会员等级升级消息 agentProducer.sendVipLevelUp(memberId); } } } agentProducer.sendCheckActivityItem(happyActivityOrderItem.getOrderId()); return new FebsResponse().success().message("操作成功"); } src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -19,7 +19,6 @@ import cc.mrbird.febs.pay.util.Signature; import cc.mrbird.febs.pay.util.Util; import cc.mrbird.febs.pay.util.WechatConfigure; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; @@ -73,7 +72,6 @@ private final IApiMallMemberWalletService memberWalletService; private final IApiMallMemberService mallMemberService; private final MallAgentRecordMapper mallAgentRecordMapper; private final AgentProducer agentProducer; private final IXcxPayService iXcxPayService; private final WxFaPiaoService wxFaPiaoService; private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); @@ -345,9 +343,6 @@ 2 ); } agentProducer.sendOrderCoupon(order.getId()); // agentProducer.sendGetScoreMsg(order.getId()); mallMoneyFlowService.addMoneyFlow( order.getMemberId(), src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
@@ -17,7 +17,6 @@ import cc.mrbird.febs.pay.model.AliPayPassbackModel; import cc.mrbird.febs.pay.properties.AliPayProperties; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; @@ -51,8 +50,6 @@ private MallOrderInfoMapper orderInfoMapper; @Autowired private ClothesTypeMapper clothesTypeMapper; @Autowired private AgentProducer agentProducer; @Value("${spring.profiles.active}") private String active; src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java
@@ -6,5 +6,5 @@ **/ public class ExchangeConstants { public static final String EXCHANGE_DEFAULT = "exchange_default_qay"; public static final String PC_COMPANY_ADD_ALI = "exchange_pc_company_add_ali"; } src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -5,21 +5,5 @@ * @date 2021-09-25 **/ public class QueueConstants { public static final String ACTIVITY_ORDER_ITEM_CHECK = "queue_activity_order_item_check"; public static final String QUEUE_DEFAULT = "queue_default_qay"; public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up_qay"; public static final String AGENT_RETURN_MONEY = "queue_agent_return_money_qay"; public static final String ORDER_RETURN_MONEY = "queue_order_return_money_qay"; public static final String ORDER_COUPON = "queue_order_coupon"; public static final String GET_SCORE_MSG = "queue_get_score_msg"; public static final String VIP_LEVEL_UP = "queue_vip_level_up"; public static final String SALE_LEVEL_UP = "queue_sale_level_up"; ; public static final String CLOTHES_ORDER_CANCEL_DELAY = "queue_order_delay_qay_clothes"; public static final String CLOTHES_ADD_LIKE = "queue_clothes_add_like"; public static final String CLOTHES_ADD_COLLECT = "queue_clothes_add_collect"; public static final String PC_COMPANY_ADD_ALI = "queue_pc_company_add_ali"; } src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java
@@ -6,5 +6,5 @@ **/ public class RouteKeyConstants { public static final String ROUTE_KEY_DEFAULT = "route_key_default_qay"; public static final String PC_COMPANY_ADD_ALI = "route_key_pc_company_add_ali"; } src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -21,141 +21,4 @@ @Component public class AgentConsumer { @Autowired private IApiMallOrderInfoService orderInfoService; @Autowired private ApiClothesOrderService apiClothesOrderService; @Autowired private IAgentService agentService; @Autowired private IMemberProfitService memberProfitService; @Autowired private HappyActivityService happyActivityService; @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT) public void agentReturn(Message message, Channel channel) { log.info("消费者:{}", new String(message.getBody())); } @RabbitListener(queues = QueueConstants.CLOTHES_ORDER_CANCEL_DELAY) public void orderCancelDelayClothes(String id) { try { apiClothesOrderService.orderCancelDelayClothes(Long.parseLong(id)); } catch (Exception e) { log.error("订单超时支付异常", e); } } @RabbitListener(queues = "queue_order_delay_qay") public void orderCancelDelay(String id) { try { orderInfoService.autoCancelOrder(Long.parseLong(id)); } catch (Exception e) { log.error("订单超时支付异常", e); } } @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP) public void agentAutoLevelUp(String id) { log.info("收到代理自动升级消息:{}", id); try { agentService.autoUpAgentLevel(Long.parseLong(id)); } catch (Exception e) { log.error("代理自动升级异常", e); } } @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY) public void agentReturnMoney(String orderId) { log.info("收到返利消息:{}", orderId); try { agentService.returnMoneyToAgent(Long.parseLong(orderId)); } catch (Exception e) { log.error("返利异常", e); } } @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY) public void orderReturnMoney(String orderId) { log.info("收到订单返利消息:{}", orderId); try { memberProfitService.dynamicProfit(Long.parseLong(orderId)); } catch (Exception e) { log.error("订单返利异常:", e); } } @RabbitListener(queues = QueueConstants.ORDER_COUPON) public void getOrderCoupon(Long orderId) { log.info("收到使用优惠卷消息:{}", orderId); try { memberProfitService.getOrderCoupon(orderId); } catch (Exception e) { log.error("使用优惠卷异常:", e); } } @Autowired private IVipCommonService vipCommonService; @RabbitListener(queues = QueueConstants.GET_SCORE_MSG) public void getScoreMsg(Long orderId) { log.info("收到积分消息:{}", orderId); try { vipCommonService.getScore(orderId); } catch (Exception e) { log.error("获取积分消息异常", e); } } @RabbitListener(queues = QueueConstants.VIP_LEVEL_UP) public void vipLevelUp(Long orderId) { log.info("收到会员升级消息:{}", orderId); try { vipCommonService.levelUp(orderId); } catch (Exception e) { log.error("会员升级消息异常", e); } } @RabbitListener(queues = QueueConstants.SALE_LEVEL_UP) public void saleLevelUp(Long orderId) { log.info("收到团长升级:{}", orderId); try { vipCommonService.saleLevelUp(orderId); } catch (Exception e) { log.error("团长升级消息异常", e); } } @RabbitListener(queues = QueueConstants.ACTIVITY_ORDER_ITEM_CHECK) public void checkActivityItem(Long orderId) { log.info("收到核销活动门票:{}", orderId); try { happyActivityService.checkActivityItem(orderId); } catch (Exception e) { log.error("核销活动门票异常", e); } } @RabbitListener(queues = QueueConstants.CLOTHES_ADD_LIKE) public void getAddLike(Long socialId) { log.info("点赞:{}", socialId); try { happyActivityService.getAddLike(socialId); } catch (Exception e) { log.error("点赞异常", e); } } @RabbitListener(queues = QueueConstants.CLOTHES_ADD_COLLECT) public void getAddCollect(Long socialId) { log.info("收藏:{}", socialId); try { happyActivityService.getAddCollect(socialId); } catch (Exception e) { log.error("收藏异常", e); } } } src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -1,35 +1,14 @@ package cc.mrbird.febs.rabbit.enumerates; import cc.mrbird.febs.rabbit.constants.ExchangeConstants; import cc.mrbird.febs.rabbit.constants.QueueConstants; import cc.mrbird.febs.rabbit.constants.RouteKeyConstants; import lombok.Getter; @Getter public enum RabbitQueueEnum { CLOTHES_ADD_COLLECT("exchange_clothes_add_collect", "route_key_clothes_add_collect", QueueConstants.CLOTHES_ADD_COLLECT), CLOTHES_ADD_LIKE("exchange_clothes_add_like", "route_key_clothes_add_like", QueueConstants.CLOTHES_ADD_LIKE), ACTIVITY_ORDER_ITEM_CHECK("exchange_activity_order_item_check", "route_key_activity_order_item_check", QueueConstants.ACTIVITY_ORDER_ITEM_CHECK), DEFAULT("exchange_default_qay", "route_key_default_qay", "queue_default_qay"), ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay", "route_key_order_delay_ttl_qay", "queue_order_delay_ttl_qay"), ORDER_CANCEL_DELAY("exchange_order_delay_qay", "route_key_order_delay_qay", "queue_order_delay_qay"), CLOTHES_ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay_clothes", "route_key_order_delay_ttl_qay_clothes", "queue_order_delay_ttl_qay_clothes"), CLOTHES_ORDER_CANCEL_DELAY("exchange_order_delay_qay_clothes", "route_key_order_delay_qay_clothes", QueueConstants.CLOTHES_ORDER_CANCEL_DELAY), AGENT_REUTRN_MONEY("exchange_agent_return_money_qay", "route_key_agent_return_money_qay", "queue_agent_return_money_qay"), ORDER_RETURN_MONEY("exchange_order_return_money_qay", "route_key_order_return_money_qay", "queue_order_return_money_qay"), ORDER_COUPON("exchange_order_coupon", "route_key_order_coupon", QueueConstants.ORDER_COUPON), GET_SCORE_MSG("exchange_get_score_msg", "route_key_get_score_msg", QueueConstants.GET_SCORE_MSG), SALE_LEVEL_UP("exchange_sale_level_up", "route_key_sale_level_up", QueueConstants.SALE_LEVEL_UP), VIP_LEVEL_UP("exchange_vip_level_up", "route_key_vip_level_up", QueueConstants.VIP_LEVEL_UP); PC_COMPANY_ADD_ALI(ExchangeConstants.PC_COMPANY_ADD_ALI, RouteKeyConstants.PC_COMPANY_ADD_ALI, QueueConstants.PC_COMPANY_ADD_ALI); private String exchange; src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -45,95 +45,17 @@ } public void sendOrderReturn(Long id) { log.info("发送消息:{}", id); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange(), RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute(), id, correlationData); } public void sendOrderCancelDelayMsg(Long id, Long times) { log.info("发送自动取消订单消息:{}, {}", id, times); rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setExpiration(String.valueOf(times)); return message; } }); } public void sendClothesOrderCancelDelayMsg(Long id, Long times) { log.info("发送自动取消订单消息:{}, {}", id, times); rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() { @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setExpiration(String.valueOf(times)); return message; } }); } /** * 发送代理自动升级消息 * * @param memberId */ public void sendAutoLevelUpMsg(@NotNull Long memberId) { log.info("发送代理自动升级消息:{}", memberId); rabbitTemplate.convertAndSend(ExchangeConstants.EXCHANGE_DEFAULT, RouteKeyConstants.ROUTE_KEY_DEFAULT, memberId); } public void sendReturnMoneyMsg(Long orderId) { log.info("发送返利消息:{}", orderId); rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId); } public void sendOrderCoupon(Long id) { log.info("发送使用优惠卷消息:{}", id); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_COUPON.getExchange(), RabbitQueueEnum.ORDER_COUPON.getRoute(), id, correlationData); } public void sendGetScoreMsg(Long orderId) { log.info("发送获得积分消息:{}", orderId); public void sendAddCompanyToken(String id) { log.info("消息记录:{}", id); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.GET_SCORE_MSG.getExchange(), RabbitQueueEnum.GET_SCORE_MSG.getRoute(), orderId, correlationData); } public void sendVipLevelUp(Long orderId) { log.info("发送会员升级消息:{}", orderId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.VIP_LEVEL_UP.getExchange(), RabbitQueueEnum.VIP_LEVEL_UP.getRoute(), orderId, correlationData); } public void sendSaleLevelUp(Long orderId) { log.info("发送团长升级:{}", orderId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.SALE_LEVEL_UP.getExchange(), RabbitQueueEnum.SALE_LEVEL_UP.getRoute(), orderId, correlationData); } public void sendCheckActivityItem(Long orderId) { log.info("核销活动门票:{}", orderId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange(), RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute(), orderId, correlationData); } public void sendAddLike(Long socialId) { log.info("点赞:{}", socialId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.CLOTHES_ADD_LIKE.getExchange(), RabbitQueueEnum.CLOTHES_ADD_LIKE.getRoute(), socialId, correlationData); } public void sendAddCollect(Long socialId) { log.info("收藏:{}", socialId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getExchange(), RabbitQueueEnum.CLOTHES_ADD_COLLECT.getRoute(), socialId, correlationData); rabbitTemplate.convertAndSend( RabbitQueueEnum.PC_COMPANY_ADD_ALI.getExchange(), RabbitQueueEnum.PC_COMPANY_ADD_ALI.getRoute(), id, correlationData); } } src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java
@@ -9,7 +9,6 @@ import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cc.mrbird.febs.vip.entity.MallVipBenefits; import cc.mrbird.febs.vip.entity.MallVipConfig; import cc.mrbird.febs.vip.mapper.MallVipConfigMapper; @@ -49,7 +48,6 @@ private final MallMemberWalletMapper mallMemberWalletMapper; private final MallMemberMapper mallMemberMapper; private final MallVipConfigMapper mallVipConfigMapper; private final AgentProducer agentProducer; private final IApiMallGoodsService mallGoodsService; private final HappyMemberLevelMapper happyMemberLevelMapper; private final HappySaleLevelMapper happySaleLevelMapper; @@ -140,8 +138,6 @@ ); // 更新会员钱包中的分数 mallMemberWalletService.add(multiply, memberId, "score"); // 发送会员等级升级消息 agentProducer.sendVipLevelUp(memberId); } // 计算推荐人获得的积分 if(StrUtil.isNotEmpty(member.getReferrerId())){ @@ -173,14 +169,10 @@ ); // 更新会员钱包中的分数 mallMemberWalletService.add(multiply, refMember.getId(), "score"); // 发送会员等级升级消息 agentProducer.sendVipLevelUp(refMember.getId()); } } } // 发送分销等级升级消息 agentProducer.sendSaleLevelUp(orderId); } src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
@@ -11,6 +11,7 @@ import cc.mrbird.febs.yinhe.req.*; import cc.mrbird.febs.yinhe.res.*; import cc.mrbird.febs.yinhe.service.YhAiService; import cn.hutool.core.util.StrUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -19,6 +20,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import javax.servlet.http.HttpServletRequest; /** * @author Administrator @@ -109,4 +113,35 @@ return service.logout(); } @ApiOperation(value = "初始化对话", notes = "初始化对话") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = YHSendInitVo.class) }) @PostMapping(value = "/initSend", produces = "application/json") public FebsResponse initSend(@RequestBody @Validated YHSendInitDto dto) { return service.initSend(dto); } @ApiOperation(value = "保存对话消息", notes = "保存对话消息") @PostMapping(value = "/saveContext") public FebsResponse saveContext(@RequestBody @Validated YHSaveContextDto dto) { return service.saveContext(dto); } @ApiOperation("AI回答(流式)") @ApiResponses({ @ApiResponse(code = 200, message = "流式响应", response = YHAitalkItemStreamVo.class), }) @PostMapping("/aiAnswer") public Flux<FebsResponse> aiAnswer(@RequestBody @Validated YHAitalkItemStreamDto dto) { if (StrUtil.isEmpty(dto.getTalkId()) || StrUtil.isEmpty(dto.getReqContext())|| StrUtil.isEmpty(dto.getReqContext())){ return Flux.just(new FebsResponse().fail().message("参数异常")); } return service.aiAnswer(dto); } } src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java
New file @@ -0,0 +1,29 @@ package cc.mrbird.febs.yinhe.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.Date; @Data @TableName("ai_agent_knowledge") public class YHAiAgentKnowledge extends YhBaseEntity { /** 主键 */ private String id; /** 公司ID */ private String companyId; /** 名称 */ private String name; /** 知识创建时间 */ private Date knowledgeCreateTime; /** 智能体ID */ private String agentId; /** 知识库ID */ private String knowledgeId; } src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java
@@ -17,4 +17,6 @@ private String code; private String knowledgeId; private String categoryId; private String levelCode; private Integer useToken; } src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java
New file @@ -0,0 +1,50 @@ package cc.mrbird.febs.yinhe.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("ai_knowledge") public class YHAiKnowledge extends YhBaseEntity { /** 主键 */ private String id; /** * 状态:0-上传服务器,1-应用数据,2-知识库 3-成功 */ private Integer state; /** * 文件ID */ private String jobId; /** * 文件ID */ private String fileId; /** * 文件存储路径 */ private String savePath; /** * 文件名称 */ private String name; /** * 文件大小 */ private String fileSize; /** * 公司ID */ private String companyId; /** * 分类ID */ private String categoryId; } src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java
New file @@ -0,0 +1,24 @@ package cc.mrbird.febs.yinhe.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("ai_talk") public class YHAiTalk extends YhBaseEntity { /** 主键 */ private String id; /** 公司ID */ private String companyId; /** 成员ID */ private String customerId; /** 智能体ID */ private String agentId; /** 类型 1-普通对话 2-员工对话*/ private Integer type ; } src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java
New file @@ -0,0 +1,27 @@ package cc.mrbird.febs.yinhe.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("ai_talk_item") public class YHAiTalkItem extends YhBaseEntity { /** 主键 */ private String id; /** 公司ID */ private String companyId; /** 对话ID */ private String talkId; /** 类型 system assistant user tool */ private String type; /** 内容 */ private String context; private Integer tokenNum; } src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.yinhe.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("sys_company_level") public class YHSysCompanyLevel extends YhBaseEntity { private String name; private String code; private Integer agentNum; private Integer token; } src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.yinhe.mapper; import cc.mrbird.febs.yinhe.entity.YHAiAgentKnowledge; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YHAiAgentKnowledgeMapper extends BaseMapper<YHAiAgentKnowledge> { } src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.yinhe.mapper; import cc.mrbird.febs.yinhe.entity.YHAiKnowledge; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YHAiKnowledgeMapper extends BaseMapper<YHAiKnowledge> { } src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.yinhe.mapper; import cc.mrbird.febs.yinhe.entity.YHAiTalkItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YHAiTalkItemMapper extends BaseMapper<YHAiTalkItem> { } src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.yinhe.mapper; import cc.mrbird.febs.yinhe.entity.YHAiTalk; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YHAiTalkMapper extends BaseMapper<YHAiTalk> { } src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.yinhe.mapper; import cc.mrbird.febs.yinhe.entity.YHSysCompanyLevel; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface YHSysCompanyLevelMapper extends BaseMapper<YHSysCompanyLevel> { } src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.yinhe.req; import com.alibaba.dashscope.common.Message; import lombok.Data; import java.util.List; @Data public class AiRequestDto { private List<Message> messages; private List<String> knowledgeIds ; private List<String> fileIds; private String prompt; private String rolePrompt; private String talkId; private String companyId; } src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.yinhe.req; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "YHAitalkItemStreamDto", description = "参数") public class YHAitalkItemStreamDto { @NotBlank(message = "会话不能为空") @ApiModelProperty(value = "会话ID", example = "10") private String talkId; @NotBlank(message = "内容不能为空") @ApiModelProperty(value = "内容", example = "10") private String reqContext; } src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java
New file @@ -0,0 +1,26 @@ package cc.mrbird.febs.yinhe.req; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "YHSaveContextDto", description = "参数") public class YHSaveContextDto { /** * 用户对话ID (UUID) */ @NotBlank(message = "会话ID不能为空") @ApiModelProperty(value = "会话ID", example = "10") private String talkId; @NotBlank(message = "类型不能为空") @ApiModelProperty(value = "类型 ai:assistant ,用户:user", example = "assistant") private String type; @NotBlank(message = "内容不能为空") @ApiModelProperty(value = "内容", example = "10") private String content; } src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java
New file @@ -0,0 +1,16 @@ package cc.mrbird.febs.yinhe.req; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "YHSendInitDto", description = "参数") public class YHSendInitDto { @NotBlank(message = "智能体不能为空") @ApiModelProperty(value = "智能体ID", example = "you_ke_*****") private String id; } src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java
@@ -10,9 +10,6 @@ @ApiModel(value = "YHSysCategoryDto", description = "参数") public class YHSysCategoryDto { @ApiModelProperty(value = "产品ID", example = "10") private String id; @ApiModelProperty(value = "是否推荐到小程序首页 1-推荐 0-不推荐", example = "1") private Integer hotState; } src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java
New file @@ -0,0 +1,16 @@ package cc.mrbird.febs.yinhe.res; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "YHAitalkItemStreamVo", description = "详情响应") public class YHAitalkItemStreamVo { @ApiModelProperty(value = "消息") private String content; @ApiModelProperty(value = "思考") private String reasoningContent; } src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.yinhe.res; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "YHSendInitVo", description = "参数") public class YHSendInitVo { @ApiModelProperty(value = "会话ID", example = "1") private String talkId; } src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
@@ -4,6 +4,9 @@ import cc.mrbird.febs.yinhe.entity.YhAiMember; import cc.mrbird.febs.yinhe.req.*; import com.baomidou.mybatisplus.extension.service.IService; import reactor.core.publisher.Flux; import javax.servlet.http.HttpServletRequest; /** * 用户表 Service 接口 @@ -26,4 +29,10 @@ FebsResponse agentSysInfo(YHSysAgentInitDto dto); FebsResponse logout(); FebsResponse initSend(YHSendInitDto dto); FebsResponse saveContext(YHSaveContextDto dto); Flux<FebsResponse> aiAnswer(YHAitalkItemStreamDto dto); } src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
@@ -1,10 +1,15 @@ package cc.mrbird.febs.yinhe.service.impl; import cc.mrbird.febs.ai.strategy.LlmStrategyFactory; import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum; import cc.mrbird.febs.ai.utils.UUID; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.YHLoginUserUtil; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cc.mrbird.febs.yinhe.entity.*; import cc.mrbird.febs.yinhe.mapper.*; import cc.mrbird.febs.yinhe.req.*; @@ -13,14 +18,18 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.Role; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j @@ -34,12 +43,21 @@ private final YHAiAgentCategoryMapper yhAiAgentCategoryMapper; private final YHAiAgentMapper yhAiAgentMapper; private final YHAiAgentStartQuestionMapper yhAiAgentStartQuestionMapper; private final YHAiAgentKnowledgeMapper yhAiAgentKnowledgeMapper; private final YHAiKnowledgeMapper yhAiKnowledgeMapper; private final YhSysAgentCategoryMapper yhSysAgentCategoryMapper; private final YHSysAgentStartQuestionMapper yhSysAgentStartQuestionMapper; private final YHSysAgentMapper yhSysAgentMapper; private final YHSysCompanyLevelMapper yhSysCompanyLevelMapper; private final YHAiTalkMapper yhAiTalkMapper; private final YHAiTalkItemMapper yhAiTalkItemMapper; private final RedisUtils redisUtils; private final AgentProducer agentProducer; private final LlmStrategyFactory llmStrategyFactory; @Override public FebsResponse memberInfo() { @@ -159,9 +177,6 @@ LambdaQueryWrapper<YhSysAgentCategory> query = Wrappers.lambdaQuery(YhSysAgentCategory.class); query.eq(YhSysAgentCategory::getState,1); if (ObjectUtil.isNotEmpty(dto.getId())){ query.eq(YhSysAgentCategory::getId,dto.getId()); } if (ObjectUtil.isNotEmpty(dto.getHotState())){ query.eq(YhSysAgentCategory::getHotState,dto.getHotState()); } @@ -246,4 +261,181 @@ redisUtils.del(AppContants.XCX_LOGIN_PREFIX + memberUuid); return new FebsResponse().success().message("退出登录"); } @Override public FebsResponse initSend(YHSendInitDto dto) { String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); YHSendInitVo vo = new YHSendInitVo(); String agentId = dto.getId(); //获取智能体信息 YHAiAgent yhAiAgent = yhAiAgentMapper.selectById(agentId); if (yhAiAgent == null) { throw new FebsException("智能体不存在"); } if (yhAiAgent.getState() != 1){ throw new FebsException("智能体未启用"); } String companyId = yhAiAgent.getCompanyId(); /** * 新增一个会话记录 */ YHAiTalk entity = new YHAiTalk(); entity.setId(UUID.getSimpleUUIDString()); entity.setCompanyId(companyId); entity.setCustomerId(memberUuid); entity.setAgentId(yhAiAgent.getId()); entity.setType(2); entity.setCreateTime(new Date()); yhAiTalkMapper.insert(entity); vo.setTalkId(entity.getId()); return new FebsResponse().success().data(vo); } @Override public FebsResponse saveContext(YHSaveContextDto dto) { String talkId = dto.getTalkId(); String type = dto.getType(); String content = dto.getContent(); YHAiTalk aiTalk = yhAiTalkMapper.selectById(talkId); if (aiTalk == null) { throw new FebsException("会话不存在"); } //保存会话记录 YHAiTalkItem aiTalkItem = new YHAiTalkItem(); aiTalkItem.setId(UUID.getSimpleUUIDString()); aiTalkItem.setCompanyId(aiTalk.getCompanyId()); aiTalkItem.setTalkId(aiTalk.getId()); aiTalkItem.setType(type); aiTalkItem.setContext(content); aiTalkItem.setTokenNum(content.length()); aiTalkItem.setCreateTime(new Date()); yhAiTalkItemMapper.insert(aiTalkItem); agentProducer.sendAddCompanyToken(aiTalkItem.getId()); return new FebsResponse().success(); } @Override public Flux<FebsResponse> aiAnswer(YHAitalkItemStreamDto dto) { String talkId = dto.getTalkId(); String reqContext = dto.getReqContext(); YHAiTalk aiTalk = yhAiTalkMapper.selectById(talkId); if (aiTalk == null) { throw new FebsException("会话不存在"); } //获取智能体的信息 String agentId = aiTalk.getAgentId(); YHAiAgent aiAgent = yhAiAgentMapper.selectById(agentId); if (aiAgent == null) { throw new FebsException("智能体异常"); } //判断字符是否足够 String companyId = aiTalk.getCompanyId(); YHAiCompany aiCompany = yhAiCompanyMapper.selectById(companyId); if (aiCompany == null) { throw new FebsException("知识库异常"); } Integer useToken = aiCompany.getUseToken(); YHSysCompanyLevel sysCompanyLevel = yhSysCompanyLevelMapper.selectOne( Wrappers.lambdaQuery(YHSysCompanyLevel.class) .select(YHSysCompanyLevel::getToken) .eq(YHSysCompanyLevel::getCode, aiCompany.getLevelCode()) ); if (useToken > sysCompanyLevel.getToken()) { throw new FebsException("字符已消耗完"); } //获取智能体绑定的知识库 List<String> knowledgeIds = new ArrayList<>(); String knowledgeId = aiCompany.getKnowledgeId(); knowledgeIds.add(knowledgeId); //获取智能体绑定的查询文件 List<String> fileIds = new ArrayList<>(); List<YHAiAgentKnowledge> aiAgentKnowledges = yhAiAgentKnowledgeMapper.selectList( Wrappers.lambdaQuery(YHAiAgentKnowledge.class) .select(YHAiAgentKnowledge::getKnowledgeId) .eq(YHAiAgentKnowledge::getAgentId, agentId) .eq(YHAiAgentKnowledge::getCompanyId, companyId) ); if (CollUtil.isNotEmpty(aiAgentKnowledges)){ List<String> aiKnowledgeIds = new ArrayList<>(); for (YHAiAgentKnowledge aiAgentKnowledge : aiAgentKnowledges){ aiKnowledgeIds.add(aiAgentKnowledge.getKnowledgeId()); } if (CollUtil.isNotEmpty(aiKnowledgeIds)){ List<YHAiKnowledge> aiKnowledges = yhAiKnowledgeMapper.selectList( Wrappers.lambdaQuery(YHAiKnowledge.class) .select(YHAiKnowledge::getFileId) .in(YHAiKnowledge::getId, aiKnowledgeIds) ); if (CollUtil.isNotEmpty(aiKnowledges)){ for (YHAiKnowledge aiKnowledge : aiKnowledges){ fileIds.add(aiKnowledge.getFileId()); } } } } AiRequestDto aiRequestDto = new AiRequestDto(); aiRequestDto.setTalkId(talkId); String prompt = aiAgent.getPrompt(); aiRequestDto.setRolePrompt(prompt); // List<Message> messages = new ArrayList<>(); // messages.add(Message.builder().role(Role.SYSTEM.getValue()).content(prompt).build()); //获取对话记录 List<Message> messages = new ArrayList<>(); List<YHAiTalkItem> aiTalkItemList = yhAiTalkItemMapper.selectList( Wrappers.lambdaQuery(YHAiTalkItem.class) .eq(YHAiTalkItem::getTalkId, talkId) .orderByAsc(YHAiTalkItem::getCreateTime) ); if (CollUtil.isNotEmpty(aiTalkItemList)){ messages = getMessages(messages,aiTalkItemList); } for ( Message message : messages ){ log.info("上下文内容:{},{}", message.getRole(),message.getContent()); } aiRequestDto.setMessages(messages); aiRequestDto.setKnowledgeIds(knowledgeIds); aiRequestDto.setFileIds(fileIds); aiRequestDto.setPrompt(reqContext); aiRequestDto.setCompanyId(companyId); //日志输出详细的请求参数的每一个属性 log.info("请求参数:{}", aiRequestDto.getPrompt()); log.info("请求参数:{}", aiRequestDto); String modelName = LlmStrategyEnum.getName(2); return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(aiRequestDto); } private List<Message> getMessages(List<Message> messages,List<YHAiTalkItem> aiTalkItemList) { for (YHAiTalkItem item : aiTalkItemList){ if (StrUtil.equals(item.getType(), Role.USER.getValue())){ messages.add(Message.builder() .role(Role.USER.getValue()) .content(item.getContext()) .build()); } if (StrUtil.equals(item.getType(),Role.ASSISTANT.getValue())){ messages.add(Message.builder() .role(Role.ASSISTANT.getValue()) .content(item.getContext()) .build()); } } return messages; } }