Quellcode durchsuchen

客户数据清洗、自动更新业务在职状态

lvjs vor 3 Wochen
Ursprung
Commit
3daaaf1463

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

@@ -18,6 +18,8 @@ public class EastarParam {
 
     public static String TB_PROJECT_TEMP="68d49cdbd17a8ab739a424ce";
 
+    public static String YD_FORMUUID_BUSINESS_USER = "FORM-C940C08329AA47A5814001E52F1665F3XV4P";    //业务小组档案,add by Jason 20260414
+
     static {
         CUSTFIELD_ACCE.put("配件名","textField_me2f7tvo");
         CUSTFIELD_ACCE.put("系列名称","selectField_me2f7tw4");

+ 6 - 7
src/main/java/com/malk/eastar/schedule/ScheduleTask.java

@@ -1,12 +1,11 @@
 package com.malk.eastar.schedule;
 
 import cn.hutool.core.date.DateUtil;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.eastar.model.AITableParam;
 import com.malk.eastar.model.AITableResult;
-import com.malk.eastar.service.AITableClient;
+import com.malk.eastar.service.MDTableClient;
 import com.malk.eastar.service.EastarTbService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
@@ -46,7 +45,7 @@ public class ScheduleTask {
 
     //add by Jason 20260313 start
     @Autowired
-    private AITableClient aiTableClient;
+    private MDTableClient mdTableClient;
     //add by Jason 20260313 end
 
     /**
@@ -162,7 +161,7 @@ public class ScheduleTask {
         JSONArray records;
         log.info("查询【表2】项目台账所有项目状态为Pending、Done、Closed的记录");
         while(hasMore){
-            aiTableResult = aiTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
+            aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
             hasMore = aiTableResult.getHasMore();
             log.info("当前第"+pageNo+"页");
             log.info("记录数="+aiTableResult.getRecords().size());
@@ -234,7 +233,7 @@ public class ScheduleTask {
         filter.put("conditions",conditions);
         aiTableParam.setFilter(filter);
         log.info("查询【参数表-人事】部门为销售部、客服部的记录");
-        aiTableResult = aiTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
+        aiTableResult = mdTableClient.queryMultiRecords(baseId,sheetIdOrName,param,aiTableParam);
         hasMore = aiTableResult.getHasMore();
         log.info("是否有更多数据:"+hasMore);
         log.info("销售和PM人员记录数="+aiTableResult.getRecords().size());
@@ -308,7 +307,7 @@ public class ScheduleTask {
                 }
                 insertData.put("records",newInsertRecords);
 //                log.info(JSON.toJSONString(insertData));
-                result = aiTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
+                result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
                 log.info("新增项目台账填写情况表记录结果,第"+pageNo+"页:");
                 log.info(result);
                 insertRecords = records;
@@ -319,7 +318,7 @@ public class ScheduleTask {
             insertData.put("records",insertRecords);
 //            log.info(JSON.toJSONString(insertData));
             sheetIdOrName = "OTgxt4G";
-            result = aiTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
+            result = mdTableClient.createMultiRecords(baseId,sheetIdOrName,param,insertData);
             log.info("新增项目台账填写情况表记录结果,第"+pageNo+"页:");
             log.info(result);
         }

+ 272 - 1
src/main/java/com/malk/eastar/schedule/ScheduleTaskNew.java

@@ -1,11 +1,19 @@
 package com.malk.eastar.schedule;
 
+import cn.hutool.core.date.DateUtil;
+import com.malk.eastar.service.AitableService;
+import com.malk.eastar.service.DDCoreClient;
+import com.malk.eastar.service.YidaService;
+import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 
+import java.util.*;
+
 /**
  * 新的定时任务
  */
@@ -15,13 +23,276 @@ import org.springframework.scheduling.annotation.Scheduled;
 @ConditionalOnProperty(name = {"enable.scheduling"})
 public class ScheduleTaskNew {
 
+    @Autowired
+    private DDCoreClient ddCoreClient;
+
+    @Autowired
+    private AitableService aitableService;
+
+    @Autowired
+    private YidaService yidaService;
+
+
 
     /**
      * 更新员工在职情况
      */
-    @Scheduled(cron = "0 55 16 * * ?")
+    @Scheduled(cron = "0 0 8 * * ?")
     public void updateEmployeeStatus() {
         log.info("更新员工在职情况");
+        try {
+            /*
+                查询业务小组档案中的成员信息
+             */
+            List<Map> ltcBusinessUserData = new ArrayList<>();
+            try {
+                ltcBusinessUserData = yidaService.queryLtcBusinessUserData();
+            } catch (Exception e) {
+                log.error("查询业务小组档案中的成员信息异常",e);
+            }
+
+            /*
+                查询最近一周的离职人员
+             */
+            List<Map<String, String>> leaveEmployeeData = new ArrayList<>();
+            try {
+                Date startTime = DateUtil.lastWeek();
+                Date endTime = DateUtil.yesterday();
+                leaveEmployeeData = ddCoreClient.getLeaveEmployeeData(startTime, endTime);
+            } catch (Exception e) {
+                log.error("查询业务小组档案中的成员信息异常",e);
+            }
+
+            /*
+                业务员已离职,更新状态
+             */
+            if(!leaveEmployeeData.isEmpty()){
+                for (Map bu : ltcBusinessUserData){
+                    for (int i = 0; i < leaveEmployeeData.size(); i++) {
+                        if(UtilMap.getString(bu, "userId").equals(UtilMap.getString(leaveEmployeeData.get(i), "userId"))){
+                            yidaService.setLtcBusinessUserLeave(UtilMap.getString(bu, "formInstId"));
+                            break;
+                        }
+                    }
+                }
+            }
+
+
+        } catch (Exception e) {
+            log.error("更新员工在职情况异常",e);
+        }
+    }
+
+
+    /**
+     * 客户数据清洗
+     */
+//    @Scheduled(cron = "0 35 18 * * ?")
+    public void cleanCustomerData() {
+        /*
+            从项目总表(系统1)获取客户数据
+         */
+        List<Map> sys1CustomerData = new ArrayList<>(); // 项目总表客户数据
+        try {
+            sys1CustomerData = aitableService.querySys1CustomerData();
+            log.info("参与比对的项目总表客户数量="+sys1CustomerData.size());
+        } catch (Exception e) {
+            log.error("查询项目总表客户数据异常",e);
+        }
+
+        /*
+            汇总业务员unionId,一一找到对应的业务员userId
+         */
+        Map<String,String> unionIdUserIdMap = new HashMap<>();
+        String businessUserUnionId;
+        String businessUserId;
+        for (Map<String, String> record : sys1CustomerData) {
+            businessUserUnionId = record.get("businessUserUnionId");
+            if (businessUserUnionId != null && !businessUserUnionId.isEmpty()) {
+                unionIdUserIdMap.put(businessUserUnionId, "");
+            }
+        }
+        for (Map.Entry<String, String> entry : unionIdUserIdMap.entrySet()) {
+            businessUserUnionId = entry.getKey();
+            try {
+                businessUserId = ddCoreClient.getUserIdByUnionId(businessUserUnionId);
+                if(businessUserId.isEmpty()){
+                    throw new RuntimeException("businessUserUserId为空");
+                }
+                unionIdUserIdMap.put(businessUserUnionId,businessUserId);
+            } catch (Exception e) {
+//                log.error("获取业务员unionId["+businessUserUnionId+"]对应的userId异常",e);
+                log.error("没有找到业务员unionId["+businessUserUnionId+"]对应的userId");
+            }
+        }
+        for (Map<String, String> record : sys1CustomerData) {
+            businessUserUnionId = record.get("businessUserUnionId");
+            if (businessUserUnionId != null && !businessUserUnionId.isEmpty()) {
+                record.put("businessUserId",unionIdUserIdMap.get(businessUserUnionId));
+            }
+        }
+
+        /*
+            从EASTAR业务数字化(系统2)获取客户数据
+         */
+        List<Map> sys2CustomerData = new ArrayList<>(); // EASTAR业务数字化客户数据
+        try {
+            sys2CustomerData = yidaService.querySys2CustomerData();
+            log.info("参与比对的EASTAR业务数字化客户数量="+sys2CustomerData.size());
+        } catch (Exception e) {
+            log.error("查询EASTAR业务数字化客户数据异常",e);
+        }
+
+        //更新客户数据清洗中的多行记录(客户名册part2)
+//        try {
+//            yidaService.updateSys1Sys2CustomerPart2Data(sys2CustomerData);
+//        } catch (Exception e) {
+//            log.error("更新客户数据清洗中的多行记录(客户名册part2)异常",e);
+//        }
+
+        /*
+            对比两个系统的客户数据,找到系统1独有的客户数据,系统2独有的客户数据,以及系统1和系统2有相同客户名称的客户数据
+         */
+        String customerName;
+        List<String> sys1CustomerNames = new ArrayList<>();
+        for (Map<String, String> record : sys1CustomerData) {
+            customerName = record.get("customerName");
+            if (customerName != null && !customerName.isEmpty()) {
+                sys1CustomerNames.add(customerName);
+            }
+        }
+        List<String> sys2CustomerNames = new ArrayList<>();
+        for (Map<String, String> record : sys2CustomerData) {
+            customerName = record.get("customerName");
+            if (customerName != null && !customerName.isEmpty()) {
+                sys2CustomerNames.add(customerName);
+            }
+        }
+        List<String> onlyInSys1 = new ArrayList<>(sys1CustomerNames);
+        onlyInSys1.removeAll(sys2CustomerNames);
+        List<String> onlyInSys2 = new ArrayList<>(sys2CustomerNames);
+        onlyInSys2.removeAll(sys1CustomerNames);
+        List<String> inBothSys = new ArrayList<>(sys1CustomerNames);
+        inBothSys.retainAll(sys2CustomerNames);
+        log.info("系统1独有客户数量: {}", onlyInSys1.size());
+        log.info("系统2独有客户数量: {}", onlyInSys2.size());
+        log.info("两个系统共有客户数量: {}", inBothSys.size());
+
+
+        /*
+            合并两个系统的客户数据
+         */
+        List<Map> sys1Sys2CustomerData = new ArrayList<>();
+        Map<String,String> sys1Sys2CustomerRecord;
+        Map tempCustomerRecord;
+        String sys1BusinessUserName;
+        String sys2BusinessUserName;
+        String sys1unionid;
+        String sys1userid;
+        String sys2userid;
+        boolean isAnyDifference;    //是否有差异
+        for(String customerNameInBothSys : inBothSys){  //遍历两个系统共有客户
+            sys1BusinessUserName = "";
+            sys2BusinessUserName = "";
+            sys1unionid = "";
+            sys1userid = "";
+            sys2userid = "";
+            for (int i = 0; i < sys1CustomerData.size(); i++) {
+                if(customerNameInBothSys.equals(sys1CustomerData.get(i).get("customerName"))){
+                    tempCustomerRecord = sys1CustomerData.get(i);
+                    sys1BusinessUserName = tempCustomerRecord.get("businessUserName")==null?"":tempCustomerRecord.get("businessUserName").toString();
+                    sys1unionid = tempCustomerRecord.get("businessUserUnionId")==null?"":tempCustomerRecord.get("businessUserUnionId").toString();
+                    sys1userid = tempCustomerRecord.get("businessUserId")==null?"":tempCustomerRecord.get("businessUserId").toString();
+                    break;
+                }
+            }
+            for (int i = 0; i < sys2CustomerData.size(); i++) {
+                if (customerNameInBothSys.equals(sys2CustomerData.get(i).get("customerName"))){
+                    tempCustomerRecord = sys2CustomerData.get(i);
+                    sys2BusinessUserName = tempCustomerRecord.get("businessUserName")==null?"":tempCustomerRecord.get("businessUserName").toString();
+                    sys2userid = tempCustomerRecord.get("businessUserId")==null?"":tempCustomerRecord.get("businessUserId").toString();
+                    break;
+                }
+            }
+            if (!sys1userid.isEmpty() && !sys2userid.isEmpty()){
+                if(sys1userid.equals(sys2userid)){
+                    //两个系统用户id都非空,且无差异
+                    isAnyDifference = false;
+                }else{
+                    //两个系统用户id都非空,且有差异
+                    isAnyDifference = true;
+                }
+            }else if(sys1userid.isEmpty() && sys2userid.isEmpty()){
+                //两个系统用户id都为空,没有差异
+                isAnyDifference = false;
+            }else{
+                //一个系统用户id为空,一个系统用户id不为空,有差异
+                isAnyDifference = true;
+            }
+            sys1Sys2CustomerRecord = new HashMap<>();
+            sys1Sys2CustomerRecord.put("customerName",customerNameInBothSys);
+            sys1Sys2CustomerRecord.put("sys1BusinessUserName",sys1BusinessUserName);
+            sys1Sys2CustomerRecord.put("sys2BusinessUserName",sys2BusinessUserName);
+            sys1Sys2CustomerRecord.put("sys1unionid",sys1unionid);
+            sys1Sys2CustomerRecord.put("sys1userid",sys1userid);
+            sys1Sys2CustomerRecord.put("sys2userid",sys2userid);
+            sys1Sys2CustomerRecord.put("isAnyDifference", isAnyDifference ?"是":"否");
+            sys1Sys2CustomerRecord.put("source", "系统1和系统2共有客户");
+            sys1Sys2CustomerData.add(sys1Sys2CustomerRecord);
+        }
+        for(String customerNameInSys1 : onlyInSys1){  //遍历系统1独有客户
+            sys1BusinessUserName = "";
+            sys1unionid = "";
+            sys1userid = "";
+            for (int i = 0; i < sys1CustomerData.size(); i++) {
+                if(customerNameInSys1.equals(sys1CustomerData.get(i).get("customerName"))){
+                    tempCustomerRecord = sys1CustomerData.get(i);
+                    sys1BusinessUserName = tempCustomerRecord.get("businessUserName")==null?"":tempCustomerRecord.get("businessUserName").toString();
+                    sys1unionid = tempCustomerRecord.get("businessUserUnionId")==null?"":tempCustomerRecord.get("businessUserUnionId").toString();
+                    sys1userid = tempCustomerRecord.get("businessUserId")==null?"":tempCustomerRecord.get("businessUserId").toString();
+                    break;
+                }
+            }
+            sys1Sys2CustomerRecord = new HashMap<>();
+            sys1Sys2CustomerRecord.put("customerName",customerNameInSys1);
+            sys1Sys2CustomerRecord.put("sys1BusinessUserName",sys1BusinessUserName);
+            sys1Sys2CustomerRecord.put("sys1unionid",sys1unionid);
+            sys1Sys2CustomerRecord.put("sys1userid",sys1userid);
+            sys1Sys2CustomerRecord.put("isAnyDifference", "否");
+            sys1Sys2CustomerRecord.put("source", "项目总表(系统1)独有客户");
+            sys1Sys2CustomerData.add(sys1Sys2CustomerRecord);
+        }
+        for (String customerNameInSys2 : onlyInSys2){  //遍历系统2独有客户
+            sys2BusinessUserName = "";
+            sys2userid = "";
+            for (int i = 0; i < sys2CustomerData.size(); i++) {
+                if(customerNameInSys2.equals(sys2CustomerData.get(i).get("customerName"))){
+                    tempCustomerRecord = sys2CustomerData.get(i);
+                    sys2BusinessUserName = tempCustomerRecord.get("businessUserName")==null?"":tempCustomerRecord.get("businessUserName").toString();
+                    sys2userid = tempCustomerRecord.get("businessUserId")==null?"":tempCustomerRecord.get("businessUserId").toString();
+                    break;
+                }
+            }
+            sys1Sys2CustomerRecord = new HashMap<>();
+            sys1Sys2CustomerRecord.put("customerName",customerNameInSys2);
+            sys1Sys2CustomerRecord.put("sys2BusinessUserName",sys2BusinessUserName);
+            sys1Sys2CustomerRecord.put("sys2userid",sys2userid);
+            sys1Sys2CustomerRecord.put("isAnyDifference", "否");
+            sys1Sys2CustomerRecord.put("source", "Eastar业务数字化(系统2)独有客户");
+            sys1Sys2CustomerData.add(sys1Sys2CustomerRecord);
+        }
+
+
+        /*
+            添加记录到客户数据清洗
+         */
+//        try {
+//            yidaService.insertSys1Sys2CustomerAllData(sys1Sys2CustomerData);
+//        } catch (Exception e) {
+//            log.error("添加记录到客户数据清洗异常",e);
+//        }
+
+        log.info("客户数据清洗完成");
     }
 
 }

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

@@ -0,0 +1,18 @@
+package com.malk.eastar.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 专用于AI表格复杂逻辑处理的接口服务
+ * add by Jason 20260409
+ */
+public interface AitableService {
+    /**
+     * 获取项目总表中的多行记录(客户名册)
+     * @return
+     */
+    List<Map> querySys1CustomerData() throws Exception;
+
+
+}

+ 26 - 0
src/main/java/com/malk/eastar/service/DDCoreClient.java

@@ -0,0 +1,26 @@
+package com.malk.eastar.service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 钉钉核心数据处理客户端接口
+ * add by Jason 20260414
+ */
+public interface DDCoreClient {
+
+    /**
+     * 根据unionId获取userid
+     * @param unionId
+     * @return
+     * @throws Exception
+     */
+    String getUserIdByUnionId(String unionId) throws Exception;
+
+    /**
+     * 查询离职员工数据
+     * @return
+     */
+    List<Map<String, String>> getLeaveEmployeeData(Date startTime, Date endTime) throws Exception;
+}

+ 4 - 2
src/main/java/com/malk/eastar/service/AITableClient.java

@@ -7,10 +7,10 @@ import com.malk.eastar.model.AITableResult;
 import java.util.Map;
 
 /**
- * AI表格数据处理客户端接口
+ * AI表格(多维表 Multi-dimensional Table)数据处理客户端接口
  * add by Jason 20260313
  */
-public interface AITableClient {
+public interface MDTableClient {
 
     /**
      * 查询多行记录
@@ -32,4 +32,6 @@ public interface AITableClient {
      * @return
      */
     String createMultiRecords(String baseId, String sheetIdOrName, Map<String,Object> param, JSONObject body);
+
+
 }

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

@@ -1,5 +1,6 @@
 package com.malk.eastar.service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -22,4 +23,33 @@ public interface YidaService {
      */
     Map createPartsTask(String formInstId);
 
+
+    /**
+     * 获取易思达中的多行记录(业务小组档案)
+     * @return
+     */
+    List<Map> queryLtcBusinessUserData() throws Exception;
+
+    /**
+     * 更新业务人员在职状态为已离职(业务小组档案)
+     */
+    void setLtcBusinessUserLeave(String formInstId) throws Exception;
+
+    /**
+     * 获取EASTAR业务数字化中的多行记录(客户名册)
+     * @return
+     */
+    List<Map> querySys2CustomerData() throws Exception;
+
+    /**
+     * 更新客户数据清洗中的多行记录(客户名册part2)
+     */
+    void updateSys1Sys2CustomerPart2Data(List<Map> sys2CustomerData) throws Exception;
+
+    /**
+     * 插入客户数据清洗中的多行记录(客户名册all)
+     */
+    void insertSys1Sys2CustomerAllData(List<Map> sys1Sys2CustomerData) throws Exception;
+
+
 }

+ 210 - 0
src/main/java/com/malk/eastar/service/impl/AitableServiceImpl.java

@@ -0,0 +1,210 @@
+package com.malk.eastar.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.eastar.model.AITableParam;
+import com.malk.eastar.model.AITableResult;
+import com.malk.eastar.service.MDTableClient;
+import com.malk.eastar.service.AitableService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 专用于AI表格复杂逻辑处理的接口服务
+ * add by Jason 20260409
+ */
+@Slf4j
+@Service
+public class AitableServiceImpl implements AitableService {
+
+    @Autowired
+    private MDTableClient mdTableClient;
+
+    @Override
+    public List<Map> querySys1CustomerData() throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> customerData = new ArrayList<>(); // 客户数据
+        List<Map> customerDataDeduplicate = 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();  //所有记录数据
+        JSONObject fields;  //字段数据
+        String customerName;    //客户名称
+        JSONArray businessUserJSONArray;  //业务【人事】
+        String businessUserUnionId;    //业务员unionId
+        String businessUserName;    //业务员姓名
+        String kp;  //KP
+        boolean isCustomerNameEmpty;    //客户名称是否为空
+        boolean isBusinessUserEmpty;    //业务员是否为空
+        boolean isKpEmpty;  //KP是否为空
+        int customerEmptyCount = 0;  //客户名称为空的记录数
+        Map<String,String> customerRecord;  //客户记录
+        Map<String, Long> customerNameCountMap = new HashMap<>();   //客户名称与出现的次数映射
+
+        /*
+            项目总表副本-20260409
+         */
+        baseId = "GZLxjv9VGqBAMDOoHYzrPZzE86EDybno";
+        sheetIdOrName = "E6RcJi3";
+
+        /*
+            初始化参数值
+         */
+        hasMore = true; //第一页默认有数据
+        pageNo = 1;
+        pageSize = 100;
+        param.put("operatorId","aj1wcWqKLXITiPDwbMIjUbAiEiE");  //操作人(Jason)的unionId
+        aiTableParam.setMaxResults(pageSize);
+
+        /*
+            翻页获取数据
+         */
+        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());
+        customerName = "";
+        businessUserUnionId = "";
+        businessUserName = "";
+        kp = "";
+        for(int i=0;i<allRecords.size();i++){
+            /*
+                重置是否为空标识
+             */
+            isCustomerNameEmpty = false;
+            isBusinessUserEmpty = false;
+            isKpEmpty = false;
+
+            //解析字段数据
+            fields = allRecords.getJSONObject(i).getJSONObject("fields");
+
+            /*
+                获取客户名称数据
+             */
+            if(fields.get("客户公司名【基础】") == null){
+                isCustomerNameEmpty = true;
+            }else{
+                customerName = fields.getString("客户公司名【基础】");
+                customerName = customerName.replace("\n",""); //去除换行符
+                customerName = customerName.trim(); //去除空格
+                if(StringUtils.isEmpty(customerName)){
+                    isCustomerNameEmpty = true;
+                }
+            }
+            if(isCustomerNameEmpty){
+                customerEmptyCount++;
+//                throw new RuntimeException("客户公司名【基础】字段为空");
+                continue;
+            }else{
+//                System.out.println("客户名称="+customerName);
+            }
+
+            /*
+                获取业务员数据
+             */
+            if(fields.get("业务【人事】") == null){
+                isBusinessUserEmpty = true;
+            }else{
+                businessUserJSONArray = fields.getJSONArray("业务【人事】");
+                if(businessUserJSONArray.isEmpty()){
+                    isBusinessUserEmpty = true;
+                }else{
+                    if(businessUserJSONArray.size()>1){ //一个客户有多个业务员负责对接
+                        log.info("客户名称="+customerName+",业务员数量="+businessUserJSONArray.size());
+                    }
+                    businessUserUnionId = businessUserJSONArray.getJSONObject(0).getString("unionId");
+                    businessUserName = businessUserJSONArray.getJSONObject(0).getString("name");
+                }
+            }
+//            System.out.println("业务员是否为空="+isBusinessUserEmpty);
+            if(isBusinessUserEmpty){
+//                throw new RuntimeException("业务【人事】字段为空");
+            }else{
+//                System.out.println("业务员="+businessUser);
+            }
+
+            /*
+                获取KP数据
+             */
+            /*
+            if(fields.get("一把手KP") == null){
+                isKpEmpty = true;
+            }else{
+                kp = fields.getString("一把手KP");
+            }
+//            System.out.println("KP是否为空="+isKpEmpty);
+            if(isKpEmpty){
+//                throw new RuntimeException("一把手KP字段为空");
+            }else{
+//                System.out.println("KP="+kp);
+            }
+             */
+
+            /*
+                汇总客户数据
+             */
+            customerRecord = new HashMap<>();
+            customerRecord.put("customerName",customerName);
+            customerRecord.put("businessUserName",businessUserName);
+            customerRecord.put("businessUserUnionId",businessUserUnionId);
+//            customerRecord.put("kp",kp);
+//            System.out.println(JSONObject.toJSONString(customerRecord));
+            customerData.add(customerRecord);
+        }
+        log.info("客户名称为空的记录数="+customerEmptyCount);
+
+        /*
+            排除有重复的客户
+         */
+        for (Map<String, String> record : customerData) {
+            customerName = record.get("customerName");
+            customerNameCountMap.merge(customerName, 1L, Long::sum);
+        }
+        for (Map.Entry<String, Long> entry : customerNameCountMap.entrySet()) {
+            if (entry.getValue() > 1) {
+                System.out.println("客户名称="+entry.getKey()+",重复次数="+ entry.getValue());
+            }
+        }
+        for (Map<String, String> record : customerData) {
+            customerName = record.get("customerName");
+            if(customerNameCountMap.get(customerName)==1){
+                customerDataDeduplicate.add(record);
+            }
+        }
+
+
+        /*
+            返回客户数据(去重)
+         */
+        return customerDataDeduplicate;
+    }
+
+
+}

+ 47 - 0
src/main/java/com/malk/eastar/service/impl/DDCoreClientImpl.java

@@ -0,0 +1,47 @@
+package com.malk.eastar.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.eastar.service.DDCoreClient;
+import com.malk.server.dingtalk.DDR;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.utils.UtilMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 钉钉核心数据处理客户端接口实现
+ * add by Jason 20260414
+ */
+@Service
+public class DDCoreClientImpl implements DDCoreClient {
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDClient_Contacts ddClientContacts;
+
+    @Override
+    public String getUserIdByUnionId(String unionId) throws Exception {
+        String userId = "";
+        String url = "https://oapi.dingtalk.com/topapi/user/getbyunionid";
+        Map param = UtilMap.map("access_token", ddClient.getAccessToken());
+        Map body = UtilMap.map("unionid", unionId);
+        Map result = (Map) DDR.doPost(url, null, param, body).getResult();
+        if(result != null){
+            userId = UtilMap.getString(result, "userid");
+        }
+        return userId;
+    }
+
+    @Override
+    public List<Map<String, String>> getLeaveEmployeeData(Date startTime, Date endTime) throws Exception {
+        Map extInfo = new HashMap();
+        extInfo.put("endTime", endTime);
+        List<Map<String, String>> leaveEmployeeRecords = ddClientContacts.getLeaveEmployeeRecords(ddClient.getAccessToken(), startTime, extInfo);
+        return leaveEmployeeRecords;
+    }
+}

+ 3 - 2
src/main/java/com/malk/eastar/service/impl/AITableClientImpl.java

@@ -3,7 +3,7 @@ package com.malk.eastar.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.eastar.model.AITableParam;
 import com.malk.eastar.model.AITableResult;
-import com.malk.eastar.service.AITableClient;
+import com.malk.eastar.service.MDTableClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.utils.UtilHttp;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +17,7 @@ import java.util.Map;
  * add by Jason 20260313
  */
 @Service
-public class AITableClientImpl implements AITableClient {
+public class MDTableClientImpl implements MDTableClient {
 
     @Autowired
     private DDClient ddClient;
@@ -47,4 +47,5 @@ public class AITableClientImpl implements AITableClient {
         String result = UtilHttp.doPost(url,header,param,body,form);
         return result;
     }
+
 }

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

@@ -1,6 +1,7 @@
 package com.malk.eastar.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.eastar.conf.EastarParam;
 import com.malk.eastar.service.YidaService;
@@ -8,6 +9,7 @@ import com.malk.eastar.util.ConfigDataProcessor;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDSearch;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.utils.PublicUtil;
@@ -458,6 +460,7 @@ public class YidaServiceImpl implements YidaService {
         return Collections.emptyMap();
     }
 
+
     /**
      * 获取所有配件记录
      */
@@ -694,5 +697,531 @@ public class YidaServiceImpl implements YidaService {
         return null;
     }
 
+    @Override
+    public List<Map> queryLtcBusinessUserData() throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> businessUserData = new ArrayList<>(); // 业务人员数据
+        Map<String,String> businessUserRecord;  //业务人员记录
+        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
+        JSONArray businessUserIdJSONArray;  //业务员userId
+        String userId;  //用户userId
+
+        /*
+            初始化参数值
+         */
+        ydSearch = new YDSearch(
+                "radioField_mn48qynm",
+                "在职",
+                "在职情况",
+                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_BUSINESS_USER);
+        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);
+        }
+
+        /*
+            请求记录数据处理
+         */
+        log.info("所有记录数量="+allRecords.size());
+        userId = "";
+        for (Map record : allRecords){
+            businessUserRecord = new HashMap<>();
+            //获取表单实例ID
+            formInstId = String.valueOf(record.get("formInstanceId"));
+            //解析字段数据
+            fields = JSONObject.parseObject(JSONObject.toJSONString(record.get("formData")));
+            /*
+                获取成员数据
+             */
+            if(fields.get("employeeField_mdfaff58_id") != null){
+                businessUserIdJSONArray = fields.getJSONArray("employeeField_mdfaff58_id");
+                if(!businessUserIdJSONArray.isEmpty()){
+                    userId = String.valueOf(businessUserIdJSONArray.get(0));
+                }
+            }
+            if(!formInstId.isEmpty() && !userId.isEmpty()){
+                businessUserRecord.put("formInstId",formInstId);
+                businessUserRecord.put("userId",userId);
+                businessUserData.add(businessUserRecord);
+            }
+        }
+
+        return businessUserData;
+    }
+
+    @Override
+    public void setLtcBusinessUserLeave(String formInstId) throws Exception {
+        /*
+            参数定义
+         */
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        String updateFormDataJson;  //更新内容
+
+        /*
+            初始化参数值
+         */
+        updateFormDataJson = JSONObject.toJSONString(UtilMap.map("radioField_mn48qynm","已离职"));  //在职情况
+
+        /*
+            更新数据
+         */
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.formInstId(formInstId);
+        ydParamBuilder = ydParamBuilder.updateFormDataJson(updateFormDataJson);
+        yidaParam = ydParamBuilder.build();
+        ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.update);
+    }
+
+    @Override
+    public List<Map> querySys2CustomerData() throws Exception {
+        /*
+            参数定义
+         */
+        List<Map> customerData = new ArrayList<>(); // 客户数据
+        List<Map> customerDataDeduplicate = new ArrayList<>(); // 客户数据(去重)
+        String appType; //宜搭应用编码
+        String formUuid;    //表单编码
+        String systemToken; //宜搭应用密钥
+        String userId;  //用户userId
+        String createToTimeGMT; //需要创建时间小于的时间
+        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 customerName;    //客户名称
+        JSONArray businessUserJSONArray;  //对接业务员
+        List<String> businessUserList;  //对接业务员(文本)
+        String businessUserId;    //业务员userId
+        String businessUserName;    //业务员姓名
+        List<Map> kpRecords;  //KP明细
+        String kp;  //KP
+        boolean isCustomerNameEmpty;    //客户名称是否为空
+        boolean isBusinessUserEmpty;    //业务员是否为空
+        boolean isKpEmpty;  //KP是否为空
+        boolean isBusinessUserMulti;    //业务员是否有多个
+        boolean isKpMulti;  //KP是否有多个
+        int customerEmptyCount = 0;  //客户名称为空的记录数
+        Map<String,String> customerRecord;  //客户记录
+        Map<String, Long> customerNameCountMap = new HashMap<>();   //客户名称与出现的次数映射
+        String formInstId;  //表单实例ID
+
+        /*
+            EASTAR业务数字化
+         */
+        appType = "APP_BPEHQO5P5YSJ7GMIU9ST";
+        systemToken = "6Q666BA1SP89K86O7K41AAQ1NS1228S93GJFL5P2";
+        formUuid = "FORM-YZ9664D10Q89BB9CEYN3P8LQBRDQ34Y45GJFL6";
+
+        /*
+            初始化参数值
+         */
+        userId = "02322511193621446331";    //操作人(Jason)的userId
+        createToTimeGMT = "2026-04-09 09:15:44";
+        hasMore = true; //第一页默认有数据
+        pageNo = 1;
+        pageSize = 100;
+        ydParamBuilder = YDParam.builder();
+        ydParamBuilder = ydParamBuilder.appType(appType);
+        ydParamBuilder = ydParamBuilder.systemToken(systemToken);
+        ydParamBuilder = ydParamBuilder.formUuid(formUuid);
+        ydParamBuilder = ydParamBuilder.userId(userId);
+        ydParamBuilder = ydParamBuilder.createToTimeGMT(createToTimeGMT);
+
+        /*
+            翻页获取数据
+         */
+        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);
+        }
+
+        /*
+            请求记录数据处理
+         */
+        log.info("所有记录数量="+allRecords.size());
+        customerName = "";
+        businessUserId = "";
+        businessUserName = "";
+        kp = "";
+        formInstId = "";
+        for(int i=0;i<allRecords.size();i++){
+            /*
+                重置是否为空标识
+             */
+            isCustomerNameEmpty = false;
+            isBusinessUserEmpty = false;
+            isKpEmpty = false;
+            isBusinessUserMulti = false;
+            isKpMulti = false;
+
+            //解析字段数据
+            fields = JSONObject.parseObject(JSONObject.toJSONString(allRecords.get(i).get("formData")));
+
+            /*
+                获取客户名称数据
+             */
+            if(fields.get("textField_lfjg60xp") == null){
+                isCustomerNameEmpty = true;
+            }else{
+                customerName = fields.getString("textField_lfjg60xp");
+                customerName = customerName.replace("\n",""); //去除换行符
+                customerName = customerName.trim(); //去除空格
+                if(StringUtils.isEmpty(customerName)){
+                    isCustomerNameEmpty = true;
+                }
+            }
+            if(isCustomerNameEmpty){
+                customerEmptyCount++;
+//                throw new RuntimeException("客户公司名字段为空");
+                continue;
+            }else{
+//                System.out.println("客户名称="+customerName);
+            }
+
+            /*
+                获取业务员数据
+             */
+            if(fields.get("employeeField_lfjg60xx") == null){
+                isBusinessUserEmpty = true;
+            }else{
+                businessUserJSONArray = fields.getJSONArray("employeeField_lfjg60xx");
+                if(businessUserJSONArray.isEmpty()){
+                    isBusinessUserEmpty = true;
+                }else{
+                    if(businessUserJSONArray.size()>1){ //一个客户有多个业务员负责对接
+                        isBusinessUserMulti = true;
+                        log.info("客户名称="+customerName+",业务员数量="+businessUserJSONArray.size());
+                    }
+                    if(isBusinessUserMulti){
+                        businessUserList = new ArrayList<>();
+                        for (int j = 0; j < businessUserJSONArray.size(); j++) {
+                            if (businessUserJSONArray.get(j) != null) {
+                                businessUserList.add(String.valueOf(businessUserJSONArray.get(j)));
+                            }
+                        }
+                        businessUserName = String.join(",", businessUserList);
+//                        System.out.println("业务员="+businessUser);
+                        continue;
+                    }else{
+                        businessUserName = String.valueOf(businessUserJSONArray.get(0));
+                        businessUserJSONArray = fields.getJSONArray("employeeField_lfjg60xx_id");
+                        businessUserId = String.valueOf(businessUserJSONArray.get(0));
+                    }
+                }
+            }
+//            System.out.println("业务员是否为空="+isBusinessUserEmpty);
+            if(isBusinessUserEmpty){
+//                throw new RuntimeException("对接业务员为空");
+            }else{
+//                System.out.println("业务员="+businessUser);
+            }
+
+            /*
+                获取KP数据
+             */
+            /*
+            if(allRecords.get(i).get("formInstanceId") != null){
+                formInstId = String.valueOf(allRecords.get(i).get("formInstanceId"));
+                ydParamBuilder = YDParam.builder();
+                ydParamBuilder = ydParamBuilder.appType(appType);
+                ydParamBuilder = ydParamBuilder.systemToken(systemToken);
+                ydParamBuilder = ydParamBuilder.formUuid(formUuid);
+                ydParamBuilder = ydParamBuilder.userId(userId);
+                ydParamBuilder = ydParamBuilder.formInstanceId(formInstId);
+                ydParamBuilder = ydParamBuilder.tableFieldId("tableField_m6yfc2c2");    //【新建客户】子表单【客户KP信息】
+                yidaParam = ydParamBuilder.build();
+                kpRecords = ydService.queryDetails(yidaParam);
+                if(kpRecords == null || kpRecords.isEmpty()){
+                    isKpEmpty = true;
+                }else{
+                    if(kpRecords.size() == 1){  //单个KP
+                        if(kpRecords.get(0).get("textField_m6yfc2c3") == null
+                                || "".equals(String.valueOf(kpRecords.get(0).get("textField_m6yfc2c3")))){ //KP姓名为空
+                            isKpEmpty = true;
+                        }else{
+                            kp = String.valueOf(kpRecords.get(0).get("textField_m6yfc2c3"));
+                        }
+                    }else{  //多个KP
+                        isKpEmpty = true;   //先假设所有记录KP为空
+                        for (int j=0; j<kpRecords.size(); j++) {
+                            if(kpRecords.get(j).get("textField_m6yfc2c3") == null
+                                    || "".equals(String.valueOf(kpRecords.get(j).get("textField_m6yfc2c3")))){ //KP姓名为空
+                                //忽略
+                            }else{
+                                isKpMulti = true;
+                                isKpEmpty = false;  //只要有1条记录KP不为空,则更新标识
+                                if(j == 0){
+                                    kp = String.valueOf(kpRecords.get(j).get("textField_m6yfc2c3"));
+                                }else{
+                                    kp += "," + String.valueOf(kpRecords.get(j).get("textField_m6yfc2c3"));
+                                }
+                            }
+                        }
+                        if (isKpMulti) {
+                            log.info("客户名称="+customerName+",KP数量="+kp.split(",").length);
+                        }
+                    }
+                }
+
+            }
+//            System.out.println("KP是否为空="+isKpEmpty);
+            if(isKpEmpty){
+//                throw new RuntimeException("KP姓名字段为空");
+            }else{
+//                System.out.println("KP="+kp);
+            }
+             */
+
+            /*
+                汇总客户数据
+             */
+            customerRecord = new HashMap<>();
+            customerRecord.put("customerName",customerName);
+            customerRecord.put("businessUserName",businessUserName);
+            customerRecord.put("businessUserId",businessUserId);
+//            customerRecord.put("kp",kp);
+//            System.out.println(JSONObject.toJSONString(customerRecord));
+            customerData.add(customerRecord);
+        }
+        log.info("客户名称为空的记录数="+customerEmptyCount);
+
+        /*
+            排除有重复的客户
+         */
+        for (Map<String, String> record : customerData) {
+            customerName = record.get("customerName");
+            customerNameCountMap.merge(customerName, 1L, Long::sum);
+        }
+        for (Map.Entry<String, Long> entry : customerNameCountMap.entrySet()) {
+            if (entry.getValue() > 1) {
+                System.out.println("客户名称="+entry.getKey()+",重复次数="+ entry.getValue());
+            }
+        }
+        for (Map<String, String> record : customerData) {
+            customerName = record.get("customerName");
+            if(customerNameCountMap.get(customerName)==1){
+                customerDataDeduplicate.add(record);
+            }
+        }
+
+        return customerDataDeduplicate;
+    }
+
+    @Override
+    public void updateSys1Sys2CustomerPart2Data(List<Map> sys2CustomerData) throws Exception {
+        /*
+            参数定义
+         */
+        String appType; //宜搭应用编码
+        String formUuid;    //表单编码
+        String systemToken; //宜搭应用密钥
+        String userId;  //用户userId
+        YDSearch ydSearch; //检索条件(单个)
+        String searchCondition; //检索条件
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        String customerName;    //客户名称
+        String kp;  //KP
+        DDR_New yidaResult; //请求返回内容
+        List<Map> records;  //记录数据
+        JSONObject fields;  //字段数据
+        String formInstId;  //表单实例ID
+        String updateFormDataJson;  //更新内容
+
+        /*
+            客户数据清洗
+         */
+        appType = "APP_IL6UN1IETFL3GATLFU0Z";
+        systemToken = "2MA66S71ZRH4FN2FJKW985LDOEBT30F3D7INMGMT";
+        formUuid = "FORM-30D3F6A5F4E34B459810BBB53619BDB8LX5I"; //客户名册part2
+
+        /*
+            初始化参数值
+         */
+        userId = "02322511193621446331";    //操作人(Jason)的userId
+
+        /*
+            遍历所有客户记录,通过客户名称去(客户数据清洗)找到对应记录,并更新KP姓名
+         */
+        for (Map<String, String> customerRecord : sys2CustomerData) {
+            /*
+                通过客户名称去(客户数据清洗)找到对应记录
+             */
+            customerName = customerRecord.get("customerName");
+            kp = customerRecord.get("kp");
+            System.out.println("customerName="+customerName+",kp="+kp);
+            ydParamBuilder = YDParam.builder();
+            ydParamBuilder = ydParamBuilder.appType(appType);
+            ydParamBuilder = ydParamBuilder.systemToken(systemToken);
+            ydParamBuilder = ydParamBuilder.formUuid(formUuid);
+            ydParamBuilder = ydParamBuilder.userId(userId);
+            ydSearch = new YDSearch(
+                    "textField_3utukqf",
+                    customerName,
+                    "客户公司名",
+                    YDSearch.Type.TEXT_FIELD,
+                    YDSearch.Operator.EQ
+            );
+            searchCondition = JSONObject.toJSONString(Arrays.asList(ydSearch));
+            ydParamBuilder.searchCondition(searchCondition);
+            yidaParam = ydParamBuilder.build();
+            yidaResult = ydClient.queryData(yidaParam,YDConf.FORM_QUERY.retrieve_list);
+            records = (List<Map>) yidaResult.getData();
+//            fields = JSONObject.parseObject(JSONObject.toJSONString(records.get(0).get("formData")));
+            if(!records.isEmpty() && records.get(0) != null){
+                formInstId = String.valueOf(records.get(0).get("formInstanceId"));
+//                System.out.println("formInstId="+formInstId);
+                /*
+                    更新KP姓名
+                 */
+                updateFormDataJson = JSONObject.toJSONString(UtilMap.map("textField_h1e7kac",kp));  //KP姓名
+                ydParamBuilder = YDParam.builder();
+                ydParamBuilder = ydParamBuilder.appType(appType);
+                ydParamBuilder = ydParamBuilder.systemToken(systemToken);
+                ydParamBuilder = ydParamBuilder.formUuid(formUuid);
+                ydParamBuilder = ydParamBuilder.userId(userId);
+                ydParamBuilder = ydParamBuilder.formInstId(formInstId);
+                ydParamBuilder = ydParamBuilder.updateFormDataJson(updateFormDataJson);
+                yidaParam = ydParamBuilder.build();
+                ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.update);
+            }
+
+        }
+        System.out.println("更新所有KP完成");
+    }
+
+    @Override
+    public void insertSys1Sys2CustomerAllData(List<Map> sys1Sys2CustomerData) throws Exception {
+        /*
+            参数定义
+         */
+        String appType; //宜搭应用编码
+        String formUuid;    //表单编码
+        String systemToken; //宜搭应用密钥
+        String userId;  //用户userId
+        YDParam yidaParam;  //HTTP请求体
+        YDParam.YDParamBuilder ydParamBuilder; //宜搭参数构建
+        Map<String,Object> customerRecord;  //待插入记录
+        int customerRecordCount;    //操作客户记录数
+        String insertFormDataJson;  //新增内容
+
+        /*
+            客户数据清洗
+         */
+        appType = "APP_IL6UN1IETFL3GATLFU0Z";
+        systemToken = "2MA66S71ZRH4FN2FJKW985LDOEBT30F3D7INMGMT";
+        formUuid = "FORM-300D7134EEB446AE82A6FDF330FAD006Q4HO"; //客户名册all
+
+        /*
+            初始化参数值
+         */
+        userId = "02322511193621446331";    //操作人(Jason)的userId
+
+        /*
+            遍历所有客户记录,通过客户名称去(客户数据清洗)找到对应记录,并更新KP姓名
+         */
+        customerRecordCount = 0;
+        for (Map<String, String> sys1Sys2CustomerRecord : sys1Sys2CustomerData) {
+            customerRecord = UtilMap.map(
+                    "textField_mnwhxldz, "  //客户名称
+                    +"textField_mnwl12wu, " //业务(项目总表)
+                    +"textField_mnwl12wv, " //业务(EASTAR业务数字化)
+                    +"textField_mnwl12ww, " //sys1unionid
+                    +"textField_mnwl12wx, " //sys1userid
+                    +"textField_mnwl12wy, " //sys2userid
+                    +"selectField_mnx00f7g, " //数据来源标记
+                    +"selectField_mnwt8opl",   //是否有差异
+                    sys1Sys2CustomerRecord.get("customerName"),
+                    sys1Sys2CustomerRecord.get("sys1BusinessUserName"),
+                    sys1Sys2CustomerRecord.get("sys2BusinessUserName"),
+                    sys1Sys2CustomerRecord.get("sys1unionid"),
+                    sys1Sys2CustomerRecord.get("sys1userid"),
+                    sys1Sys2CustomerRecord.get("sys2userid"),
+                    sys1Sys2CustomerRecord.get("source"),
+                    sys1Sys2CustomerRecord.get("isAnyDifference")
+            );
+            insertFormDataJson = JSONObject.toJSONString(customerRecord);  //KP姓名
+            ydParamBuilder = YDParam.builder();
+            ydParamBuilder = ydParamBuilder.appType(appType);
+            ydParamBuilder = ydParamBuilder.systemToken(systemToken);
+            ydParamBuilder = ydParamBuilder.formUuid(formUuid);
+            ydParamBuilder = ydParamBuilder.userId(userId);
+            ydParamBuilder = ydParamBuilder.formDataJson(insertFormDataJson);
+            yidaParam = ydParamBuilder.build();
+            ydClient.operateData(yidaParam,YDConf.FORM_OPERATION.create);
+            customerRecordCount++;
+            if(customerRecordCount % 100 == 0){
+                System.out.println("已处理"+customerRecordCount+"条客户数据");
+            }
+        }
+        if(customerRecordCount % 100 != 0){
+            System.out.println("已处理"+customerRecordCount+"条客户数据");
+        }
+        System.out.println("新增客户名册完成");
+    }
+
+
+
 
 }