Pārlūkot izejas kodu

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

caoliqin 2 dienas atpakaļ
vecāks
revīzija
cf816c3c10

+ 114 - 0
fs-admin/src/main/java/com/fs/task/SaleBehaviorAnalyzeTask.java

@@ -0,0 +1,114 @@
+package com.fs.task;
+
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.crm.utils.CrmCustomerAiTagUtil;
+import com.fs.his.enums.AiSaleBehaviorAnalyzsEnum;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+//销售行为分析
+@Component("SaleBehaviorAnalyzeAiTask")
+@RequiredArgsConstructor
+@Slf4j
+public class SaleBehaviorAnalyzeTask {
+
+    private final RedisTemplate<String, String> redisTemplate;
+    private final ICompanyUserService companyUserService;
+
+    public void orderMoney() {
+        log.info("开始获取销售增加的销售额");
+        //增加
+        List<String> rangeAdd = redisTemplate.opsForList().range(AiSaleBehaviorAnalyzsEnum.SALE_ANALYZE_ADD.getRedisKey(), 0, -1);
+        //减少 存的时候传负数
+        List<String> rangeMinus = redisTemplate.opsForList().range(AiSaleBehaviorAnalyzsEnum.SALE_ANALYZE_MINUS.getRedisKey(), 0, -1);
+
+        // 统一判空处理
+        if ((rangeAdd == null || rangeAdd.isEmpty()) && (rangeMinus == null || rangeMinus.isEmpty())) {
+            log.info("无销售额增减任务,结束进程");
+            return;
+        }
+        // 记录任务统计信息
+        log.info("销售额任务统计 - 增加任务数: {}, 减少任务数: {}",
+                rangeAdd == null ? 0 : rangeAdd.size(),
+                rangeMinus == null ? 0 : rangeMinus.size());
+
+//        if (rangeAdd == null || rangeAdd.isEmpty()) {
+//            log.info("无增加销售额任务");
+//        } else {
+//            log.info("增加销售额任务示例: {}", rangeAdd.get(0));
+//        }
+//        if (rangeMinus == null || rangeMinus.isEmpty()) {
+//            log.info("无减少销售额任务");
+//        } else {
+//            log.info("减少销售额任务示例: {}", rangeMinus.get(0));
+//        }
+
+        // key = companyId:companyUserId
+        Map<String, BigDecimal> addSum = sumByCompanyAndUser(rangeAdd);
+        Map<String, BigDecimal> minusSum = sumByCompanyAndUser(rangeMinus);
+
+        // add - minus => 结果集合
+        List<String> netList = new ArrayList<>();
+        Map<String, BigDecimal> netMap = new HashMap<>(addSum);
+        for (Map.Entry<String, BigDecimal> e : minusSum.entrySet()) {
+            netMap.merge(e.getKey(), e.getValue().negate(), BigDecimal::add);
+        }
+        for (Map.Entry<String, BigDecimal> e : netMap.entrySet()) {
+            // 输出格式:companyId:companyUserId:netAmount
+            netList.add(e.getKey() + ":" + e.getValue());
+        }
+
+        log.info("销售额增减汇总完成,分组数: {}", netList.size());
+        // TODO: netList 即“同 companyId 同 companyUserId add相加再减minus”的集合,可用于后续入库/分析
+        for (Map.Entry<String, BigDecimal> entry : netMap.entrySet()){
+            String k = entry.getKey();
+            BigDecimal v = entry.getValue();
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.valueOf(k));
+            if (companyUser == null){
+                log.info("用户ID不存在: " + k);
+                continue;
+            }
+
+        }
+    }
+
+    private static Map<String, BigDecimal> sumByCompanyAndUser(List<String> rows) {
+        Map<String, BigDecimal> sum = new HashMap<>();
+        if (rows == null || rows.isEmpty()) {
+            return sum;
+        }
+        for (String item : rows) {
+            if (item == null || item.trim().isEmpty()) {
+                continue;
+            }
+            List<String> parts = Arrays.asList(item.split(":"));
+            if (parts.size() < 2) {
+                continue;
+            }
+            String companyUserId = parts.get(0);
+            String amountStr = parts.get(1);
+            if ( companyUserId == null || amountStr == null) {
+                continue;
+            }
+            BigDecimal amount;
+            try {
+                amount = new BigDecimal(amountStr);
+            } catch (Exception ignore) {
+                continue;
+            }
+            String key = companyUserId;
+            sum.merge(key, amount, BigDecimal::add);
+        }
+        return sum;
+    }
+}

+ 5 - 4
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopWxLogsTaskServiceImpl.java

@@ -12,6 +12,7 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.domain.CompanyUser;
@@ -754,7 +755,7 @@ public class SopWxLogsTaskServiceImpl implements SopWxLogsTaskService {
         WxSopLogs wxSopLogs = new WxSopLogs();
 
         // 基础信息
-        wxSopLogs.setSendTime(formattedSendTime);
+        wxSopLogs.setSendTime(DateUtil.stringToLocalDateTime(formattedSendTime));
         wxSopLogs.setAccountId(Long.valueOf(logVo.getCustomerId())); // 个微账号ID
         wxSopLogs.setType(logVo.getType());
         wxSopLogs.setFsUserId(fsUserId);
@@ -1032,7 +1033,7 @@ public class SopWxLogsTaskServiceImpl implements SopWxLogsTaskService {
                     try {
                         if (sopLogs.getFsUserId() != null && !Objects.equals(0L, sopLogs.getFsUserId())) {
                             sopLogs.setSendStatus(5);
-                            sopLogs.setReceivingStatus(0);
+//                            sopLogs.setReceivingStatus(0);
                             sopLogs.setRemark("已经注册过的客户不发送");
                         }
                         if (ObjectUtil.isNotEmpty(setting.getValue())) {
@@ -2392,7 +2393,7 @@ public class SopWxLogsTaskServiceImpl implements SopWxLogsTaskService {
         watchLog.setCourseId(courseId != null ? courseId.longValue() : null);
         watchLog.setCompanyUserId(companyUserId != null ? Long.valueOf(companyUserId) : null);
         watchLog.setCompanyId(companyId != null ? Long.valueOf(companyId) : null);
-        watchLog.setCreateTime(convertStringToDate(sopLogs.getSendTime(), "yyyy-MM-dd HH:mm:ss"));
+        watchLog.setCreateTime(DateUtil.stringToDate(DateUtil.formatLocalDateTime(sopLogs.getSendTime())));
         watchLog.setUpdateTime(new Date());
         watchLog.setLogType(3);
         watchLog.setUserId(sopLogs.getFsUserId());
@@ -3350,7 +3351,7 @@ public class SopWxLogsTaskServiceImpl implements SopWxLogsTaskService {
     private void setSopLogsStatus(WxSopLogs sopLogs, Integer sendStatus, Integer receivingStatus, String remark) {
         if (sopLogs != null) {
             sopLogs.setSendStatus(sendStatus);
-            sopLogs.setReceivingStatus(receivingStatus);
+//            sopLogs.setReceivingStatus(receivingStatus);
             sopLogs.setRemark(remark);
         }
     }

+ 10 - 14
fs-service/src/main/java/com/fs/crm/service/impl/CrmCustomerAnalyzeServiceImpl.java

@@ -5,8 +5,6 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -21,13 +19,11 @@ import com.fs.common.utils.spring.SpringUtils;
 import com.fs.crm.domain.*;
 import com.fs.crm.dto.CrmCustomerAiAutoTagVo;
 import com.fs.crm.mapper.CrmCustomerAnalyzeMapper;
-import com.fs.crm.mapper.CrmCustomerMapper;
 import com.fs.crm.param.PolishingScriptParam;
 import com.fs.crm.service.ICrmCustomerAnalyzeService;
 import com.fs.crm.service.ICrmCustomerPropertyTemplateService;
 import com.fs.crm.utils.CrmCustomerAiTagUtil;
-import com.fs.crm.vo.CrmCustomerAiTagVo;
-import com.fs.crm.vo.QwCustomerAiTagVo;
+import com.fs.qw.vo.QwCustomerAiTagVo;
 import com.fs.qw.domain.QwExternalAiAnalyze;
 import com.fs.qw.mapper.QwCustomerPropertyMapper;
 import com.fs.qw.mapper.QwExternalAiAnalyzeMapper;
@@ -402,7 +398,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
         requestParam.put("userIntent", "");
         long startTime = System.currentTimeMillis();
         R aiResponse = CrmCustomerAiTagUtil.callAiService(requestParam, Long.valueOf(param.getChatId()),OTHER_KEY);
-        System.out.println(aiResponse);
+//        System.out.println(aiResponse);
         String result = "";
         CrmCustomerChatMessage crmCustomerChatMessage = new CrmCustomerChatMessage();
         crmCustomerChatMessage.setContentType(1);
@@ -550,7 +546,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 //        log.info("请求参数:{}", requestParam);
 
         R aiResponse = CrmCustomerAiTagUtil.callAiService(requestParam, chatId,OTHER_KEY);
-        JSONObject root = JSON.parseObject(JSONUtil.toJsonStr(aiResponse));
+//        JSONObject root = JSON.parseObject(JSONUtil.toJsonStr(aiResponse));
 //        System.out.println(aiResponse);
 // 获取 data.responseData
         String result = "";
@@ -598,7 +594,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public String aiGeneratedCustomerPortraitQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType", "客户画像");
 //        log.info("请求参数:{}", stringObjectMap);
         R aiResponse = CrmCustomerAiTagUtil.callAiService(stringObjectMap, logId, OTHER_KEY);
@@ -620,7 +616,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public String aiCommunicationSummaryQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType", "沟通总结");
 //        log.info("请求参数:{}", stringObjectMap);
         R aiResponse = CrmCustomerAiTagUtil.callAiService(stringObjectMap, logId, OTHER_KEY);
@@ -639,7 +635,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public String aiCommunicationAbstractQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType", "沟通摘要");
         stringObjectMap.remove("userInfo");
         HashMap<String, String> map = MapUtil.of("沟通摘要", "");
@@ -660,7 +656,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public Long aiAttritionLevelQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType","流失风险等级");
         stringObjectMap.remove("userInfo");
         HashMap<String, String> map = MapUtil.of("流失风险等级", "");
@@ -682,7 +678,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public String aiCustomerFocusQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType","客户关注点");
         stringObjectMap.remove("userInfo");
         HashMap<String, String> map = MapUtil.of("客户关注点", "");
@@ -705,7 +701,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
 
     @Override
     public String aiIntentionDegreeQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson, Long logId) {
-        Map<String, Object> stringObjectMap = buildRequestParamQw(qwExternalAiAnalyze, dataJson);
+        Map<String, Object> stringObjectMap = buildRequestParam(qwExternalAiAnalyze, dataJson);
         stringObjectMap.put("modelType","客户意向度");
         stringObjectMap.remove("userInfo");
         HashMap<String, String> map = MapUtil.of("客户意向度", "");
@@ -878,7 +874,7 @@ public class CrmCustomerAnalyzeServiceImpl extends ServiceImpl<CrmCustomerAnalyz
         return null;
     }
 
-    private Map<String, Object> buildRequestParamQw(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson) {
+    private Map<String, Object> buildRequestParam(QwExternalAiAnalyze qwExternalAiAnalyze, String dataJson) {
         Map<String, Object> requestParam = new HashMap<>();
 
         // 获取各类数据

+ 12 - 0
fs-service/src/main/java/com/fs/his/enums/AiSaleBehaviorAnalyzsEnum.java

@@ -0,0 +1,12 @@
+package com.fs.his.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum AiSaleBehaviorAnalyzsEnum {
+    SALE_ANALYZE_ADD("sale:behavior:analyze:order:add"),
+    SALE_ANALYZE_MINUS("sale:behavior:analyze:order:minus");
+    private String redisKey;
+}

+ 4 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -1146,6 +1146,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
             } catch (Exception e) {
                 log.info("拆分订单错误:{}", order.getOrderId());
             }
+            //付款成功存入redis进行销售行为分析订单金额增减
+            redisCache.redisTemplate.opsForList().rightPush(AiSaleBehaviorAnalyzsEnum.SALE_ANALYZE_ADD.getRedisKey(),order.getCompanyUserId()+":"+order.getPayPrice());
         }
 
         return R.ok();
@@ -1753,6 +1755,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                     userCouponService.updateFsUserCoupon(userCoupon);
                 }
             }
+            //付款成功存入redis进行销售行为分析订单金额增减
+            redisCache.redisTemplate.opsForList().rightPush(AiSaleBehaviorAnalyzsEnum.SALE_ANALYZE_ADD.getRedisKey(),order.getCompanyUserId()+":"+order.getPayPrice());
             return R.ok();
         } catch (Exception e) {
             log.info(payCode + "异常了" + e.getMessage());

+ 1 - 1
fs-service/src/main/java/com/fs/qw/mapper/QwCustomerPropertyMapper.java

@@ -1,7 +1,7 @@
 package com.fs.qw.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.fs.crm.vo.QwCustomerAiTagVo;
+import com.fs.qw.vo.QwCustomerAiTagVo;
 import com.fs.qw.domain.QwCustomerProperty;
 import org.springframework.stereotype.Repository;
 

+ 1 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwCustomerPropertyServiceImpl.java

@@ -14,8 +14,7 @@ import com.fs.crm.domain.CrmCustomerPropertyTemplate;
 import com.fs.crm.dto.CrmCustomerAiAutoTagVo;
 import com.fs.crm.service.ICrmCustomerPropertyTemplateService;
 import com.fs.crm.utils.CrmCustomerAiTagUtil;
-import com.fs.crm.vo.CrmCustomerAiTagVo;
-import com.fs.crm.vo.QwCustomerAiTagVo;
+import com.fs.qw.vo.QwCustomerAiTagVo;
 import com.fs.hisapi.util.MapUtil;
 import com.fs.qw.domain.QwCustomerProperty;
 import com.fs.qw.domain.QwExternalAiAnalyze;

+ 1 - 1
fs-service/src/main/java/com/fs/crm/vo/QwCustomerAiTagVo.java → fs-service/src/main/java/com/fs/qw/vo/QwCustomerAiTagVo.java

@@ -1,4 +1,4 @@
-package com.fs.crm.vo;
+package com.fs.qw.vo;
 
 import lombok.Data;
 import lombok.experimental.Accessors;