From f9e40800aa15abd4cfd2799f334b015e6f13629c Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 16 Mar 2026 11:21:38 +0800
Subject: [PATCH] feat(yinhe): 新增智能体系统功能并调整配置

---
 src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java             |  320 ++++++------
 src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java      |  102 ++++
 src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java                       |   14 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java             |   40 +
 src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java         |  221 ++++++++
 src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java                     |   19 
 src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java                    |   19 
 src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java               |  142 ++--
 src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java                   |   17 
 src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java                    |   13 
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java  |    7 
 src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java                       |   43 +
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java              |    7 
 src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java           |    3 
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java       |    7 
 src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java                 |   18 
 src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java                   |    2 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java                    |   45 +
 src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.java                  |   16 
 src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java                       |   82 +-
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java        |   22 
 src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java                  |   27 +
 src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java      |    7 
 src/main/resources/application-test.yml                                      |   16 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java |    1 
 /dev/null                                                                    |   12 
 src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java                       |   23 
 src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java                      |   66 +-
 src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java                    |   27 +
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java                     |   40 +
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java               |    7 
 src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java            |   46 +
 src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.java                     |   16 
 src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java               |   20 
 src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java                        |   22 
 35 files changed, 1,139 insertions(+), 350 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
index 59043be..7575ee1 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -68,5 +68,8 @@
         registration.excludePathPatterns("/api/ai/company/list");
         registration.excludePathPatterns("/api/ai/common/**");
         registration.excludePathPatterns("/api/ai/videoPlay/**");
+
+        registration.excludePathPatterns("/api/yh/agent/categorySysList");
+        registration.excludePathPatterns("/api/yh/agent/agentSysList");
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java b/src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java
new file mode 100644
index 0000000..de498c3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.common.utils;
+
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.yinhe.entity.YhAiMember;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author xxx
+ * @date 2020-08-24
+ **/
+public class YHLoginUserUtil {
+
+    public static YhAiMember getLoginUser() {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+        return (YhAiMember) request.getSession().getAttribute("member");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
index d9c2125..338e405 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
@@ -19,46 +19,46 @@
 @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
 public class BaiduJob {
 
-    @Autowired
-    private RedisUtils redisUtils;
-    @Resource
-    RestTemplate restTemplate;
-
-    @Scheduled(cron = "0 0 1 * * ? ")
-    public void getAccessToken(){
-        // 官网获取的 API Key 更新为你注册的
-        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
-        // 官网获取的 Secret Key 更新为你注册的
-        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
-        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
-        String getAccessTokenUrl = authHost
-                // 1. grant_type为固定参数
-                + "grant_type=client_credentials"
-                // 2. 官网获取的 API Key
-                + "&client_id=" + clientId
-                // 3. 官网获取的 Secret Key
-                + "&client_secret=" + clientSecret;
-        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
-
-        /**
-         * 返回结果
-         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
-         */
-        if (!jsonStr.contains("access_token")) {
-            System.out.println("获取access_token失败");
-        }
-        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
-        String accessToken = jsonObject.getString("access_token");
-
-        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
-        if (StrUtil.isEmpty(accessToken)) {
-            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
-            throw new ApiException("获取access token失败");
-        } else {
-            log.info("baidu access_token : {}",accessToken);
-            System.out.println(accessToken);
-            redisUtils.set(accessTokenKey,accessToken);
-        }
-    }
+//    @Autowired
+//    private RedisUtils redisUtils;
+//    @Resource
+//    RestTemplate restTemplate;
+//
+//    @Scheduled(cron = "0 0 1 * * ? ")
+//    public void getAccessToken(){
+//        // 官网获取的 API Key 更新为你注册的
+//        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
+//        // 官网获取的 Secret Key 更新为你注册的
+//        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
+//        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
+//        String getAccessTokenUrl = authHost
+//                // 1. grant_type为固定参数
+//                + "grant_type=client_credentials"
+//                // 2. 官网获取的 API Key
+//                + "&client_id=" + clientId
+//                // 3. 官网获取的 Secret Key
+//                + "&client_secret=" + clientSecret;
+//        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
+//
+//        /**
+//         * 返回结果
+//         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
+//         */
+//        if (!jsonStr.contains("access_token")) {
+//            System.out.println("获取access_token失败");
+//        }
+//        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+//        String accessToken = jsonObject.getString("access_token");
+//
+//        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
+//        if (StrUtil.isEmpty(accessToken)) {
+//            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
+//            throw new ApiException("获取access token失败");
+//        } else {
+//            log.info("baidu access_token : {}",accessToken);
+//            System.out.println(accessToken);
+//            redisUtils.set(accessTokenKey,accessToken);
+//        }
+//    }
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
index bab9b03..52e8a8b 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
@@ -27,77 +27,77 @@
 @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "false")
 public class OrderOvertimeJob {
 
-    @Autowired
-    private MallOrderInfoMapper orderInfoMapper;
-
-    @Autowired
-    private MallMemberMapper mallMemberMapper;
-
-    @Autowired
-    private MallOrderItemMapper mallOrderItemMapper;
-
-    @Autowired
-    private MallGoodsMapper mallGoodsMapper;
-
-    @Autowired
-    private MallGoodsSkuMapper mallGoodsSkuMapper;
-
-    @Autowired
-    private MallMemberCouponMapper mallMemberCouponMapper;
-
-    @Scheduled(cron = "0 0/5 * * * ? ")
-    public void overtimeJob() {
-        log.info("订单超时任务执行");
-        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoUpTime(OrderStatusEnum.WAIT_PAY.getValue());
-        if (CollUtil.isNotEmpty(orderList)) {
-            for (MallOrderInfo orderInfo : orderList) {
-                //更新订单状态
-                orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
-                orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
-                orderInfoMapper.updateById(orderInfo);
-
-                List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfo.getId());
-                if(CollUtil.isNotEmpty(mallOrderItemList)){
-                    for(MallOrderItem mallOrderItem : mallOrderItemList){
-                        MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
-                        if (sku == null) {
-                            throw new FebsException("购买商品或sku不存在");
-                        }
-
-//                        if (sku.getStock() < mallOrderItem.getCnt()) {
+//    @Autowired
+//    private MallOrderInfoMapper orderInfoMapper;
+//
+//    @Autowired
+//    private MallMemberMapper mallMemberMapper;
+//
+//    @Autowired
+//    private MallOrderItemMapper mallOrderItemMapper;
+//
+//    @Autowired
+//    private MallGoodsMapper mallGoodsMapper;
+//
+//    @Autowired
+//    private MallGoodsSkuMapper mallGoodsSkuMapper;
+//
+//    @Autowired
+//    private MallMemberCouponMapper mallMemberCouponMapper;
+//
+//    @Scheduled(cron = "0 0/5 * * * ? ")
+//    public void overtimeJob() {
+//        log.info("订单超时任务执行");
+//        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoUpTime(OrderStatusEnum.WAIT_PAY.getValue());
+//        if (CollUtil.isNotEmpty(orderList)) {
+//            for (MallOrderInfo orderInfo : orderList) {
+//                //更新订单状态
+//                orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
+//                orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
+//                orderInfoMapper.updateById(orderInfo);
+//
+//                List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfo.getId());
+//                if(CollUtil.isNotEmpty(mallOrderItemList)){
+//                    for(MallOrderItem mallOrderItem : mallOrderItemList){
+//                        MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(mallOrderItem.getSkuId());
+//                        if (sku == null) {
+//                            throw new FebsException("购买商品或sku不存在");
+//                        }
+//
+////                        if (sku.getStock() < mallOrderItem.getCnt()) {
+////                            throw new FebsException(sku.getSkuName() + "库存不足");
+////                        }
+//
+//                        MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
+//                        Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
+//                        if(1 != goodsResult){
+//                            throw new FebsException(mallGoods.getGoodsName() + "库存不足");
+//                        }
+//
+//                        Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
+//                        if(1 != skuResult){
 //                            throw new FebsException(sku.getSkuName() + "库存不足");
 //                        }
-
-                        MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
-                        Integer goodsResult = mallGoodsMapper.updateStockAndVolumeByGoodsId(mallGoods.getId(), mallOrderItem.getCnt());
-                        if(1 != goodsResult){
-                            throw new FebsException(mallGoods.getGoodsName() + "库存不足");
-                        }
-
-                        Integer skuResult = mallGoodsSkuMapper.updateStockAndVolumeBySkuId(sku.getId(),mallOrderItem.getCnt());
-                        if(1 != skuResult){
-                            throw new FebsException(sku.getSkuName() + "库存不足");
-                        }
-                        Long memberCouponId = mallOrderItem.getMemberCouponId();
-                        MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
-                        if(ObjectUtil.isNotEmpty(mallMemberCoupon)){
-                            mallMemberCoupon.setState(1);
-                            mallMemberCouponMapper.updateById(mallMemberCoupon);
-                        }
-                    }
-                }
-            }
-        }
-
-    }
-
-
-
-    @Autowired
-    private RedisUtils redisUtils;
-
-    @Scheduled(cron = "0/5 * * * * ? ")
-    public void wakeup() {
-        redisUtils.set("wakeup", "wakeup");
-    }
+//                        Long memberCouponId = mallOrderItem.getMemberCouponId();
+//                        MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(memberCouponId);
+//                        if(ObjectUtil.isNotEmpty(mallMemberCoupon)){
+//                            mallMemberCoupon.setState(1);
+//                            mallMemberCouponMapper.updateById(mallMemberCoupon);
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//
+//    }
+//
+//
+//
+//    @Autowired
+//    private RedisUtils redisUtils;
+//
+//    @Scheduled(cron = "0/5 * * * * ? ")
+//    public void wakeup() {
+//        redisUtils.set("wakeup", "wakeup");
+//    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
index 2aebfcf..d9ec3fe 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
@@ -37,170 +37,170 @@
 @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
 public class OrderSettlementJob {
 
-    @Autowired
-    private MallOrderInfoMapper mallOrderInfoMapper;
-
-    @Autowired
-    private MallOrderItemMapper mallOrderItemMapper;
-
-    @Autowired
-    private IApiMallMemberWalletService memberWalletService;
-
-    @Autowired
-    private IMallMoneyFlowService mallMoneyFlowService;
-
-    @Autowired
-    private MallMemberMapper mallMemberMapper;
-
-    @Autowired
-    private MallGoodsSkuMapper mallGoodsSkuMapper;
-
-    @Autowired
-    private MallLeaderAchieveMapper mallLeaderAchieveMapper;
-
-    @Autowired
-    private MallTeamLeaderMapper mallTeamLeaderMapper;
-
-    @Autowired
-    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
-
-    @Autowired
-    private IMemberProfitService memberProfitService;
-
-    @Autowired
-    private IMallAchieveService mallAchieveService;
-
-    @Autowired
-    private AgentProducer agentProducer;
-
-    /**
-     * 普通商品结算
-     */
+//    @Autowired
+//    private MallOrderInfoMapper mallOrderInfoMapper;
+//
+//    @Autowired
+//    private MallOrderItemMapper mallOrderItemMapper;
+//
+//    @Autowired
+//    private IApiMallMemberWalletService memberWalletService;
+//
+//    @Autowired
+//    private IMallMoneyFlowService mallMoneyFlowService;
+//
+//    @Autowired
+//    private MallMemberMapper mallMemberMapper;
+//
+//    @Autowired
+//    private MallGoodsSkuMapper mallGoodsSkuMapper;
+//
+//    @Autowired
+//    private MallLeaderAchieveMapper mallLeaderAchieveMapper;
+//
+//    @Autowired
+//    private MallTeamLeaderMapper mallTeamLeaderMapper;
+//
+//    @Autowired
+//    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
+//
+//    @Autowired
+//    private IMemberProfitService memberProfitService;
+//
+//    @Autowired
+//    private IMallAchieveService mallAchieveService;
+//
+//    @Autowired
+//    private AgentProducer agentProducer;
+//
+//    /**
+//     * 普通商品结算
+//     */
+////    @Scheduled(cron = "0 0 0 * * ?")
+////    public void normalGoodsSettlementJob() {
+////        log.info("普通商品结算");
+////        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderInfoWithNormalGoods(DateUtil.offsetDay(new Date(), -10));
+////        if (CollUtil.isEmpty(orderInfos)) {
+////            return;
+////        }
+////
+////        for (MallOrderInfo orderInfo : orderInfos) {
+////            MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
+////            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
+////                continue;
+////            }
+////
+////            for (MallOrderItem item : orderInfo.getItems()) {
+////                MallGoodsSku sku = mallGoodsSkuMapper.selectById(item.getSkuId());
+////                BigDecimal score = sku.getPresentPrice();
+////
+////                memberWalletService.add(score, member.getId(), "score");
+////                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
+////
+////                mallAchieveService.add(item.getId());
+////            }
+////
+////            // 普通商品动态分红结算
+////            memberProfitService.dynamicProfit(orderInfo.getId(), 1);
+////        }
+////    }
+//
+//    /**
+//     * 自动确认收货
+//     */
 //    @Scheduled(cron = "0 0 0 * * ?")
-//    public void normalGoodsSettlementJob() {
-//        log.info("普通商品结算");
-//        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderInfoWithNormalGoods(DateUtil.offsetDay(new Date(), -10));
-//        if (CollUtil.isEmpty(orderInfos)) {
-//            return;
-//        }
 //
-//        for (MallOrderInfo orderInfo : orderInfos) {
-//            MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
-//            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
-//                continue;
-//            }
-//
-//            for (MallOrderItem item : orderInfo.getItems()) {
-//                MallGoodsSku sku = mallGoodsSkuMapper.selectById(item.getSkuId());
-//                BigDecimal score = sku.getPresentPrice();
-//
-//                memberWalletService.add(score, member.getId(), "score");
-//                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
-//
-//                mallAchieveService.add(item.getId());
-//            }
-//
-//            // 普通商品动态分红结算
-//            memberProfitService.dynamicProfit(orderInfo.getId(), 1);
-//        }
-//    }
-
-    /**
-     * 自动确认收货
-     */
-    @Scheduled(cron = "0 0 0 * * ?")
-
-//    @Scheduled(cron = "1 * * * * ?")
-    public void orderAutoConfirmJob() {
-        log.info("自动确认收货");
-        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.OEDER_AUTO_CONFIRM.getType(), DataDictionaryEnum.OEDER_AUTO_CONFIRM.getCode());
-        Integer value = Integer.parseInt(dic.getValue());
-        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderByStatusAndPayTime(3,DateUtil.offsetDay(new Date(), -value));
-        if(CollUtil.isNotEmpty(orderInfos)){
-//            for(MallOrderInfo orderInfo : orderInfos){
-//                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
-//                Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch();
-//                if(1 == profitSwitch){
-//                    BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
-////                DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
-////                BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
-//                    //生成一条团长提成记录
-//                    Long id = orderInfo.getId();
-//                    List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
-//                    if(CollUtil.isNotEmpty(mallOrderItemList)){
-//                        for(MallOrderItem mallOrderItem : mallOrderItemList){
-//                            Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState();
-//                            if(1 == state){
-//                                MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
-//                                mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
-//                                mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
-//                                mallLeaderAchieve.setOrderItemId(mallOrderItem.getId());
-//                                BigDecimal itemAmount = mallOrderItem.getAmount();
-//                                mallLeaderAchieve.setAmount(itemAmount);
-//                                BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN);
-//                                mallLeaderAchieve.setProfitAmount(bigDecimal);
-//                                mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
-//                                mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
-//                                mallLeaderAchieveMapper.insert(mallLeaderAchieve);
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-            mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value));
-
-            orderInfos.forEach(item -> {
-                agentProducer.sendGetScoreMsg(item.getId());
-            });
-        }
-    }
-    /**
-     * 团长第二天才会结算前一天的所有提成
-     * 从团长业绩表中查询出前一天的所有已完成订单金额*提成系数,得到今日提成
-     * 修改业绩的状态
-     * 并生成一条提成流水
-     */
-//    @Scheduled(cron = "0 0 1 * * ?")
 ////    @Scheduled(cron = "1 * * * * ?")
-//    public void leaderAchieveAuto() {
-//        log.info("团长每日提成");
-//        //获取每日提成总数
-//        /**
-//         * a.unique_code uniqueCode 团长特征码
-//         * , IFNULL(sum(a.amount),0) amount 每日提成总金额
-//         */
-//            DateTime dateTime = DateUtil.offsetDay(new Date(), -1);
-////        DateTime dateTime = DateUtil.offsetDay(new Date(), 0);
-//        List<Map<String, String>> allLeaderAchieve = mallLeaderAchieveMapper.selectListByStateAndCreateTimeAndUniqueCode(MallLeaderAchieve.STATE_ONE,dateTime);
-//        if (CollUtil.isNotEmpty(allLeaderAchieve)) {
-//            for (Map<String, String> map : allLeaderAchieve) {
-//                String uniqueCode = map.get("uniqueCode");
-//                Object profitAmount = map.get("profitAmount");
+//    public void orderAutoConfirmJob() {
+//        log.info("自动确认收货");
+//        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.OEDER_AUTO_CONFIRM.getType(), DataDictionaryEnum.OEDER_AUTO_CONFIRM.getCode());
+//        Integer value = Integer.parseInt(dic.getValue());
+//        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderByStatusAndPayTime(3,DateUtil.offsetDay(new Date(), -value));
+//        if(CollUtil.isNotEmpty(orderInfos)){
+////            for(MallOrderInfo orderInfo : orderInfos){
+////                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
+////                Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch();
+////                if(1 == profitSwitch){
+////                    BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
+//////                DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
+//////                BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
+////                    //生成一条团长提成记录
+////                    Long id = orderInfo.getId();
+////                    List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
+////                    if(CollUtil.isNotEmpty(mallOrderItemList)){
+////                        for(MallOrderItem mallOrderItem : mallOrderItemList){
+////                            Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState();
+////                            if(1 == state){
+////                                MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
+////                                mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
+////                                mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
+////                                mallLeaderAchieve.setOrderItemId(mallOrderItem.getId());
+////                                BigDecimal itemAmount = mallOrderItem.getAmount();
+////                                mallLeaderAchieve.setAmount(itemAmount);
+////                                BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN);
+////                                mallLeaderAchieve.setProfitAmount(bigDecimal);
+////                                mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
+////                                mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
+////                                mallLeaderAchieveMapper.insert(mallLeaderAchieve);
+////                            }
+////                        }
+////                    }
+////                }
+////            }
+//            mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value));
 //
-//                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(uniqueCode);
-//                Integer profitSwitch = mallTeamLeader.getProfitSwitch();
-//                if(1 == profitSwitch){
-//                    //直接舍弃小数点的第三位
-//                    BigDecimal achieveMoney = new BigDecimal(String.valueOf(profitAmount)).setScale(2,BigDecimal.ROUND_DOWN);
-//                    MallMember mallMember = mallMemberMapper.selectInfoByInviteId(uniqueCode);
-//                    memberWalletService.addBalance(achieveMoney,mallMember.getId());
-//                    String achieveNo = "TC."+ MallUtils.getOrderNum();
-//                    mallMoneyFlowService.addMoneyFlow(
-//                            mallMember.getId(),
-//                            achieveMoney,
-//                            MoneyFlowTypeEnum.LEADERACHIEVE.getValue(),
-//                            achieveNo,
-//                            FlowTypeEnum.BALANCE.getValue());
-//
-//                    //更新到已提成状态
-//                    mallLeaderAchieveMapper.updateByUniqueCodeStateAndTime(DateUtil.date(),uniqueCode,MallLeaderAchieve.STATE_ONE,dateTime);
-//                }
-//            }
+//            orderInfos.forEach(item -> {
+//                agentProducer.sendGetScoreMsg(item.getId());
+//            });
 //        }
 //    }
-
-//    public static void main(String[] args) {
-//        BigDecimal bigDecimal = new BigDecimal(0.1256).setScale(2,BigDecimal.ROUND_DOWN);
-//        System.out.println(bigDecimal);
-//    }
+//    /**
+//     * 团长第二天才会结算前一天的所有提成
+//     * 从团长业绩表中查询出前一天的所有已完成订单金额*提成系数,得到今日提成
+//     * 修改业绩的状态
+//     * 并生成一条提成流水
+//     */
+////    @Scheduled(cron = "0 0 1 * * ?")
+//////    @Scheduled(cron = "1 * * * * ?")
+////    public void leaderAchieveAuto() {
+////        log.info("团长每日提成");
+////        //获取每日提成总数
+////        /**
+////         * a.unique_code uniqueCode 团长特征码
+////         * , IFNULL(sum(a.amount),0) amount 每日提成总金额
+////         */
+////            DateTime dateTime = DateUtil.offsetDay(new Date(), -1);
+//////        DateTime dateTime = DateUtil.offsetDay(new Date(), 0);
+////        List<Map<String, String>> allLeaderAchieve = mallLeaderAchieveMapper.selectListByStateAndCreateTimeAndUniqueCode(MallLeaderAchieve.STATE_ONE,dateTime);
+////        if (CollUtil.isNotEmpty(allLeaderAchieve)) {
+////            for (Map<String, String> map : allLeaderAchieve) {
+////                String uniqueCode = map.get("uniqueCode");
+////                Object profitAmount = map.get("profitAmount");
+////
+////                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(uniqueCode);
+////                Integer profitSwitch = mallTeamLeader.getProfitSwitch();
+////                if(1 == profitSwitch){
+////                    //直接舍弃小数点的第三位
+////                    BigDecimal achieveMoney = new BigDecimal(String.valueOf(profitAmount)).setScale(2,BigDecimal.ROUND_DOWN);
+////                    MallMember mallMember = mallMemberMapper.selectInfoByInviteId(uniqueCode);
+////                    memberWalletService.addBalance(achieveMoney,mallMember.getId());
+////                    String achieveNo = "TC."+ MallUtils.getOrderNum();
+////                    mallMoneyFlowService.addMoneyFlow(
+////                            mallMember.getId(),
+////                            achieveMoney,
+////                            MoneyFlowTypeEnum.LEADERACHIEVE.getValue(),
+////                            achieveNo,
+////                            FlowTypeEnum.BALANCE.getValue());
+////
+////                    //更新到已提成状态
+////                    mallLeaderAchieveMapper.updateByUniqueCodeStateAndTime(DateUtil.date(),uniqueCode,MallLeaderAchieve.STATE_ONE,dateTime);
+////                }
+////            }
+////        }
+////    }
+//
+////    public static void main(String[] args) {
+////        BigDecimal bigDecimal = new BigDecimal(0.1256).setScale(2,BigDecimal.ROUND_DOWN);
+////        System.out.println(bigDecimal);
+////    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
index 0dbf31c..15d728d 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -37,38 +37,38 @@
 @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
 public class ProfitJob {
 
-    @Resource
-    private HappyActivityService happyActivityService;
-
-    /**
-     * 活动时间结束更新
-     *          一分钟运行一次
-     */
-    @Scheduled(cron = "0 0/1 * * * ? ")
-    public void activityEnd() {
-        happyActivityService.activityEnd();
-    }
-
-    /**
-     * 活动时间开始更新
-     *          一分钟运行一次
-     */
-    @Scheduled(cron = "0 0/1 * * * ? ")
-    public void activityStart() {
-
-        happyActivityService.activityStart();
-
-    }
-
-
-
-    /**
-     * 订单失效
-     *          五分钟运行一次
-     */
-    @Scheduled(cron = "0 0/5 * * * ? ")
-    public void overtimeJob() {
-        happyActivityService.overtimeJob();
-    }
+//    @Resource
+//    private HappyActivityService happyActivityService;
+//
+//    /**
+//     * 活动时间结束更新
+//     *          一分钟运行一次
+//     */
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+//    public void activityEnd() {
+//        happyActivityService.activityEnd();
+//    }
+//
+//    /**
+//     * 活动时间开始更新
+//     *          一分钟运行一次
+//     */
+//    @Scheduled(cron = "0 0/1 * * * ? ")
+//    public void activityStart() {
+//
+//        happyActivityService.activityStart();
+//
+//    }
+//
+//
+//
+//    /**
+//     * 订单失效
+//     *          五分钟运行一次
+//     */
+//    @Scheduled(cron = "0 0/5 * * * ? ")
+//    public void overtimeJob() {
+//        happyActivityService.overtimeJob();
+//    }
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
index 10dffe2..a9a1962 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
@@ -77,27 +77,4 @@
 
     }
 
-    @Scheduled(cron = "0 0 0/1 * * ? ")
-    public void expireCoupon() {
-        List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByExpireTime(DateUtil.date());
-        if(CollUtil.isEmpty(mallMemberCoupons)){
-            return;
-        }
-        for(MallMemberCoupon mallMemberCoupon : mallMemberCoupons){
-            mallMemberCoupon.setState(3);
-            mallMemberCouponMapper.updateById(mallMemberCoupon);
-        }
-
-    }
-
-    /**
-     * 更新发票记录表数据
-     * 定时,每天凌晨一点
-     * 已完成的订单,更新到发票记录中
-     */
-    @Scheduled(cron = "0 0 1 * * ?")
-    public void mallInvoiceJob() {
-        mallInvoiceService.mallInvoiceJob();
-    }
-
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index 6a585ee..1805188 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -758,7 +758,6 @@
                     );
                     String inviteId = ShareCodeUtil.toSerialCode(entity.getId());
                     entity.setInviteId(inviteId);
-                    entity.setName("XCX"+inviteId);
                     yhAiMemberMapper.updateById(entity);
                 } else {
                     if ("1".equals(entity.getAccountStatus())) {
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
index 4c940c8..ca433c5 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
@@ -6,7 +6,7 @@
 
     public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
 
-    public static final String WX_ACCESS_TOKEN_REDIS_KEY = "access_token";
+    public static final String WX_ACCESS_TOKEN_REDIS_KEY = "yh_access_token";
     public static final String BAIDU_ACCESS_TOKEN_REDIS_KEY = "bd_access_token";
 
     public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
diff --git a/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java b/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
new file mode 100644
index 0000000..1579475
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
@@ -0,0 +1,102 @@
+package cc.mrbird.febs.yinhe.controller;
+
+import cc.mrbird.febs.ai.req.product.ApiProductInfoDto;
+import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
+import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
+import cc.mrbird.febs.ai.res.product.ApiProductVo;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
+import cc.mrbird.febs.ai.service.AiProductService;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.vo.MallMemberVo;
+import cc.mrbird.febs.yinhe.req.*;
+import cc.mrbird.febs.yinhe.res.*;
+import cc.mrbird.febs.yinhe.service.YhAiService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author Administrator
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/yh/agent")
+@Api(value = "YHApiAgentController", tags = "AI-银和-智能体相关接口")
+public class YHApiAgentController {
+
+    private final YhAiService service;
+    @ApiOperation(value = "获取用户信息", notes = "获取用户信息")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHMemberVo.class)
+    })
+    @GetMapping(value = "/memberInfo")
+    public FebsResponse memberInfo() {
+
+        return service.memberInfo();
+    }
+
+    @ApiOperation(value = "公司-智能体分类", notes = "公司-智能体分类")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHCategoryVo.class)
+    })
+    @PostMapping(value = "/categoryList")
+    public FebsResponse categoryList(@RequestBody @Validated YHCategoryDto dto) {
+
+        return service.categoryList(dto);
+    }
+
+    @ApiOperation(value = "公司-智能体", notes = "公司-智能体")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHAgentVo.class)
+    })
+    @PostMapping(value = "/agentList")
+    public FebsResponse agentList(@RequestBody @Validated YHAgentDto dto) {
+
+        return service.agentList(dto);
+    }
+
+    @ApiOperation(value = "公司-智能体-查看详情", notes = "公司-智能体-查看详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHAgentInitVo.class)
+    })
+    @PostMapping(value = "/agentInfo")
+    public FebsResponse agentInfo(@RequestBody @Validated YHAgentInitDto dto) {
+
+        return service.agentInfo(dto);
+    }
+
+    @ApiOperation(value = "首页-智能体分类", notes = "首页-智能体分类")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHSysCategoryVo.class)
+    })
+    @PostMapping(value = "/categorySysList")
+    public FebsResponse categoryList(@RequestBody @Validated YHSysCategoryDto dto) {
+
+        return service.categorySysList(dto);
+    }
+
+    @ApiOperation(value = "首页-智能体", notes = "首页-智能体")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHSysAgentVo.class)
+    })
+    @PostMapping(value = "/agentSysList")
+    public FebsResponse agentList(@RequestBody @Validated YHSysAgentDto dto) {
+
+        return service.agentSysList(dto);
+    }
+
+    @ApiOperation(value = "退出", notes = "退出")
+    @PostMapping(value = "/logout")
+    public FebsResponse logout() {
+
+        return service.logout();
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java
new file mode 100644
index 0000000..1d38390
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java
@@ -0,0 +1,40 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_agent")
+public class YHAiAgent extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+    
+    /** 公司ID */
+    private String companyId;
+    
+    /** 代理分类ID */
+    private String agentCategoryId;
+    
+    /** 名称 */
+    private String name;
+    
+    /** 状态 0-禁用 1-启用 2-已删除 */
+    private Integer state;
+    
+    /** 描述 */
+    private String description;
+    
+    /** 背景图片 */
+    private String backImg;
+    
+    /** 小图标 */
+    private String iconImg;
+    
+    /** 提示词 */
+    private String prompt;
+    
+    /** 开场白 */
+    private String introduct;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java
new file mode 100644
index 0000000..634b86e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java
@@ -0,0 +1,40 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_agent_category")
+public class YHAiAgentCategory extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+    
+    /** 公司ID */
+    private String companyId;
+    
+    /** 名称 */
+    private String name;
+    
+    /** 背景图片 */
+    private String backImg;
+    
+    /** 小图标 */
+    private String iconImg;
+    
+    /** 排序 */
+    private Integer sort;
+    
+    /** 状态 0-禁用 1-启用 2-已删除 */
+    private Integer state;
+    
+    /** 是否推荐到小程序首页 1-推荐 0-不推荐 */
+    private Integer hotState;
+    
+    /** 级别 */
+    private Integer level;
+    
+    /** 父级ID */
+    private String parentId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java
new file mode 100644
index 0000000..39cc04b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_agent_start_question")
+public class YHAiAgentStartQuestion extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+    
+    /** 公司ID */
+    private String companyId;
+    
+    /** 代理ID */
+    private String agentId;
+    
+    /** 问题内容 */
+    private String title;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java
new file mode 100644
index 0000000..7af980b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java
@@ -0,0 +1,45 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 智能体信息表 ai_sys_agent
+ * 
+ * @author ruoyi
+ */
+@Data
+@TableName("sys_agent")
+public class YHSysAgent extends YhBaseEntity
+{
+    /** 主键 */
+    private String id;
+
+    /** 公司ID */
+    private String companyId;
+
+    /** 分类ID */
+    private String agentCategoryId;
+
+    /** 名称 */
+    private String name;
+
+    /** 状态 0-禁用 1-启用 2-已删除 */
+    private Integer state;
+
+    /** 描述 */
+    private String description;
+
+    /** 背景图片 */
+    private String backImg;
+
+    /** 小图标 */
+    private String iconImg;
+
+    /** 提示词 */
+    private String prompt;
+
+    /** 开场白 */
+    private String introduct;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java
new file mode 100644
index 0000000..c84b0ce
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java
@@ -0,0 +1,46 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 智能体分类表 ai_sys_agent_category
+ *
+ * @author ruoyi
+ */
+@Data
+@TableName("sys_agent_category")
+public class YhSysAgentCategory extends YhBaseEntity
+{
+    /** 主键 */
+    private String id;
+
+    /** 公司ID */
+    private String companyId;
+
+
+    /** 名称 */
+    private String name;
+
+    /** 背景图片 */
+    private String backImg;
+
+    /** 小图标 */
+    private String iconImg;
+
+    /** 排序 */
+    private Integer sort;
+
+    /** 状态 0-禁用 1-启用 2-已删除 */
+    private Integer state;
+
+    /** 是否推荐到首页 1-推荐 0-不推荐 */
+    private Integer hotState;
+
+    /** 层级 */
+    private Integer level;
+
+    /** 父级ID */
+    private String parentId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java
new file mode 100644
index 0000000..deb7ca2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiAgentCategory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiAgentCategoryMapper extends BaseMapper<YHAiAgentCategory> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java
new file mode 100644
index 0000000..d3a61d6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiAgent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiAgentMapper extends BaseMapper<YHAiAgent> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java
new file mode 100644
index 0000000..509b3ce
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiAgentStartQuestion;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiAgentStartQuestionMapper extends BaseMapper<YHAiAgentStartQuestion> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java
new file mode 100644
index 0000000..5e7aa9f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHSysAgent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHSysAgentMapper extends BaseMapper<YHSysAgent> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java
new file mode 100644
index 0000000..697832b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YhSysAgentCategory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YhSysAgentCategoryMapper extends BaseMapper<YhSysAgentCategory> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java
new file mode 100644
index 0000000..71a6f27
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java
@@ -0,0 +1,14 @@
+package cc.mrbird.febs.yinhe.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "YHAgentDto", description = "参数")
+public class YHAgentDto {
+
+    @ApiModelProperty(value = "分类", example = "1")
+    private String agentCategoryId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java
new file mode 100644
index 0000000..a7e88df
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java
@@ -0,0 +1,17 @@
+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 = "YHAgentInitDto", description = "参数")
+public class YHAgentInitDto {
+
+    @NotBlank(message = "智能体不能为空")
+    @ApiModelProperty(value = "智能体ID", example = "you_ke_*****")
+    private String id;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java
new file mode 100644
index 0000000..802f1a0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java
@@ -0,0 +1,19 @@
+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 = "YHCategoryDto", description = "参数")
+public class YHCategoryDto {
+
+    @ApiModelProperty(value = "ID", example = "10")
+    private String id;
+
+    @ApiModelProperty(value = "是否推荐到小程序首页 1-推荐 0-不推荐", example = "1")
+    private Integer hotState;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java
new file mode 100644
index 0000000..75f204b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.yinhe.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "YHSysAgentDto", description = "参数")
+public class YHSysAgentDto {
+
+    @ApiModelProperty(value = "分类", example = "1")
+    private String agentCategoryId;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java
new file mode 100644
index 0000000..df46663
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java
@@ -0,0 +1,18 @@
+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 = "YHSysCategoryDto", description = "参数")
+public class YHSysCategoryDto {
+
+    @ApiModelProperty(value = "产品ID", example = "10")
+    private String id;
+
+    @ApiModelProperty(value = "是否推荐到小程序首页 1-推荐 0-不推荐", example = "1")
+    private Integer hotState;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java
new file mode 100644
index 0000000..4b7670e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.yinhe.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "YHAgentInitVo", description = "详情响应")
+public class YHAgentInitVo {
+
+    @ApiModelProperty(value = "智能体ID*", example = "1")
+    private String id;
+    @ApiModelProperty(value = "名称*", example = "1")
+    private String name;
+    @ApiModelProperty(value = "描述*", example = "1")
+    private String description;
+    @ApiModelProperty(value = "小图标*", example = "1")
+    private String iconImg;
+    @ApiModelProperty(value = "开场白*", example = "1")
+    private String introduct;
+
+    @ApiModelProperty(value = "开场白预设问题", example = "1")
+    private List<String> items;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java
new file mode 100644
index 0000000..1ce5c11
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs.yinhe.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "YHAgentVo", description = "参数")
+public class YHAgentVo {
+
+    @ApiModelProperty(value = "智能体ID*", example = "1")
+    private String id;
+    @ApiModelProperty(value = "名称*", example = "1")
+    private String name;
+    @ApiModelProperty(value = "描述*", example = "1")
+    private String description;
+    @ApiModelProperty(value = "小图标*", example = "1")
+    private String iconImg;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.java
new file mode 100644
index 0000000..c2628bd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.java
@@ -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 = "YHCategoryVo", description = "参数")
+public class YHCategoryVo {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java
new file mode 100644
index 0000000..023a490
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java
@@ -0,0 +1,43 @@
+package cc.mrbird.febs.yinhe.res;
+
+import cc.mrbird.febs.mall.vo.memberLevel.ApiLabelInfoVo;
+import cc.mrbird.febs.vip.entity.MallVipConfig;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel(value = "YHMemberVo", description = "参数")
+public class YHMemberVo {
+
+
+    @ApiModelProperty(value = "会员ID")
+    private String memberUuid;
+
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "昵称")
+    private String name;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "公司ID")
+    private String companyId;
+
+    @ApiModelProperty(value = "公司")
+    private String companyName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java
new file mode 100644
index 0000000..bd80b92
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.yinhe.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "YHSysAgentVo", description = "参数")
+public class YHSysAgentVo {
+
+    @ApiModelProperty(value = "智能体ID*", example = "1")
+    private String id;
+    @ApiModelProperty(value = "名称*", example = "1")
+    private String name;
+    @ApiModelProperty(value = "描述*", example = "1")
+    private String description;
+    @ApiModelProperty(value = "小图标*", example = "1")
+    private String iconImg;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.java
new file mode 100644
index 0000000..9b8a382
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.java
@@ -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 = "YHSysCategoryVo", description = "参数")
+public class YHSysCategoryVo {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java b/src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java
deleted file mode 100644
index 83820d7..0000000
--- a/src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package cc.mrbird.febs.yinhe.service;
-
-import cc.mrbird.febs.yinhe.entity.YhAiMember;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * 用户表 Service 接口
- * 对应数据库表:ai_member
- */
-public interface YhAiMemberService extends IService<YhAiMember> {
-
-}
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java b/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
new file mode 100644
index 0000000..563d98f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.yinhe.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.yinhe.entity.YhAiMember;
+import cc.mrbird.febs.yinhe.req.*;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 用户表 Service 接口
+ * 对应数据库表:ai_member
+ */
+public interface YhAiService extends IService<YhAiMember> {
+
+    FebsResponse memberInfo();
+
+    FebsResponse categoryList(YHCategoryDto dto);
+
+    FebsResponse agentList(YHAgentDto dto);
+
+    FebsResponse agentInfo(YHAgentInitDto dto);
+
+    FebsResponse categorySysList(YHSysCategoryDto dto);
+
+    FebsResponse agentSysList(YHSysAgentDto dto);
+
+    FebsResponse logout();
+}
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java b/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
new file mode 100644
index 0000000..8b8caec
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
@@ -0,0 +1,221 @@
+package cc.mrbird.febs.yinhe.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+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.yinhe.entity.*;
+import cc.mrbird.febs.yinhe.mapper.*;
+import cc.mrbird.febs.yinhe.req.*;
+import cc.mrbird.febs.yinhe.res.*;
+import cc.mrbird.febs.yinhe.service.YhAiService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+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 java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class YhAiServiceImpl  extends ServiceImpl<YhAiMemberMapper, YhAiMember> implements YhAiService {
+
+    private final YhAiMemberMapper yhAiMemberMapper;
+    private final YHAiCompanyMapper yhAiCompanyMapper;
+
+    private final YHAiAgentCategoryMapper yhAiAgentCategoryMapper;
+    private final YHAiAgentMapper yhAiAgentMapper;
+    private final YHAiAgentStartQuestionMapper yhAiAgentStartQuestionMapper;
+
+    private final YhSysAgentCategoryMapper yhSysAgentCategoryMapper;
+    private final YHSysAgentMapper yhSysAgentMapper;
+
+    private final RedisUtils redisUtils;
+
+    @Override
+    public FebsResponse memberInfo() {
+
+        String memberUuid = YHLoginUserUtil.getLoginUser().getMemberUuid();
+
+        YHMemberVo yhMemberVo = new YHMemberVo();
+        YhAiMember yhAiMember = yhAiMemberMapper.selectOne(
+                Wrappers.lambdaQuery(YhAiMember.class)
+                        .eq(YhAiMember::getMemberUuid, memberUuid)
+        );
+        if (ObjectUtil.isNotEmpty(yhAiMember)){
+            String companyId = yhAiMember.getCompanyId();
+            YHAiCompany yhAiCompany = yhAiCompanyMapper.selectById(companyId);
+
+            yhMemberVo.setMemberUuid(yhAiMember.getMemberUuid());
+            yhMemberVo.setAvatar(yhAiMember.getAvatar());
+            yhMemberVo.setName(yhAiMember.getName());
+            yhMemberVo.setRealName(yhAiMember.getRealName());
+            yhMemberVo.setSex(yhAiMember.getSex());
+            yhMemberVo.setCompanyId(yhAiCompany.getId());
+            yhMemberVo.setCompanyName(yhAiCompany.getName());
+            yhMemberVo.setPhone(yhAiMember.getPhone());
+        }
+        return new FebsResponse().success().data(yhMemberVo);
+    }
+
+    @Override
+    public FebsResponse categoryList(YHCategoryDto dto) {
+        String companyId = YHLoginUserUtil.getLoginUser().getCompanyId();
+        List<YHCategoryVo> yhCategoryVos = new ArrayList<>();
+
+        LambdaQueryWrapper<YHAiAgentCategory> query = Wrappers.lambdaQuery(YHAiAgentCategory.class);
+        query.eq(YHAiAgentCategory::getCompanyId,companyId);
+        query.eq(YHAiAgentCategory::getState,1);
+        if (ObjectUtil.isNotEmpty(dto.getId())){
+            query.eq(YHAiAgentCategory::getId,dto.getId());
+        }
+        if (ObjectUtil.isNotEmpty(dto.getHotState())){
+            query.eq(YHAiAgentCategory::getHotState,dto.getHotState());
+        }
+        query.orderByAsc(YHAiAgentCategory::getSort);
+        List<YHAiAgentCategory> yhAiAgentCategories = yhAiAgentCategoryMapper.selectList(query);
+
+        if (CollUtil.isNotEmpty(yhAiAgentCategories)){
+            for (YHAiAgentCategory yhAiAgentCategory : yhAiAgentCategories) {
+                YHCategoryVo yhCategoryVo = new YHCategoryVo();
+                yhCategoryVo.setName(yhAiAgentCategory.getName());
+                yhCategoryVo.setId(yhAiAgentCategory.getId());
+                yhCategoryVos.add(yhCategoryVo);
+            }
+        }
+
+        return new FebsResponse().success().data(yhCategoryVos);
+    }
+
+    @Override
+    public FebsResponse agentList(YHAgentDto dto) {
+        String companyId = YHLoginUserUtil.getLoginUser().getCompanyId();
+
+        ArrayList<YHAgentVo> yhAgentVos = new ArrayList<>();
+        LambdaQueryWrapper<YHAiAgent> query = Wrappers.lambdaQuery(YHAiAgent.class);
+        query.eq(YHAiAgent::getCompanyId,companyId);
+        query.eq(YHAiAgent::getState,1);
+        if (ObjectUtil.isNotEmpty(dto.getAgentCategoryId())){
+            query.eq(YHAiAgent::getAgentCategoryId,dto.getAgentCategoryId());
+        }
+        query.orderByDesc(YHAiAgent::getCreateTime);
+
+        List<YHAiAgent> yhAiAgents = yhAiAgentMapper.selectList(query);
+        if (CollUtil.isNotEmpty(yhAiAgents)){
+
+            for (YHAiAgent yhAiAgent : yhAiAgents) {
+                YHAgentVo yhAgentVo = new YHAgentVo();
+                yhAgentVo.setId(yhAiAgent.getId());
+                yhAgentVo.setName(yhAiAgent.getName());
+                yhAgentVo.setDescription(yhAiAgent.getDescription());
+                yhAgentVo.setIconImg(yhAiAgent.getIconImg());
+                yhAgentVos.add(yhAgentVo);
+            }
+        }
+        return new FebsResponse().success().data(yhAgentVos);
+    }
+
+    @Override
+    public FebsResponse agentInfo(YHAgentInitDto dto) {
+
+        String companyId = YHLoginUserUtil.getLoginUser().getCompanyId();
+        YHAgentInitVo yhAgentInitVo = new YHAgentInitVo();
+
+        String id = dto.getId();
+        YHAiAgent yhAiAgent = yhAiAgentMapper.selectById(id);
+        if (ObjectUtil.isNotEmpty(yhAiAgent)){
+            yhAgentInitVo.setId(yhAiAgent.getId());
+            yhAgentInitVo.setName(yhAiAgent.getName());
+            yhAgentInitVo.setDescription(yhAiAgent.getDescription());
+            yhAgentInitVo.setIconImg(yhAiAgent.getIconImg());
+            yhAgentInitVo.setIntroduct(yhAiAgent.getIntroduct());
+            List<YHAiAgentStartQuestion> yhAiAgentStartQuestions = yhAiAgentStartQuestionMapper.selectList(
+                    Wrappers.lambdaQuery(YHAiAgentStartQuestion.class).eq(YHAiAgentStartQuestion::getAgentId, id)
+            );
+            if (CollUtil.isNotEmpty(yhAiAgentStartQuestions)){
+                List<String> questions = new ArrayList<>();
+                for (YHAiAgentStartQuestion yhAiAgentStartQuestion : yhAiAgentStartQuestions) {
+                    questions.add(yhAiAgentStartQuestion.getTitle());
+                }
+                yhAgentInitVo.setItems(questions);
+            }
+        }
+
+        return new FebsResponse().success().data(yhAgentInitVo);
+    }
+
+    @Override
+    public FebsResponse categorySysList(YHSysCategoryDto dto) {
+        List<YHSysCategoryVo> vos = new ArrayList<>();
+
+        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());
+        }
+        query.orderByAsc(YhSysAgentCategory::getSort);
+
+        List<YhSysAgentCategory> yhSysAgentCategories = yhSysAgentCategoryMapper.selectList(query);
+        if (CollUtil.isNotEmpty(yhSysAgentCategories)){
+            for (YhSysAgentCategory yhSysAgentCategory : yhSysAgentCategories) {
+                YHSysCategoryVo vo = new YHSysCategoryVo();
+                vo.setId(yhSysAgentCategory.getId());
+                vo.setName(yhSysAgentCategory.getName());
+                vos.add(vo);
+            }
+        }
+        return new FebsResponse().success().data(vos);
+    }
+
+    @Override
+    public FebsResponse agentSysList(YHSysAgentDto dto) {
+        ArrayList<YHSysAgentVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<YHSysAgent> query = Wrappers.lambdaQuery(YHSysAgent.class);
+        query.eq(YHSysAgent::getState,1);
+        if (ObjectUtil.isNotEmpty(dto.getAgentCategoryId())){
+            query.eq(YHSysAgent::getAgentCategoryId,dto.getAgentCategoryId());
+        }
+        query.orderByDesc(YHSysAgent::getCreateTime);
+
+        List<YHSysAgent> list = yhSysAgentMapper.selectList(query);
+        if (CollUtil.isNotEmpty(list)){
+
+            for (YHSysAgent entity : list) {
+                YHSysAgentVo vo = new YHSysAgentVo();
+                vo.setId(entity.getId());
+                vo.setName(entity.getName());
+                vo.setDescription(entity.getDescription());
+                vo.setIconImg(entity.getIconImg());
+                vos.add(vo);
+            }
+        }
+        return new FebsResponse().success().data(vos);
+    }
+
+    @Override
+    public FebsResponse logout() {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+
+        String redisKey = AppContants.XCX_LOGIN_PREFIX + memberUuid;
+        String existToken = redisUtils.getString(redisKey);
+        if (StrUtil.isNotBlank(existToken)) {
+            Object o = redisUtils.get(existToken);
+            if (ObjectUtil.isNotEmpty(o)) {
+                redisUtils.del(existToken);
+            }
+        }
+        redisUtils.del(AppContants.XCX_LOGIN_PREFIX + memberUuid);
+        return new FebsResponse().success().message("退出登录");
+    }
+}
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index affd23d..af63d09 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -15,16 +15,16 @@
       datasource:
         # 数据源-1,名称为 base
         base:
-          username: ai_one
-          password: ai_one!@#123
+          username: ry_vue_ai
+          password: ry_vue_ai!@#123
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://127.0.0.1:3306/ai_one?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://8.166.133.146:3306/ry_vue_ai?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
-    database: 1
+    database: 3
     # Redis服务器地址
-    host: 127.0.0.1
+    host: 8.166.133.146
     # Redis服务器连接端口
     port: 6379
     # Redis 密码
@@ -42,7 +42,7 @@
     # 连接超时时间(毫秒)
     timeout: 5000000
   rabbitmq:
-    host: 127.0.0.1
+    host: 8.166.133.146
     port: 5672
     username: xc_rabbit
     password: xuncong123
@@ -70,8 +70,8 @@
 #  wecharpaySecret: CSxc168888CSxc168888CSxc168888xc
 xcx:
   wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-  xcx_appid: wxcd0555ebf4448971
-  xcx_secret: 0a10fa3b9388ddd5d5ad4c8bd6637be1
+  xcx_appid: wx203cb932dc947a15
+  xcx_secret: 1e61bee704b159577cc2a58f80f19190
   debug: true
   wecharPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/wxpayCallback
   wecharActivityPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/activityOrderCallback

--
Gitblit v1.9.1