Просмотр исходного кода

清洗客户数据(AB客户),按月计算AB客户发展数

lvjs недель назад: 2
Родитель
Сommit
95d5a1efd0

+ 1 - 1
src/main/java/com/malk/eastar/controller/AitableController.java

@@ -142,7 +142,7 @@ public class AitableController {
         log.info("客户变更, {}", data);
         McException.assertParamException_Null(data, "aitableId");
         String aitableId = UtilMap.getString(data, "aitableId");
-        String yidaCustomerLevel = UtilMap.getString(data, "yidaCustomerLevel");    //客户潜在等级
+        String yidaCustomerLevel = UtilMap.getString(data, "yidaCustomerLevel");    //客户潜在等级或客户当前分级
         String yidaNewOrOld = UtilMap.getString(data, "yidaNewOrOld");    //新老客户
         Map<String,Object> fields = new HashMap<>();
         try {

+ 4 - 4
src/main/java/com/malk/eastar/schedule/ScheduleTask1.java

@@ -58,13 +58,13 @@ public class ScheduleTask1 {
     /**
      * 私海客户流出
      */
-    @Scheduled(cron = "0 0 5 * * ?")
+//    @Scheduled(cron = "0 0 5 * * ?")
     public void releasePrivatePoolCustomers() {
         log.info("私海客户流出定时任务");
         try {
             //查询所有已建联客户跟进记录
             List<Map> establishContactData = yidaService.queryLtcCustomerEstablishContactData();
-            log.info("已建联跟进记录数:"+ establishContactData.size());
+//            log.info("已建联跟进记录数:"+ establishContactData.size());
 
             //进入私海时间分界点(2026年5月10日)
             long enterPrivateTime = UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.of(2026, 5, 10).atStartOfDay());
@@ -79,7 +79,7 @@ public class ScheduleTask1 {
                     new YDSearch("dateField_l3tw3kfn",endTime,"最后跟进时间",YDSearch.Type.DATE_FIELD,YDSearch.Operator.LT)
             );
             List<Map> ltcCustomerData = yidaService.queryLtcNotFollowedCustomerData(ydFilters);
-            log.info("超过3天未跟进的私海新客户记录数:"+ ltcCustomerData.size());
+//            log.info("超过3天未跟进的私海新客户记录数:"+ ltcCustomerData.size());
             
             //排除已建联
             Set<String> contactedCustomerCodes = new HashSet<>();
@@ -121,7 +121,7 @@ public class ScheduleTask1 {
             }
             Map alertLogRecord;
             for (Map.Entry<String, List<Map>> entry : customerGroupBySales.entrySet()) {
-                log.info("业务员: {}, 可能会流出客户数量: {}", entry.getKey(), entry.getValue().size());
+//                log.info("业务员: {}, 可能会流出客户数量: {}", entry.getKey(), entry.getValue().size());
                 //新增私海客户流出告警日志
                 alertLogRecord = new HashMap();
                 alertLogRecord.put("businessUserId",entry.getKey());

Разница между файлами не показана из-за своего большого размера
+ 2738 - 4
src/main/java/com/malk/eastar/schedule/ScheduleTask4.java


+ 12 - 0
src/main/java/com/malk/eastar/service/AitableService.java

@@ -14,6 +14,12 @@ public interface AitableService {
      */
     List<Map> querySys1CustomerData() throws Exception;
 
+    /**
+     * 获取项目总表中的多行记录(售前台账)
+     * @return
+     */
+    List<Map> querySys1AllSaleData() throws Exception;
+
     /**
      * 获取项目总表中的多行记录(售前台账)
      * @return
@@ -64,4 +70,10 @@ public interface AitableService {
      */
     String updateSys1SaleData(String id,Map<String,Object> fields) throws Exception;
 
+    /**
+     * 添加客户2026年AB客户发展数(预计、实际)
+     * @throws Exception
+     */
+    String addCustomerABDevData(Map<String,Object> fields) throws Exception;
+
 }

+ 11 - 1
src/main/java/com/malk/eastar/service/YidaService.java

@@ -118,10 +118,20 @@ public interface YidaService {
     void updateLtcCustomerBasicInfo7(String formInstId, String customerLevel, String customerPotentialLevel) throws Exception;
 
     /**
-     * 更新易思达系统客户基本信息(客户当前分级、客户潜在等级
+     * 更新易思达系统客户基本信息(进入私海时间、最近一次跟进时间
      */
     void updateLtcCustomerBasicInfo8(String formInstId, long privateSeaTime, long lastContactTime) throws Exception;
 
+    /**
+     * 更新易思达系统客户基本信息(客户当前分级)
+     */
+    void updateCustomerCurrentLevel(String formInstId, String customerCurrentLevel) throws Exception;
+
+    /**
+     * 更新易思达系统客户基本信息(客户潜在等级)
+     */
+    void updateCustomerPotentialLevel(String formInstId, String customerPotentialLevel) throws Exception;
+
     /**
      * 更新客户前跟进人信息
      */

+ 207 - 3
src/main/java/com/malk/eastar/service/impl/AitableServiceImpl.java

@@ -179,10 +179,10 @@ public class AitableServiceImpl implements AitableService {
                                 ||"潜C".equals(customerLevel)
                                 ||"D".equals(customerLevel)
                                 ||"潜D".equals(customerLevel)
+                                ||"E".equals(customerLevel)
+                                ||"保稳E".equals(customerLevel)
                 ){
                     //不变
-                }else if("E".equals(customerLevel)){
-                    customerLevel = "保稳E";
                 }else{
                     customerLevel = "";
                 }
@@ -265,6 +265,166 @@ public class AitableServiceImpl implements AitableService {
         return customerDataDeduplicate;
     }
 
+    @Override
+    public List<Map> querySys1AllSaleData() throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> saleData = new ArrayList<>(); //售前台账数据
+        String baseId; //AI表格文档ID
+        String sheetIdOrName;   //数据表ID或数据表名称
+        Map<String,Object> param = new HashMap<>(); //HTTP请求参数
+        AITableParam aiTableParam = new AITableParam(); //HTTP请求体
+        boolean hasMore; //是否还有下一页
+        int pageNo; //当前页码
+        int pageSize;   //每页获取的数据量(上限100)
+        AITableResult aiTableResult;    //请求返回内容
+        JSONArray records;  //每页记录数据
+        JSONArray allRecords = new JSONArray();  //所有记录数据
+        String aiTableId;   //AI表格ID
+        JSONObject fields;  //字段数据
+        Map<String,Object> saleRecord;  //售前台账记录
+        String piCode;  //原PI号
+        String projectName;  //项目名称
+        String projectEnName;  //项目英文名
+        String pName;  //项目名称缩写
+        Double projectAmount;   //预计销售项目金额
+        JSONArray linkedRecordIds;  //客户公司名 - S1【基础】
+        String customerId;  //客户ID
+        Long expectedCloseDate; //预计成单日期
+        Long actualCloseDate;   //实际成单日期
+        JSONArray unionIdJSONArray;  //业务 - S1【人事】
+        String unionId;  //业务员ID
+
+
+
+        /*
+            项目总表 - 【表1】售前台账
+         */
+        baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
+        sheetIdOrName = "C1mtX34";
+
+        /*
+            初始化参数值
+         */
+        hasMore = true; //第一页默认有数据
+        pageNo = 1;
+        pageSize = 100;
+        param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE");  //操作人(Jason)的unionId
+        aiTableParam.setMaxResults(pageSize);
+        JSONObject filter = new JSONObject();
+        filter.put("combination","and");
+        JSONArray conditions = new JSONArray();
+        JSONObject condition1 = new JSONObject();
+        condition1.put("field","Parent Record");
+        condition1.put("operator","empty");
+        conditions.add(condition1);
+        filter.put("conditions",conditions);
+        aiTableParam.setFilter(filter);
+
+        /*
+            翻页获取数据
+         */
+        while(hasMore){
+            aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
+            hasMore = aiTableResult.getHasMore();
+            log.info("当前第"+pageNo+"页");
+            log.info("记录数="+aiTableResult.getRecords().size());
+            records = aiTableResult.getRecords();
+            for(int i=0;i<records.size();i++){
+                allRecords.add(records.getJSONObject(i));
+            }
+            log.info("是否有更多数据:"+hasMore);
+            pageNo++;
+            aiTableParam.setNextToken(aiTableResult.getNextToken());
+        }
+
+        /*
+            请求记录数据处理
+         */
+        log.info("所有记录数量="+allRecords.size());
+        for(int i=0;i<allRecords.size();i++){
+            //重置变量
+            piCode = "";
+            projectName = "";
+            projectEnName = "";
+            pName = "";
+            projectAmount = null;
+            customerId = "";
+            expectedCloseDate = null;
+            actualCloseDate = null;
+            unionId = "";
+
+            //获取AI表格ID
+            aiTableId = allRecords.getJSONObject(i).getString("id");
+
+            //解析字段数据
+            fields = allRecords.getJSONObject(i).getJSONObject("fields");
+
+            if(fields.get("项目编号 - S1【基础】") != null){
+                piCode = fields.getString("项目编号 - S1【基础】");
+                piCode = piCode.replace("\n",""); //去除换行符
+                piCode = piCode.trim(); //去除空格
+                Matcher matcher = Pattern.compile("Eastar-?([A-Za-z]+)").matcher(piCode);
+                if (matcher.find()) {
+                    pName = matcher.group(1);
+                    if(pName != null && pName.length()>0){
+                        pName = pName.toUpperCase();    //转大写
+                        if(pName.length()>5){
+                            pName = pName.substring(0,5);   //最大5个字符
+                        }
+                    }
+                }
+            }
+            if(fields.get("项目名称 - S1【基础】") != null){
+                projectName = fields.getString("项目名称 - S1【基础】");
+                projectName = projectName.replace("\n",""); //去除换行符
+                projectName = projectName.trim(); //去除空格
+            }
+            if(fields.get("项目英文名 - S1【基础") != null){
+                projectEnName = fields.getString("项目英文名 - S1【基础");
+                projectEnName = projectEnName.replace("\n",""); //去除换行符
+                projectEnName = projectEnName.trim(); //去除空格
+            }
+            if(fields.get("订单金额 - S2~3【销售数据】") != null){
+                projectAmount = fields.getDouble("订单金额 - S2~3【销售数据】");
+            }
+            if(fields.get("客户公司名 - S1【基础】") != null){
+                linkedRecordIds = fields.getJSONObject("客户公司名 - S1【基础】").getJSONArray("linkedRecordIds");
+                if(linkedRecordIds!=null && !linkedRecordIds.isEmpty()){
+                    customerId = linkedRecordIds.getString(0);
+                }
+            }
+            if(fields.get("预计成单日期 - S1~2【商机进度】") != null){
+                expectedCloseDate = fields.getLong("预计成单日期 - S1~2【商机进度】");
+            }
+            if(fields.get("实际成单日期 - S3【销售数据】") != null){
+                actualCloseDate = fields.getLong("实际成单日期 - S3【销售数据】");
+            }
+            if(fields.get("业务 - S1【人事】") != null){
+                unionIdJSONArray = fields.getJSONArray("业务 - S1【人事】");
+                if(unionIdJSONArray!=null && !unionIdJSONArray.isEmpty()){
+                    unionId = unionIdJSONArray.getJSONObject(0).getString("unionId");
+                }
+            }
+
+            saleRecord = new HashMap<>();
+            saleRecord.put("aiTableId",aiTableId);
+            saleRecord.put("piCode",piCode);
+            saleRecord.put("projectName",projectName);
+            saleRecord.put("projectEnName",projectEnName);
+            saleRecord.put("pName",pName);
+            saleRecord.put("projectAmount",projectAmount);
+            saleRecord.put("customerId",customerId);
+            saleRecord.put("expectedCloseDate",expectedCloseDate);
+            saleRecord.put("actualCloseDate",actualCloseDate);
+            saleRecord.put("unionId",unionId);
+            saleData.add(saleRecord);
+        }
+
+        return saleData;
+    }
+
     @Override
     public List<Map> querySys1SaleData() throws Exception {
         /*
@@ -429,7 +589,7 @@ public class AitableServiceImpl implements AitableService {
             saleRecord.put("expectedCloseDate",expectedCloseDate);
             saleRecord.put("actualCloseDate",actualCloseDate);
             saleRecord.put("unionId",unionId);
-            System.out.println(JSONObject.toJSONString(saleRecord));
+//            System.out.println(JSONObject.toJSONString(saleRecord));
             saleData.add(saleRecord);
         }
 
@@ -811,5 +971,49 @@ public class AitableServiceImpl implements AitableService {
         return result;
     }
 
+    @Override
+    public String addCustomerABDevData(Map<String, Object> fields) throws Exception {
+        /*
+            参数定义
+         */
+        String baseId; //AI表格文档ID
+        String sheetIdOrName;   //数据表ID或数据表名称
+        Map<String,Object> param = new HashMap<>(); //HTTP请求参数
+        JSONObject insertData = new JSONObject();   //HTTP请求体
+        JSONArray insertRecords = new JSONArray();  //新增记录集合
+        JSONObject insertRecord = new JSONObject();      //新增记录行数据
+        String result;  //返回结果
+        JSONObject resultJSONObject;
+        JSONArray aitableIdJSONArray;
+        String aitableId = "";   //AI表格记录ID
+
+        /*
+            项目总表
+         */
+        baseId = "G53mjyd80pEr5grBfpjmMX6586zbX04v";
+        sheetIdOrName = "S4bMyJU";
+
+        /*
+            初始化参数值
+         */
+        param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE");  //操作人(Jason)的unionId
+        insertRecord.put("fields",fields);
+        insertRecords.add(insertRecord);
+        insertData.put("records",insertRecords);
+
+        /*
+            新增数据
+         */
+        log.info(JSONObject.toJSONString(insertData));
+        result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
+        log.info(result);
+        resultJSONObject = JSONObject.parseObject(result);
+        aitableIdJSONArray = resultJSONObject.getJSONArray("value");
+        if(aitableIdJSONArray!=null || !aitableIdJSONArray.isEmpty()){
+            aitableId = aitableIdJSONArray.getJSONObject(0).getString("id");
+        }
+        return aitableId;
+    }
+
 
 }

+ 92 - 0
src/main/java/com/malk/eastar/service/impl/YidaServiceImpl.java

@@ -1792,6 +1792,60 @@ public class YidaServiceImpl implements YidaService {
         ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.update);
     }
 
+    @Override
+    public void updateCustomerCurrentLevel(String formInstId, String customerCurrentLevel) throws Exception {
+        /*
+            参数定义
+         */
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        String updateFormDataJson;  //更新内容
+
+        /*
+            初始化参数值
+         */
+        Map<String,String> updateFormData = new HashMap<String,String>();
+        updateFormData.put("selectField_mcsoft5i",customerCurrentLevel);
+        updateFormDataJson = JSONObject.toJSONString(updateFormData);
+        System.out.println(updateFormDataJson);
+
+        /*
+            更新数据
+         */
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formInstId(formInstId);
+        ydParamBuilder = ydParamBuilder.updateFormDataJson(updateFormDataJson);
+        yidaParam = ydParamBuilder.build();
+        ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.update);
+    }
+
+    @Override
+    public void updateCustomerPotentialLevel(String formInstId, String customerPotentialLevel) throws Exception {
+/*
+            参数定义
+         */
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        String updateFormDataJson;  //更新内容
+
+        /*
+            初始化参数值
+         */
+        Map<String,String> updateFormData = new HashMap<String,String>();
+        updateFormData.put("selectField_mhsvnqsv",customerPotentialLevel);
+        updateFormDataJson = JSONObject.toJSONString(updateFormData);
+        System.out.println(updateFormDataJson);
+
+        /*
+            更新数据
+         */
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formInstId(formInstId);
+        ydParamBuilder = ydParamBuilder.updateFormDataJson(updateFormDataJson);
+        yidaParam = ydParamBuilder.build();
+        ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.update);
+    }
+
     @Override
     public void updatePreviousBusinessUser(String formInstId, String previousBusinessUserId, String previousBusinessGroup) throws Exception {
         /*
@@ -2169,6 +2223,8 @@ public class YidaServiceImpl implements YidaService {
         Map<String,String> customerRecord;  //客户记录
         Map<String, Long> customerNameCountMap = new HashMap<>();   //客户名称与出现的次数映射
         String formInstId;  //表单实例ID
+        String customerCurrentLevel;    //当下客户等级
+        String customerPotentialLevel;    //客户未来等级
 
         /*
             EASTAR业务数字化
@@ -2232,6 +2288,8 @@ public class YidaServiceImpl implements YidaService {
             isKpEmpty = false;
             isBusinessUserMulti = false;
             isKpMulti = false;
+            customerCurrentLevel = "";
+            customerPotentialLevel = "";
 
             //解析字段数据
             fields = JSONObject.parseObject(JSONObject.toJSONString(allRecords.get(i).get("formData")));
@@ -2351,6 +2409,38 @@ public class YidaServiceImpl implements YidaService {
             }
              */
 
+            //当下客户等级
+            if(fields.get("selectField_lfjg60xr") != null){
+                customerCurrentLevel = fields.getString("selectField_lfjg60xr");
+                if(
+                        "A".equals(customerCurrentLevel)
+                                ||"B".equals(customerCurrentLevel)
+                                ||"C".equals(customerCurrentLevel)
+                                ||"D".equals(customerCurrentLevel)
+                                ||"E".equals(customerCurrentLevel)
+                ){
+                    //不变
+                }else{
+                    customerCurrentLevel = "";
+                }
+            }
+
+            //客户未来等级
+            if(fields.get("selectField_lxj3f00s") != null){
+                customerPotentialLevel = fields.getString("selectField_lxj3f00s");
+                if(
+                        "潜在A".equals(customerPotentialLevel)
+                                ||"潜在B".equals(customerPotentialLevel)
+                                ||"潜在C".equals(customerPotentialLevel)
+                                ||"潜在D".equals(customerPotentialLevel)
+                                ||"保稳E".equals(customerPotentialLevel)
+                ){
+                    customerPotentialLevel = customerPotentialLevel.replace("潜在","潜");
+                }else{
+                    customerPotentialLevel = "";
+                }
+            }
+
             /*
                 汇总客户数据
              */
@@ -2358,6 +2448,8 @@ public class YidaServiceImpl implements YidaService {
             customerRecord.put("customerName",customerName);
             customerRecord.put("businessUserName",businessUserName);
             customerRecord.put("businessUserId",businessUserId);
+            customerRecord.put("customerCurrentLevel",customerCurrentLevel);
+            customerRecord.put("customerPotentialLevel",customerPotentialLevel);
 //            customerRecord.put("kp",kp);
 //            System.out.println(JSONObject.toJSONString(customerRecord));
             customerData.add(customerRecord);