Przeglądaj źródła

Merge branch 'master' of https://mc.cloudpure.cn/mjava/cont

lfx 10 miesięcy temu
rodzic
commit
89d178d635

+ 1 - 1
mjava-kabeiyi/pom.xml

@@ -38,7 +38,7 @@
         <dependency>
             <groupId>com.malk</groupId>
             <artifactId>base</artifactId>
-            <version>1.0-SNAPSHOT</version>
+            <version>1.1-SNAPSHOT</version>
         </dependency>
 
         <!--<dependency>-->

+ 5 - 2
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/config/StartupRunner.java

@@ -1,5 +1,7 @@
 package com.malk.kabeiyi.config;
 
+import com.malk.kabeiyi.service.McProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
@@ -7,9 +9,10 @@ import org.springframework.stereotype.Component;
 @Component
 public class StartupRunner implements ApplicationRunner {
 
-
+    @Autowired
+    private McProjectService mcProjectService;
     @Override
     public void run(ApplicationArguments args) throws Exception {
-
+        mcProjectService.init();
     }
 }

+ 7 - 1
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java

@@ -61,11 +61,17 @@ public class KabeiyiController {
 
     }
 
-    //审批实例推送到宜搭
+    //审批实例推送到宜搭(卡倍亿)
     @PostMapping("pushProcInstToYD")
     public McR pushProcInstToYD(@RequestBody Map map){
         return kabeiyiService.pushProcInstToYD(map);
     }
 
+    //审批实例推送到宜搭(特充)
+    @PostMapping("pushProcInstToYD2")
+    public McR pushProcInstToYD2(@RequestBody Map map){
+        return kabeiyiService.pushProcInstToYD2(map);
+    }
+
 
 }

+ 7 - 1
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/KabeiyiService.java

@@ -15,10 +15,16 @@ public interface KabeiyiService {
     McR addPayment(Map map);
 
     /**
-     * 审批实例推送到宜搭
+     * 审批实例推送到宜搭(卡倍亿)
      * @param map
      * @return
      */
     McR pushProcInstToYD(Map map);
 
+    /**
+     * 审批实例推送到宜搭(特充)
+     * @param map
+     * @return
+     */
+    McR pushProcInstToYD2(Map map);
 }

+ 7 - 0
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/McProjectService.java

@@ -0,0 +1,7 @@
+package com.malk.kabeiyi.service;
+
+public interface McProjectService {
+
+    void init();
+
+}

+ 150 - 7
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/KabeiyiServiceImpl.java

@@ -7,11 +7,18 @@ import com.malk.kabeiyi.util.U8Util;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR;
 import com.malk.service.aliwork.YDService;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilToken;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
@@ -20,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
+@Slf4j
 @Service
 public class KabeiyiServiceImpl implements KabeiyiService {
     @Autowired
@@ -31,15 +39,27 @@ public class KabeiyiServiceImpl implements KabeiyiService {
     @Autowired
     private YDService ydService;
 
-    //审批实例url前缀
-    private static final String PROC_INST_PREFIX_URL = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=dingc3a744cb591a7346f2c783f7214b6d69#/plainapproval?procInstId=";
+    @Autowired
+    private DDConf ddConf;
 
-    //宜搭-关联数据表
-    private static final String RELATION = "FORM-230C40137ED94524B4D4C94F8B23A8D2F8PF";
+    @Value("${tcdingtalk.appKey}")
+    private String appKey;
 
-    private static final Map<String,String> SCHEMA_MAP = new HashMap<>();
+    @Value("${tcdingtalk.appSecret}")
+    private String appSecret;
+
+    //审批实例url前缀(卡倍亿)
+    private static final String PROC_INST_PREFIX_URL = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=dingc3a744cb591a7346f2c783f7214b6d69#/plainapproval?procInstId=";
+    //宜搭-关联数据(卡倍亿)
+    private static final String RELATION = "FORM-230C40137ED94524B4D4C94F8B23A8D2F8PF";
 
+    //审批实例url前缀(特充)
+    private static final String PROC_INST_PREFIX_URL2 = "https://aflow.dingtalk.com/dingtalk/web/query/pchomepage.htm?from=oflow&op=true&corpid=ding3ea249a3b5b466d0f2c783f7214b6d69#/plainapproval?procInstId=";
+    //宜搭-关联数据(特充)
+    private static final String RELATION2 = "FORM-51E17EFB52C14C9CB9E00168FED2BC18LQ6H";
 
+    //关联表单(卡倍亿)
+    private static final Map<String,String> SCHEMA_MAP = new HashMap<>();
     static{
         SCHEMA_MAP.put("工厂用章流程","1.1、工厂用章流程(除采购营销人事)");
         SCHEMA_MAP.put("中心用章流程","1.2、中心用章流程(除采购营销人事)");
@@ -47,7 +67,6 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         SCHEMA_MAP.put("商务部用章申请流程","1.4、商务部用章申请流程");
         SCHEMA_MAP.put("办公用品采购申请流程","4.3、办公用品采购申请流程");
 
-
         //需传其他值
         //对方单位名称 收入或支出 金额 备注
         SCHEMA_MAP.put("信息化建设用章流程","1.7、信息化建设用章流程");
@@ -59,8 +78,26 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         SCHEMA_MAP.put("设备采购合同审批流程","4.5c、设备采购合同审批流程");
         SCHEMA_MAP.put("原材料采购合同审批流程","4.9b、原材料采购合同审批流程");
         SCHEMA_MAP.put("墨西哥采购合同审批流程","4.13b、墨西哥采购合同审批流程");
+    }
 
+    //关联表单(特充)
+    private static final Map<String,String> SCHEMA_MAP2 = new HashMap<>();
+    static{
+        //需传其他值
+        //对方单位名称 收入或支出 金额 备注
+        SCHEMA_MAP2.put("特充用章流程","1.2、特充用章流程(除采购营销人事)");
+
+        //合同总金额 合同说明
+        SCHEMA_MAP2.put("设备备品备件采购合同审批流程","4.1b、设备备品备件采购合同审批流程");
+        SCHEMA_MAP2.put("其他物品采购合同流程","4.2b、其他物品采购合同流程");
+        SCHEMA_MAP2.put("母排设备采购合同审批流程","4.5c、母排设备采购合同审批流程");
+        SCHEMA_MAP2.put("双铝设备采购合同审批流程","4.6c、双铝设备采购合同审批流程");
 
+        //合同总金额
+        SCHEMA_MAP2.put("原材料采购合同审批流程","4.9b、原材料采购合同审批流程");
+
+        //文件类别 对方单位名称 收入或支出 金额 用印文件名称 文件份数 加盖何种印章 备注
+        SCHEMA_MAP2.put("信息化建设用章流程","1.7、信息化建设用章流程");
     }
 
     @Override
@@ -82,6 +119,8 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
     @Override
     public McR pushProcInstToYD(Map map) {
+        MDC.put("MDC_KEY_PID","1002");
+
         //审批实例
         String procInstId = String.valueOf(map.get("procInstId"));
         //获取审批实例信息
@@ -98,7 +137,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                         case "1.7、信息化建设用章流程" :
                             for (Map formComponentValue : formComponentValues) {
                                 String name = String.valueOf(formComponentValue.get("name"));
-                                String value = String.valueOf(formComponentValue.get("value"));
+                                String value = String.valueOf(formComponentValue.get("value")).equals("null") ? "" : String.valueOf(formComponentValue.get("value"));
                                 switch (name){
                                     case "对方单位名称" : formData.put("textField_lygzlf3j",value);break;
                                     case "收入或支出" : formData.put("textField_lygzlf3k",value);break;
@@ -157,4 +196,108 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
         return McR.errorParam("审批实例不存在!");
     }
+
+    @Override
+    public McR pushProcInstToYD2(Map map) {
+        MDC.put("MDC_KEY_PID","1003");
+
+        //审批实例
+        String procInstId = String.valueOf(map.get("procInstId"));
+        //获取审批实例信息
+        Map processInstance = ddClient_workflow.getProcessInstanceId(getTcAccessToken(), procInstId);
+        if (Objects.nonNull(processInstance)){
+            Map formData = new HashMap<>();
+            String title = String.valueOf(processInstance.get("title"));
+            String type = "";
+            List<Map> formComponentValues = (List<Map>) processInstance.get("formComponentValues");
+            for (String key : SCHEMA_MAP2.keySet()) {
+                if (title.contains(key)){
+                    type = SCHEMA_MAP2.get(key);
+                    switch (type){
+                        case "1.7、信息化建设用章流程" :
+                            for (Map formComponentValue : formComponentValues) {
+                                String name = String.valueOf(formComponentValue.get("name"));
+                                Object value = formComponentValue.get("value");
+                                switch (name){
+                                    case "文件类别" : formData.put("textField_lymfq9oa",value);break;
+                                    case "对方单位名称" : formData.put("textField_lygzlf3j",value);break;
+                                    case "收入或支出" : formData.put("textField_lygzlf3k",value);break;
+                                    case "金额(元)" : formData.put("textField_lygzlf3l",value);break;
+                                    case "用印文件名称" : formData.put("textField_lymfq9oc",value);break;
+                                    case "文件份数" : formData.put("numberField_lymfq9od",value);break;
+                                    case "加盖何种印章" : formData.put("textField_lymfq9oe",value);break;
+                                    case "备注" : formData.put("textField_lygzlf3m",value);break;
+                                }
+                            }
+                            break;
+
+                        case "4.1b、设备备品备件采购合同审批流程" :
+                        case "4.2b、其他物品采购合同流程" :
+                        case "4.5c、母排设备采购合同审批流程" :
+                        case "4.6c、双铝设备采购合同审批流程" :
+                        case "4.9b、原材料采购合同审批流程" :
+                            for (Map formComponentValue : formComponentValues) {
+                                String name = String.valueOf(formComponentValue.get("name"));
+                                switch (name){
+                                    case "合同总金额(元)":
+                                    case "合同总金额" : formData.put("numberField_lyf81587",formComponentValue.get("value"));break;
+                                    case "合同说明" :
+                                        if (Objects.nonNull(formComponentValue.get("value"))){
+                                            formData.put("textField_lyf81588",formComponentValue.get("value"));
+                                        }
+                                        break;
+                                }
+                            }
+                            break;
+                        case "1.2、特充用章流程(除采购营销人事)" :
+                            for (Map formComponentValue : formComponentValues) {
+                                String name = String.valueOf(formComponentValue.get("name"));
+                                String value = String.valueOf(formComponentValue.get("value")).equals("null") ? "" : String.valueOf(formComponentValue.get("value"));
+                                switch (name){
+                                    case "对方单位名称" : formData.put("textField_lygzlf3j",value);break;
+                                    case "收入或支出" : formData.put("textField_lygzlf3k",value);break;
+                                    case "金额(元)" : formData.put("textField_lygzlf3l",value);break;
+                                    case "备注" : formData.put("textField_lygzlf3m",value);break;
+                                }
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+
+                    formData.put("textField_lyf8157x",title);
+                    formData.put("selectField_lyf81580",type);
+
+                    Map condition = new HashMap<>();
+                    condition.put("textField_lyf81581",PROC_INST_PREFIX_URL2 + procInstId);
+
+
+                    //同步到宜搭
+                    ydService.upsertFormData(RELATION2,condition,formData,null);
+
+                    break;
+                }
+            }
+            return McR.success();
+        }
+
+        return McR.errorParam("审批实例不存在!");
+    }
+
+    public String getTcAccessToken() {
+        String accessToken = UtilToken.get("tc-invalid-token-dingtalk");
+        if (StringUtils.isNotBlank(accessToken)) {
+            return accessToken;
+        } else {
+            Map param = new HashMap();
+            param.put("appkey", appKey);
+            param.put("appsecret", appSecret);
+            DDR r = (DDR)UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+            log.info("特充响应token, {}", r.getAccessToken());
+            accessToken = r.getAccessToken();
+            UtilToken.put("tc-invalid-token-dingtalk", accessToken, (long)r.getExpiresIn() * 1000L);
+            return accessToken;
+        }
+
+    }
 }

+ 35 - 0
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/McProjectServiceImpl.java

@@ -0,0 +1,35 @@
+package com.malk.kabeiyi.service.impl;
+
+import com.malk.core.McProject;
+
+import com.malk.kabeiyi.service.McProjectService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class McProjectServiceImpl implements McProjectService {
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Override
+    public void init() {
+        MDC.put("MDC_KEY_PID","1002");
+        McProject.addYida("1002",new String[] {"APP_YNE2466O27IZFF9VVLQ1","T6666H71IOAMFEZR9I4O08U8TWJL2VAACWWXLJ4"});
+        McProject.addYida("1003",new String[] {"APP_CRSI2VXGJE74J60OEFPD","C1A66XB1JOAMVXWCE3H28B05EU7T2F3AM4XXLN3"});
+
+        log.info("项目加载完毕:1002,1003");
+    }
+}

+ 12 - 4
mjava-kabeiyi/src/main/resources/application-dev.yml

@@ -29,7 +29,7 @@ mybatis-plus:
 
 
 
-# dingtalk
+# dingtalk 卡倍亿
 dingtalk:
   agentId: 3100597392
   appKey: dingps8yzze1gbztpmhg
@@ -37,6 +37,14 @@ dingtalk:
   corpId:
   aesKey:
   token:
+#特充
+tcdingtalk:
+  agentId: 3163661041
+  appKey: dinghvpbsfg9w61jr1ty
+  appSecret: JuEoHeci_fGtR2Yf_JyRvp3tTbPDFsaW6ZvudCIgYf8naHyoO0DYJyHv8lfn9HGz
+  corpId:
+  aesKey:
+  token:
 
 # teambition
 teambition:
@@ -44,8 +52,8 @@ teambition:
   AppSecret:
   TenantId:
   OperatorId:    # 公共账号, 需要有操作权限 [牧语]
-# aliwork
+# aliwork mc
 aliwork:
-  appType: APP_YNE2466O27IZFF9VVLQ1
-  systemToken: T6666H71IOAMFEZR9I4O08U8TWJL2VAACWWXLJ4
+  appType: APP_HZ5V1PF2YGBIUCIYOSI5
+  systemToken: DIC66I91HJ3MWKL3FAQ5UD46GIR129PR66KXLA
 

+ 19 - 20
mjava-kabeiyi/src/main/resources/application-prod.yml

@@ -23,29 +23,28 @@ mybatis-plus:
     map-underscore-to-camel-case: true
     #开启日志打印
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-  type-aliases-package: com.malk.shantai.entity
+  type-aliases-package: com.malk.kabeiyi.entity
   #扫描mapper文件
   mapper-locations: classpath:mapper/*.xml
 
 
 
-# dingtalk
+# dingtalk 卡倍亿
 dingtalk:
-  agentId: 3088485347
-  appKey: dingryt7ulefpiziveoj
-  appSecret: qBdVqoK1UP9J3yN0ulaKuBmse4nrZPfNbVxjLGjaODGoRqbtws0__f3A5GpD5bLz
-  corpId: ding2c2e3f1dbf2b3ffebc961a6cb783455b
-  aesKey: uCSTfCFVU18QJjECfZTBWyC9mi10qqY1Spuqjl4ghct
-  token: Adib7WsRXHYrLGkOAUNcgl6gLY9nBIIaeprkhfmxGg6ca6atYWWKDkuE
-
-  #poc
-  #agentId: 2995824312
-  #appKey: ding3ap1jk1tg44tz3s2
-  #appSecret: PaWTDG-FiX-RW5fnV9r8CzEmR-9QlJpubC88txhprL_Z_iREO62B-iRW6w7gkA_K
-  #corpId: ding321c72787fffc78b35c2f4657eb6378f
-  #aesKey: LSIc7r5uHAP0dd6v23J3LWRmjECMNzbkIcxAwdx63RE
-  #token: yqXHMHaK4oHYvjyQshU4zFqgrHFq7PcBxVSqGo1BAQk0
-
+  agentId: 3100597392
+  appKey: dingps8yzze1gbztpmhg
+  appSecret: pMSmfhnmqwRSUF35TDTSPg42muARAwy2Qpjfs16N5nFlJlWpSUHQfi3LpNlrzFJu
+  corpId:
+  aesKey:
+  token:
+#特充
+tcdingtalk:
+  agentId: 3163661041
+  appKey: dinghvpbsfg9w61jr1ty
+  appSecret: JuEoHeci_fGtR2Yf_JyRvp3tTbPDFsaW6ZvudCIgYf8naHyoO0DYJyHv8lfn9HGz
+  corpId:
+  aesKey:
+  token:
 
 # teambition
 teambition:
@@ -53,8 +52,8 @@ teambition:
   AppSecret:
   TenantId:
   OperatorId:    # 公共账号, 需要有操作权限 [牧语]
-# aliwork
+# aliwork mc
 aliwork:
-  appType:
-  systemToken:
+  appType: APP_HZ5V1PF2YGBIUCIYOSI5
+  systemToken: DIC66I91HJ3MWKL3FAQ5UD46GIR129PR66KXLA
 

+ 1 - 1
mjava-kabeiyi/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: prod
   servlet:
     multipart:
       max-file-size: 100MB

+ 49 - 5
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/controller/KKLController.java

@@ -1,6 +1,7 @@
 package com.malk.kuaikeli.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.google.common.base.Strings;
 import com.malk.kuaikeli.service.KKLService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
@@ -10,13 +11,12 @@ import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 错误抛出与拦截详见 CatchException
@@ -143,7 +143,51 @@ public class KKLController {
         return McR.success();
     }
 
-    
+    /**
+     * 获取新老供应商差异匹配(供应商原材料全量匹配)
+     * @param oldSupplierCode
+     * @param newSupplierCode
+     * @return
+     */
+    @GetMapping("getDiffMatchingSuppliers")
+    McR getDiffMatchingSuppliers(String oldSupplierCode,String newSupplierCode){
+        if (Strings.isNullOrEmpty(oldSupplierCode) || Strings.isNullOrEmpty(newSupplierCode)){
+            return McR.errorParam("参数缺失");
+        }
+        List<Map<String,String>> result = kklService.getDiffMatchingSuppliers(oldSupplierCode,newSupplierCode);
+        return McR.success(result);
+    }
+
+    /**
+     * 获取新老供应商差异匹配(定价单明细中间表匹配)
+     * @param projectCode
+     * @param oldSupplierCode
+     * @param newSupplierCode
+     * @return
+     */
+    @GetMapping("getDiffMatchingSuppliers2")
+    McR getDiffMatchingSuppliers2(String projectCode,String oldSupplierCode,String newSupplierCode){
+        if (Strings.isNullOrEmpty(projectCode) || Strings.isNullOrEmpty(oldSupplierCode) || Strings.isNullOrEmpty(newSupplierCode)){
+            return McR.errorParam("参数缺失");
+        }
+        List<Map<String,String>> result = kklService.getDiffMatchingSuppliers2(projectCode,oldSupplierCode,newSupplierCode);
+        return McR.success(result);
+    }
+
+    /**
+     * 更新定价单供应商
+     * @param map
+     * @return
+     */
+    @PostMapping("updateSuppliers")
+    McR updateSuppliers(@RequestBody Map map) {
+        String formInstId = String.valueOf(map.get("formInstId"));
+        if (Strings.isNullOrEmpty(formInstId)){
+            return McR.errorParam("参数缺失");
+        }
+        return kklService.updateSuppliers(formInstId);
+    }
+
     @PostMapping("test")
     McR test(HttpServletRequest request) {
         Map data = UtilServlet.getParamMap(request);

+ 11 - 1
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/KKLService.java

@@ -1,7 +1,9 @@
 package com.malk.kuaikeli.service;
 
+import com.malk.server.common.McR;
 import org.springframework.scheduling.annotation.Async;
 
+import java.util.List;
 import java.util.Map;
 
 public interface KKLService {
@@ -15,7 +17,7 @@ public interface KKLService {
     @Async
     void updateState(String id);
 
-    @Async
+//    @Async
     void serviceRate(Map data);
 
     void adjustCost(Map data);
@@ -23,4 +25,12 @@ public interface KKLService {
     void additionMaterial(Map data);
 
     void syncPrice();
+
+    List<Map<String, String>> getDiffMatchingSuppliers(String oldSupplierCode,String newSupplierCode);
+
+    @Async
+    McR updateSuppliers(String formInstId);
+
+    List<Map<String, String>> getDiffMatchingSuppliers2(String projectCode,String oldSupplierCode, String newSupplierCode);
+
 }

+ 460 - 0
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/impl/KKLImplService.java

@@ -2,10 +2,13 @@ package com.malk.kuaikeli.service.impl;
 
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.kuaikeli.service.KKLService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.utils.PublicUtil;
@@ -15,7 +18,10 @@ import com.malk.utils.UtilNumber;
 import lombok.SneakyThrows;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -25,6 +31,14 @@ import java.util.stream.Collectors;
 @Slf4j
 public class KKLImplService implements KKLService {
 
+    //供应商原材料档案表
+    private static final String SUPPLIER_MATERIALS = "FORM-12EB6BCE3C264630824721E7BBABCC03L8U9";
+    private static final String SUPPLIER_CHANGE = "FORM-C939E9F486124464B17A6910D66A2425EWPX";
+    //定价单明细中间表
+    private static final String PRICE_DETAIL_MIDDLE = "FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5";
+    //菜品管理
+    private static final String FOOD = "FORM-GP666M71DIGDE0ZADDLZ85VEFBD128OUH1MLLF";
+
     @Autowired
     private YDService ydService;
 
@@ -486,4 +500,450 @@ public class KKLImplService implements KKLService {
                     .build(), YDConf.FORM_OPERATION.update);
         }
     }
+
+    @Override
+    public List<Map<String, String>> getDiffMatchingSuppliers(String oldSupplierCode,String newSupplierCode) {
+        List<Map<String,String>> diffList = new ArrayList<>();
+
+        //获取旧供应商原材料信息
+        List<Map> oldSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", oldSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
+        List<Map<String,String>> oldSupplierMaterialsFormData = oldSupplierMaterials.stream()
+                .map(item -> {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
+                    map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
+                    map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
+                    return map;
+                }).collect(Collectors.toList());
+        //按物品名称进行分组
+        Map<String, List<Map<String, String>>> groupOldSupplierMaterials = oldSupplierMaterialsFormData.stream()
+                .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
+        //物品名称重复的物品
+        List<String> oldRepeatNames = new ArrayList<>();
+        //物品名称未重复的物品
+        List<String> oldNames = new ArrayList<>();
+        groupOldSupplierMaterials.forEach((name, value) -> {
+            if (value.size() > 1) {
+                diffList.addAll(value);
+                oldRepeatNames.add(name);
+            }else {
+                oldNames.add(name);
+            }
+        });
+        //待匹配的物品
+        oldSupplierMaterialsFormData = oldSupplierMaterialsFormData.stream().filter(item -> !oldRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
+
+
+        //获取新供应商原材料信息
+        List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
+        List<Map<String,String>> newSupplierMaterialsFormData = newSupplierMaterials.stream()
+                .map(item -> {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
+                    map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
+                    map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
+                    return map;
+                }).collect(Collectors.toList());
+        //按物品名称进行分组
+        Map<String, List<Map<String, String>>> groupNewSupplierMaterials = newSupplierMaterialsFormData.stream()
+                .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
+        //物品名称重复的物品
+        List<String> newRepeatNames = new ArrayList<>();
+        //物品名称未重复的物品
+        List<String> newNames = new ArrayList<>();
+        groupNewSupplierMaterials.forEach((name, value) -> {
+            if (value.size() > 1) {
+//                diffList.addAll(value);
+                newRepeatNames.add(name);
+            }else {
+                newNames.add(name);
+            }
+        });
+        //待匹配的物品
+//        newSupplierMaterialsFormData = newSupplierMaterialsFormData.stream().filter(item -> !newRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
+        List<String> matchNameList = new ArrayList<>();
+        matchNameList.addAll(oldNames);
+        matchNameList.retainAll(newNames);
+
+        List<String> diffNameList = new ArrayList<>();
+        diffNameList.addAll(oldNames);
+        diffNameList.removeAll(newNames);
+
+//        oldNames.removeAll(newNames);
+
+        oldSupplierMaterialsFormData.forEach(item -> {
+            if (diffNameList.contains(item.get("textField_lywr2qcq"))){
+                diffList.add(item);
+            }
+        });
+
+
+        return diffList;
+    }
+
+    @Override
+    public List<Map<String, String>> getDiffMatchingSuppliers2(String projectCode,String oldSupplierCode, String newSupplierCode) {
+        List<Map<String,String>> diffList = new ArrayList<>();
+
+        //获取旧供应商定价单明细中间表
+        List<Map> oldSupplierMaterials = getYdFormDataList(PRICE_DETAIL_MIDDLE, JSON.toJSONString(UtilMap.map("textField_llzzbyj1, textField_llm1vtjm", oldSupplierCode,projectCode)), YDConf.FORM_QUERY.retrieve_list);
+
+        List<Map<String,String>> oldSupplierMaterialsFormData = oldSupplierMaterials.stream()
+                .map(item -> {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
+                    map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
+                    map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
+                    return map;
+                }).collect(Collectors.toList());
+        //按物品名称进行分组
+        Map<String, List<Map<String, String>>> groupOldSupplierMaterials = oldSupplierMaterialsFormData.stream()
+                .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
+        //物品名称重复的物品
+        List<String> oldRepeatNames = new ArrayList<>();
+        //物品名称未重复的物品
+        List<String> oldNames = new ArrayList<>();
+        groupOldSupplierMaterials.forEach((name, value) -> {
+            if (value.size() > 1) {
+                diffList.addAll(value);
+                oldRepeatNames.add(name);
+            }else {
+                oldNames.add(name);
+            }
+        });
+        //待匹配的物品
+        oldSupplierMaterialsFormData = oldSupplierMaterialsFormData.stream().filter(item -> !oldRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
+
+
+        //获取新供应商原材料信息
+        List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
+        List<Map<String,String>> newSupplierMaterialsFormData = newSupplierMaterials.stream()
+                .map(item -> {
+                    Map<String, String> map = new HashMap<>();
+                    map.put("textField_lywr2qcq", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd1")));//物品名称
+                    map.put("textField_lyxr5c44", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd2")));//物品编号
+                    map.put("textField_lyxr5c46", String.valueOf(((Map) item.get("formData")).get("textField_llkb7kd4")));//物品规格
+                    return map;
+                }).collect(Collectors.toList());
+        //按物品名称进行分组
+        Map<String, List<Map<String, String>>> groupNewSupplierMaterials = newSupplierMaterialsFormData.stream()
+                .collect(Collectors.groupingBy(map -> map.get("textField_lywr2qcq")));
+        //物品名称重复的物品
+        List<String> newRepeatNames = new ArrayList<>();
+        //物品名称未重复的物品
+        List<String> newNames = new ArrayList<>();
+        groupNewSupplierMaterials.forEach((name, value) -> {
+            if (value.size() > 1) {
+//                diffList.addAll(value);
+                newRepeatNames.add(name);
+            }else {
+                newNames.add(name);
+            }
+        });
+        //待匹配的物品
+//        newSupplierMaterialsFormData = newSupplierMaterialsFormData.stream().filter(item -> !newRepeatNames.contains(item.get("name"))).collect(Collectors.toList());
+        List<String> matchNameList = new ArrayList<>();
+        matchNameList.addAll(oldNames);
+        matchNameList.retainAll(newNames);
+
+        List<String> diffNameList = new ArrayList<>();
+        diffNameList.addAll(oldNames);
+        diffNameList.removeAll(newNames);
+
+//        oldNames.removeAll(newNames);
+
+        oldSupplierMaterialsFormData.forEach(item -> {
+            if (diffNameList.contains(item.get("textField_lywr2qcq"))){
+                diffList.add(item);
+            }
+        });
+
+
+        return diffList;
+    }
+
+    private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
+        List<Map> list = new ArrayList<>();
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 100;
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
+                    .searchCondition(searchCondition)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize).build(), formQuery);
+
+            list.addAll((List<Map>) ddrNew.getData());
+            pageNumber++;
+        }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+        return list;
+    }
+
+    private List<Map> getYdInnerTableList(String formUuid,String formInstId,String tableFieldId) {
+        List<Map> list = new ArrayList<>();
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 50;
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid(formUuid)
+                    .formInstanceId(formInstId)
+                    .tableFieldId(tableFieldId)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize).build(), YDConf.FORM_QUERY.retrieve_details);
+
+            list.addAll((List<Map>) ddrNew.getData());
+            pageNumber++;
+        }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+        return list;
+    }
+
+
+    @Override
+    public McR updateSuppliers(String formInstId) {
+        //查询定价单供应商变更实例
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String oldSupplierCode = String.valueOf(formData.get("textField_lv3w1k1l"));//旧供应商编号
+        String newSupplierCode = String.valueOf(formData.get("textField_llzzbai8"));//新供应商编号
+        String newSupplierName = String.valueOf(formData.get("textField_lmsli3bq"));//新供应商名称
+        String jsonString = formData.get("associationFormField_llkb7kct_id").toString();
+        String supplierJsonString = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));//新供应商(关联表单)
+        List<Map> supplier =(List<Map>) JSONArray.parse(supplierJsonString);
+
+        String jsonString2 = formData.get("associationFormField_llkb7kcs_id").toString();
+        String orderJsonString = StringEscapeUtils.unescapeJava(jsonString2.substring(1, jsonString2.length() - 1));//定价单(关联表单)
+        List<Map> order =(List<Map>) JSONArray.parse(orderJsonString);
+
+        String projectCode = String.valueOf(formData.get("textField_lllovku7"));//定价单编号
+
+        //新供应商差异原材料编号
+        List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
+        //新供应商匹配原材料编号
+        List<String> newMatchSupplierMaterialCodes = new ArrayList<>();
+        //新供应商匹配原材料名称
+        List<String> newMatchSupplierMaterialNames = new ArrayList<>();
+
+        //老供应商差异原材料编号
+        List<String> oldDiffSupplierMaterialCodes = new ArrayList<>();
+        //老供应商匹配原材料编号
+        List<String> oldMatchSupplierMaterialCodes = new ArrayList<>();
+
+
+        //校验新供应商原材料是否存在
+        List<Map> newSupplierMaterials = getYdFormDataList(SUPPLIER_MATERIALS, JSON.toJSONString(UtilMap.map("textField_llzzbyj1", newSupplierCode)), YDConf.FORM_QUERY.retrieve_list);
+        List<String> newSupplierMaterialCodes = newSupplierMaterials.stream()
+                .map(item -> String.valueOf(((Map)item.get("formData")).get("textField_llkb7kd2")))
+                .collect(Collectors.toList());
+
+        //获取差异子表所有数据(可能超过50条)
+        List<Map> diffList = getYdInnerTableList(SUPPLIER_CHANGE, formInstId, "tableField_lywr2qcp");
+
+
+//        List<Map> diffList = (List<Map>) formData.get("tableField_lywr2qcp");
+
+        for (Map diff : diffList) {
+            String oldCode = String.valueOf(diff.get("textField_lyxr5c44"));//老供应商原材料编号
+            String newCode = String.valueOf(diff.get("textField_lywr2qcv"));//新供应商原材料编号
+            String newName = String.valueOf(diff.get("textField_lz70gmob"));//新供应商原材料名称
+            //选择新供应商原材料且新供应商原材料编号存在
+            if ((Objects.nonNull(diff.get("associationFormField_lywr2qcr_id")) && newSupplierMaterialCodes.contains(newCode))){
+                oldMatchSupplierMaterialCodes.add(oldCode);
+                newMatchSupplierMaterialCodes.add(newCode);
+                newMatchSupplierMaterialNames.add(newName);
+            }
+            //未选择老供应商原材料且新供应商原材料不存在
+            if ((Objects.isNull(diff.get("associationFormField_lywr2qcr_id")) && !newSupplierMaterialCodes.contains(newCode))){
+                oldDiffSupplierMaterialCodes.add(oldCode);
+                newDiffSupplierMaterialCodes.add(newCode);
+            }
+        }
+
+        //校验新供应商原材料编号是否重复
+        HashSet<String> set = new HashSet<>(newDiffSupplierMaterialCodes);
+        if (set.size() != newDiffSupplierMaterialCodes.size()){
+            return McR.errorUnknown("新供应商原材料编号存在重复!");
+        }
+
+        /*for (Map diff : diffList) {
+            String oldCode = String.valueOf(diff.get("textField_lyxr5c44"));//老供应商原材料编号
+            String newCode = String.valueOf(diff.get("textField_lywr2qcv"));//新供应商原材料编号
+
+            if (!newMatchSupplierMaterialCodes.contains(newCode)){
+                //查询旧供应商原材料信息
+                List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
+                        .formUuid(SUPPLIER_MATERIALS)
+                        .searchCondition(JSON.toJSONString(UtilMap.map("textField_llkb7kd2, textField_llzzbyj1", oldCode, oldSupplierCode)))
+                        .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                //复制旧供应商原材料信息到新供应商
+                if (Objects.nonNull(data) && !data.isEmpty()){
+                    Map diffFormData = (Map) data.get(0).get("formData");
+                    diffFormData.put("associationFormField_lphya7cq",supplierJsonString);//供应商(关联表单)
+                    diffFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
+                    diffFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
+                    diffFormData.put("textField_llkb7kd2", newCode);//物品编号
+
+                    ydClient.operateData(YDParam.builder().formUuid(SUPPLIER_MATERIALS)
+                            .formDataJson(JSON.toJSONString(diffFormData)).build(), YDConf.FORM_OPERATION.create);
+                }
+            }
+        }*/
+
+        //未匹配上的原材料
+        List<String> notMatchCodes = new ArrayList<>();
+
+        //获取旧供应商定价单明细中间表
+        List<Map> oldSupplierMaterials = getYdFormDataList(PRICE_DETAIL_MIDDLE, JSON.toJSONString(UtilMap.map("textField_llzzbyj1, textField_llm1vtjm", oldSupplierCode,projectCode)), YDConf.FORM_QUERY.retrieve_list);
+        for (Map oldSupplierMaterial : oldSupplierMaterials) {
+            Map oldSupplierMaterialFormData = (Map) oldSupplierMaterial.get("formData");
+            String code = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd2"));
+            String name = String.valueOf(oldSupplierMaterialFormData.get("textField_llkb7kd1"));
+            String formInstanceId = String.valueOf(oldSupplierMaterial.get("formInstanceId"));
+
+            String newCode = "";
+
+            //更新定价单明细中间表
+            oldSupplierMaterialFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
+            oldSupplierMaterialFormData.put("textField_llzzbyj1", newSupplierCode);//供应商编号
+
+            //未匹配上的原材料  将明细删除
+            int index1 = oldDiffSupplierMaterialCodes.indexOf(code);
+            if (index1 != -1){
+                /*ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
+                        .formInstanceId(formInstanceId)
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lm4lxur8","已停用"))).build(), YDConf.FORM_OPERATION.update);
+*/
+                ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
+                        .formInstanceId(formInstanceId)
+                        .build(), YDConf.FORM_OPERATION.delete);
+                notMatchCodes.add(code);
+                continue;
+            }
+            //手动匹配上的原材料
+            int index2 = oldMatchSupplierMaterialCodes.indexOf(code);
+            if (index2 != -1){
+                newCode = newMatchSupplierMaterialCodes.get(index2);
+                oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
+                oldSupplierMaterialFormData.put("textField_llkb7kd1",newMatchSupplierMaterialNames.get(index2));//物品名称
+                ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
+                        .formInstanceId(formInstanceId)
+                        .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
+                continue;
+            }
+            //自动匹配上的原材料
+            for (Map newSupplierMaterial : newSupplierMaterials) {
+                Map newSupplierMaterialFormData = (Map) newSupplierMaterial.get("formData");
+                if (String.valueOf(newSupplierMaterialFormData.get("textField_llkb7kd1")).equals(name)){
+                    newCode = newSupplierMaterialFormData.get("textField_llkb7kd2").toString();
+                    oldSupplierMaterialFormData.put("textField_llkb7kd2", newCode);//物品编号
+                    ydClient.operateData(YDParam.builder().formUuid(PRICE_DETAIL_MIDDLE)
+                            .formInstanceId(formInstanceId)
+                            .updateFormDataJson(JSON.toJSONString(oldSupplierMaterialFormData)).build(), YDConf.FORM_OPERATION.update);
+                    break;
+                }
+            }
+        }
+
+        //更新定价单
+        String supplierInstanceId = supplier.get(0).get("instanceId").toString();
+        Map supplierMap = ydClient.queryData(YDParam.builder()
+                .formInstId(supplierInstanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        List<Map> employee = (List<Map>) supplierMap.get("employeeField_lllodwha_id");
+
+        String orderInstanceId = order.get(0).get("instanceId").toString();
+        Map updateFormData = new HashMap<>();
+        updateFormData.put("associationFormField_llkb7kct",supplierJsonString);//供应商(关联表单)
+        updateFormData.put("textField_llzzbai8", newSupplierCode);//供应商编号
+        updateFormData.put("textField_lmsli3bq", newSupplierName);//供应商名称
+        updateFormData.put("textField_lv3w1k1l", oldSupplierCode);//历史供应商编号
+        updateFormData.put("employeeField_lmsli3br", employee);//供应商负责人
+
+        ydClient.operateData(YDParam.builder()
+                .formInstId(orderInstanceId)
+                .updateFormDataJson(JSON.toJSONString(updateFormData))
+                .build(), YDConf.FORM_OPERATION.update);
+
+        //更新菜品
+        List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid(FOOD)
+                .searchCondition(JSON.toJSONString(UtilMap.map("textField_lln3lmn1", projectCode)))
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+        for (Map datum : data) {
+            //获取菜品管理信息
+            Map foodFormData = (Map) datum.get("formData");
+            List<Map> materialList = (List<Map>) foodFormData.get("tableField_llm1i9yy");
+            List<String> errorCodes = new ArrayList<>();
+
+//            Map foodFormData = ydClient.queryData(YDParam.builder().formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+//            List<Map> materialList = (List<Map>) foodFormData.get("tableField_llm1i9yy");
+            for (Map material : materialList) {
+                String code = material.get("textField_lmk94yf5").toString();
+                //如果明细被删除
+                if (notMatchCodes.contains(code)){
+                    errorCodes.add(code);
+                    continue;
+                }
+                String jsonString3 = material.get("associationFormField_lln3lmmv_id").toString();
+                String materialJsonString = StringEscapeUtils.unescapeJava(jsonString3.substring(1, jsonString3.length() - 1));//新供应商原材料(关联表单)
+
+                Map materialMap =(((List<Map>) JSONArray.parse(materialJsonString))).get(0);
+                String instanceId = materialMap.get("instanceId").toString();
+
+                //获取定价单明细中间表信息
+                Map formData1 = ydClient.queryData(YDParam.builder().formInstanceId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+                materialMap.put("title",formData1.get("textField_llkb7kd1").toString());
+                materialMap.put("subTitle",formData1.get("textField_lmkfg67e"));
+                List<Map> list = new ArrayList<>();
+                list.add(materialMap);
+                material.put("associationFormField_lln3lmmv",list);//原材料(关联表单)
+                material.put("textField_lln3lmn2",formData1.get("textField_llkb7kd3"));//单位
+                material.put("textField_llyy3khw",formData1.get("textField_lmkfg67e"));//品牌
+                material.put("textField_lz0ve9ct",formData1.get("textField_llkb7kd4"));//规格
+                material.put("numberField_lnrzzg03",formData1.get("numberField_lnrzzg03"));//整包装数量
+                material.put("textField_lnrzzg04",formData1.get("textField_lnrzzg04"));//整包装单位
+                material.put("textField_llndm599",formData1.get("textField_llkb7kd1"));//原材料名称
+                material.put("textField_lmk94yf5",formData1.get("textField_llkb7kd2"));//原材料编号
+                material.put("selectField_lmqclyx9",formData1.get("selectField_llkb7kd5"));//第一分类
+                material.put("numberField_lmqclyxa",formData1.get("numberField_llkknd6h"));//供货价
+                material.put("numberField_lmsvffts",formData1.get("numberField_llkknd6g"));//成本单价
+                material.put("numberField_lmsvfftt",formData1.get("numberField_llkb7kcy"));//服务费率
+            }
+
+            if (!errorCodes.isEmpty()){
+                foodFormData.put("selectField_lzaq9r7i","异常");
+                foodFormData.put("textField_lzaq9r7n",String.join(",",errorCodes));
+            }
+
+            foodFormData.put("tableField_llm1i9yy",materialList);
+
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(formInstId)
+                    .updateFormDataJson(JSON.toJSONString(foodFormData))
+                    .build(), YDConf.FORM_OPERATION.update);
+
+            /*for (Map material : materialList) {
+
+
+
+
+                String code = material.get("textField_lmk94yf5").toString();//老供应商原材料编号
+                if (changeCodeMap.containsKey(code)){
+                    material.put("textField_lmk94yf5", changeCodeMap.get(code));//新供应商原材料编号
+                }
+
+            }
+
+            foodFormData.put("tableField_llm1i9yy",materialList);
+            ydClient.operateData(YDParam.builder()
+                    .formInstanceId(datum.get("formInstanceId").toString())
+                    .updateFormDataJson(JSON.toJSONString(foodFormData))
+                    .build(),YDConf.FORM_OPERATION.update);*/
+        }
+
+        return McR.success();
+    }
+
+
 }

+ 70 - 5
mjava-mc/src/main/java/com/malk/mc/controller/McYdController.java

@@ -1,25 +1,34 @@
 package com.malk.mc.controller;
 
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.malk.core.McProject;
+import com.malk.mc.service.McYdService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
+import com.malk.service.dingtalk.DDClient;
 import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
+import java.util.*;
 
 /***
  * 宜搭服务
  */
+@Slf4j
 @RestController
 @RequestMapping("/yd/")
 public class McYdController {
@@ -29,6 +38,10 @@ public class McYdController {
     @Autowired
     private YDClient ydClient;
 
+    @Autowired
+    private McYdService mcYdService;
+
+
     /***
      * 复制表单数据到另一个表
      * @param param
@@ -61,4 +74,56 @@ public class McYdController {
         return McR.success();
     }
 
+    /**
+     * 根据筛选条件获取表单数据
+     * @param
+     * @return
+     */
+    @GetMapping("getFromData")
+    public Map getFromData(String formUuid,String fieldCode,String fileValue){
+        log.info("formUuid:{},fieldCode:{},fileValue:{}",formUuid,fieldCode,fileValue);
+        MDC.put("MDC_KEY_PID","1004");
+//        McProject.addYida("1004",new String[] {"APP_YMOUJB8W36ZVCJ9BUE77","YE966DA1CKMCAWSRAM78Y5K6NESA27LKXC9KL6C2"});
+
+        fileValue = Objects.nonNull(fileValue) ? fileValue : "";
+
+        List<Map> ydFormDataList = getYdFormDataList(formUuid, JSONObject.toJSONString(UtilMap.map(fieldCode, fileValue)), YDConf.FORM_QUERY.retrieve_list);
+
+        Map<String, Object> resultMap = new HashMap<>();
+
+        resultMap.put("data", ydFormDataList);
+
+        return resultMap;
+    }
+
+
+    private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
+        List<Map> list = new ArrayList<>();
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 100;
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder().formUuid(formUuid)
+                    .searchCondition(searchCondition)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize).build(), formQuery);
+
+            list.addAll((List<Map>) ddrNew.getData());
+            pageNumber++;
+        }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+        return list;
+    }
+
+    /**
+     * 更新表单数据版本
+     * @param map
+     * @return
+     */
+    @PostMapping("/updateFormDataVersion")
+    public McR updateFormDataVersion(@RequestBody Map map){
+        mcYdService.updateFormDataVersion(map);
+
+        return McR.success();
+    }
+
 }

+ 10 - 0
mjava-mc/src/main/java/com/malk/mc/service/McYdService.java

@@ -0,0 +1,10 @@
+package com.malk.mc.service;
+
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.Map;
+
+public interface McYdService {
+    @Async
+    void updateFormDataVersion(Map map);
+}

+ 9 - 0
mjava-mc/src/main/java/com/malk/mc/service/impl/McPocTbServiceImpl.java

@@ -21,6 +21,8 @@ import com.malk.service.teambition.TBClient;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -81,6 +83,9 @@ public class McPocTbServiceImpl implements McPocTbService {
             data.put("textField_lxk6f7i5",pocTbTask.getTaskName());//
             data.put("numberField_lxk6f7i4", NumberUtil.div(pocTbWorkTime.getWorkTime(),"3600000"));//
             data.put("textareaField_lxk6f7i6",pocTbWorkTime.getDescription());//
+            if (Strings.isNotBlank(MDC.get("MDC_KEY_PID"))){
+                log.info(MDC.get("MDC_KEY_PID"));
+            }
             ydClient.operateData(YDParam.builder().formUuid("FORM-EDFDBFBE08F149AAB4FD7A9BA00FAFD8DQER").formDataJson(JSONObject.toJSONString(data)).build(), YDConf.FORM_OPERATION.create);
         }
     }
@@ -121,6 +126,10 @@ public class McPocTbServiceImpl implements McPocTbService {
             data.put("textareaField_lxu7g60p",String.valueOf(content.get("text")));//周报内容
             data.put("dateField_lxu7g60q",DateUtil.parse(createDate));//周报创建日期
 
+            if (Strings.isNotBlank(MDC.get("MDC_KEY_PID"))){
+                log.info(MDC.get("MDC_KEY_PID"));
+            }
+
             ydClient.operateData(YDParam.builder().formUuid("FORM-4EFCFB6F0E3D4187BCDEBEEA60F4F555RTIK").formDataJson(JSONObject.toJSONString(data)).build(), YDConf.FORM_OPERATION.create);
         }
 

+ 86 - 0
mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java

@@ -0,0 +1,86 @@
+package com.malk.mc.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.malk.mc.service.McYdService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class McYdServiceImpl implements McYdService {
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDConf ddConf;
+
+    @Override
+    @Async
+    public void updateFormDataVersion(Map map) {
+        String pid = Objects.nonNull(map.get("pid")) ? map.get("pid").toString() : "";
+        String formInstId = Objects.nonNull(map.get("formInstId")) ? map.get("formInstId").toString() : "";
+        String formUuid = Objects.nonNull(map.get("formUuid")) ? map.get("formUuid").toString() : "";
+        if (Strings.isNotBlank(pid)){
+            MDC.put("MDC_KEY_PID",pid);
+            if (Strings.isNotBlank(formInstId) && Strings.isBlank(formUuid)){
+                ydClient.operateData(YDParam.builder()
+                        .formInstId(formInstId)
+                        .useLatestVersion(true)
+                        .updateFormDataJson("{}").build(), YDConf.FORM_OPERATION.update);
+            }else if (Strings.isBlank(formInstId) && Strings.isNotBlank(formUuid)){
+                int i = 1;
+                int pageSize = 100;
+                DDR_New ddrNew;
+                do {
+                    ddrNew = ydClient.queryData(YDParam.builder()
+                            .formUuid(formUuid)
+                            .pageNumber(i)
+                            .pageSize(100)
+                            .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+                    List<String> formInstIdList = (List<String>) ddrNew.getData();
+
+                    //noExecuteExpression字段不传或传false  传true会导致实例版本不更新或滞后更新
+                    ydClient.operateData(YDParam.builder()
+                            .formInstanceIdList(formInstIdList)
+                            .formUuid(formUuid)
+                            .useLatestFormSchemaVersion(true)
+                            .updateFormDataJson("{}")
+                            .build(),YDConf.FORM_OPERATION.multi_update);
+
+                }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+            }
+
+            //发送工作通知给当前登陆人
+            if (Objects.nonNull(map.get("userId"))){
+                String userId = map.get("userId").toString();
+                Map param2 = new HashMap();
+                param2.put("access_token",ddClient.getAccessToken());
+                Map body3 = new HashMap();
+                body3.put("agent_id",ddConf.getAgentId());
+                body3.put("userid_list",userId);
+                Map msg = new HashMap();
+                msg.put("msgtype","text");
+                //获取当前时间 精确到秒
+                String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
+                msg.put("text", UtilMap.map("content","表单实例版本已更新  时间:" + time));
+                body3.put("msg",msg);
+                UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
+            }
+        }
+    }
+}