소스 검색

快客利更新供应商接口v2.0

wzy 11 달 전
부모
커밋
183f0caa5f

+ 2 - 1
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/controller/KKLController.java

@@ -185,7 +185,8 @@ public class KKLController {
         if (Strings.isNullOrEmpty(formInstId)){
             return McR.errorParam("参数缺失");
         }
-        return kklService.updateSuppliers(formInstId);
+        kklService.updateSuppliers(formInstId);
+        return McR.success();
     }
 
     @PostMapping("test")

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

@@ -29,7 +29,7 @@ public interface KKLService {
     List<Map<String, String>> getDiffMatchingSuppliers(String oldSupplierCode,String newSupplierCode);
 
     @Async
-    McR updateSuppliers(String formInstId);
+    void updateSuppliers(String formInstId);
 
     List<Map<String, String>> getDiffMatchingSuppliers2(String projectCode,String oldSupplierCode, String newSupplierCode);
 

+ 143 - 74
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/impl/KKLImplService.java

@@ -1,5 +1,6 @@
 package com.malk.kuaikeli.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -7,10 +8,13 @@ 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.McException;
 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.*;
 import lombok.SneakyThrows;
 import lombok.Synchronized;
@@ -41,6 +45,15 @@ public class KKLImplService implements KKLService {
     @Autowired
     private YDService ydService;
 
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDConf ddConf;
+
     /**
      * [动态] 发起单据, 分供应商进行流程推送
      */
@@ -68,9 +81,6 @@ public class KKLImplService implements KKLService {
         }
     }
 
-    @Autowired
-    private YDClient ydClient;
-
     /**
      * 菜单计划, 编辑校验
      * -
@@ -702,11 +712,18 @@ public class KKLImplService implements KKLService {
     }
 
 
+    @Async
     @Override
-    public McR updateSuppliers(String formInstId) {
+    public void updateSuppliers(String formInstId) {
+        //获取当前时间戳
+        long beginTimestamp = System.currentTimeMillis();
+        log.info("开始更新定价单供应商:{}",DateUtil.format(new Date(beginTimestamp), "yyyy-MM-dd HH:mm:ss"));
+
         //查询定价单供应商变更实例
-        Map formData = ydClient.queryData(YDParam.builder()
-                .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                .formInstanceId(formInstId).build(), YDConf.FORM_QUERY.retrieve_id);
+        String userId = ((Map) ddrNew.getOriginator()).get("userId").toString();
+        Map formData = ddrNew.getFormData();
 
         String oldSupplierCode = String.valueOf(formData.get("textField_lv3w1k1l"));//旧供应商编号
         String newSupplierCode = String.valueOf(formData.get("textField_llzzbai8"));//新供应商编号
@@ -721,15 +738,15 @@ public class KKLImplService implements KKLService {
 
         String projectCode = String.valueOf(formData.get("textField_lllovku7"));//定价单编号
 
-        //新供应商差异原材料编号
-        List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
+        //新供应商未匹配原材料编号
+//        List<String> newDiffSupplierMaterialCodes = new ArrayList<>();
         //新供应商匹配原材料编号
         List<String> newMatchSupplierMaterialCodes = new ArrayList<>();
         //新供应商匹配原材料名称
         List<String> newMatchSupplierMaterialNames = new ArrayList<>();
 
-        //老供应商差异原材料编号
-        List<String> oldDiffSupplierMaterialCodes = new ArrayList<>();
+        //老供应商未匹配原材料编号
+        List<String> oldNotMatchSupplierMaterialCodes = new ArrayList<>();
         //老供应商匹配原材料编号
         List<String> oldMatchSupplierMaterialCodes = new ArrayList<>();
 
@@ -756,17 +773,18 @@ public class KKLImplService implements KKLService {
                 newMatchSupplierMaterialCodes.add(newCode);
                 newMatchSupplierMaterialNames.add(newName);
             }
-            //未选择老供应商原材料且新供应商原材料不存在
-            if ((Objects.isNull(diff.get("associationFormField_lywr2qcr_id")) && !newSupplierMaterialCodes.contains(newCode))){
-                oldDiffSupplierMaterialCodes.add(oldCode);
-                newDiffSupplierMaterialCodes.add(newCode);
+            //未选择新供应商原材料
+            if (Objects.isNull(diff.get("associationFormField_lywr2qcr_id"))){
+                oldNotMatchSupplierMaterialCodes.add(oldCode);
+//                newDiffSupplierMaterialCodes.add(newCode);
             }
         }
 
-        //校验新供应商原材料编号是否重复
-        HashSet<String> set = new HashSet<>(newDiffSupplierMaterialCodes);
-        if (set.size() != newDiffSupplierMaterialCodes.size()){
-            return McR.errorUnknown("新供应商原材料编号存在重复!");
+        //校验已选择的新供应商原材料编号是否重复
+        HashSet<String> set = new HashSet<>(newMatchSupplierMaterialCodes);
+        if (set.size() != newMatchSupplierMaterialCodes.size()){
+            log.info("新供应商原材料编号存在重复!");
+            return;
         }
 
         /*for (Map diff : diffList) {
@@ -794,59 +812,12 @@ public class KKLImplService implements KKLService {
         }*/
 
         //未匹配上的原材料
-        List<String> notMatchCodes = new ArrayList<>();
+//        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;
-                }
-            }
-        }
+        //处理旧供应商定价单明细中间表
+        handleOldSupplierPriceDetailMiddle(oldSupplierMaterials,newSupplierName,newSupplierCode,oldNotMatchSupplierMaterialCodes,oldMatchSupplierMaterialCodes,newMatchSupplierMaterialCodes,newMatchSupplierMaterialNames,newSupplierMaterials);
 
         //更新定价单
         String supplierInstanceId = supplier.get(0).get("instanceId").toString();
@@ -883,7 +854,7 @@ public class KKLImplService implements KKLService {
             for (Map material : materialList) {
                 String code = material.get("textField_lmk94yf5").toString();
                 //如果明细被删除
-                if (notMatchCodes.contains(code)){
+                if (oldNotMatchSupplierMaterialCodes.contains(code)){
                     errorCodes.add(code);
                     continue;
                 }
@@ -927,10 +898,6 @@ public class KKLImplService implements KKLService {
                     .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));//新供应商原材料编号
@@ -945,8 +912,110 @@ public class KKLImplService implements KKLService {
                     .build(),YDConf.FORM_OPERATION.update);*/
         }
 
-        return McR.success();
+        long endTimestamp = System.currentTimeMillis();
+        log.info("更新供应商结束:{}",DateUtil.format(new Date(endTimestamp), "yyyy-MM-dd HH:mm:ss"));
+        log.info("耗时:{}秒",(endTimestamp - beginTimestamp)/1000);
+        //发送工作通知给发起人
+        if (Objects.nonNull(userId)){
+            Map param2 = new HashMap();
+            param2.put("access_token",ddClient.getAccessToken("dingtydw7atg0yzh2trz","x47ctlj-H4frFAcJbWQ0jz8rBlvKp4BmSML3nXYgB99Br2MrVQsV6RGUxHBTN-m7"));
+            Map body3 = new HashMap();
+            body3.put("agent_id","3205833281");
+            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 + ",耗时:" + (endTimestamp - beginTimestamp)/1000 + "秒"));
+            body3.put("msg",msg);
+            String s = UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", null, param2, body3);
+
+            log.info("发送工作通知给发起人:{}",s);
+        }
     }
 
 
+    //处理旧供应商定价单中间表
+    private void handleOldSupplierPriceDetailMiddle(List<Map> oldSupplierMaterials,String newSupplierName, String newSupplierCode,
+                                            List<String> oldNotMatchSupplierMaterialCodes,List<String> oldMatchSupplierMaterialCodes,
+                                            List<String> newMatchSupplierMaterialCodes,List<String> newMatchSupplierMaterialNames,
+                                            List<Map> newSupplierMaterials) {
+
+        int maxAttempts = 5; // 尝试的最大次数
+        int attempt = 0;
+        for (Map oldSupplierMaterial : oldSupplierMaterials) {
+            boolean success = false;
+            attempt = 0; // 重置当前迭代的尝试次数
+
+            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);//供应商编号
+
+            while (!success && attempt < maxAttempts){
+                try {
+                    int index1 = oldNotMatchSupplierMaterialCodes.indexOf(code);
+                    int index2 = oldMatchSupplierMaterialCodes.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);
+                    }else 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);
+                    }else {
+                        //自动匹配上的原材料
+                        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;
+                            }
+                        }
+                    }
+                    success = true;
+                }catch (McException e){
+                    if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")){
+                        attempt++;
+                        // 线程睡眠3秒
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException ie) {
+                            Thread.currentThread().interrupt(); // 重新设置中断状态
+                            System.err.println("Sleep interrupted: " + ie.getMessage());
+                        }
+                    }
+                }catch (Exception e){
+                    log.error("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},异常信息:{}", formInstanceId, name,code, e.getMessage());
+                    success = true;
+                }
+            }
+            if (!success) {
+                // 如果达到最大尝试次数后仍未成功,可以选择退出循环或做其他处理
+                log.info("处理旧供应商定价单中间表失败,实例id:{},物料名称:{},物料编号:{},尝试次数:{}", formInstanceId, name,code, attempt);
+            }
+
+        }
+    }
+
 }