Browse Source

调整私海客户流出定时任务、更新新增客户同步AI表格接口

lvjs 2 months ago
parent
commit
234c74beb3

+ 3 - 0
src/main/java/com/malk/eastar/conf/EastarParam.java

@@ -20,6 +20,9 @@ public class EastarParam {
 
     public static String YD_FORMUUID_CUSTOMER = "FORM-9261FABA687B4D1D917617F53B4A5DB7UN16";    //客户,add by Jason 20260414
     public static String YD_FORMUUID_BUSINESS_USER = "FORM-C940C08329AA47A5814001E52F1665F3XV4P";    //业务小组档案,add by Jason 20260414
+    public static String YD_FORMUUID_CUSTOMER_CONTACT = "FORM-F2217E70844B4836833AB97C56C27BDFRI4Y";    //客户跟进,add by Jason 20260522
+    public static String YD_FORMUUID_ALERT_LOG = "FORM-49E10E54526E42B0925D0C809F4BF5DA8W4S";    //私海客户流出告警日志,add by Jason 20260522
+    public static String YD_FORMUUID_ALERT_DETAIL = "FORM-AAA9AD76E53246B89356B09DEE5262552ZA0";    //私海客户流出风险提示,add by Jason 20260522
 
     static {
         CUSTFIELD_ACCE.put("配件名","textField_me2f7tvo");

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

@@ -141,7 +141,8 @@ public class AitableController {
         String yidaOrderCompletionRate = UtilMap.getString(data, "yidaOrderCompletionRate"); //成单情况
         String yidaEstimatedOrderDate = UtilMap.getString(data, "yidaEstimatedOrderDate"); //预计成单日期
         String yidaOrderAmount = UtilMap.getString(data, "yidaOrderAmount"); //预计项目金额
-        String yidaCustomerName = UtilMap.getString(data, "yidaCustomerName");  //客户
+        String aiTableCustomerID = UtilMap.getString(data, "aiTableCustomerID");    //客户AI表格映射ID
+        String yidaCustomerName = UtilMap.getString(data, "yidaCustomerName");  //客户公司名
         String yidaBusinessUserId = UtilMap.getString(data, "yidaBusinessUserId");  //业务
         Map<String,Object> fields = new HashMap<>();
         try {
@@ -151,7 +152,7 @@ public class AitableController {
             fields.put("m34IbuX",Long.parseLong(yidaEstimatedOrderDate));  //预计成单日期 - S1~2【商机进度】
             fields.put("MYBeHPG",yidaOrderAmount);  //订单金额 - S2~3【销售数据】
             JSONObject bidirectionalLink = new JSONObject();
-            String[] linkedRecordIds = new String[]{aitableService.querySys1CustomerIdByName(yidaCustomerName)};
+            String[] linkedRecordIds = new String[]{aiTableCustomerID};
             bidirectionalLink.put("linkedRecordIds",linkedRecordIds);
             fields.put("F7zdGI6",bidirectionalLink);  //客户公司名 - S1【基础】
             JSONArray user = new JSONArray();

+ 95 - 18
src/main/java/com/malk/eastar/schedule/ScheduleTask.java

@@ -7,6 +7,7 @@ import com.malk.eastar.model.AITableParam;
 import com.malk.eastar.model.AITableResult;
 import com.malk.eastar.service.MDTableClient;
 import com.malk.eastar.service.EastarTbService;
+import com.malk.eastar.service.YidaService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDSearch;
@@ -48,30 +49,106 @@ public class ScheduleTask {
     private MDTableClient mdTableClient;
     //add by Jason 20260313 end
 
+    //add by Jason 20260522 start
+    @Autowired
+    private YidaService yidaService;
+    //add by Jason 20260522 end
+
+
     /**
-     * 客户私海流出
+     * 私海客户流出
      */
-//    @Scheduled(cron = "0 0 8 * * ?")
-    public void syncMer() {
-        log.info("客户公海同步");
+    @Scheduled(cron = "0 0 5 * * ?")
+    public void releasePrivatePoolCustomers() {
+        log.info("私海客户流出定时任务");
         try {
-            long endTime= UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().minusDays(30).atTime(LocalTime.MIN));
-            List<Map> list= (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-9261FABA687B4D1D917617F53B4A5DB7UN16").searchCondition(JSONObject.toJSONString(
-                    Arrays.asList(
-                            new YDSearch("radioField_md6q7oxa","私","公私海", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ),
-                            new YDSearch("radioField_md6q7ox8","新","新老客户", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ),
-                            new YDSearch("dateField_l3tw3kfn",endTime,"截至跟进时间",YDSearch.Type.DATE_FIELD,YDSearch.Operator.LT)
-                    )
-            )).build(), YDConf.FORM_QUERY.retrieve_list).getData();
-            for(Map map:list){
-                log.info("客户:{}释放为公海", UtilMap.getMap(map,"formData").get("textField_lqanqe6j"));
-                ydClient.operateData(YDParam.builder().formInstId(UtilMap.getString(map,"formInstanceId")).updateFormDataJson(
-                        JSONObject.toJSONString(UtilMap.map("radioField_md6q7oxa, employeeField_lqanqe6n, employeeField_lqx3act6","公","[]","[]"))
-                ).build(), YDConf.FORM_OPERATION.update);
+            //查询所有已建联客户跟进记录
+            List<Map> establishContactData = yidaService.queryLtcCustomerEstablishContactData();
+            log.info("已建联跟进记录数:"+ establishContactData.size());
+
+            //查询超过3天未跟进的私海新客户记录
+            long endTime = UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().minusDays(3).atTime(LocalTime.MIN));
+            List ydFilters = Arrays.asList(
+//                    new YDSearch("radioField_mnpdkss9","否","测试使用", YDSearch.Type.RADIO_FIELD,YDSearch.Operator.EQ),
+                    new YDSearch("radioField_md6q7oxa","私","公海or私海", YDSearch.Type.RADIO_FIELD,YDSearch.Operator.EQ),
+                    new YDSearch("radioField_md6q7ox8","新","新老客户", YDSearch.Type.RADIO_FIELD,YDSearch.Operator.EQ),
+                    new YDSearch("dateField_l3tw3kfn",endTime,"最后跟进时间",YDSearch.Type.DATE_FIELD,YDSearch.Operator.LT)
+            );
+            List<Map> ltcCustomerData = yidaService.queryLtcNotFollowedCustomerData(ydFilters);
+            log.info("超过3天未跟进的私海新客户记录数:"+ ltcCustomerData.size());
+            
+            //排除已建联
+            Set<String> contactedCustomerCodes = new HashSet<>();
+            for(Map contactRecord : establishContactData){
+                String customerCode = UtilMap.getString(contactRecord, "customerCode");
+                if(StringUtils.isNotEmpty(customerCode)){
+                    contactedCustomerCodes.add(customerCode);
+                }
+            }
+            List<Map> filteredCustomerData = new ArrayList<>();
+            for(Map customerRecord : ltcCustomerData){
+                String customerCode = UtilMap.getString(customerRecord, "customerCode");
+                if(!contactedCustomerCodes.contains(customerCode)){
+                    filteredCustomerData.add(customerRecord);
+                }
             }
+            log.info("排除已建联后的记录数:"+ filteredCustomerData.size());
+            Map alertDetailRecord;
+            for (Map customerRecord : filteredCustomerData) {
+                alertDetailRecord = new HashMap();
+                alertDetailRecord.put("businessUserId",UtilMap.getString(customerRecord, "userId"));
+                alertDetailRecord.put("formInstId",UtilMap.getString(customerRecord, "formInstId"));
+                alertDetailRecord.put("customerName",UtilMap.getString(customerRecord, "customerName"));
+                alertDetailRecord.put("customerCode",UtilMap.getString(customerRecord, "customerCode"));
+                alertDetailRecord.put("today", UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().atStartOfDay()));
+//                alertDetailRecord.put("tomorrow", UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().plusDays(1).atStartOfDay()));
+                alertDetailRecord.put("remark","私海,新客户,未建联,超过3天未跟进");
+                yidaService.addAlertDetail(alertDetailRecord);
+            }
+
+            //按业务员分组,统计客户数量
+            Map<String, List<Map>> customerGroupBySales = new HashMap<>();
+            for (Map customerRecord : filteredCustomerData) {
+                String salesPerson = UtilMap.getString(customerRecord, "userId");
+                if (StringUtils.isEmpty(salesPerson)) {
+                    salesPerson = "未知业务员";
+                }
+                customerGroupBySales.computeIfAbsent(salesPerson, k -> new ArrayList<>()).add(customerRecord);
+            }
+            Map alertLogRecord;
+            for (Map.Entry<String, List<Map>> entry : customerGroupBySales.entrySet()) {
+                log.info("业务员: {}, 可能会流出客户数量: {}", entry.getKey(), entry.getValue().size());
+                //新增私海客户流出告警日志
+                alertLogRecord = new HashMap();
+                alertLogRecord.put("businessUserId",entry.getKey());
+                alertLogRecord.put("customerNum",entry.getValue().size());
+                alertLogRecord.put("today", UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().atStartOfDay()));
+                yidaService.addAlertLog(alertLogRecord);
+            }
+
+
+
+            //查询超过30天未跟进的私海新客户记录
+
+
+//            long endTime= UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().minusDays(30).atTime(LocalTime.MIN));
+//            List<Map> list= (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-9261FABA687B4D1D917617F53B4A5DB7UN16").searchCondition(JSONObject.toJSONString(
+//                    Arrays.asList(
+//                            new YDSearch("radioField_md6q7oxa","私","公私海", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ),
+//                            new YDSearch("radioField_md6q7ox8","新","新老客户", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ),
+//                            new YDSearch("dateField_l3tw3kfn",endTime,"截至跟进时间",YDSearch.Type.DATE_FIELD,YDSearch.Operator.LT)
+//                    )
+//            )).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+//            for(Map map:list){
+//                log.info("客户:{}释放为公海", UtilMap.getMap(map,"formData").get("textField_lqanqe6j"));
+//                ydClient.operateData(YDParam.builder().formInstId(UtilMap.getString(map,"formInstanceId")).updateFormDataJson(
+//                        JSONObject.toJSONString(UtilMap.map("radioField_md6q7oxa, employeeField_lqanqe6n, employeeField_lqx3act6","公","[]","[]"))
+//                ).build(), YDConf.FORM_OPERATION.update);
+//            }
         }catch (Exception e){
-            e.printStackTrace();
+            log.error("私海客户流出定时任务异常",e);
         }
+        log.info("私海客户流出定时任务执行完成");
     }
 
     /**

+ 22 - 0
src/main/java/com/malk/eastar/service/YidaService.java

@@ -40,6 +40,18 @@ public interface YidaService {
      */
     List<Map> queryLtcAllCustomerData() throws Exception;
 
+    /**
+     * 获取易思达系统中的未跟进客户
+     */
+    List<Map> queryLtcNotFollowedCustomerData(List ydFilters) throws Exception;
+
+
+    /**
+     * 获取易思达系统中的客户建联跟进记录
+     */
+    List<Map> queryLtcCustomerEstablishContactData() throws Exception;
+
+
     /**
      * 更新易思达系统客户测试使用标识(客户名册)
      */
@@ -100,6 +112,16 @@ public interface YidaService {
      */
     void insertCustomerData(Map row) throws Exception;
 
+    /**
+     * 插入易思达系统中的一行记录(私海客户流出风险提示)
+     */
+    void addAlertDetail(Map row) throws Exception;
+
+    /**
+     * 插入易思达系统中的一行记录(私海客户流出告警日志)
+     */
+    void addAlertLog(Map row) throws Exception;
+
     /**
      * 获取EASTAR业务数字化中的多行记录(客户名册)
      * @return

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

@@ -990,6 +990,205 @@ public class YidaServiceImpl implements YidaService {
         return ltcCustomerData;
     }
 
+    @Override
+    public List<Map> queryLtcNotFollowedCustomerData(List ydFilters) throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> ltcCustomerData = new ArrayList<>();
+        String searchCondition; //检索条件
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        DDR_New yidaResult; //请求返回内容
+        List<Map> records;  //每页记录数据
+        List<Map> allRecords = new ArrayList<>();  //所有记录数据
+        boolean hasMore; //是否还有下一页
+        int pageNo; //当前页码
+        int pageSize;   //每页获取的数据量(上限100)
+        JSONObject fields;  //字段数据
+        String formInstId;  //表单实例ID
+        Map customerRecord;  //客户记录
+        String customerCode;    //客户编号
+        String customerName;    //客户名称
+        JSONArray businessUserIdJSONArray;  //业务员字段值
+        String userId;  //业务员userId
+
+
+        /*
+            初始化参数值
+         */
+        searchCondition = JSONObject.toJSONString(ydFilters);
+        hasMore = true; //第一页默认有数据
+        pageNo = 1;
+        pageSize = 100;
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formUuid(EastarParam.YD_FORMUUID_CUSTOMER);
+        ydParamBuilder = ydParamBuilder.searchCondition(searchCondition);
+
+        /*
+            翻页获取数据
+         */
+        while(hasMore){
+            ydParamBuilder = ydParamBuilder.pageNumber(pageNo);
+            ydParamBuilder = ydParamBuilder.pageSize(pageSize);
+            yidaParam = ydParamBuilder.build();
+            yidaResult = ydClient.queryData(yidaParam,YDConf.FORM_QUERY.retrieve_list);
+            log.info("当前第"+pageNo+"页");
+            records = (List<Map>) yidaResult.getData();
+            log.info("记录数="+records.size());
+            for (Map record : records){
+                allRecords.add(record);
+            }
+            if((pageNo*pageSize) < yidaResult.getTotalCount()){
+                pageNo++;
+            }else{
+                hasMore = false;
+            }
+            log.info("是否有更多数据:"+hasMore);
+            Thread.sleep(3000);
+        }
+
+        /*
+            请求记录数据处理
+         */
+        log.info("所有记录数量="+allRecords.size());
+        for (Map ltcCustomerRecord : allRecords){
+            userId = "";
+
+            //获取表单实例ID
+            formInstId = String.valueOf(ltcCustomerRecord.get("formInstanceId"));
+
+            //解析字段数据
+            fields = JSONObject.parseObject(JSONObject.toJSONString(ltcCustomerRecord.get("formData")));
+
+            customerCode = fields.getString("serialNumberField_lqanqe6i");
+            customerName = fields.getString("textField_lqanqe6j");
+
+            /*
+                获取成员数据
+             */
+            if(fields.get("employeeField_lqanqe6n_id") != null){
+                businessUserIdJSONArray = fields.getJSONArray("employeeField_lqanqe6n_id");
+                if(!businessUserIdJSONArray.isEmpty()){
+                    userId = String.valueOf(businessUserIdJSONArray.get(0));
+                }
+            }
+
+            //生成客户数据
+            customerRecord = UtilMap.map(
+                    "formInstId, customerCode, customerName, userId",
+                    formInstId, //表单实例ID
+                    customerCode, //客户编号
+                    customerName, //客户公司名(英文名)
+                    userId  //业务员userId
+            );
+            ltcCustomerData.add(customerRecord);
+        }
+
+        return ltcCustomerData;
+    }
+
+    @Override
+    public List<Map> queryLtcCustomerEstablishContactData() throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> establishContactData = new ArrayList<>();
+        YDSearch ydSearch; //检索条件(单个)
+        String searchCondition; //检索条件
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        DDR_New yidaResult; //请求返回内容
+        List<Map> records;  //每页记录数据
+        List<Map> allRecords = new ArrayList<>();  //所有记录数据
+        boolean hasMore; //是否还有下一页
+        int pageNo; //当前页码
+        int pageSize;   //每页获取的数据量(上限100)
+        JSONObject fields;  //字段数据
+        String formInstId;  //表单实例ID
+        Map establishContactRecord;  //客户建联跟进记录
+        String customerCode;    //客户编号
+        JSONArray businessUserIdJSONArray;  //跟进人字段值
+        String userId;    //业务员userId
+
+        /*
+            初始化参数值
+         */
+        ydSearch = new YDSearch(
+                "radioField_mo2p26sg",
+                "是",
+                "是否已建立联系",
+                YDSearch.Type.RADIO_FIELD,
+                YDSearch.Operator.EQ
+        );
+        searchCondition = JSONObject.toJSONString(Arrays.asList(ydSearch));
+        hasMore = true; //第一页默认有数据
+        pageNo = 1;
+        pageSize = 100;
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formUuid(EastarParam.YD_FORMUUID_CUSTOMER_CONTACT);
+        ydParamBuilder = ydParamBuilder.searchCondition(searchCondition);
+
+        /*
+            翻页获取数据
+         */
+        while(hasMore){
+            ydParamBuilder = ydParamBuilder.pageNumber(pageNo);
+            ydParamBuilder = ydParamBuilder.pageSize(pageSize);
+            yidaParam = ydParamBuilder.build();
+            yidaResult = ydClient.queryData(yidaParam,YDConf.FORM_QUERY.retrieve_list);
+            log.info("当前第"+pageNo+"页");
+            records = (List<Map>) yidaResult.getData();
+            log.info("记录数="+records.size());
+            for (Map record : records){
+                allRecords.add(record);
+            }
+            if((pageNo*pageSize) < yidaResult.getTotalCount()){
+                pageNo++;
+            }else{
+                hasMore = false;
+            }
+            log.info("是否有更多数据:"+hasMore);
+            Thread.sleep(3000);
+        }
+
+
+        /*
+            请求记录数据处理
+         */
+        log.info("所有记录数量="+allRecords.size());
+        for (Map record : allRecords){
+            customerCode = "";
+            userId = "";
+
+            //解析字段数据
+            fields = JSONObject.parseObject(JSONObject.toJSONString(record.get("formData")));
+
+            //获取客户编号
+            customerCode = fields.getString("textField_lqgni3ps");
+
+            /*
+                获取业务员userId
+             */
+            if(fields.get("employeeField_lqbo4rw3_id") != null){
+                businessUserIdJSONArray = fields.getJSONArray("employeeField_lqbo4rw3_id");
+                if(!businessUserIdJSONArray.isEmpty()){
+                    userId = String.valueOf(businessUserIdJSONArray.get(0));
+                }
+            }
+
+            //添加客户建联跟进记录
+            establishContactRecord = UtilMap.map(
+                    "customerCode, userId",
+                    customerCode, //客户编号
+                    userId  //业务员userId
+            );
+            establishContactData.add(establishContactRecord);
+        }
+
+        return establishContactData;
+    }
+
     @Override
     public void updateLtcCustomerTestFlag(String formInstId) throws Exception {
         /*
@@ -1380,6 +1579,76 @@ public class YidaServiceImpl implements YidaService {
         System.out.println("新增一条客户记录");
     }
 
+    @Override
+    public void addAlertDetail(Map row) throws Exception {
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+
+        String[] businessUserIdArr = new String[]{};
+        if(row.get("businessUserId")!=null){
+            businessUserIdArr = new String[]{row.get("businessUserId").toString()};
+        }
+
+        List customerField = new ArrayList();
+        Map customerFieldVal = new HashMap();
+        customerFieldVal.put("appType","APP_GM7D1NW6XCD0ZJBPVH51");
+        customerFieldVal.put("formUuid","FORM-9261FABA687B4D1D917617F53B4A5DB7UN16"); //客户
+        customerFieldVal.put("formType","receipt");
+        customerFieldVal.put("instanceId",row.get("formInstId"));
+        customerFieldVal.put("title",row.get("customerName"));
+        customerFieldVal.put("subTitle",row.get("customerCode"));
+        customerField.add(customerFieldVal);
+
+        Map alertLogRecord = UtilMap.map(
+                "employeeField_mpf2mxcc, " //业务员
+                        +"associationFormField_mpf2mxcb, " //客户
+                        +"textareaField_mpghcehk, " //备注
+                        +"dateField_mpf2mxcd", //提醒日期
+                businessUserIdArr,
+                customerField,
+                row.get("remark"),
+                row.get("today")
+        );
+        String insertFormDataJson = JSONObject.toJSONString(alertLogRecord);
+        System.out.println(insertFormDataJson);
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formUuid(EastarParam.YD_FORMUUID_ALERT_DETAIL);
+        ydParamBuilder = ydParamBuilder.formDataJson(insertFormDataJson);
+        yidaParam = ydParamBuilder.build();
+        ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.create);
+        log.info("新增一条私海客户流出风险提示记录");
+        Thread.sleep(1000);
+    }
+
+    @Override
+    public void addAlertLog(Map row) throws Exception {
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+
+        String[] businessUserIdArr = new String[]{};
+        if(row.get("businessUserId")!=null){
+            businessUserIdArr = new String[]{row.get("businessUserId").toString()};
+        }
+
+        Map alertLogRecord = UtilMap.map(
+                "employeeField_mpgmbad0, " //业务员
+                        +"numberField_mpgmbad2, " //超过3天未跟进客户数量
+                        +"dateField_mpgmbad3", //发布日期
+                businessUserIdArr,
+                row.get("customerNum"),
+                row.get("today")
+        );
+        String insertFormDataJson = JSONObject.toJSONString(alertLogRecord);
+        System.out.println(insertFormDataJson);
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formUuid(EastarParam.YD_FORMUUID_ALERT_LOG);
+        ydParamBuilder = ydParamBuilder.formDataJson(insertFormDataJson);
+        yidaParam = ydParamBuilder.build();
+        ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.create);
+        log.info("新增一条私海客户流出告警日志记录");
+        Thread.sleep(3000);
+    }
+
     @Override
     public List<Map> querySys2CustomerData() throws Exception {
         /*