Browse Source

Merge remote-tracking branch 'origin/master'

lfx 9 months ago
parent
commit
d8d872e797

+ 70 - 0
mjava-huagao/pom.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.2.0.RELEASE</version> <!-- 使用最新的稳定版或其他适用版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.malk.huagao</groupId>
+    <artifactId>mjava-huagao</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>huagao</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 17 - 0
mjava-huagao/src/main/java/com/malk/huagao/HuaGaoApplication.java

@@ -0,0 +1,17 @@
+package com.malk.huagao;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+@EnableScheduling
+public class HuaGaoApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(HuaGaoApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 20 - 0
mjava-huagao/src/main/java/com/malk/huagao/controller/HuaGaoController.java

@@ -0,0 +1,20 @@
+package com.malk.huagao.controller;
+
+import com.malk.huagao.service.HuaGaoService;
+import com.malk.server.common.McR;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("")
+public class HuaGaoController {
+    @Autowired
+    private HuaGaoService huaGaoService;
+
+    @GetMapping("/test")
+    public McR test() {
+        return McR.success();
+    }
+}

+ 4 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/HuaGaoService.java

@@ -0,0 +1,4 @@
+package com.malk.huagao.service;
+
+public interface HuaGaoService {
+}

+ 8 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/HuaGaoServiceImpl.java

@@ -0,0 +1,8 @@
+package com.malk.huagao.service.impl;
+
+import com.malk.huagao.service.HuaGaoService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HuaGaoServiceImpl implements HuaGaoService {
+}

+ 28 - 0
mjava-huagao/src/main/resources/application-dev.yml

@@ -0,0 +1,28 @@
+server:
+  port: 8112
+  servlet:
+    context-path: /huagao
+
+enable:
+  scheduling: false
+logging:
+  path: /home/server/huagao/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 3254218465
+  appKey: dingdhgwe3g6xrifq3iz
+  appSecret: xO9uBMFGvv79UAqv8HBPZQVXLBbLhf8ueX28Vtn_de-4ME7-K9wBRVFihCGFoeX4
+  corpId:
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType:
+  systemToken:
+
+

+ 29 - 0
mjava-huagao/src/main/resources/application-prod.yml

@@ -0,0 +1,29 @@
+server:
+  port: 8112
+  servlet:
+    context-path: /huagao
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/huagao/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 3254218465
+  appKey: dingdhgwe3g6xrifq3iz
+  appSecret: xO9uBMFGvv79UAqv8HBPZQVXLBbLhf8ueX28Vtn_de-4ME7-K9wBRVFihCGFoeX4
+  corpId:
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType:
+  systemToken:
+
+

+ 15 - 0
mjava-huagao/src/main/resources/application.yml

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: dev
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      id-type: auto

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

@@ -1,12 +1,18 @@
 package com.malk.kabeiyi.controller;
 
 import com.malk.kabeiyi.service.KabeiyiService;
+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.DDR_New;
+import com.malk.service.aliwork.YDClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.*;
@@ -29,7 +35,10 @@ public class KabeiyiController {
 
     //审批实例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=";
-
+    @GetMapping("test")
+    public McR test(){
+        return McR.success();
+    }
 
     @GetMapping("getList")
     public McR getList(String pid,String procCode,String nextToken){
@@ -98,4 +107,61 @@ public class KabeiyiController {
     public McR getDeliveryInfo(){
         return kabeiyiService.getDeliveryInfo();
     }
+
+    /*@Autowired
+    private YDClient ydClient;
+    @GetMapping("deleteAllData")
+    public McR deleteAllData(){
+        MDC.put("MDC_KEY_PID","1019");
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 100;
+        String formUuid = "FORM-809458EB6D524CF5AE1A91A3492D8B1BZIMN";
+        List<String> errorList = new ArrayList<>();
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid(formUuid)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize).build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+            List<String> list =(List<String>) ddrNew.getData();
+
+            int i=1;
+            boolean flag = false;
+            while (i<=5 && !flag){
+                try {
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid(formUuid)
+                            .asynchronousExecution(false)
+                            .formInstanceIdList(list)
+                            .build(),YDConf.FORM_OPERATION.delete_batch);
+                    flag = true;
+                }catch (McException e){
+                    if (e.getMessage().contains("The request has failed due to a temporary failure of the server.")){
+                        log.info("请求失败,尝试次数:{}",i);
+                        i++;
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException ex) {
+                            throw new RuntimeException(ex);
+                        }
+                    }else {
+                        log.info("删除失败 失败原因:{}" , e.getMessage());
+                        errorList.addAll(list);
+                        flag = true;
+                    }
+                }catch (Exception e){
+                    log.info("删除失败 失败原因:{}" , e.getMessage());
+                    errorList.addAll(list);
+                    flag = true;
+                }
+            }
+            if (i>5){
+                log.info("删除失败,重试次数过多");
+            }
+
+        }while (ddrNew.getTotalCount() > 0);
+        log.info("失败列表:{}",errorList);
+        return McR.success();
+    }*/
 }

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

@@ -39,5 +39,6 @@ public interface KabeiyiService {
 
     McR addPlanApproval(Map map);
 
+    @Async
     McR getDeliveryInfo();
 }

+ 210 - 45
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/KabeiyiServiceImpl.java

@@ -16,6 +16,7 @@ import com.malk.kabeiyi.util.RecognizeAllText;
 import com.malk.kabeiyi.util.U8Util;
 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;
@@ -25,6 +26,7 @@ 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.UtilMap;
 import com.malk.utils.UtilToken;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -32,6 +34,7 @@ import org.apache.commons.lang3.time.DateUtils;
 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;
 
 import java.io.FileOutputStream;
@@ -90,27 +93,43 @@ public class KabeiyiServiceImpl implements KabeiyiService {
     @Value("${u8.appSecret}")
     private String u8AppSecret;
 
-    //u8数据源库序号
-    private static final int[] DS_SEQUENCES = {2,3,5,8,9,10,12,14};
-
     //审批实例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 String QUESTION = "FORM-89F515967FF94C62A9031F28EF6000B1YV5Q";
+
     //问题整改表流程code
     private static final String QUESTION_PROC_CODE = "TPROC--DP5660A1LEXNP1S37P7KU9GCHD5U3HB6C360M5";
+
     //审核表
     private static final String CHECK = "FORM-F4ED246EADD8427381BC13C4F0FEF7FDYMKJ";
+
     //审核表流程code
     private static final String CHECK_PROC_CODE = "TPROC--4XC66Y61XWWNZNJKBZD4VAB5BQAJ2YANX160M5";
-    //关联表单(卡倍亿)
+
+    //审核计划
+    private static final String CHECK_PLAN = "FORM-A9A7991EEB7D41FDAADADB9B1E1750FE0K5K";
+
+    //产品实发
+    private static final String PRODUCT_REAL = "FORM-809458EB6D524CF5AE1A91A3492D8B1BZIMN";
+
+    //内部交易客户
+    private static final String INTERNAL_CUSTOMER = "FORM-14782CE27EA54D2C94CC5BEF90554E5ALYP7";
+
+    //内部工厂
+    private static final String INTERNAL_FACTORY = "FORM-6CD7A1EDE1134AC8B2EE833769595C2EIWQ6";
+
+     //关联表单(卡倍亿)
     private static final Map<String,String> SCHEMA_MAP = new HashMap<>();
     static{
         SCHEMA_MAP.put("工厂用章流程","1.1、工厂用章流程(除采购营销人事)");
@@ -351,9 +370,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         Map formData = ddrNew.getFormData();
 
         List<String> reviewerUserIds = (List<String>) formData.get("employeeField_m061zye5_id");//审核人
-        List<String> deptManagerUserIds = (List<String>) formData.get("employeeField_m10d5uqj_id");//部门经理
-        String area = formData.get("selectField_m0w4kilf").toString();//审核区域
-
+        String area = formData.get("selectField_m0w4kilf").toString();
         List<Map> details = (List<Map>) formData.get("tableField_m0kqtqoy");
         String[] yida = McProject.getYida("1009");
         for (Map detail : details) {
@@ -366,23 +383,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 question.put("attachmentField_m061zyep",detail.get("attachmentField_m061zyep"));//问题证据
                 question.put("textareaField_m063drgz",detail.get("textareaField_m063drgz"));//问题描述
                 question.put("dateField_m061zyev",detail.get("dateField_m061zyev"));//整改截止时间
-                question.put("employeeField_m10dns9c",deptManagerUserIds);//部门经理
-
-                //根据userId获取部门id
-                List<String> rectificationUserIds = (List<String>) detail.get("employeeField_m061zyeq_id");
-                question.put("employeeField_m061zyeq",rectificationUserIds);//责任整改人
+                question.put("employeeField_m10dns9c",detail.get("employeeField_m10d5uqj_id"));//部门经理
                 question.put("selectField_m0w4kilf",area);//审核区域
 
-                Map body2 = new HashMap<>();
-                body2.put("userid", rectificationUserIds.get(0));
-
-                DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/department/listparentbyuser", null, ddClient.initTokenParams(), body2, DDR_New.class);
-                Map result2 = (Map) ddrNew1.getResult();
-                List<Map> parentList = (List<Map>) result2.get("parent_list");
-                List<Long> parentDeptIdList = (List<Long>) parentList.get(0).get("parent_dept_id_list");
-                String deptId = parentDeptIdList.get(0) + "";
-                question.put("departmentSelectField_m0p0tbyo",new String[]{deptId});//部门
-
                 Map<String,Object> body = new HashMap<>();
                 body.put("appType",yida[0]);
                 body.put("systemToken",yida[1]);
@@ -400,11 +403,11 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
     @Override
     public McR ocr(String downloadUrl,String name,String type) {
-        MDC.put("MDC_KEY_PID","1009");
+        MDC.put("MDC_KEY_PID","1020");
 
         //下载宜搭附件
         try {
-            String[] yida = McProject.getYida("1009");
+            String[] yida = McProject.getYida("1020");
             downloadFile(downloadUrl,filePath + name,yida[0],yida[1]);
             log.info("文件下载成功!");
         } catch (IOException e) {
@@ -506,7 +509,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 break;
             default:break;
         }
-
+        //获取所有子表明细(大于50条)
+        List<Map> details = getInnerTable(CHECK_PLAN,formInstId,"tableField_m0kqtqoy",1,50);
+        formData.put("tableField_m0kqtqoy",details);
         //每个审批人发起审批
         for (String reviewerUserId : reviewerUserIds) {
             //根据userId获取部门id
@@ -547,15 +552,71 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         return McR.success();
     }
 
+    private List<Map> getInnerTable(String formUuid, String formInstId, String tableField, int pageNumber, int pageSize) {
+        List<Map> details = new ArrayList<>();
+        DDR_New ddrNew = new DDR_New();
+
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid(formUuid)
+                    .formInstId(formInstId)
+                    .tableFieldId(tableField)
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize)
+                    .build(), YDConf.FORM_QUERY.retrieve_details);
+            details.addAll((List<Map>)ddrNew.getData());
+            pageNumber++;
+        }while (ddrNew.getTotalCount() > pageSize * ddrNew.getPageNumber());
+
+        return details;
+    }
+
     @Override
+    @Async
     public McR getDeliveryInfo() {
-        MDC.put("MDC_KEY_PID","1009");
+        //现在时间戳
+        long beginTime = System.currentTimeMillis();
+
+        MDC.put("MDC_KEY_PID","1019");
 
-        for (int dsSequence : DS_SEQUENCES) {
-            //获取昨天所有发货单
-            DateTime dateTime = DateUtil.offsetDay(new Date(), -1);
-            String yesterday = dateTime.toString("yyyy-MM-dd");
-//            String yesterday = dateTime.toString("2024-07-01");
+        //内部交易客户
+        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                .formUuid(INTERNAL_CUSTOMER)
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> data = (List<Map>) ddrNew.getData();
+
+        Set<String> cusCodes = new HashSet<>();
+        for (Map map : data) {
+            Map formData = (Map) map.get("formData");
+            cusCodes.add(getString(formData.get("textField_m1g1tp7i")));
+        }
+
+        //数据源对应工厂
+        Map<Integer,String> factory = new HashMap<>();
+        DDR_New ddrNew2 = ydClient.queryData(YDParam.builder()
+                .formUuid(INTERNAL_FACTORY)
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> data2 = (List<Map>) ddrNew2.getData();
+        for (Map map : data2) {
+            Map formData = (Map) map.get("formData");
+            int dqNumber = (int) formData.get("numberField_m1fvucmc");//数据源序号
+            String factoryName = getString(formData.get("textField_m1fvucmd"));//工厂名称
+            factory.put(dqNumber,factoryName);
+        }
+        List<Map> errorList = new ArrayList<>();
+
+        //同步当月内的数据 upsert
+        DateTime dateTime = DateUtil.offsetDay(new Date(), -1);
+        String yesterday = dateTime.toString("yyyy-MM-dd");
+
+        DateTime beginOfMonth = DateUtil.beginOfMonth(DateUtil.lastMonth());
+        String beginOfMonthString = beginOfMonth.toString("yyyy-MM-dd");
+
+/*        String beginOfMonthString = "2024-10-09";
+
+        String yesterday = "2024-10-09";*/
+        for (Integer dsSequence : factory.keySet()) {
+            List<String> errorCodes = new ArrayList<>();
 
             Map<String,Object> param = new HashMap<>();
             param.put("from_account",fromAccount);
@@ -565,16 +626,21 @@ public class KabeiyiServiceImpl implements KabeiyiService {
             param.put("page_index", 1);
             param.put("rows_per_page", 50);
             param.put("ds_sequence", dsSequence);
-            param.put("date_begin", yesterday);
+            param.put("date_begin", beginOfMonthString);
             param.put("date_end", yesterday);
 
             Map<String, Object> map = get("https://api.yonyouup.com/api/consignmentlist/batch_get", param, null);
+            if (!getString(map.get("errcode")).equals("0")){
+                log.error("获取发货单列表失败:{}",map.get("errmsg"));
+                continue;
+            }
             if (!map.get("page_count").equals("1")){
                 Integer rowCount = Integer.valueOf(map.get("row_count").toString());
                 param.put("rows_per_page",rowCount);
                 map = get("https://api.yonyouup.com/api/consignmentlist/batch_get", param, null);
             }
             List<Map> consignmentList = (List<Map>) map.get("consignmentlist");
+
             for (Map consignment : consignmentList) {
                 //查询单个发货单详情
                 String id = getString(consignment.get("code"));
@@ -587,27 +653,59 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 param2.put("id", id);
                 param2.put("ds_sequence", dsSequence);
 
-                Map<String, Object> map2 = get("https://api.yonyouup.com/api/consignment/get", param2, null);
+                Map<String, Object> map2 = new HashMap<>();
+
+                int i1 =1 ;
+                boolean flag1 = false;
+                while (i1<=5 && !flag1) {
+                    try {
+                        map2 = get("https://api.yonyouup.com/api/consignment/get", param2, null);
+                        flag1 = true;
+                    } catch (Exception e) {
+                        log.error("获取发货单详情失败:{}, 重试次数:{}",e.getMessage(),i1);
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException ex) {
+                            throw new RuntimeException(ex);
+                        }
+                        i1++;
+                    }
+                }
+                if (i1 > 5){
+                    log.error("获取发货单详情失败");
+                    errorCodes.add(id);
+                    continue;
+                }
+
 
                 Map consignment2 = (Map) map2.get("consignment");
 
                 Map formData = new HashMap();
+                //若为内部交易客户,则不同步
+                String cusCode = getString(consignment2.get("custcode"));
+                if (cusCodes.contains(cusCode)){
+                    continue;
+                }
+
+                formData.put("textField_m18nvp7y",getString(consignment2.get("cusname")));//客户名称
+                formData.put("textField_m219zpzf",getString(consignment2.get("cusabbname")));//客户码
                 formData.put("textField_m18qfuiz",getString(consignment2.get("operation_type")));//操作类型
                 formData.put("textField_m18qfuj0",getString(consignment2.get("saletypename")));//销售类型
                 formData.put("textField_m18nvp87",getString(consignment2.get("code")));//发货单code
-                formData.put("dateField_m18nvp7x",DateUtil.parseDate(yesterday).getTime());//发货日期
-                formData.put("textField_m18nvp7y",getString(consignment2.get("cusname")));//客户名称
+                formData.put("dateField_m18nvp7x",DateUtil.parseDate(getString(consignment.get("date"))).getTime());//发货日期
                 formData.put("textField_m18nvp7z",getString(consignment2.get("deptname")));//部门
                 formData.put("textField_m18nvp81",getString(consignment2.get("maker")));//生产员
-                formData.put("textField_m18nvp80",getString(consignment2.get("verifier")));//生产员
-                formData.put("numberField_m18wkih7",dsSequence);//生产员
+                formData.put("textField_m18nvp80",getString(consignment2.get("verifier")));//质检员
+                formData.put("numberField_m18wkih7",dsSequence);//数据源序号
+                formData.put("textField_m1er3scl",factory.get(dsSequence));//工厂名称
 
                 List<Map> entry = (List<Map>) consignment2.get("entry");
                 List<Map> collect = entry.stream().map(item -> {
                     Map detail = new HashMap();
                     detail.put("textField_m18nvp8c", getString(item.get("socode")));//销售订单号
                     detail.put("textField_m18nvp8d", getString(item.get("warehouse_name")));//仓库名称
-                    detail.put("textField_m18nvp8e", getString(item.get("inventory_name")));//库存名称
+                    detail.put("textField_m18nvp8e", getString(item.get("inventory_name")));//存货名称
+                    detail.put("textField_m22mkwzk", getString(item.get("define29")));//客户存货码
                     detail.put("textField_m18nvp8f", getString(item.get("cinvm_unit")));//单位
                     detail.put("numberField_m18nvp8h", getString(item.get("quantity")));//发货长度
                     detail.put("numberField_m18nvp8j", getString(item.get("price")));//未税单价
@@ -616,21 +714,88 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                     detail.put("numberField_m18nvp8m", getString(item.get("sum")));//含税总价
                     detail.put("numberField_m18nvp8n", getString(item.get("taxrate")));//税率
                     detail.put("numberField_m18nvp8o", getString(item.get("tax")));//总税价
-                    detail.put("dateField_m18yzlob", DateUtil.parseDate(yesterday).getTime());//发货日期
+                    detail.put("dateField_m18yzlob", DateUtil.parseDate(getString(consignment.get("date"))).getTime());//发货日期
                     detail.put("textField_m18z3yn8", getString(consignment2.get("cusname")));//客户名称
+                    detail.put("textField_m219zpzg", getString(item.get("free1")));//客户码
+                    detail.put("textField_m21b1bhg", getString(item.get("free2")));//产品颜色
+
+                    detail.put("textField_m1odluob", factory.get(dsSequence));//工厂名称
 
                     return detail;
                 }).collect(Collectors.toList());
 
                 formData.put("tableField_m18nvp82",collect);//发货明细
-
-                ydClient.operateData(YDParam.builder()
-                        .formUuid("FORM-BE542784AAC04206BD46AF3D9CD1F12DYSKF")
-                        .formDataJson(JSON.toJSONString(formData))
-                        .build(), YDConf.FORM_OPERATION.create);
+                int i=1;
+                boolean flag = false;
+                while (i<=5 && !flag){
+                    try{
+                        List<Map> jsonString = new ArrayList<>();
+                        jsonString.add(UtilMap.map("key, value, type, operator, componentName", "textField_m18nvp87",getString(consignment2.get("code")),"TEXT","eq","TextField"));
+                        jsonString.add(UtilMap.map("key, value, type, operator, componentName", "numberField_m18wkih7",new int[]{dsSequence,dsSequence},"DOUBLE","between","NumberField"));
+
+                        String searchCondition = JSONObject.toJSONString(jsonString);
+
+                        ydClient.operateData(YDParam.builder()
+                                .formUuid(PRODUCT_REAL)
+//                                .searchCondition(JSON.toJSONString(UtilMap.map("textField_m18nvp87, numberField_m18wkih7",getString(consignment2.get("code")),dsSequence)))//模糊查询
+                                .searchCondition(searchCondition)//精准查询
+                                .formDataJson(JSON.toJSONString(formData))
+                                .build(), YDConf.FORM_OPERATION.upsert);
+                        flag = true;
+                    }catch (McException e){
+                        if (e.getMessage().contains("The request has failed due to a temporary failure of the server.")){
+                            log.error("upsert失败,尝试次数:{}",i);
+                            i++;
+                            try {
+                                Thread.sleep(3000);
+                            } catch (InterruptedException ex) {
+                                throw new RuntimeException(ex);
+                            }
+                        }else {
+                            log.error("upsert,失败原因:{}" , e.getMessage());
+                            errorCodes.add(id);
+                            flag = true;
+                        }
+                    }catch (Exception e){
+                        log.error("发货单:{} 同步失败 失败原因:{}",getString(consignment2.get("code")) , e.getMessage());
+                        errorCodes.add(id);
+                        flag = true;
+                    }
+                }
+                if (i>5){
+                    errorCodes.add(id);
+                    log.error("发货单:{} 同步失败 失败原因:{}",getString(consignment2.get("code")) , "重试次数过多");
+                }
             }
-        }
 
+            Map error = new HashMap();
+            error.put("ds_sequence",dsSequence);
+            error.put("error_count",errorCodes.size());
+            //errorCodes逗号分隔
+            error.put("error_codes",errorCodes.stream().collect(Collectors.joining(",")));
+            errorList.add(error);
+
+        }
+        long endTime = System.currentTimeMillis();
+        double time = (endTime - beginTime) / 1000.0;
+        log.info("同步完成,耗时:{}秒", time);
+        log.info("同步失败列表: {}", errorList);
+
+        //记录失败日志
+        Map<String,Object> formData = new HashMap<>();
+        formData.put("dateField_m21oifwi",beginTime);
+        formData.put("dateField_m21oifwp",endTime);
+        formData.put("numberField_m21oifwo",time);
+        //换行分隔errorList
+        String errorStr = errorList.stream().map(item -> {
+            String s = "数据源序号:" + item.get("ds_sequence") + ",错误数量:" + item.get("error_count") + ",发货单codes:" + item.get("error_codes");
+            return s;
+        }).collect(Collectors.joining("\n"));
+        formData.put("textareaField_m21oifwj",errorStr);
+        ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-F297D439FFF747ACB26DEA940850CD9B13LM")
+                .formDataJson(JSON.toJSONString(formData))
+                .build(), YDConf.FORM_OPERATION.create);
         return McR.success();
     }
 

+ 4 - 2
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/McProjectServiceImpl.java

@@ -29,7 +29,9 @@ public class McProjectServiceImpl implements McProjectService {
         MDC.put("MDC_KEY_PID","1002");
         McProject.addYida("1002",new String[] {"APP_YNE2466O27IZFF9VVLQ1","T6666H71IOAMFEZR9I4O08U8TWJL2VAACWWXLJ4"});
         McProject.addYida("1003",new String[] {"APP_CRSI2VXGJE74J60OEFPD","C1A66XB1JOAMVXWCE3H28B05EU7T2F3AM4XXLN3"});
-        McProject.addYida("1009",new String[] {"APP_S5U4NUUK2T4RF8UR17EN","JL666BD1QGXNTZQ5DXEI97Q1USK92I1G6160MTCF"});
-        log.info("项目加载完毕:1002,1003,1009");
+        McProject.addYida("1009",new String[] {"APP_S5U4NUUK2T4RF8UR17EN","JL666BD1QGXNTZQ5DXEI97Q1USK92I1G6160MTCF"});//卡倍亿二期-分层审核
+        McProject.addYida("1019",new String[] {"APP_UT77LJBEO7ZH3N5MX1TJ","ND966TC1C69P0KL9EE47C6WBVCBH29IMLRZ1M6E"});//卡倍亿二期-产量分析
+        McProject.addYida("1020",new String[] {"APP_TROTJSBUI5IMEJYKXJU1","VF666N91369PUM829XYCL8LD9A433TH9GSZ1M8A"});//卡倍亿二期-OCR识别
+        log.info("项目加载完毕:1002,1003,1009,1019,1020");
     }
 }

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

@@ -54,9 +54,10 @@ public class KKLController {
         log.info("validate, {}", JSON.toJSONString(data));
 
         boolean approve=kklService.validateApprove(data);
-        if(approve){
+        //09.27 改为通过业务关联规则更新菜单计划状态
+        /*if(approve){
             kklService.updateState(UtilMap.getString(data,"poid"));
-        }
+        }*/
         return McR.success();
     }
 

+ 7 - 1
mjava-kuaikeli/src/main/java/com/malk/kuaikeli/service/impl/KKLImplService.java

@@ -368,9 +368,15 @@ public class KKLImplService implements KKLService {
         String cost6 = UtilMap.getString(data,"state");// 原材料状态
 
         //todo2: 服务执行, 周日凌晨更新价格前, 是否重新匹配数据?
+        List<Map> jsonString = new ArrayList<>();
+        jsonString.add(UtilMap.map("key, value, type, operator, componentName", "textField_llkb7kd2",data.get("itemNumber"),"TEXT","eq","TextField"));
+
+        String searchCondition = JSONObject.toJSONString(jsonString);
+
         List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
                 .formUuid("FORM-E6766M811CKD2PIXEAKOM9S2DKBM2PBQU1MLL5")
-                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llkb7kd2", data.get("itemNumber"))))
+//                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llkb7kd2", data.get("itemNumber"))))//模糊匹配
+                .searchFieldJson(searchCondition)//精准匹配
                 .build());
         log.info("adjustCost, {}", dataList.size());
 

+ 35 - 0
mjava-mc/src/main/java/com/malk/mc/controller/McItemLvController.java

@@ -0,0 +1,35 @@
+package com.malk.mc.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.core.McProject;
+import com.malk.server.common.McR;
+import com.malk.utils.PublicUtil;
+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;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2024/10/10 14:44
+ */
+@RestController
+@RequestMapping("/Item/")
+public class McItemLvController {
+
+
+//    律所传参为空校验
+@PostMapping("checkNull")
+public McR add(@RequestBody JSONObject param){
+//
+    if(PublicUtil.isNull(param,"param")){
+        return McR.errorNullPointer();
+    }else{
+        return McR.success();
+
+    }
+
+}
+
+}