Administrator
7 days ago f9e40800aa15abd4cfd2799f334b015e6f13629c
feat(yinhe): 新增智能体系统功能并调整配置

- 新增YHAgentDto、YHAgentInitDto、YHAgentInitVo、YHAgentVo数据传输对象
- 新增YHAiAgent、YHAiAgentCategory、YHAiAgentStartQuestion实体类
- 新增YHAiAgentCategoryMapper、YHAiAgentMapper、YHAiAgentStartQuestionMapper数据访问接口
- 重命名YhAiMemberService为YhAiService并扩展方法
- 新增YhAiServiceImpl实现类
- 在WebMvcConfigure中排除新的API路径
- 更新application-test.yml中的数据库连接配置
- 更新微信访问令牌Redis键名
- 移除百度定时任务和订单相关定时任务代码
- 移除会员服务中的姓名设置逻辑
- 更新小程序应用ID和密钥配置
25 files added
1 files deleted
9 files modified
1479 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java 82 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java 142 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java 310 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 66 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java 102 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java 45 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java 22 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java 221 ●●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 16 ●●●● patch | view | raw | blame | history
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");
    }
}
src/main/java/cc/mrbird/febs/common/utils/YHLoginUserUtil.java
New file
@@ -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");
    }
}
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);
//        }
//    }
}
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");
//    }
}
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;
    /**
     * 普通商品结算
     */
//    @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;
//        }
//    @Autowired
//    private MallOrderInfoMapper mallOrderInfoMapper;
//
//        for (MallOrderInfo orderInfo : orderInfos) {
//            MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
//            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
//                continue;
//            }
//    @Autowired
//    private MallOrderItemMapper mallOrderItemMapper;
//
//            for (MallOrderItem item : orderInfo.getItems()) {
//                MallGoodsSku sku = mallGoodsSkuMapper.selectById(item.getSkuId());
//                BigDecimal score = sku.getPresentPrice();
//    @Autowired
//    private IApiMallMemberWalletService memberWalletService;
//
//                memberWalletService.add(score, member.getId(), "score");
//                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
//    @Autowired
//    private IMallMoneyFlowService mallMoneyFlowService;
//
//                mallAchieveService.add(item.getId());
//            }
//    @Autowired
//    private MallMemberMapper mallMemberMapper;
//
//            // 普通商品动态分红结算
//            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("团长每日提成");
//        //获取每日提成总数
//    @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;
//
//        /**
//         * 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");
////    @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);
////        }
////    }
//
//                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());
//    /**
//     * 自动确认收货
//     */
//    @Scheduled(cron = "0 0 0 * * ?")
//
//                    //更新到已提成状态
//                    mallLeaderAchieveMapper.updateByUniqueCodeStateAndTime(DateUtil.date(),uniqueCode,MallLeaderAchieve.STATE_ONE,dateTime);
////    @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());
//            });
//                }
//            }
//        }
//    }
//    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);
////    }
}
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();
//    }
}
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();
    }
}
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())) {
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";
src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
New file
@@ -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();
    }
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgent.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentCategory.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentStartQuestion.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHSysAgent.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YhSysAgentCategory.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentCategoryMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentStartQuestionMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysAgentMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YhSysAgentCategoryMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/req/YHAgentDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHAgentInitDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHCategoryDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHSysAgentDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHAgentInitVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHAgentVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHCategoryVo.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 = "YHCategoryVo", description = "参数")
public class YHCategoryVo {
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "ID")
    private String id;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHMemberVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHSysAgentVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHSysCategoryVo.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 = "YHSysCategoryVo", description = "参数")
public class YHSysCategoryVo {
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "ID")
    private String id;
}
src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java
File was deleted
src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
New file
@@ -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();
}
src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
New file
@@ -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("退出登录");
    }
}
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