Parcourir la source

Merge remote-tracking branch 'origin/master'

lfx il y a 4 mois
Parent
commit
d8a02b1cd8
95 fichiers modifiés avec 6720 ajouts et 1322 suppressions
  1. 97 0
      mjava-chuizi/pom.xml
  2. 17 0
      mjava-chuizi/src/main/java/com/malk/chuizi/ChuiZiApplication.java
  3. 22 0
      mjava-chuizi/src/main/java/com/malk/chuizi/common/SeqHelper.java
  4. 24 0
      mjava-chuizi/src/main/java/com/malk/chuizi/config/KDWebApiConf.java
  5. 29 0
      mjava-chuizi/src/main/java/com/malk/chuizi/config/KDWebApiConfig.java
  6. 29 0
      mjava-chuizi/src/main/java/com/malk/chuizi/controller/ChuiziController.java
  7. 22 0
      mjava-chuizi/src/main/java/com/malk/chuizi/controller/DDController.java
  8. 93 0
      mjava-chuizi/src/main/java/com/malk/chuizi/delegate/DDDelegate.java
  9. 22 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/AccountsPayableEntity.java
  10. 26 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/Audit.java
  11. 18 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/BillQuery.java
  12. 15 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/BillTypeID.java
  13. 33 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/Customer.java
  14. 25 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/DefectEntity.java
  15. 15 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/FNumber.java
  16. 63 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/ForecastEntity.java
  17. 16 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/LinkEntry.java
  18. 33 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/Model.java
  19. 28 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/OtherMeet.java
  20. 29 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/OtherMeetEntity.java
  21. 29 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/SaleOrderEntry.java
  22. 16 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/SaleOrderFinance.java
  23. 24 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/Save.java
  24. 22 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/Submit.java
  25. 14 0
      mjava-chuizi/src/main/java/com/malk/chuizi/entity/View.java
  26. 19 0
      mjava-chuizi/src/main/java/com/malk/chuizi/service/ChuiZiService.java
  27. 520 0
      mjava-chuizi/src/main/java/com/malk/chuizi/service/impl/ChuiZiServiceImpl.java
  28. 285 0
      mjava-chuizi/src/main/java/com/malk/chuizi/utils/HttpUtils.java
  29. 49 0
      mjava-chuizi/src/main/resources/application-dev.yml
  30. 49 0
      mjava-chuizi/src/main/resources/application-dev2.yml
  31. 49 0
      mjava-chuizi/src/main/resources/application-prod.yml
  32. 15 0
      mjava-chuizi/src/main/resources/application.yml
  33. 61 0
      mjava-chuizi/src/main/resources/logback-spring.xml
  34. 22 0
      mjava-huagao/pom.xml
  35. 2 0
      mjava-huagao/src/main/java/com/malk/huagao/HuaGaoApplication.java
  36. 34 21
      mjava-huagao/src/main/java/com/malk/huagao/controller/HuaGaoController.java
  37. 47 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/YdNonProdPrice.java
  38. 32 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/YdProdWorkHoursPrice.java
  39. 55 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/YdUserInput.java
  40. 23 0
      mjava-huagao/src/main/java/com/malk/huagao/mapper/YdNonProdPriceMapper.java
  41. 18 0
      mjava-huagao/src/main/java/com/malk/huagao/mapper/YdProdWorkHoursPriceMapper.java
  42. 18 0
      mjava-huagao/src/main/java/com/malk/huagao/mapper/YdUserInputMapper.java
  43. 40 3
      mjava-huagao/src/main/java/com/malk/huagao/schedule/ScheduleTask.java
  44. 9 10
      mjava-huagao/src/main/java/com/malk/huagao/service/HuaGaoService.java
  45. 146 180
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/HuaGaoServiceImpl.java
  46. 44 0
      mjava-huagao/src/main/java/com/malk/huagao/utils/MPGenerator.java
  47. 21 2
      mjava-huagao/src/main/resources/application-dev.yml
  48. 23 5
      mjava-huagao/src/main/resources/application-prod.yml
  49. 1 1
      mjava-huagao/src/main/resources/application.yml
  50. 9 0
      mjava-huagao/src/main/resources/mapper/YdNonProdPriceMapper.xml
  51. 5 0
      mjava-huagao/src/main/resources/mapper/YdProdWorkHoursPriceMapper.xml
  52. 5 0
      mjava-huagao/src/main/resources/mapper/YdUserInputMapper.xml
  53. 16 0
      mjava-huagao/src/test/java/com/malk/huagao/YyYdTest.java
  54. 2 2
      mjava-jianhui/src/main/java/com/malk/jianhui/controller/JianhuiController.java
  55. 10 6
      mjava-jianhui/src/main/java/com/malk/jianhui/service/impl/JianhuiServiceImpl.java
  56. 1 1
      mjava-jianhui/src/main/resources/application-dev.yml
  57. 1 1
      mjava-jianhui/src/main/resources/application-prod.yml
  58. 1 1
      mjava-jianhui/src/main/resources/logback-spring.xml
  59. 21 83
      mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java
  60. 3 2
      mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/KabeiyiService.java
  61. 443 88
      mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/KabeiyiServiceImpl.java
  62. 1 1
      mjava-kabeiyi/src/main/resources/application.yml
  63. 180 0
      mjava-kabeiyi/src/test/java/com/malk/kabeiyi/DdTest.java
  64. 96 0
      mjava-lilin/pom.xml
  65. 100 0
      mjava-lilin/src/main/java/com/malk/lilin/Controller/LiLinController.java
  66. 96 0
      mjava-lilin/src/main/java/com/malk/lilin/Controller/taskController.java
  67. 13 0
      mjava-lilin/src/main/java/com/malk/lilin/MjavaLilinApplication.java
  68. 24 0
      mjava-lilin/src/main/java/com/malk/lilin/Service/LiLinService.java
  69. 1353 0
      mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java
  70. 34 0
      mjava-lilin/src/main/resources/application-dev.yml
  71. 15 0
      mjava-lilin/src/main/resources/application.yml
  72. 13 0
      mjava-lilin/src/test/java/com/malk/lilin/MjavaLilinApplicationTests.java
  73. 1 0
      mjava-mc/pom.xml
  74. 269 0
      mjava-mc/src/main/java/com/malk/mc/controller/McCjController.java
  75. 62 22
      mjava-mc/src/main/java/com/malk/mc/controller/McYdController.java
  76. 7 0
      mjava-mc/src/main/java/com/malk/mc/service/McYdService.java
  77. 1 4
      mjava-mc/src/main/java/com/malk/mc/service/impl/McProjectServiceImpl.java
  78. 328 76
      mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java
  79. 16 0
      mjava-pake/pom.xml
  80. 51 0
      mjava-pake/src/main/java/com/malk/pake/controller/PkProjectController.java
  81. 39 0
      mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java
  82. 15 0
      mjava-pake/src/main/java/com/malk/pake/service/PkProjectService.java
  83. 507 0
      mjava-pake/src/main/java/com/malk/pake/service/impl/PkProjectServiceImpl.java
  84. 285 0
      mjava-pake/src/main/java/com/malk/pake/utils/HttpUtils.java
  85. 4 1
      mjava-pake/src/main/resources/application-dev.yml
  86. 8 5
      mjava-pake/src/main/resources/application-prod.yml
  87. 1 1
      mjava-pake/src/main/resources/application.yml
  88. 0 790
      mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/RsQysServiceImpl.java
  89. 1 1
      mjava-yiyao/pom.xml
  90. 102 0
      mjava-yiyao/src/main/java/com/malk/yiyao/controller/CallBackController.java
  91. 5 0
      mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java
  92. 197 0
      mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java
  93. 6 6
      mjava-yiyao/src/main/resources/application-dev.yml
  94. 8 9
      mjava-yiyao/src/main/resources/application-prod.yml
  95. 22 0
      mjava-yiyao/src/test/java/com/malk/yiyao/YiyaoTest.java

+ 97 - 0
mjava-chuizi/pom.xml

@@ -0,0 +1,97 @@
+<?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.chuizi</groupId>
+    <artifactId>mjava-chuizi</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>k3cloud</artifactId>
+            <version>8.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <finalName>chuzii</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>
+
+</project>

+ 17 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/ChuiZiApplication.java

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

+ 22 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/common/SeqHelper.java

@@ -0,0 +1,22 @@
+package com.malk.chuizi.common;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class SeqHelper {
+    static long seq = 0L;
+    static int mod = 10000;
+
+    public SeqHelper() {
+    }
+
+    public static long genSeq() {
+        return ++seq;
+    }
+
+    public static String genNumber(String pre) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMHHmmss");
+        String id = sdf.format(new Date());
+        return pre == null ? id + (genSeq() + (long)mod) : pre + id + (genSeq() + (long)mod);
+    }
+}

+ 24 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/config/KDWebApiConf.java

@@ -0,0 +1,24 @@
+package com.malk.chuizi.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "kingdee")
+@Slf4j
+public class KDWebApiConf {
+
+    private String XKDApiAcctID;
+
+    private String XKDApiUserName;
+
+    private String XKDApiAppID;
+
+    private String XKDApiAppSec;
+
+    private String XKDApiServerUrl;
+
+}

+ 29 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/config/KDWebApiConfig.java

@@ -0,0 +1,29 @@
+package com.malk.chuizi.config;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class KDWebApiConfig {
+    private Properties properties = new Properties();
+
+    public KDWebApiConfig(String filePath) throws IOException {
+        try (FileInputStream input = new FileInputStream(filePath)) {
+            properties.load(input);
+        }
+    }
+
+    public String getProperty(String key) {
+        return properties.getProperty(key);
+    }
+
+    public static void main(String[] args) {
+        try {
+            KDWebApiConfig config = new KDWebApiConfig("mjava-jianhui/src/main/resources/application-dev.yml");
+            System.out.println("AcctID: " + config.getProperty("X-KDApi-AcctID"));
+            // 打印其他属性...
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 29 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/controller/ChuiziController.java

@@ -0,0 +1,29 @@
+package com.malk.chuizi.controller;
+
+import com.malk.chuizi.service.ChuiZiService;
+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.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+public class ChuiziController {
+
+    @Autowired
+    ChuiZiService chuiZiService;
+    @GetMapping("/test")
+    public McR test(){
+        return McR.success();
+    }
+
+    //新增其他应付单
+    @PostMapping("/saveAccountsPayable")
+    public McR saveOtherMeet(Map processData) {
+        return chuiZiService.saveAccountsPayable(processData);
+    }
+
+
+}

+ 22 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/controller/DDController.java

@@ -0,0 +1,22 @@
+package com.malk.chuizi.controller;
+
+import com.malk.controller.DDCallbackController;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 钉钉事件回调 3_1
+ * -
+ * [子项目直接继承即可有调用, 无需实现]
+ * -
+ * 注解 @RequestMapping 路径不能重复 [主子项目属同一个项目];
+ * 获取项目回调请求地址, https://mc.cloudpure.cn/frp/xxx/dd/callback [调试代理: frp + nginx]
+ */
+@Slf4j
+@RestController
+@RequestMapping("/dd")
+public class DDController extends DDCallbackController {
+
+
+}

+ 93 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/delegate/DDDelegate.java

@@ -0,0 +1,93 @@
+package com.malk.chuizi.delegate;
+
+import com.malk.chuizi.service.ChuiZiService;
+import com.malk.delegate.DDEvent;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Personnel;
+import com.malk.service.dingtalk.DDClient_Workflow;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+@Primary
+public class DDDelegate implements DDEvent {
+
+    @Autowired
+    ChuiZiService chuiZiService;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+    // 审批任务回调执行业务逻辑
+
+    @Async
+    @Override
+    public void executeEvent_Task_Finish(String processInstanceId, String processCode, boolean isAgree, String remark) {
+        log.info("executeEvent_Task_Finish");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Start");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Redirect(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Redirect");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Instance_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Instance_Start");
+    }
+
+
+    /// dingtalk
+    final String APP_EKY = "ding9seotugcsfjlgy8h";
+    final String APP_SECRET = "4k6hoCDUwwpUG5WXijfWcnzIm97j_zGquJqXJgrkBcyp2vo7ceV6dO-nSDUUDMhE";
+    // 审批实例回调执行业务逻辑
+    @Async
+    @Override
+    public void executeEvent_Instance_Finish(String processInstanceId, String processCode, boolean isAgree, boolean isTerminate, String staffId) {
+        log.info("executeEvent_Instance_Finish:{}",processCode);
+        String approveResult = isAgree ? "agree" : "refuse";
+//        if (isTerminate) approveResult = "terminated";
+        if  (isAgree){
+            String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+            Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
+            log.info("开始执行回调:{}",processInstanceId);
+            //差旅报销
+            String TRAVEL_REIMBURSEMENT = "PROC-D362D97E-916B-4865-B932-13D4A3B4DF1C";
+            //油卡充值
+            String RECHARGE_FUEL_CARD = "PROC-65D446B1-EF01-4E6D-A66A-519B4C62A4D6";
+            //付款申请
+            String PAYMENT_APPLICATION = "PROC-82233BD3-A274-4B90-8710-97D9F9663634";
+
+            if (PAYMENT_APPLICATION.equals(processCode)){
+                chuiZiService.saveAccountsPayable(processData);
+            }else if (TRAVEL_REIMBURSEMENT.equals(processCode)){
+                chuiZiService.saveOtherMeet(processData);
+            } else if (RECHARGE_FUEL_CARD.equals(processCode)) {
+                chuiZiService.rechargeFuelCard(processData);
+            }
+        }
+        log.info("审批实例回调执行业务逻辑, {}", approveResult);
+    }
+}

+ 22 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/AccountsPayableEntity.java

@@ -0,0 +1,22 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AccountsPayableEntity {
+    //实体主键
+    private FNumber FEntryID;
+    //结算方式
+    private FNumber FSETTLETYPEID;
+    //付款用途
+    private FNumber FPURPOSEID;
+    //应付金额
+    private Double FPAYTOTALAMOUNTFOR;
+    //付款金额
+    private Double FPAYAMOUNTFOR_E;
+
+    //关联明细
+    private List<Object> FPaySubEntity;
+}

+ 26 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/Audit.java

@@ -0,0 +1,26 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Audit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private String InterationFlags;
+
+    private int UseOrgId;
+
+    private String NetworkCtrl;
+
+    private Boolean IsVerifyProcInst;
+
+    private String IgnoreInterationFlag;
+
+    private Boolean UseBatControlTimes;
+}

+ 18 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/BillQuery.java

@@ -0,0 +1,18 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class BillQuery {
+    private String FormId;
+    private String FieldKeys;
+    private List<Map> FilterString;
+    private String OrderString;
+    private int TopRowCount;
+    private int StartRow;
+    private int Limit;
+    private String SubSystemId;
+}

+ 15 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/BillTypeID.java

@@ -0,0 +1,15 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class BillTypeID {
+    public BillTypeID(String FNUMBER) {
+        this.FNUMBER = FNUMBER;
+    }
+
+    public BillTypeID() {
+    }
+
+    private String FNUMBER;
+}

+ 33 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/Customer.java

@@ -0,0 +1,33 @@
+package com.malk.chuizi.entity;
+
+public class Customer {
+    long CustID;
+    String FNumber;
+    public long getCustID() {
+        return CustID;
+    }
+    public void setCustID(long custID) {
+        CustID = custID;
+    }
+    public String getFNumber() {
+        return FNumber;
+    }
+    public void setFNumber(String fNumber) {
+        FNumber = fNumber;
+    }
+    public String getFName() {
+        return FName;
+    }
+    public void setFName(String fName) {
+        FName = fName;
+    }
+    String FName;
+
+    String FShortName;
+    public String getFShortName() {
+        return FShortName;
+    }
+    public void setFShortName(String fShortName) {
+        FShortName = fShortName;
+    }
+}

+ 25 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/DefectEntity.java

@@ -0,0 +1,25 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DefectEntity {
+    //物料id
+    private FNumber FMateridlId;
+    //供应商
+    private FNumber FSupplierId;
+    //单位
+    private FNumber FUnitID;
+    //检验不良数量
+    private double FInspectDefectQty;
+    //不良处理
+    private String FDefProcess;
+    //不良数量
+    private double FDefectiveQty;
+    //使用决策备注
+    private String FMemo;
+    //关联明细
+    private List<Object> FEntity_Link;
+}

+ 15 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/FNumber.java

@@ -0,0 +1,15 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class FNumber {
+    public FNumber() {
+    }
+
+    public FNumber(String FNumber) {
+        this.FNumber = FNumber;
+    }
+
+    private String FNumber;
+}

+ 63 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/ForecastEntity.java

@@ -0,0 +1,63 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class ForecastEntity {
+    //供应组织
+    private FNumber FSupplyOrgId;
+    //客户id
+    private FNumber FCustID;
+    //产品类型
+    private String FProductType;
+    //物料id
+    private FNumber FMaterialID;
+    //单位id
+    private FNumber FUnitID;
+    //数量
+    private double FQty;
+    //预测开始日期
+    private String FStartDate;
+    //预测结束日期
+    private String FEndDate;
+    //基础单位id
+    private FNumber FBaseUnitID;
+    //基础数量
+    private double FBaseQty;
+    //基础订单数量
+    private double FBaseOrderQty;
+    //基础核销数量
+    private double FBaseWriteOffQty;
+    //基础选配数量
+    private double FBaseSelPrdQty;
+    //均化类型
+    private String FAVERATYPE;
+    //均化周期
+    private int FAveraCycle;
+    //库存组织id
+    private FNumber FStockOrgId;
+    //货主类型
+    private String FOwnerTypeId;
+    //货主id
+    private FNumber FOwnerId;
+    //预留类型
+    private String FReserveType;
+    //需求优先级
+    private int FPriority;
+    //核销数量
+    private double FWriteOffQty;
+    //订单数量
+    private double FOrderQty;
+    //选配数量
+    private double FSelPrdQty;
+    //备注
+    private String FRemark;
+    //是否MRP
+    private boolean FIsMRP;
+    //BOM条目id
+    private int FBomEntryId;
+    //是否MRP计算
+    private boolean FISMRPCAL;
+    //变更标识
+    private String FChangeFlag;
+}

+ 16 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/LinkEntry.java

@@ -0,0 +1,16 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class LinkEntry {
+    private FNumber FMaterialId;
+    private FNumber FUnitID;
+    private double FQty;
+    private FNumber FPriceUnitId;
+    private double FTaxPrice;
+    private boolean FIsFree;
+    private double FEntryTaxRate;
+    private String FDeliveryDate;
+    private String FEntryNote;
+}

+ 33 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/Model.java

@@ -0,0 +1,33 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Model {
+    private int FID;
+    private BillTypeID FBillTypeID;//单据类型
+    private String FDATE;//业务日期
+    private String FENDDATE_H;//到期日
+    private String FCONTACTUNITTYPE;//往来单位类型
+    private FNumber FCONTACTUNIT;//往来单位
+    private FNumber FCURRENCYID ;//币别
+    private Double FTOTALAMOUNTFOR_H;//总金额
+    private Double FNOTSETTLEAMOUNTFOR;//未借款金额
+    private FNumber FDEPARTMENTID;//申请部门
+    private FNumber SettlementOrgan;//结算组织(暂无字段)
+    private FNumber PaymentOrgan;//付款组织(暂无字段)
+    private FNumber PurchasingOrgan;//采购组织(暂无字段)
+    private FNumber FPURCHASEDEPTID;//采购部门
+    private FNumber FPURCHASERGROUPID;//采购组
+    private FNumber FPURCHASERID;//采购员
+    private String FRemarks ;//备注
+    private String FREMARK ;//备注
+    private String FBUSINESSTYPE;//业务类型
+    private String FRECTUNITTYPE;//收款单位类型
+    private FNumber FRECTUNIT;//收款单位
+    private List<Object> FEntity;//明细
+    private List<OtherMeetEntity> otherMeetEntityList;//明细
+    private List<AccountsPayableEntity> FPAYBILLENTRY;//明细
+}

+ 28 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/OtherMeet.java

@@ -0,0 +1,28 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OtherMeet {
+    private int FID;
+    private FNumber FBillTypeID;//单据类型
+    private String FDATE;//业务日期
+    private String FENDDATE_H;//到期日
+    private String FCONTACTUNITTYPE;//往来单位类型
+    private FNumber FCONTACTUNIT;//往来单位
+    private FNumber FCURRENCYID ;//币别
+    private Double FTOTALAMOUNTFOR_H;//总金额
+    private Double FNOTSETTLEAMOUNTFOR;//未借款金额
+    private FNumber FDEPARTMENTID;//申请部门
+    private FNumber SettlementOrgan;//结算组织(暂无字段)
+    private FNumber PaymentOrgan;//付款组织(暂无字段)
+    private FNumber PurchasingOrgan;//采购组织(暂无字段)
+    private FNumber FPURCHASEDEPTID;//采购部门
+    private FNumber FPURCHASERGROUPID;//采购组
+    private FNumber FPURCHASERID;//采购员
+    private String FRemarks ;//备注
+    private List<Object> FEntity;//明细
+
+}

+ 29 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/OtherMeetEntity.java

@@ -0,0 +1,29 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OtherMeetEntity {
+    //实体主键
+    private FNumber FEntryID;
+    //费用项目编码
+    private FNumber FCOSTID;
+    //费用项目名称
+    private FNumber FCOSTNAME;
+    //费用承担部门
+    private FNumber FCOSTDEPARTMENTID;
+    //发票类型
+    private String FINVOICETYPE;
+    //税率
+    private Double FEntryTaxRate;
+    //不含税金额
+    private Double FNOTAXAMOUNTFOR;
+    //税额
+    private Double FTAXAMOUNTFOR;
+    //总金额
+    private Double FTOTALAMOUNTFOR;
+    //关联明细
+    private List<Object> FPaySubEntity;
+}

+ 29 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/SaleOrderEntry.java

@@ -0,0 +1,29 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class SaleOrderEntry {
+    private FNumber FMaterialId;
+    private FNumber FUnitID;
+    private double FQty;
+    private FNumber FPriceUnitId;
+//    private double FPriceUnitQty;
+//    private double FPrice;
+    private double FTaxPrice;
+    private boolean FIsFree;
+    private double FEntryTaxRate;
+    /*private double FTaxAmount_LC;
+    private double FAmount_LC;
+    private double FAllAmount_LC;*/
+    private String FDeliveryDate;
+    /*private FNumber FStockFNumber;
+    private FNumber FSettleOrgIds;
+    private String FOwnerTypeId;
+    private FNumber FOwnerId;*/
+    private String FEntryNote;
+/*    private double F_WMVJ_Decimal;
+    private double F_WMVJ_Amount;
+    private double F_WMVJ_Qty;
+    private boolean F_WMVJ_CheckBox;*/
+}

+ 16 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/SaleOrderFinance.java

@@ -0,0 +1,16 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class SaleOrderFinance {
+    private FNumber FSettleCurrId;
+    private boolean FIsIncludedTax;
+    private boolean FIsPriceExcludeTax;
+    /*private FNumber FExchangeTypeId;
+    private double FMarginLevel;
+    private double FMargin;
+    private boolean FOverOrgTransDirect;
+    private double FAllDisCount;
+    private int FXPKID_F;*/
+}

+ 24 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/Save.java

@@ -0,0 +1,24 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class Save {
+        //默认为空 需要时选择性赋值
+/*        private List<String> NeedUpDateFields;
+        private List<String> NeedReturnFields;
+        private boolean IsDeleteEntry;
+        private String SubSystemId;
+        private boolean IsVerifyBaseDataField;
+        private boolean IsEntryBatchFill;
+        private boolean ValidateFlag;
+        private boolean NumberSearch;
+        private boolean IsAutoAdjustField;
+        private String InterationFlags;
+        private boolean IgnoreInterationFlag;
+        private boolean IsControlPrecision;
+        private boolean ValidateRepeatJson;*/
+
+        //保存实体
+        private Model model;
+}

+ 22 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/Submit.java

@@ -0,0 +1,22 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Submit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private int SelectedPostId;
+
+    private int UseOrgId;
+
+    private Boolean NetworkCtrl;
+
+    private Boolean IgnoreInterationFlag;
+}

+ 14 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/entity/View.java

@@ -0,0 +1,14 @@
+package com.malk.chuizi.entity;
+
+import lombok.Data;
+
+@Data
+public class View {
+    private int CreateOrgId;
+
+    private String Number;
+
+    private String Id;
+
+    private Boolean IsSortBySeq;
+}

+ 19 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/service/ChuiZiService.java

@@ -0,0 +1,19 @@
+package com.malk.chuizi.service;
+
+import com.malk.server.common.McR;
+
+import java.util.Map;
+
+public interface ChuiZiService {
+
+    /**
+     * 费用报销应付单
+     * @param
+     * @return
+     */
+    McR saveOtherMeet(Map processData);
+
+    McR saveAccountsPayable(Map processData);
+
+    McR rechargeFuelCard(Map processData);
+}

+ 520 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/service/impl/ChuiZiServiceImpl.java

@@ -0,0 +1,520 @@
+package com.malk.chuizi.service.impl;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.chuizi.config.KDWebApiConf;
+import com.malk.chuizi.entity.*;
+import com.malk.chuizi.service.ChuiZiService;
+import com.malk.chuizi.utils.HttpUtils;
+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.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Personnel;
+import com.malk.service.dingtalk.DDClient_Workflow;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+
+import static org.junit.Assert.fail;
+
+@Slf4j
+@Service
+public class ChuiZiServiceImpl implements ChuiZiService {
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private DDClient_Personnel ddClientPersonnel;
+
+    @Value("${dingtalk.agentId}")
+    private Long agentId;
+
+    @Autowired
+    private YDClient ydClient;
+
+    //单据状态
+    private static final Map<String,String> FDOCUMENTSTATUS = new HashMap<>();
+    static{
+        FDOCUMENTSTATUS.put("Z","暂存");
+        FDOCUMENTSTATUS.put("A","创建");
+        FDOCUMENTSTATUS.put("B","审核中");
+        FDOCUMENTSTATUS.put("C","已审核");
+        FDOCUMENTSTATUS.put("D","重新审核");
+    }
+
+    //整单状态
+    private static final Map<String,String> AUDITSTATUS = new HashMap<>();
+    static{
+        AUDITSTATUS.put("U","未审核");
+        AUDITSTATUS.put("A","已审核");
+        AUDITSTATUS.put("I","审核中");
+        AUDITSTATUS.put("P","部分审核");
+        AUDITSTATUS.put("R","重新审核");
+    }
+
+    //禁用状态
+    private static final Map<String,String> FFORBIDSTATUS = new HashMap<>();
+    static{
+        FFORBIDSTATUS.put("A","否");
+        FFORBIDSTATUS.put("B","是");
+    }
+
+    private static final Map<String,String> FFORBIDDENSTATUS = new HashMap<>();
+    static{
+        FFORBIDDENSTATUS.put("0","否");
+        FFORBIDDENSTATUS.put("1","是");
+    }
+
+    private static final Map<String,String> FERPCLSID = new HashMap<>();
+    static {
+        FERPCLSID.put("10","资产");
+        FERPCLSID.put("9","配置");
+        FERPCLSID.put("2","自制");
+        FERPCLSID.put("11","费用");
+        FERPCLSID.put("12","模型");
+        FERPCLSID.put("5","虚拟");
+        FERPCLSID.put("7","一次性");
+        FERPCLSID.put("13","产品系列");
+        FERPCLSID.put("3","委外");
+        FERPCLSID.put("4","特征");
+        FERPCLSID.put("6","服务");
+        FERPCLSID.put("1","外购");
+    }
+
+    private static final Map<String,String> BUSINESS_TYPE = new HashMap<>();
+    static {
+        BUSINESS_TYPE.put("8","发货检验");
+        BUSINESS_TYPE.put("25","生产退料检验");
+        BUSINESS_TYPE.put("26","委外退料检验");
+        BUSINESS_TYPE.put("3","产品检验");
+        BUSINESS_TYPE.put("20","其他检验");
+        BUSINESS_TYPE.put("6","委外工序");
+        BUSINESS_TYPE.put("10","受托材料检验");
+        BUSINESS_TYPE.put("2","委外检验");
+        BUSINESS_TYPE.put("21","工序巡检");
+        BUSINESS_TYPE.put("7","退货检验");
+        BUSINESS_TYPE.put("9","生产线检验");
+        BUSINESS_TYPE.put("1","采购检验");
+        BUSINESS_TYPE.put("4","库存检验");
+        BUSINESS_TYPE.put("5","工序自制");
+    }
+
+    private static final Map<String,String> INSPECT_RESULT = new HashMap<>();
+    static {
+        INSPECT_RESULT.put("1","合格");
+        INSPECT_RESULT.put("2","不合格");
+        INSPECT_RESULT.put("3","保留");
+    }
+    private static final Map<String,String> DEPARTMENT = new HashMap<>();
+    static {
+        DEPARTMENT.put("经营管理部","CZ00104");
+        DEPARTMENT.put("人事行政部","CZ00105");
+        DEPARTMENT.put("销售部","CZ00106");
+        DEPARTMENT.put("技术部","CZ00107");
+        DEPARTMENT.put("IT部门","CZ00107");
+        DEPARTMENT.put("后勤部","CZ00108");
+        DEPARTMENT.put("资材部","CZ00109");
+        DEPARTMENT.put("原料仓库组","CZ0010902");
+        DEPARTMENT.put("成品仓库组","CZ0010903");
+        DEPARTMENT.put("生产计划组","CZ0010904");
+        DEPARTMENT.put("客户服务组","CZ0010905");
+        DEPARTMENT.put("品质部","CZ00110");
+        DEPARTMENT.put("一车间检验组","CZ0011001");
+        DEPARTMENT.put("二车间检验组","CZ0011002");
+        DEPARTMENT.put("三车间检验组","CZ0011003");
+        DEPARTMENT.put("生产部","CZ00111");
+        DEPARTMENT.put("一车间生产组","CZ0011101");
+        DEPARTMENT.put("二车间生产组","CZ0011103");
+        DEPARTMENT.put("三车间生产组","CZ0011105");
+        DEPARTMENT.put("总经办","CZ00101");
+        DEPARTMENT.put("审计部","CZ00102");
+        DEPARTMENT.put("财务部","CZ00103");
+    }
+    private static final Map<String,String> PAYMENT_METHOD = new HashMap<>();
+    static {
+        PAYMENT_METHOD.put("现金","JSFS01_SYS");
+        PAYMENT_METHOD.put("现金支票","JSFS02_SYS");
+        PAYMENT_METHOD.put("转账支票","JSFS03_SYS");
+        PAYMENT_METHOD.put("电汇","JSFS04_SYS");
+        PAYMENT_METHOD.put("信汇","JSFS05_SYS");
+        PAYMENT_METHOD.put("商业承兑汇票","JSFS06_SYS");
+        PAYMENT_METHOD.put("银行承兑汇票","JSFS07_SYS");
+        PAYMENT_METHOD.put("信用证","JSFS08_SYS");
+        PAYMENT_METHOD.put("应收票据背书","JSFS09_SYS");
+        PAYMENT_METHOD.put("票据退票","JSFS12_SYS");
+        PAYMENT_METHOD.put("保证金转货款","JSFS22_SYS");
+        PAYMENT_METHOD.put("微信","JSFS31_SYS");
+        PAYMENT_METHOD.put("支付宝","JSFS32_SYS");
+        PAYMENT_METHOD.put("供应链票据","JSFS36_SYS");
+        PAYMENT_METHOD.put("内部转销","JSFS41_SYS");
+        PAYMENT_METHOD.put("认领结算","JSFS81_SYS");
+
+    }
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+
+    private String getString(Object object){
+        return object == null ? "" : object.toString();
+    }
+
+
+    /// dingtalk
+    final String APP_EKY = "ding9seotugcsfjlgy8h";
+    final String APP_SECRET = "4k6hoCDUwwpUG5WXijfWcnzIm97j_zGquJqXJgrkBcyp2vo7ceV6dO-nSDUUDMhE";
+    @Override
+    public McR saveOtherMeet(Map processData) {
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        String workId = getNumberByUserId(userId);
+        Save save = new Save();
+
+        Model otherMeet = new Model();
+        otherMeet.setFCONTACTUNITTYPE("BD_Empinfo");
+        otherMeet.setFBillTypeID(new BillTypeID("QTYFD02_SYS"));
+        otherMeet.setFCONTACTUNIT(new FNumber(workId));//员工号
+        otherMeet.setFDATE(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
+        otherMeet.setFENDDATE_H(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
+        otherMeet.setFCURRENCYID(new FNumber("PRE001"));//币别
+        final double[] sum = {0.0,0.0};
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+        Map<String, Object> mainData = new HashMap<>();
+        List<Map<String,Object>> sonData = new ArrayList<>();
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            if ("金蝶科目".equals(name) || "报销科目".equals(name) || "归属部门".equals(name) || "发票类型".equals(name) || "申请人".equals(name) ) {
+                mainData.put(name, e.get("value"));
+            } else if ("TableField".equals(e.get("componentType"))) {
+                Object parse = JSON.parse(e.get("value").toString());
+                JSONArray jsonArray = JSON.parseArray(parse.toString());
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                    Object rowValue = jsonObject.get("rowValue");
+                    JSONArray array = JSON.parseArray(rowValue.toString());
+                    for (int i1 = 0; i1 < array.size(); i1++) {
+                        jsonObject = (JSONObject) array.get(i1);
+                        if (jsonObject.containsKey("extendValue")){
+                            rowValue = jsonObject.get("extendValue");
+                            jsonObject = JSONObject.parseObject(rowValue.toString());
+                            rowValue = jsonObject.get("list");
+                            JSONArray array1 =  JSON.parseArray(rowValue.toString());
+                            for (int i2 = 0; i2 < array1.size(); i2++) {
+                                jsonObject = (JSONObject) array1.get(i2);
+                                if (jsonObject.containsKey("rowValue")){
+                                    rowValue = jsonObject.get("rowValue");
+                                    JSONArray array2 = JSON.parseArray(rowValue.toString());
+                                    for (int l = 0; l < array2.size(); l++) {
+                                        Map<String, Object> map = new HashMap<>();
+                                        jsonObject = (JSONObject) array2.get(l);
+                                        //需要改成金额
+                                        if ("金额".equals(jsonObject.get("label"))){
+                                            double amount = Double.parseDouble(jsonObject.get("value") == null ? "0.0" : jsonObject.get("value").toString());
+                                            sum[0] = sum[0] + amount;
+                                            sum[1] = sum[1] + amount;
+                                            map.put("amount",amount);
+
+                                            sonData.add(map);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        });
+        List<Object> objects  = new ArrayList<>();
+        if (ObjectUtil.isNotNull(sonData) && sonData.size()>0){
+            sonData.forEach(e->{
+                OtherMeetEntity otherMeetEntity = new OtherMeetEntity();
+                otherMeetEntity.setFCOSTID(new FNumber(mainData.get("金蝶科目").toString()));
+                otherMeetEntity.setFINVOICETYPE(mainData.get("发票类型").toString());
+                otherMeetEntity.setFCOSTDEPARTMENTID(new FNumber(DEPARTMENT.get(mainData.get("归属部门").toString())));
+                otherMeetEntity.setFEntryTaxRate(0.0);
+                otherMeetEntity.setFNOTAXAMOUNTFOR(Double.parseDouble(e.get("amount").toString()));
+                otherMeetEntity.setFTAXAMOUNTFOR(0.0);
+                otherMeetEntity.setFTOTALAMOUNTFOR(Double.parseDouble(e.get("amount").toString()));
+                otherMeetEntity.setFPaySubEntity(null);
+
+                objects.add(otherMeetEntity);
+            });
+        }
+        otherMeet.setFEntity(objects);
+
+        save.setModel(otherMeet);
+        System.out.println(save);
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "AP_OtherPayable";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                isTrue(repoRet2);
+
+//                String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
+
+//                ydClient.operateData(YDParam.builder()
+////                        .formInstId(formInstId)
+//                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
+//                        .build(), YDConf.FORM_OPERATION.update);
+
+                if (isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR saveAccountsPayable(Map processData) {
+//        String userId = String.valueOf(processData.get("originatorUserId"));
+        Save save = new Save();
+
+        Model model = new Model();
+        model.setFCONTACTUNITTYPE("BD_Supplier");
+        model.setFBillTypeID(new BillTypeID("FKDLX01_SYS"));
+        model.setFDATE(LocalDateTimeUtil.format(LocalDate.now(),"yyyy-MM-dd"));
+        model.setFCURRENCYID(new FNumber("PRE001"));//币别
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+
+        Map<String, Object> mainData = new HashMap<>();
+
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            mainData.put(name, e.get("value"));
+        });
+        List<AccountsPayableEntity> objects  = new ArrayList<>();
+        if (ObjectUtil.isNotNull(mainData)){
+            //主表
+            model.setFREMARK(mainData.get("付款事由").toString());
+            model.setFRECTUNIT(new FNumber(mainData.get("供应商编码").toString()));
+            model.setFCONTACTUNIT(new FNumber(mainData.get("供应商编码").toString()));
+            //明细
+            AccountsPayableEntity accountsPayableEntity = new AccountsPayableEntity();
+            accountsPayableEntity.setFSETTLETYPEID(new FNumber(PAYMENT_METHOD.get(mainData.get("付款方式"))));//结算方式
+            accountsPayableEntity.setFPURPOSEID(new FNumber(mainData.get("付款用途编码").toString()));//付款用途
+            accountsPayableEntity.setFPAYTOTALAMOUNTFOR(Double.parseDouble(mainData.get("付款总额").toString()));
+            accountsPayableEntity.setFPAYAMOUNTFOR_E(Double.parseDouble(mainData.get("付款总额").toString()));
+
+            objects.add(accountsPayableEntity);
+        }
+        model.setFPAYBILLENTRY(objects);
+
+        save.setModel(model);
+        System.out.println(save);
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "AP_PAYBILL";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                isTrue(repoRet2);
+
+                if (isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR rechargeFuelCard(Map processData) {
+        //身份认证参数
+        Map headers = new HashMap();
+        headers.put("EngineCode","o3mum9h68yl3v8g1o3ft2aek7");
+        headers.put("EngineSecret","yeFjbv44SHwG9GThAfNCmJYqM+FfKYNTHp6Lw31T7KwhB3qKu5dv2w==");
+        headers.put("Content-Type","application/json");
+
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+
+        Map<String, Object> mainData = new HashMap<>();
+        formComponentValues.forEach(e->{
+            String name = e.get("name").toString();
+            mainData.put(name, e.get("value"));
+        });
+
+
+        Map<String, String> paramMap = new HashMap();
+        paramMap.put("ActionName",   "LoadBizObjects");
+        paramMap.put("SchemaCode", "D285303f3713e1dfc2d4bb5be5c41ce4b1d545b");
+        paramMap.put("Filter","{\"FromRowNum\":0,\"RequireCount\": false,\"ReturnItems\":[],\"SortByCollection\":[],\"ToRowNum\":500,\"Matcher\":{\"Type\":\"And\",\"Matchers\":[{\"Type\":\"And\",\"Matchers\":[{\"Type\":\"Item\",\"Name\":\"F0000002\",\"Operator\":2,\"Value\":\""+mainData.get("车牌").toString()+"\"}]}]}}");
+
+        final String[] BizObject = {"",""};
+        String result = HttpUtils.httpPost("https://www.h3yun.com/OpenApi/Invoke",   paramMap, headers);
+        log.info(result);
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
+        jsonObject = (JSONObject) jsonObject.get("ReturnData");
+        JSONArray jsonArray = JSONArray.parseArray(jsonObject.get("BizObjectArray").toString());
+        jsonArray.forEach(e->{
+            JSONObject value = (JSONObject) JSONObject.parse(e.toString());
+            BizObject[0] = value.getString("ObjectId");
+            BizObject[1] = value.get("F0000006").toString();
+        });
+        System.out.println(BizObject[0]+" "+BizObject[1]);
+        System.out.println(jsonArray);
+        double amount = BizObject[1] == null || BizObject[1].isEmpty() ? 0.0 : Double.parseDouble(BizObject[1]);
+        paramMap.put("ActionName","UpdateBizObject");
+        paramMap.put("SchemaCode","D285303f3713e1dfc2d4bb5be5c41ce4b1d545b");
+        paramMap.put("BizObjectId",BizObject[0]);
+        paramMap.remove("Filter");
+        paramMap.put("BizObject",JSON.toJSONString(UtilMap.map("F0000006",BigDecimal.valueOf(amount).add(BigDecimal.valueOf(100)))));
+
+        result = HttpUtils.httpPost("https://www.h3yun.com/OpenApi/Invoke",   paramMap, headers);
+        log.info(result);
+        return McR.success();
+    }
+
+    public String getNumberByUserId(String workingEmployeeIds) {
+//        log.info("根据钉钉人员id获取员工工号:{}",workingEmployeeIds);
+        List<String> filterList = new ArrayList<>();
+        filterList.add("sys00-jobNumber");
+        List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), Arrays.asList(workingEmployeeIds), agentId, filterList);
+        final String[] value = {""};
+        employeeInfos.forEach(e -> {
+            List<Map> mapList = (List<Map>) e.get("field_data_list");
+            mapList.forEach(m -> {
+                List<Map> valueList = (List<Map>) m.get("field_value_list");
+                value[0] = ObjectUtil.isNotNull(valueList.get(0).get("value")) ? valueList.get(0).get("value").toString() : null;
+            });
+        });
+        return value[0];
+    }
+
+    private String getMultiLanguageTextName(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+            List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
+            String value = getString(multiLanguageText.get(0).get("Name"));
+
+            return value;
+        }
+        return null;
+    }
+
+    private String getMultiLanguageTextSpecification(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+            List<Map> multiLanguageText = (List<Map>) map.get("MultiLanguageText");
+            String value = getString(multiLanguageText.get(0).get("Specification"));
+
+            return value;
+        }
+        return null;
+    }
+
+    private String getEntryNumber(Object object){
+        if (Objects.nonNull(object)){
+            Map map = (Map) object;
+            String value =  getString(map.get("Number"));
+
+            return value;
+        }
+        return null;
+    }
+
+
+    private boolean isTrue(RepoRet repoRet){
+        Gson gson = new Gson();
+
+        if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
+            System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
+            return true;
+        } else {
+            fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
+            return false;
+        }
+    }
+
+    private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
+        List<Map> list = new ArrayList<>();
+        DDR_New ddrNew = new DDR_New();
+        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;
+    }
+
+
+}

+ 285 - 0
mjava-chuizi/src/main/java/com/malk/chuizi/utils/HttpUtils.java

@@ -0,0 +1,285 @@
+package com.malk.chuizi.utils;
+
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.HttpConnectionFactory;
+import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
+import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
+import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
+import org.apache.http.util.EntityUtils;
+
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http请求封装
+ *
+ * @author lh
+ * @date 2022-09-23
+ */
+@Slf4j
+public class HttpUtils {
+
+    /**
+     * 默认请求类型
+     */
+    private static final String DEFAULT_CONTENT_TYPE = "application/json";
+
+    /**
+     * 默认编码
+     */
+    private static final String DEFAULT_ENCODING = "utf-8";
+
+    /**
+     * GBK编码
+     */
+    private static final String GBK_ENCODING = "GBK";
+
+    /**
+     * 默认超时时间
+     */
+    private static final int DEFAULT_TIME_OUT = 60;
+
+    private static PoolingHttpClientConnectionManager manager = null;
+
+    private static CloseableHttpClient httpClient = null;
+
+    /**
+     * 获取httpclient对象
+     *
+     * @return
+     */
+    public static synchronized CloseableHttpClient getHttpClient(int timeOut) {
+        if (null == httpClient) {
+            log.info("============================================创建");
+            // 注册访问协议相关的socket工厂
+            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+                    .register("http", PlainConnectionSocketFactory.INSTANCE)
+                    .register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
+                    .build();
+
+            // httpConnection工厂
+            HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory =
+                    new ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE
+                            , DefaultHttpResponseParserFactory.INSTANCE);
+
+            // DNS解析器
+            DnsResolver dnsResolver = SystemDefaultDnsResolver.INSTANCE;
+            // 创建池化连接管理器
+            manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, connectionFactory, dnsResolver);
+            // socket配置
+            SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
+            manager.setDefaultSocketConfig(socketConfig);
+            // 连接池最大连接数
+            manager.setMaxTotal(300);
+            manager.setDefaultMaxPerRoute(200);
+            // 5s检测一次连接池连接
+            manager.setValidateAfterInactivity(5 * 1000);
+            // 默认请求配置
+            RequestConfig requestConfig = RequestConfig.custom()
+                    // 连接超时时间
+                    .setConnectTimeout(timeOut * 1000)
+                    // 等待数据超时时间
+                    .setSocketTimeout(timeOut * 1000)
+                    // 从连接池获取连接超时时间
+                    .setConnectionRequestTimeout(timeOut * 1000)
+                    .build();
+            // 创建httpclient
+            httpClient = HttpClients.custom()
+                    .setConnectionManager(manager)
+                    // 连接池不共享
+                    .setConnectionManagerShared(false)
+                    // 定期回收空闲连接
+                    .evictIdleConnections(timeOut, TimeUnit.SECONDS)
+                    // 定期回收过期连接
+                    .evictExpiredConnections()
+                    .setConnectionTimeToLive(timeOut, TimeUnit.SECONDS)
+                    // 设置默认请求
+                    .setDefaultRequestConfig(requestConfig)
+                    // 连接重用策略
+                    .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
+                    // 长连接配置
+                    .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
+                    // 设置重试次数
+                    .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
+                    .build();
+
+            // jvm停止或重启时,关闭连接池释放连接
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+
+                @Override
+                public void run() {
+                    try {
+                        if (null != httpClient) {
+                            httpClient.close();
+                        }
+                    } catch (Exception e) {
+                        log.error("httpclient关闭异常:{}", e);
+                    }
+                }
+            });
+        }
+        return httpClient;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPost(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @param headers
+     * @param timeOut 超时时间
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params, Map<String, String> headers, int timeOut) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}", JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(timeOut);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers) {
+            for (String key : headers.keySet()) {
+                httpPost.setHeader(key, headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @return
+     */
+    public static String httpGet(String url) {
+        log.info("请求url:{}", url);
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpGet httpGet = new HttpGet(url);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpGet);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+}
+

+ 49 - 0
mjava-chuizi/src/main/resources/application-dev.yml

@@ -0,0 +1,49 @@
+#测试学习
+server:
+  port: 8109
+  servlet:
+    context-path: /chuizi
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/chuzi/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 3746535996
+  appKey: ding9seotugcsfjlgy8h
+  appSecret: 4k6hoCDUwwpUG5WXijfWcnzIm97j_zGquJqXJgrkBcyp2vo7ceV6dO-nSDUUDMhE
+  corpId:
+  aesKey: 2qpILM4GJXsv9A24pcLMhzsjsVLhjAarqZzHVl4DgKa
+  token: 93TmIb21XoFozsu5o5unY6p
+#  operator:
+
+#aliwork:
+#  appType: APP_XPPVVMG6HA0GNDPJV4C1
+#  systemToken: 8R7668D1P92RSNTS7OKZG5UR9P333QA7GAJ4MTG
+
+#测试环境
+kingdee:
+# 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 67d92ff7f69ac8
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 312000_T+5I1yGE2urX5XTuxeSL6z1HSuS8SBrE
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: a8cfbf47aa504a528bc5c75d4de2f71d
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://124.71.139.0:8283/K3cloud
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

+ 49 - 0
mjava-chuizi/src/main/resources/application-dev2.yml

@@ -0,0 +1,49 @@
+#钉钉测试
+server:
+  port: 9030
+  servlet:
+    context-path: /chuizi
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/jianhui/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 3366214854
+  appKey: dingntvkzjzxdx8h2m1s
+  appSecret: YfaV5mYOL4F--P8P_G9aD8DP_a8_IgM6dBILsSaTb4LeUZYSntacol55O1tJuqcU
+  corpId: ding923faa53d9d45937acaaa37764f94726
+  aesKey:
+  token:
+  operator: 344749020127590108
+
+aliwork:
+  appType: APP_XPPVVMG6HA0GNDPJV4C1
+  systemToken: 8R7668D1P92RSNTS7OKZG5UR9P333QA7GAJ4MTG
+
+#测试环境
+kingdee:
+# 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 67adb125bcb53e
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 303494_XZ8JQZuu3mnb49Xu3+XDzd+NzNx7wANv
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 9ba984bc11a14bf1883e23ac223cc733
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://124.71.139.0:8283/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

+ 49 - 0
mjava-chuizi/src/main/resources/application-prod.yml

@@ -0,0 +1,49 @@
+#钉钉测试
+server:
+  port: 8109
+  servlet:
+    context-path: /chuizi
+
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/jianhui/log/
+  level:
+    com.malk.*: INFO
+
+# dingtalk
+dingtalk:
+  agentId: 3746535996
+  appKey: ding9seotugcsfjlgy8h
+  appSecret: 4k6hoCDUwwpUG5WXijfWcnzIm97j_zGquJqXJgrkBcyp2vo7ceV6dO-nSDUUDMhE
+  corpId:
+  aesKey: 2qpILM4GJXsv9A24pcLMhzsjsVLhjAarqZzHVl4DgKa
+  token: 93TmIb21XoFozsu5o5unY6p
+#  operator:
+
+#aliwork:
+#  appType: APP_XPPVVMG6HA0GNDPJV4C1
+#  systemToken: 8R7668D1P92RSNTS7OKZG5UR9P333QA7GAJ4MTG
+
+#正式环境 锤子塑业2025数据中心
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 685e63e9aca3fc
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 317159_X6cCSwGoUnC9Xa/J1/SDRY/r0s6c6plG
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 97078d7261424da48fe4789b61c70d07
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://124.71.139.0:8283/K3cloud
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

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

@@ -0,0 +1,15 @@
+spring:
+  profiles:
+    active: prod
+  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

+ 61 - 0
mjava-chuizi/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.malk.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 22 - 0
mjava-huagao/pom.xml

@@ -25,6 +25,28 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!--sql server依赖-->
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>12.4.0.jre8</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.2</version>
+        </dependency>
+        <!--MP自动生成器依赖-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.5.3.1</version>
+        </dependency>
+        <dependency> <!--自动生成的模板:模板有三种:Velocity(默认)、Freemarker、Beetl -->
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+            <version>1.7</version>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

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

@@ -4,6 +4,8 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
+import java.security.Security;
+
 @SpringBootApplication(scanBasePackages = {"com.malk"})
 public class HuaGaoApplication {
     public static void main(String[] args) {

+ 34 - 21
mjava-huagao/src/main/java/com/malk/huagao/controller/HuaGaoController.java

@@ -1,14 +1,23 @@
 package com.malk.huagao.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.malk.delegate.McDelegate;
 import com.malk.huagao.service.HuaGaoService;
+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.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 
 @Slf4j
@@ -17,40 +26,44 @@ import java.util.Map;
 public class HuaGaoController {
     @Autowired
     private HuaGaoService huaGaoService;
+    @Autowired
+
+    private YDClient ydClient;
+
+
+    @Autowired
+
+    private DDClient dd;
 
+
+    @Autowired
+
+    private McDelegate mcDelegate;
     @GetMapping("/test")
     public McR test() {
         return McR.success();
     }
 
     /**
-     * 创建投资人用户
+     * 宜搭非生产单价同步至数据库
+     * @param map
+     * @return
      */
-    @PostMapping("/user/sync")
-    McR syncUser() {
-        log.info("syncUser");
-        huaGaoService.syncDingTalk_exclusive();
+    @PostMapping("/upsertNonProdPrice")
+    McR upsertNonProdPrice(@RequestBody Map map) {
+        huaGaoService.upsertNonProdPrice(map);
         return McR.success();
     }
 
     /**
-     * 重置密码流程
+     * 宜搭生产工时单价同步至数据库
+     * @param map
+     * @return
      */
-    @PostMapping("/reset")
-    McR resetPwd(HttpServletRequest request) {
-
-        Map data = UtilServlet.getParamMap(request);
-        log.info("reset, {}", data);
-        McException.assertParamException_Null(data, "userId", "password");
-        huaGaoService.resetPwd(data);
-        return McR.success();
-    }
-    /**
-     * 获取工作时长详情
-     */
-    @PostMapping("details")
-    McR details(@RequestBody Map<String,Object> data) {
-        huaGaoService.getCheckWorkDateDetails(data);
+    @PostMapping("/upsertWorkHoursPrice")
+    McR upsertWorkHoursPrice(@RequestBody Map map) {
+        huaGaoService.upsertWorkHoursPrice(map);
         return McR.success();
     }
+
 }

+ 47 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/YdNonProdPrice.java

@@ -0,0 +1,47 @@
+package com.malk.huagao.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 非生产单价
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-24
+ */
+@Getter
+@Setter
+  @TableName("YD_NON_PROD_PRICE")
+public class YdNonProdPrice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+      /**
+     * 工单类型
+     */
+      private String type;
+
+      /**
+     * 单据
+     */
+      private String form;
+
+      /**
+     * 仓位
+     */
+      private String position;
+
+      /**
+     * 物料编码前四位
+     */
+      private String materialCodeLeft;
+
+      /**
+     * 单价
+     */
+      private Object price;
+}

+ 32 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/YdProdWorkHoursPrice.java

@@ -0,0 +1,32 @@
+package com.malk.huagao.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 生产工时单价
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-24
+ */
+@Getter
+@Setter
+  @TableName("YD_PROD_WORK_HOURS_PRICE")
+public class YdProdWorkHoursPrice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+      /**
+     * 工单类型
+     */
+      private String type;
+
+      /**
+     * 单价
+     */
+      private Object price;
+}

+ 55 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/YdUserInput.java

@@ -0,0 +1,55 @@
+package com.malk.huagao.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 人员工时投入
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-23
+ */
+@Getter
+@Setter
+  @TableName("YD_USER_INPUT")
+public class YdUserInput implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+      /**
+     * 成员
+     */
+      private String user;
+
+      /**
+     * 员工id
+     */
+      private String userId;
+
+      /**
+     * 日期
+     */
+      private Date date;
+
+      /**
+     * 工时
+     */
+      private Object workHours;
+
+      /**
+     * 单价
+     */
+      private Object price;
+
+      /**
+     * 金额小计
+     */
+      private Object totalPrice;
+}

+ 23 - 0
mjava-huagao/src/main/java/com/malk/huagao/mapper/YdNonProdPriceMapper.java

@@ -0,0 +1,23 @@
+package com.malk.huagao.mapper;
+
+import com.malk.huagao.entity.YdNonProdPrice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 非生产单价 Mapper 接口
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-24
+ */
+@Mapper
+public interface YdNonProdPriceMapper extends BaseMapper<YdNonProdPrice> {
+
+    List<YdNonProdPrice> selectByType(String type);
+
+}

+ 18 - 0
mjava-huagao/src/main/java/com/malk/huagao/mapper/YdProdWorkHoursPriceMapper.java

@@ -0,0 +1,18 @@
+package com.malk.huagao.mapper;
+
+import com.malk.huagao.entity.YdProdWorkHoursPrice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 生产工时单价 Mapper 接口
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-24
+ */
+@Mapper
+public interface YdProdWorkHoursPriceMapper extends BaseMapper<YdProdWorkHoursPrice> {
+
+}

+ 18 - 0
mjava-huagao/src/main/java/com/malk/huagao/mapper/YdUserInputMapper.java

@@ -0,0 +1,18 @@
+package com.malk.huagao.mapper;
+
+import com.malk.huagao.entity.YdUserInput;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 人员工时投入 Mapper 接口
+ * </p>
+ *
+ * @author WZY
+ * @since 2025-07-23
+ */
+@Mapper
+public interface YdUserInputMapper extends BaseMapper<YdUserInput> {
+
+}

+ 40 - 3
mjava-huagao/src/main/java/com/malk/huagao/schedule/ScheduleTask.java

@@ -1,5 +1,6 @@
 package com.malk.huagao.schedule;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.huagao.service.HuaGaoService;
@@ -15,12 +16,13 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
 
 /**
  * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
@@ -133,4 +135,39 @@ public class ScheduleTask {
                 .build(), YDConf.FORM_OPERATION.create);
     }
 
+    public static void main(String[] args) {
+        LocalDateTime startTime1= LocalDate.now().minusDays(1).atTime(LocalTime.MIN);
+        LocalDateTime endTime= LocalDate.now().atTime(LocalTime.MIN);
+        long startTime = UtilDateTime.getLocalDateTimeTimeStamp(startTime1);
+        //获取所属周(每周六-下周五)
+      DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date = LocalDate.parse("2025-06-24", inputFormatter);
+         LocalDate startOfWeek;
+          // 获取该周的周六(开始日期)
+                               startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.SATURDAY));
+
+                    // 获取该周的周五(结束日期)
+                               LocalDate endOfWeek = startOfWeek.plusDays(6);
+                     DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM.dd");
+        String format = startOfWeek.format(outputFormatter);
+//        LocalDateTime startTime2= LocalDate.now().minusMonths(1).atTime(LocalTime.MIN);
+//        List<String> time= Arrays.asList(String.valueOf(UtilDateTime.getLocalDateTimeTimeStamp(startTime)),String.valueOf(UtilDateTime.getLocalDateTimeTimeStamp(endTime)));
+//        LocalDateTime startTime1= LocalDate.now().minusWeeks(1).atTime(LocalTime.MIN);
+//        String stTime=UtilDateTime.formatLocal(startTime,UtilDateTime.DATE_TIME_PATTERN);
+//        String edTime=UtilDateTime.formatLocal(endTime,UtilDateTime.DATE_TIME_PATTERN);
+//        String date = "2025-03-27 00:00:00";
+//        Long dateTime= UtilDateTime.getLocalDateTimeTimeStamp(UtilDateTime.parseLocalDateTime(date));
+
+        System.out.println(date);
+        System.out.println(startTime);
+        System.out.println(startOfWeek);
+        System.out.println(endOfWeek);
+        System.out.println(format);
+//        System.out.println("===="+dateTime);
+//
+//
+//        System.out.println(stTime);
+//        System.out.println(edTime);
+
+    }
 }

+ 9 - 10
mjava-huagao/src/main/java/com/malk/huagao/service/HuaGaoService.java

@@ -4,17 +4,16 @@ import java.time.LocalDateTime;
 import java.util.Map;
 
 public interface HuaGaoService {
-    /**
-     * 同步钉钉企业账号
-     */
-    void syncDingTalk_exclusive();
+    void syncKqData(LocalDateTime startTime, LocalDateTime endTime);
 
-    /**
-     * 重置企业账号密码
-     */
-    void resetPwd(Map data);
+    void upsertNonProdPrice(Map map);
 
-    void getCheckWorkDateDetails(Map data);
+    void upsertWorkHoursPrice(Map map);
 
-    void syncKqData(LocalDateTime startTime, LocalDateTime endTime);
+    /**
+     * 同步员工工时投入
+     * @param startTime
+     * @param endTime
+     */
+//    void syncUserInput(LocalDateTime startTime, LocalDateTime endTime);
 }

+ 146 - 180
mjava-huagao/src/main/java/com/malk/huagao/service/impl/HuaGaoServiceImpl.java

@@ -1,13 +1,22 @@
 package com.malk.huagao.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.malk.huagao.entity.YdNonProdPrice;
+import com.malk.huagao.entity.YdProdWorkHoursPrice;
+import com.malk.huagao.entity.YdUserInput;
+import com.malk.huagao.mapper.YdNonProdPriceMapper;
+import com.malk.huagao.mapper.YdProdWorkHoursPriceMapper;
+import com.malk.huagao.mapper.YdUserInputMapper;
 import com.malk.huagao.service.HuaGaoService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McException;
 import com.malk.server.dingtalk.DDR;
+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;
@@ -21,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -28,19 +38,12 @@ import java.util.*;
 @Slf4j
 @Service
 public class HuaGaoServiceImpl implements HuaGaoService {
-
     @Autowired
     private YDService ydService;
 
     @Autowired
     private YDClient ydClient;
 
-    @Value("${dingtalk.appKey}")
-    private String appKey;
-
-    @Value("${dingtalk.appSecret}")
-    private String appSecret;
-
     @Autowired
     private DDClient_Contacts ddClient_contacts;
 
@@ -49,143 +52,15 @@ public class HuaGaoServiceImpl implements HuaGaoService {
 
     @Autowired
     private DDClient ddClient;
-    @Autowired
-    private FXKClient fxkClient;
 
     @Autowired
-    private static final long DEPT_ID = 971482089L; // 合作加盟校区
-
-    /// 创建企业账号: loginI/userId 都为 SHR 工号
-private Map crcreateUser_dingTalk(String name, String randomAccount, String randomPassword) {
-
-    Map param = new HashMap();
-    param.put("access_token", ddClient.getAccessToken());
-    Map body = new HashMap();
-    body.put("exclusive_account", "true");
-    body.put("exclusive_account_type", "dingtalk");
-    body.put("login_id", randomAccount);
-    body.put("init_password", randomPassword);
-    body.put("name", name);
-    body.put("userid", randomAccount);
-    body.put("dept_id_list", DEPT_ID);
-    Object result = DDR.doPost("https://oapi.dingtalk.com/topapi/v2/user/create", (Map) null, param, body).getResult();
-    return (Map) result;
-}
-
-    /**
-     * 同步钉钉企业账号
-     */
-    @Override
-    public void syncDingTalk_exclusive() {
-
-        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
-                .formUuid("FORM-0086C4597047459BBB37C79E404745C9CK0C")
-                .build());
-        log.info("钉钉企业账号同步开始,共{}条数据", dataList.size());
-        dataList.forEach(data -> {
-            if ("".equals(UtilMap.getString(data, "textField_m1mw64v4"))) {
-                String message = "";
-                String randomAccount = generateRandomAccount();
-                String randomPassword = generateRandomSixDigitPassword();
-                try {
-                    Map textField_m21lkesk = this.crcreateUser_dingTalk(UtilMap.getString(data, "textField_m21lkesk"), randomAccount, randomPassword);
-                    System.out.println("");
-                } catch (McException e) {
-                    message = e.getMessage();
-                    log.error(e.getMessage(), e);
-                }
-                ydClient.operateData(YDParam.builder()
-                        .formInstanceId(UtilMap.getString(data, "instanceId"))
-                        .useLatestVersion(true)
-                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_m1mw64v4, textField_m1mw64v5", randomAccount, randomPassword)))
-                        .build(), YDConf.FORM_OPERATION.update);
-
-            }
-
-        });
-
-    }
-
-    /**
-     * 重置企业账号密码
-     */
-    @Override
-    public void resetPwd(Map data) {
-        ddClient_contacts.updateUser_dingTalk(ddClient.getAccessToken(), UtilMap.getString(data, "userId"), Arrays.asList(DEPT_ID), UtilMap.map("init_password", UtilMap.getString(data, "password")));
-    }
-    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    @Override
-    public void getCheckWorkDateDetails(Map data) {
-        List<String> users = new ArrayList<>();
-        users.add("284156461536271475");
-        String[] strings = users.toArray(new String[0]);
-        log.info("users:{}", JSON.toJSONString(strings));
-        List<Map> mapList = ddClientAttendance.getAttColumnVal(ddClient.getAccessToken(appKey, appSecret),"284156461536271475", Arrays.asList("82772106,89349019"),"2025-01-20 08:00:00", "2025-01-21 08:00:00");
-        System.out.println("====="+mapList);
-//        mapList.get(0)
-       String FORMtime = "2025-01-01 00:00:00";
-        String TOtime = "2025-01-31 00:00:00";
-
-//        dateFormat.format(FORMtime);
-//        dateFormat.format(TOtime);
-        //工作时长(实际工时)
-        // Step 1. 提取原始数据到日期-字段ID-值的映射
-        Map<String, Map<Long, Double>> dateData = new HashMap<>();
-
-        for (Map<String, Object> element : mapList) {
-            // 获取字段ID
-            Map<String, Object> columnVo = (Map<String, Object>) element.get("column_vo");
-            Long id = ((Number) columnVo.get("id")).longValue();
-
-            // 遍历该字段的所有日期数据
-            List<Map<String, String>> columnVals = (List<Map<String, String>>) element.get("column_vals");
-            for (Map<String, String> entry : columnVals) {
-                String fullDate = entry.get("date");
-//                System.out.println("fullDate:====="+fullDate);
-                String date = fullDate.split(" ")[0]; // 提取日期部分
-                Double value = Double.parseDouble(entry.get("value"));
-
-                // 存储到日期映射中
-                dateData.computeIfAbsent(date, k -> new HashMap<>())
-                        .put(id, value);
-            }
-        }
-
-        // Step 2. 按日期处理业务逻辑
-        Map<String, Double> finalResult = new LinkedHashMap<>(); // 保持日期顺序
-
-        for (Map.Entry<String, Map<Long, Double>> entry : dateData.entrySet()) {
-            String date = entry.getKey();
-            Map<Long, Double> idValues = entry.getValue();
-
-            // 获取目标字段的值
-            Double targetValue = idValues.get(89349019L); // ID=89349019
-            Double refValue = idValues.get(82772106L);    // ID=82772106
-
-            // 逻辑判断
-            if (targetValue == null || refValue == null) {
-                System.err.println("日期 " + date + " 缺少必要字段数据,跳过计算");
-                continue;
-            }
-
-            double result;
-            if (targetValue >= 8) {
-                result = targetValue; // 直接返回
-            } else {
-                result = targetValue + (refValue / 60); // 组合计算
-            }
-
-            finalResult.put(date, result);
-        }
-
-        // Step 3. 打印最终结果
-        System.out.println("===== 计算结果 =====");
-        finalResult.forEach((date, value) -> {
-            System.out.printf("日期: %s \t 结果值: %.1f%n", date, value);
-        });
+    private YdUserInputMapper ydUserInputMapper;
 
+    @Autowired
+    private YdNonProdPriceMapper ydNonProdPriceMapper;
 
-    }
+    @Autowired
+    private YdProdWorkHoursPriceMapper ydProdWorkHoursPriceMapper;
 
     @Override
     public void syncKqData(LocalDateTime startTime, LocalDateTime endTime) {
@@ -206,12 +81,143 @@ private Map crcreateUser_dingTalk(String name, String randomAccount, String rand
                         String workTime="休息".equals(dataMap.get("82772125"))?
                                 dataMap.get("89349019"): NumberUtil.add(dataMap.get("89349019"),dataMap.get("82772106")).toString();
                         saveData(user,date,workTime,price);
+
+                        //同步到数据库
+                        LambdaQueryWrapper<YdUserInput> ydUserInputLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                        ydUserInputLambdaQueryWrapper.eq(YdUserInput::getUserId,user)
+                                .eq(YdUserInput::getDate, date);
+
+                        YdUserInput ydUserInput = ydUserInputMapper.selectOne(ydUserInputLambdaQueryWrapper);
+
+                        if (Objects.nonNull(ydUserInput)){
+                            ydUserInput.setWorkHours(workTime);
+                            ydUserInput.setPrice(price);
+                            ydUserInput.setTotalPrice(NumberUtil.mul(workTime,price));
+
+                            ydUserInputMapper.update(ydUserInput,ydUserInputLambdaQueryWrapper);
+                        }else {
+                            try {
+                                ydUserInput = new YdUserInput();
+                                ydUserInput.setUserId(user);
+                                SimpleDateFormat formatter = new SimpleDateFormat(UtilDateTime.DATE_TIME_PATTERN);
+                                ydUserInput.setDate(formatter.parse(date));
+                                ydUserInput.setWorkHours(workTime);
+                                ydUserInput.setPrice(price);
+                                ydUserInput.setTotalPrice(NumberUtil.mul(workTime,price));
+
+                                ydUserInputMapper.insert(ydUserInput);
+                            }catch (ParseException e){
+                                log.info("无法解析日期字符串: {}",e.getMessage());
+                            }
+                        }
                     }
                 }
             }
         }
     }
 
+    @Override
+    public void upsertNonProdPrice(Map map) {
+        String formInstId = UtilMap.getString(map, "formInstId");
+
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String type = UtilMap.getString(formData, "textField_m8fljzks");
+        String form = UtilMap.getString(formData, "textField_m8fljzkt");
+        String position = UtilMap.getString(formData, "textField_m8fljzku");
+        String materialCodeLeft = UtilMap.getString(formData, "textField_m8fljzkv");
+        String price = UtilMap.getString(formData, "numberField_m8fljzkw");
+
+        LambdaQueryWrapper<YdNonProdPrice> ydNonProdPriceLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        ydNonProdPriceLambdaQueryWrapper.eq(YdNonProdPrice::getType,type)
+                .eq(YdNonProdPrice::getForm,form)
+                .eq(YdNonProdPrice::getPosition,position)
+                .eq(YdNonProdPrice::getMaterialCodeLeft,materialCodeLeft);
+
+        YdNonProdPrice ydNonProdPrice = ydNonProdPriceMapper.selectOne(ydNonProdPriceLambdaQueryWrapper);
+        if (Objects.nonNull(ydNonProdPrice)){
+            ydNonProdPrice.setPrice(price);
+
+            ydNonProdPriceMapper.update(ydNonProdPrice,ydNonProdPriceLambdaQueryWrapper);
+        }else {
+            ydNonProdPrice = new YdNonProdPrice();
+            ydNonProdPrice.setType(type);
+            ydNonProdPrice.setForm(form);
+            ydNonProdPrice.setPosition(position);
+            ydNonProdPrice.setMaterialCodeLeft(materialCodeLeft);
+            ydNonProdPrice.setPrice(price);
+
+            ydNonProdPriceMapper.insert(ydNonProdPrice);
+        }
+    }
+
+    @Override
+    public void upsertWorkHoursPrice(Map map) {
+        String formInstId = UtilMap.getString(map, "formInstId");
+
+        Map formData = ydClient.queryData(YDParam.builder()
+                .formInstId(formInstId)
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        String type = UtilMap.getString(formData, "selectField_m8zib4co");
+        String price = UtilMap.getString(formData, "numberField_m8zib4cp");
+
+        LambdaQueryWrapper<YdProdWorkHoursPrice> ydProdWorkHoursPriceLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        ydProdWorkHoursPriceLambdaQueryWrapper.eq(YdProdWorkHoursPrice::getType,type);
+
+        YdProdWorkHoursPrice ydProdWorkHoursPrice = ydProdWorkHoursPriceMapper.selectOne(ydProdWorkHoursPriceLambdaQueryWrapper);
+        if (Objects.nonNull(ydProdWorkHoursPrice)){
+            ydProdWorkHoursPrice.setPrice(price);
+
+            ydProdWorkHoursPriceMapper.update(ydProdWorkHoursPrice,ydProdWorkHoursPriceLambdaQueryWrapper);
+        }else {
+            ydProdWorkHoursPrice = new YdProdWorkHoursPrice();
+            ydProdWorkHoursPrice.setType(type);
+            ydProdWorkHoursPrice.setPrice(price);
+
+            ydProdWorkHoursPriceMapper.insert(ydProdWorkHoursPrice);
+        }
+    }
+
+    /*@Override
+    public void syncUserInput(LocalDateTime startTime, LocalDateTime endTime) {
+        List<Map> dataList = getYdFormDataList("FORM-78BF5DE20E244369BD475C11A5CA48A0ZAQJ", "", YDConf.FORM_QUERY.retrieve_list_all);
+
+        for (Map data : dataList) {
+            Map formData = UtilMap.getMap(data, "formData");
+
+            YdUserInput ydUserInput = new YdUserInput();
+            ydUserInput.setUser(UtilMap.getList(formData, "employeeField_m8cu0g58").get(0).toString());
+            ydUserInput.setUserId(UtilMap.getList(formData, "employeeField_m8cu0g58_id").get(0).toString());
+
+            ydUserInput.setDate(new Date(UtilMap.getLong(formData,"dateField_m8e53oef")));
+            ydUserInput.setWorkHours(UtilMap.getString(formData,"numberField_m8ctvm2e"));
+            ydUserInput.setPrice(UtilMap.getString(formData,"numberField_m8e53oeg"));
+            ydUserInput.setTotalPrice(UtilMap.getString(formData,"numberField_m8e53oeh"));
+
+            ydUserInputMapper.insert(ydUserInput);
+        }
+    }*/
+
+    /*private List<Map> getYdFormDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
+        List<Map> list = new ArrayList<>();
+        DDR_New ddrNew = new DDR_New();
+        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 Map<String,Map<String,String>> toDateMap(List<Map> valList){
         Map<String,Map<String,String>>  result = new HashMap<>();
         for(Map map:valList){
@@ -239,44 +245,4 @@ private Map crcreateUser_dingTalk(String name, String randomAccount, String rand
                 .searchCondition(JSONObject.toJSONString(UtilMap.map("employeeField_m8cu0g58, dateField_m8e53oef", userId,Arrays.asList(dateTime,dateTime))))
                 .formDataJson(JSONObject.toJSONString(saveMap)).build(), YDConf.FORM_OPERATION.upsert);
     }
-
-    /**
-     * 生成一个由大写字母和数字组成的八位随机账号。
-     *
-     * @return 生成的随机账号字符串
-     */
-    public static String generateRandomAccount() {
-        // 可选字符集合:大写字母A-Z和数字0-9
-        final String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-        final int LENGTH = 8; // 账号长度
-
-        Random random = new Random();
-        StringBuilder sb = new StringBuilder(LENGTH);
-
-        for (int i = 0; i < LENGTH; i++) {
-            // 随机选择一个字符
-            int index = random.nextInt(CHARS.length());
-            char randomChar = CHARS.charAt(index);
-            sb.append(randomChar);
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * 生成一个六位数的随机密码。
-     *
-     * @return 生成的随机密码字符串
-     */
-    public static String generateRandomSixDigitPassword() {
-        Random random = new Random();
-        int min = 100000; // 六位数最小值
-        int max = 999999; // 六位数最大值
-
-        // 生成一个介于[min, max]之间的随机数
-        int randomNumber = random.nextInt(max - min + 1) + min;
-
-        // 将生成的随机数转换为字符串
-        return String.valueOf(randomNumber);
-    }
 }

+ 44 - 0
mjava-huagao/src/main/java/com/malk/huagao/utils/MPGenerator.java

@@ -0,0 +1,44 @@
+package com.malk.huagao.utils;
+
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
+
+import java.sql.Types;
+
+public class MPGenerator {
+    public static void main(String[] args) {
+        //可以直接去官方文档上查看
+        FastAutoGenerator
+                .create("jdbc:sqlserver://113.45.187.194:1433;databaseName=dingding",
+                        "hgdd", "hgdd@2025")
+                .globalConfig(builder -> {
+                    builder.author("WZY")
+                            .disableOpenDir()
+                            .outputDir(System.getProperty("user.dir")+
+                                    "/mjava-huagao/src/main/java");
+                })
+                .dataSourceConfig(builder ->
+                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
+                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
+                            if (typeCode == Types.SMALLINT) {
+                                return DbColumnType.INTEGER;
+                            }
+                            return typeRegistry.getColumnType(metaInfo);
+                        }))
+                .packageConfig(builder -> {
+                    builder.parent("com.malk.huagao")
+                            .controller("controller")
+                            .service("service")
+                            .serviceImpl("service.impl")
+                            .mapper("mapper")
+                            .entity("entity");
+                })
+                .strategyConfig(builder -> {
+                    builder.addInclude("YD_PROD_WORK_HOURS_PRICE")
+                            .entityBuilder().enableLombok();
+                })
+                .templateEngine(new VelocityTemplateEngine())
+                .execute();
+    }
+}

+ 21 - 2
mjava-huagao/src/main/resources/application-dev.yml

@@ -4,12 +4,30 @@ server:
     context-path: /huagao
 
 enable:
-  scheduling: true
+  scheduling: false
 logging:
   config: classpath:logback-spring.xml
   path: /home/server/huagao/log/
   level:
-    com.malk.*: info
+    com.malk.*: debug
+
+spring:
+  datasource:
+    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    #trustServerCertificate=true 临时绕过证书验证的风险
+    url: jdbc:sqlserver://113.45.187.194:1433;databaseName=dingding;encrypt=true;trustServerCertificate=true;
+    username: hgdd
+    password: hgdd@2025
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.huagao.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
 
 # dingtalk
 dingtalk:
@@ -27,3 +45,4 @@ aliwork:
   systemToken: 37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q
 
 
+

+ 23 - 5
mjava-huagao/src/main/resources/application-prod.yml

@@ -1,15 +1,33 @@
 server:
-  port: 8112
+  port: 7708
   servlet:
     context-path: /huagao
 
 enable:
-  scheduling: false
+  scheduling: true
 logging:
   config: classpath:logback-spring.xml
   path: /home/server/huagao/log/
   level:
-    com.malk.*: debug
+    com.malk.*: info
+
+spring:
+  datasource:
+    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    #trustServerCertificate=true 临时绕过证书验证的风险
+    url: jdbc:sqlserver://113.45.187.194:1433;databaseName=dingding;encrypt=true;trustServerCertificate=true;
+    username: hgdd
+    password: hgdd@2025
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.huagao.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
 
 # dingtalk
 dingtalk:
@@ -23,7 +41,7 @@ dingtalk:
 
 # aliwork
 aliwork:
-  appType:
-  systemToken:
+  appType: APP_BWPT6ET90UEE8IBEY9GJ
+  systemToken: 37766HD145ST2RBB9S4D37J2WMNU293GASC8M6Q
 
 

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

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

+ 9 - 0
mjava-huagao/src/main/resources/mapper/YdNonProdPriceMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.malk.huagao.mapper.YdNonProdPriceMapper">
+
+
+    <select id="selectByType" resultType="com.malk.huagao.entity.YdNonProdPrice">
+        select * from yd_non_prod_price where type = #{type}
+    </select>
+</mapper>

+ 5 - 0
mjava-huagao/src/main/resources/mapper/YdProdWorkHoursPriceMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.malk.huagao.mapper.YdProdWorkHoursPriceMapper">
+
+</mapper>

+ 5 - 0
mjava-huagao/src/main/resources/mapper/YdUserInputMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.malk.huagao.mapper.YdUserInputMapper">
+
+</mapper>

+ 16 - 0
mjava-huagao/src/test/java/com/malk/huagao/YyYdTest.java

@@ -21,7 +21,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -82,4 +84,18 @@ public class YyYdTest {
 //        List<Map> attColumns = ddClientAttendance.getAttColumns(ddClient.getAccessToken());
 //        System.out.println(attColumns);
     }
+
+    @Test
+    public void test2() {
+        //同步员工投入历史数据
+//        huaGaoService.syncUserInput(LocalDateTime.now(),LocalDateTime.now());
+    }
+
+    @Test
+    public void test3() {
+        LocalDateTime startTime= LocalDate.now().minusDays(3).atTime(LocalTime.MIN);
+        LocalDateTime endTime= LocalDate.now().atTime(LocalTime.MIN);
+
+        huaGaoService.syncKqData(startTime,endTime);
+    }
 }

+ 2 - 2
mjava-jianhui/src/main/java/com/malk/jianhui/controller/JianhuiController.java

@@ -92,8 +92,8 @@ public class JianhuiController {
         return jianhuiService.syncInspectionOrder();
     }
 
-    //每天0点同步所有数据
-    @Scheduled(cron = "0 0 0 * * ?")
+    //每天1点同步所有数据
+    @Scheduled(cron = "0 0 1 * * ?")
     @GetMapping("/syncData")
     public McR syncData(){
         return jianhuiService.syncData();

+ 10 - 6
mjava-jianhui/src/main/java/com/malk/jianhui/service/impl/JianhuiServiceImpl.java

@@ -10,6 +10,7 @@ import com.malk.jianhui.entity.*;
 import com.malk.jianhui.service.JianhuiService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR_New;
@@ -369,7 +370,7 @@ public class JianhuiServiceImpl implements JianhuiService {
 
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-C3E9A165EEAB4232BD2F04F536E195D1WINH")
-                        .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m67c6m6f",customer.get("FNumber"))))
+                        .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m67c6m6f",customer.get("FNumber"),"客户编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
                         .formDataJson(JSONObject.toJSONString(formData))
                         .build(), YDConf.FORM_OPERATION.upsert);
 
@@ -440,7 +441,7 @@ public class JianhuiServiceImpl implements JianhuiService {
 
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-250CD995257D4CB08F99786E47D8D51BCUDP")
-                        .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m67pb4tn",operator.get("FNumber"))))
+                        .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m67pb4tn",operator.get("FNumber"),"业务员编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
                         .formDataJson(JSONObject.toJSONString(formData))
                         .build(), YDConf.FORM_OPERATION.upsert);
             }
@@ -472,9 +473,11 @@ public class JianhuiServiceImpl implements JianhuiService {
 
 //            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","39","2025-03-12 00:00:00","","","0"));//修改日期大于等于xx
 //            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FModifyDate","16","2025-03-14 00:00:00","","","0"));//修改日期小于等于xx
-//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-03-12 00:00:00","","","0"));//创建日期大于等于xx
-//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-03-14 00:00:00","","","0"));//创建日期大于等于xx
+//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","39","2025-06-28 00:00:00","","","0"));//创建日期大于等于xx
+//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FCreateDate","16","2025-07-07 00:00:00","","","0"));//创建日期小于等于xx
 //            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","39","2025-03-14 00:00:00","","","0"));//审核日期大于等于xx
+//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","Y0070002","","","0"));//编码等于xx
+//            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","17","0001","","","0"));//编码包含xx
 
 
             billQuery.setFilterString(filterString);
@@ -517,9 +520,10 @@ public class JianhuiServiceImpl implements JianhuiService {
                     formData.put("textField_m6ak641d",unitCode);//单位编码
                 }
 
+
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-2A5CAB7EB91D493AAFC90D8C7479A7F5KPR7")
-                        .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m6ak640v",material.get("FNumber"))))
+                        .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m6ak640v",material.get("FNumber"),"编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
                         .formDataJson(JSONObject.toJSONString(formData))
                         .build(), YDConf.FORM_OPERATION.upsert);
 
@@ -854,7 +858,7 @@ public class JianhuiServiceImpl implements JianhuiService {
 
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-1DAEA1675CAE47F49BE1F86A034D695191W1")
-                        .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m6yuw4iw",operator.get("FNumber"))))
+                        .searchFieldJson(JSONObject.toJSONString(Arrays.asList(new YDSearch("textField_m6yuw4iw",operator.get("FNumber"),"编码", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ))))
                         .formDataJson(JSONObject.toJSONString(formData))
                         .build(), YDConf.FORM_OPERATION.upsert);
             }

+ 1 - 1
mjava-jianhui/src/main/resources/application-dev.yml

@@ -8,7 +8,7 @@ enable:
   scheduling: false
 logging:
   config: classpath:logback-spring.xml
-  path: /home/server/jianhui/log/
+  path: d:\\jianhui_cloudpure\logs\
   level:
     com.malk.*: debug
 

+ 1 - 1
mjava-jianhui/src/main/resources/application-prod.yml

@@ -8,7 +8,7 @@ enable:
   scheduling: false
 logging:
   config: classpath:logback-spring.xml
-  path: /home/server/jianhui/log/
+  path: d:\\jianhui_cloudpure\logs\
   level:
     com.malk.*: INFO
 

+ 1 - 1
mjava-jianhui/src/main/resources/logback-spring.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="false" scan="false" scanPeriod="60 seconds">
-    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="d:\\jianhui_cloudpure\logs\"/>
     <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
 
     <!-- 定义控制台输出 -->

+ 21 - 83
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/controller/KabeiyiController.java

@@ -1,18 +1,12 @@
 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.*;
@@ -65,18 +59,6 @@ public class KabeiyiController {
         return McR.success(UtilMap.map("data, nextToken",result,rsp.get("nextToken")));
     }
 
-    //审批实例推送到宜搭(卡倍亿)
-    @PostMapping("pushProcInstToYD")
-    public McR pushProcInstToYD(@RequestBody Map map){
-        return kabeiyiService.pushProcInstToYD(map);
-    }
-
-    //审批实例推送到宜搭(特充)
-    @PostMapping("pushProcInstToYD2")
-    public McR pushProcInstToYD2(@RequestBody Map map){
-        return kabeiyiService.pushProcInstToYD2(map);
-    }
-
     //发起问题整改审批
     @PostMapping("addQuestionApproval")
     public McR addQuestionApproval(@RequestBody Map map){
@@ -95,76 +77,32 @@ public class KabeiyiController {
         return kabeiyiService.ocr(downloadUrl,name,type);
     }
 
-    //每天0点定时同步发货单信息
-//    @Scheduled(cron = "0 0 0 * * ?")
-    @GetMapping("getDeliveryInfo")
-    public McR getDeliveryInfo(){
-        return kabeiyiService.getDeliveryInfo();
+    //每天0点定时同步出库单信息
+    @Scheduled(cron = "0 0 0 * * ?")
+    @GetMapping("getSaleoutInfo")
+    public McR getSaleoutInfo(){
+        return kabeiyiService.getSaleoutInfo();
     }
 
-    //新增一张凭证
-    @PostMapping("addVoucher")
-    public McR addVoucher(@RequestBody Map map){
-        kabeiyiService.addVoucher(map);
-        return McR.success();
-    }
 
-    @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();
+    //审批实例推送到宜搭(卡倍亿)
+    /*@PostMapping("pushProcInstToYD")
+    public McR pushProcInstToYD(@RequestBody Map map){
+        return kabeiyiService.pushProcInstToYD(map);
     }*/
 
+    //审批实例推送到宜搭(特充)
+    /*@PostMapping("pushProcInstToYD2")
+    public McR pushProcInstToYD2(@RequestBody Map map){
+        return kabeiyiService.pushProcInstToYD2(map);
+    }*/
 
+    //新增一张凭证
+    /*@PostMapping("addVoucher")
+    public McR addVoucher(@RequestBody Map map){
+        kabeiyiService.addVoucher(map);
+        return McR.success();
+    }*/
 }

+ 3 - 2
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/KabeiyiService.java

@@ -2,7 +2,6 @@ package com.malk.kabeiyi.service;
 
 import com.malk.server.common.McR;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
 
 import java.util.Map;
 
@@ -33,9 +32,11 @@ public interface KabeiyiService {
     McR addPlanApproval(Map map);
 
     @Async
-    McR getDeliveryInfo();
+    McR getSaleoutInfo();
 
     McR testInnerTable();
 
     void addVoucher(Map map);
+
+    String getWeekRange(String dateStr);
 }

+ 443 - 88
mjava-kabeiyi/src/main/java/com/malk/kabeiyi/service/impl/KabeiyiServiceImpl.java

@@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.malk.core.McProject;
 import com.malk.kabeiyi.service.KabeiyiService;
 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;
@@ -44,8 +43,11 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.time.LocalDate;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -564,7 +566,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
     @Override
     @Async
-    public McR getDeliveryInfo() {
+    public McR getSaleoutInfo() {
         //现在时间戳
         long beginTime = System.currentTimeMillis();
 
@@ -603,15 +605,19 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         DateTime beginOfMonth = DateUtil.beginOfMonth(DateUtil.lastMonth());
         String beginOfMonthString = beginOfMonth.toString("yyyy-MM-dd");
 
-        /*String beginOfMonthString = "2024-12-22";
+        /*String beginOfMonthString = "2025-06-25";
 
-        String yesterday = "2024-12-22";*/
+        String yesterday = "2025-06-25";*/
         for (Integer dsSequence : factory.keySet()) {
             /*if (dsSequence != 8){
                 continue;
             }*/
+
             List<String> errorCodes = new ArrayList<>();
 
+            //存放存货名称、编码
+            Map<String,String> inventory = new HashMap<>();
+
             Map<String,Object> param = new HashMap<>();
             param.put("from_account",fromAccount);
             param.put("to_account",toAccount);
@@ -639,7 +645,7 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 //查询单个出库单详情
                 String id = getString(saleout.get("code"));
 
-                /*if (!id.equals("0000008087")){
+                /*if (!id.equals("0000009439")){
                     continue;
                 }*/
 
@@ -693,6 +699,8 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("textField_m18nvp8c",getString(saleout2.get("businesscode")));//业务单号
                 formData.put("textField_m5nnwiv1", getString(saleout2.get("warehousename")));//仓库名称
                 formData.put("dateField_m18nvp7x",DateUtil.parseDate(getString(saleout2.get("date"))).getTime());//单据日期
+                formData.put("textField_mbu5nao3",getWeekRange(getString(saleout2.get("date"))));//发货周
+                formData.put("textField_mbu5nao5",saleout2.get("date").toString().substring(0,4));//年份
                 formData.put("dateField_m5nnwiuw",Objects.nonNull(saleout2.get("auditdate")) ?  DateUtil.parseDate(getString(saleout2.get("auditdate"))).getTime() : null);//审核日期
                 formData.put("textField_m18nvp7y",getString(saleout2.get("customername")));//客户名称
                 formData.put("textField_m18nvp7z",getString(saleout2.get("departmentname")));//部门
@@ -704,6 +712,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("numberField_m18wkih7",dsSequence);//数据源序号
                 formData.put("selectField_m7b8j9uj","实发");//类型
 
+                AtomicReference<Double> totalQuantity = new AtomicReference<>(0d);
+                AtomicReference<Double> totalCost = new AtomicReference<>(0d);
+
                 List<Map> entry = (List<Map>) saleout2.get("entry");
 
                 //collect拆分成五个list  每个list长度为500
@@ -717,8 +728,15 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                     errorCodes.add(id + "出库明细超过2500");
                 }
 
+                //是否退线
+                boolean isReject = false;
+
+                Map<String,String> inventoryPrice = new HashMap<>();
+
                 //出库明细
-                List list1 = collectList.get(0).stream().map(item -> {
+                List<Map> list1 = new ArrayList();
+
+                for (Map item : collectList.get(0)) {
                     if (Objects.isNull(formData.get("textField_m219zpzf"))){
                         formData.put("textField_m219zpzf",getString(item.get("free1")));//客户码  出库主表没有客户码,取明细的客户码
                     }
@@ -728,120 +746,362 @@ public class KabeiyiServiceImpl implements KabeiyiService {
 
                     Map detail = new HashMap();
                     detail.put("textField_m22mkwzk", getString(item.get("define29")));//客户存货码
-                    detail.put("textField_m5qdxf7r", getString(item.get("inventorycode")));//存货编码
-//                    detail.put("textField_m18nvp8e", inventory_name);//存货名称
-
+                    detail.put("textField_mbu5naoj", getString(item.get("inventorycode")));//存货编码
+                    detail.put("textField_mc1emzfr",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                     detail.put("textField_m21b1bhg", getString(item.get("free2")));//产品颜色
+                    detail.put("textField_mbu5naoa", getString(item.get("define28")));//条码
                     detail.put("textField_m18nvp8f", getString(item.get("cmassunitname")));//单位
-                    detail.put("numberField_m18nvp8h", getString(item.get("quantity")));//发货数量
-                    detail.put("textField_m5oztcmx", getString(item.get("define25")));//包装方式
-                    detail.put("textField_m5oztcmy", getString(item.get("define30")));//工艺号
-                    detail.put("textareaField_m5oztcmz", getString(item.get("define31")));//备注
 
+                    if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                        if (getString((item.get("quantity"))).contains("-")){
+                            isReject = true;
+                            break;
+                        }else {
+                            detail.put("numberField_m18nvp8h", getString(item.get("quantity")));//发货数量
+                        }
+                    }else {
+                        continue;
+                    }
+
+                    totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                    String price = getString(item.get("price"));
+                    String cost = getString(item.get("cost"));
+
+                    try {
+                        double numericValue = Double.parseDouble(price);
+
+                        //单价为0时查询存货价目表
+                        if (numericValue == 0d){
+                            String inventorycode = getString(item.get("inventorycode"));
+
+                            if (inventoryPrice.containsKey(inventorycode)){
+                                price = inventoryPrice.get(inventorycode);
+                            }else {
+                                price = getInventoryPrice(factory.get(dsSequence), getString(item.get("free1")), getString(saleout2.get("date")), getString(item.get("inventorycode")));
+
+                                inventoryPrice.put(getString(item.get("inventorycode")),price);
+                            }
+
+                            if (!"0".equals(price)){
+                                cost = Double.parseDouble(price) * Double.parseDouble(getString(item.get("quantity"))) + "";
+                                detail.put("numberField_m18nvp8k", price);//单价
+                                detail.put("numberField_m18nvp8m", cost);//金额
+                            }
+                        }else {
+                            detail.put("numberField_m18nvp8k", price);//单价
+                            detail.put("numberField_m18nvp8m", cost);//金额
+                        }
+
+                        String finalCost = cost;
+                        totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(finalCost))));
+                    } catch (NumberFormatException e) {
+                        System.out.println("字符串不是有效的数值: " + price);
+                    }
 
-                    /*detail.put("numberField_m18nvp8j", getString(item.get("price")));//未税单价
-                    detail.put("numberField_m18nvp8l", getString(item.get("money")));//未税总价
-                    detail.put("numberField_m18nvp8k", getString(item.get("taxprice")));//含税单价
-                    detail.put("numberField_m18nvp8m", getString(item.get("sum")));//含税总价
-                    detail.put("numberField_m18nvp8n", getString(item.get("taxrate")));//税率
-                    detail.put("numberField_m18nvp8o", getString(item.get("tax")));//总税价*/
+                   /* if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                        detail.put("numberField_m18nvp8k", getString(item.get("price")));//单
+                    }
+
+                    if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                        detail.put("numberField_m18nvp8m", getString(item.get("cost")));//金额
 
-                    return detail;
-                }).collect(Collectors.toList());
+                        totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                    }*/
+
+                    list1.add(detail);
+                }
 
                 List<Map> list2 = new ArrayList<>();
                 if (collectList.size() > 1){
-                    list2 = collectList.get(1).stream().map(item -> {
+                    for (Map item : collectList.get(1)) {
                         Map detail = new HashMap();
                         detail.put("textField_m2j0wj8o", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m2j0wj8p", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naol", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzft",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m2j0wj8q", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoc", getString(item.get("define28")));//条码
                         detail.put("textField_m2j0wj8r", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m2j0wj8s", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcn3", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcn2", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcng", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m2j0wj8t", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m2j0wj8u", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m2j0wj8v", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m2j0wj8w", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m2j0wj8x", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m2j0wj8y", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m2j0wj8s", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        String price = getString(item.get("price"));
+                        String cost = getString(item.get("cost"));
+
+                        try {
+                            double numericValue = Double.parseDouble(price);
+
+                            //单价为0时查询存货价目表
+                            if (numericValue == 0d){
+                                String inventorycode = getString(item.get("inventorycode"));
+
+                                if (inventoryPrice.containsKey(inventorycode)){
+                                    price = inventoryPrice.get(inventorycode);
+                                }else {
+                                    price = getInventoryPrice(factory.get(dsSequence), getString(item.get("free1")), getString(saleout2.get("date")), getString(item.get("inventorycode")));
+
+                                    inventoryPrice.put(getString(item.get("inventorycode")),price);
+                                }
+
+                                if (!"0".equals(price)){
+                                    cost = Double.parseDouble(price) * Double.parseDouble(getString(item.get("quantity"))) + "";
+                                    detail.put("numberField_m2j0wj8v", price);//单价
+                                    detail.put("numberField_m2j0wj8w", cost);//金额
+                                }
+                            }else {
+                                detail.put("numberField_m2j0wj8v", price);//单价
+                                detail.put("numberField_m2j0wj8w", cost);//金额
+                            }
+
+                            String finalCost = cost;
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(finalCost))));
+                        } catch (NumberFormatException e) {
+                            System.out.println("字符串不是有效的数值: " + price);
+                        }
+
+                        /*if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m2j0wj8v", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m2j0wj8w", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }*/
+
+                        list2.add(detail);
+                    }
                 }
+
                 List<Map> list3 = new ArrayList<>();
                 if (collectList.size() > 2){
-                    list3 = collectList.get(2).stream().map(item -> {
+                    for (Map item : collectList.get(2)) {
                         Map detail = new HashMap();
                         detail.put("textField_m2j0wj93", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m2j0wj94", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naon", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfv",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m2j0wj95", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoe", getString(item.get("define28")));//条码
                         detail.put("textField_m2j0wj96", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m2j0wj97", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcn7", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcn6", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcni", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m2j0wj98", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m2j0wj99", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m2j0wj9a", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m2j0wj9b", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m2j0wj9c", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m2j0wj9d", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m2j0wj97", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        String price = getString(item.get("price"));
+                        String cost = getString(item.get("cost"));
+
+                        try {
+                            double numericValue = Double.parseDouble(price);
+
+                            //单价为0时查询存货价目表
+                            if (numericValue == 0d){
+                                String inventorycode = getString(item.get("inventorycode"));
+
+                                if (inventoryPrice.containsKey(inventorycode)){
+                                    price = inventoryPrice.get(inventorycode);
+                                }else {
+                                    price = getInventoryPrice(factory.get(dsSequence), getString(item.get("free1")), getString(saleout2.get("date")), getString(item.get("inventorycode")));
+
+                                    inventoryPrice.put(getString(item.get("inventorycode")),price);
+                                }
+
+                                if (!"0".equals(price)){
+                                    cost = Double.parseDouble(price) * Double.parseDouble(getString(item.get("quantity"))) + "";
+                                    detail.put("numberField_m2j0wj9a", price);//单价
+                                    detail.put("numberField_m2j0wj9b", cost);//金额
+                                }
+                            }else {
+                                detail.put("numberField_m2j0wj9a", price);//单价
+                                detail.put("numberField_m2j0wj9b", cost);//金额
+                            }
+
+                            String finalCost = cost;
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(finalCost))));
+                        } catch (NumberFormatException e) {
+                            System.out.println("字符串不是有效的数值: " + price);
+                        }
+
+                        /*if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m2j0wj9a", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m2j0wj9b", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }*/
+
+                        list3.add(detail);
+                    }
                 }
 
                 List<Map> list4 = new ArrayList<>();
                 if (collectList.size() > 3){
-                    list4 = collectList.get(3).stream().map(item -> {
+                    for (Map item : collectList.get(3)) {
                         Map detail = new HashMap();
                         detail.put("textField_m4cfhc70", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m4cfhc71", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naop", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfx",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m4cfhc72", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naog", getString(item.get("define28")));//条码
                         detail.put("textField_m4cfhc73", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m4cfhc74", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcnb", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcna", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcnk", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m4cfhc75", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m4cfhc76", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m4cfhc77", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m4cfhc78", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m4cfhc79", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m4cfhc7a", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m4cfhc74", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        String price = getString(item.get("price"));
+                        String cost = getString(item.get("cost"));
+
+                        try {
+                            double numericValue = Double.parseDouble(price);
+
+                            //单价为0时查询存货价目表
+                            if (numericValue == 0d){
+                                String inventorycode = getString(item.get("inventorycode"));
+
+                                if (inventoryPrice.containsKey(inventorycode)){
+                                    price = inventoryPrice.get(inventorycode);
+                                }else {
+                                    price = getInventoryPrice(factory.get(dsSequence), getString(item.get("free1")), getString(saleout2.get("date")), getString(item.get("inventorycode")));
+
+                                    inventoryPrice.put(getString(item.get("inventorycode")),price);
+                                }
+
+                                if (!"0".equals(price)){
+                                    cost = Double.parseDouble(price) * Double.parseDouble(getString(item.get("quantity"))) + "";
+                                    detail.put("numberField_m4cfhc77", price);//单价
+                                    detail.put("numberField_m4cfhc78", cost);//金额
+                                }
+                            }else {
+                                detail.put("numberField_m4cfhc77", price);//单价
+                                detail.put("numberField_m4cfhc78", cost);//金额
+                            }
+
+                            String finalCost = cost;
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(finalCost))));
+                        } catch (NumberFormatException e) {
+                            System.out.println("字符串不是有效的数值: " + price);
+                        }
+
+                        /*if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m4cfhc77", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m4cfhc78", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }*/
+
+                        list4.add(detail);
+                    }
                 }
 
                 List<Map> list5 = new ArrayList<>();
                 if (collectList.size() > 4){
-                    list5 = collectList.get(4).stream().map(item -> {
+                    for (Map item : collectList.get(4)) {
                         Map detail = new HashMap();
                         detail.put("textField_m4cfhc7f", getString(item.get("define29")));//客户存货码
-                        detail.put("textField_m4cfhc7g", getString(item.get("inventory_name")));//存货名称
+                        detail.put("textField_mbu5naor", getString(item.get("inventorycode")));//存货编码
+                        detail.put("textField_mc1emzfz",getInventoryName(getString(item.get("inventorycode")),dsSequence,inventory));//存货名称
                         detail.put("textField_m4cfhc7h", getString(item.get("free2")));//产品颜色
+                        detail.put("textField_mbu5naoi", getString(item.get("define28")));//条码
                         detail.put("textField_m4cfhc7i", getString(item.get("cinvm_unit")));//单位
-                        detail.put("numberField_m4cfhc7j", getString(item.get("quantity")));//发货数量
-                        detail.put("textField_m5oztcnf", getString(item.get("define25")));//包装方式
-                        detail.put("textField_m5oztcne", getString(item.get("define30")));//工艺号
-                        detail.put("textareaField_m5oztcnm", getString(item.get("define31")));//备注
-
-                        /*detail.put("numberField_m4cfhc7k", getString(item.get("price")));//未税单价
-                        detail.put("numberField_m4cfhc7l", getString(item.get("money")));//未税总价
-                        detail.put("numberField_m4cfhc7m", getString(item.get("taxprice")));//含税单价
-                        detail.put("numberField_m4cfhc7n", getString(item.get("sum")));//含税总价
-                        detail.put("numberField_m4cfhc7o", getString(item.get("taxrate")));//税率
-                        detail.put("numberField_m4cfhc7p", getString(item.get("tax")));//总税价*/
-
-                        return detail;
-                    }).collect(Collectors.toList());
+
+                        if (Objects.nonNull(item.get("quantity")) && isNumber(getString(item.get("quantity")))){
+                            if (getString((item.get("quantity"))).contains("-")){
+                                isReject = true;
+                                break;
+                            }else {
+                                detail.put("numberField_m4cfhc7j", getString(item.get("quantity")));//发货数量
+                            }
+                        }else {
+                            continue;
+                        }
+
+                        totalQuantity.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("quantity"))))));
+
+                        String price = getString(item.get("price"));
+                        String cost = getString(item.get("cost"));
+
+                        try {
+                            double numericValue = Double.parseDouble(price);
+
+                            //单价为0时查询存货价目表
+                            if (numericValue == 0d){
+                                String inventorycode = getString(item.get("inventorycode"));
+
+                                if (inventoryPrice.containsKey(inventorycode)){
+                                    price = inventoryPrice.get(inventorycode);
+                                }else {
+                                    price = getInventoryPrice(factory.get(dsSequence), getString(item.get("free1")), getString(saleout2.get("date")), getString(item.get("inventorycode")));
+
+                                    inventoryPrice.put(getString(item.get("inventorycode")),price);
+                                }
+
+                                if (!"0".equals(price)){
+                                    cost = Double.parseDouble(price) * Double.parseDouble(getString(item.get("quantity"))) + "";
+                                    detail.put("numberField_m4cfhc7m", price);//单价
+                                    detail.put("numberField_m4cfhc7n", cost);//金额
+                                }
+                            }else {
+                                detail.put("numberField_m4cfhc7m", price);//单价
+                                detail.put("numberField_m4cfhc7n", cost);//金额
+                            }
+
+                            String finalCost = cost;
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(finalCost))));
+                        } catch (NumberFormatException e) {
+                            System.out.println("字符串不是有效的数值: " + price);
+                        }
+
+                        /*if (Objects.nonNull(item.get("price")) && isNumber(getString(item.get("price")))){
+                            detail.put("numberField_m4cfhc7m", getString(item.get("price")));//单价
+                        }
+
+                        if (Objects.nonNull(item.get("cost")) && isNumber(getString(item.get("cost")))){
+                            detail.put("numberField_m4cfhc7n", getString(item.get("cost")));//金额
+
+                            totalCost.updateAndGet(v -> new Double((double) (v + Double.parseDouble(getString(item.get("cost"))))));
+                        }*/
+
+                        list5.add(detail);
+                    }
+                }
+
+                if (isReject){
+                    continue;
                 }
 
                 formData.put("tableField_m18nvp82",list1);
@@ -850,6 +1110,9 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                 formData.put("tableField_m4cfhc7c",list4);
                 formData.put("tableField_m4cfhc7r",list5);
 
+                formData.put("numberField_mbu92ncy",totalQuantity.get());//发货数量合计
+                formData.put("numberField_mbu92nd0",totalCost.get());//发货金额合计
+
                 //精准匹配
                 List<Map> jsonString = new ArrayList<>();
                 jsonString.add(UtilMap.map("key, value, type, operator, componentName", "textField_m18nvp87",getString(saleout2.get("code")),"TEXT","eq","TextField"));
@@ -882,14 +1145,14 @@ public class KabeiyiServiceImpl implements KabeiyiService {
                             flag = true;
                         }
                     }catch (Exception e){
-                        log.error("发货单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , e.getMessage());
+                        log.error("出库单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , e.getMessage());
                         errorCodes.add(id);
                         flag = true;
                     }
                 }
                 if (i>5){
                     errorCodes.add(id);
-                    log.error("发货单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , "重试次数过多");
+                    log.error("出库单:{} 同步失败 失败原因:{}",getString(saleout2.get("code")) , "重试次数过多");
                 }
             }
 
@@ -924,6 +1187,70 @@ public class KabeiyiServiceImpl implements KabeiyiService {
         return McR.success();
     }
 
+    public String getInventoryPrice(String factory,String customerCode,String dateStr,String inventoryCode){
+        String price = "0";
+        List<Map> searchCondition = new ArrayList<>();
+        searchCondition.add(UtilMap.map("key, value, type, operator, componentName","selectField_mc36onxf",factory,"TEXT","eq","TextField"));//工厂
+        searchCondition.add(UtilMap.map("key, value, type, operator, componentName","selectField_mc36onxg",customerCode,"TEXT","eq","TextField"));//客户码
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        // 解析日期字符串为 LocalDate
+        LocalDate date = LocalDate.parse(dateStr, formatter);
+
+        // 获取当天的起始时间(00:00:00)
+        LocalDateTime startOfDay = date.atStartOfDay();
+        // 获取当天的结束时间(23:59:59)
+        LocalDateTime endOfDay = date.atTime(23, 59, 59);
+
+        // 转换为时间戳(假设使用系统默认时区)
+        ZoneId zoneId = ZoneId.systemDefault();
+        ZonedDateTime startZonedDateTime = startOfDay.atZone(zoneId);
+        ZonedDateTime endZonedDateTime = endOfDay.atZone(zoneId);
+
+        long startTimestamp = startZonedDateTime.toInstant().toEpochMilli();
+        long endTimestamp = endZonedDateTime.toInstant().toEpochMilli();
+
+        searchCondition.add(UtilMap.map("key, value, type, operator, componentName","dateField_mc36onxh",Arrays.asList(startTimestamp,endTimestamp),"DOUBLE","between","DateField"));//出库时间
+        searchCondition.add(UtilMap.map("key, value, type, operator, componentName","textField_mc36onxm",inventoryCode,"TEXT","eq","TextField"));//存货编码
+
+        List<Map> priceData = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-934F1DF0B6C34535B81102F0CEFB6C1FR55N")
+                .searchCondition(JSONObject.toJSONString(searchCondition))
+                .pageSize(1)
+                .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+
+        if (priceData.size() == 1){
+            price = getString(((Map)priceData.get(0).get("formData")).get("numberField_mc36onxj"));
+        }
+
+        return price;
+    }
+
+    public String getInventoryName(String inventoryCode,int dsSequence,Map<String,String> inventory){
+        if (inventory.containsKey(inventoryCode)){
+            return inventory.get(inventoryCode);
+        }
+
+        Map<String, Object> param3 = new HashMap<>();
+        param3.put("from_account", fromAccount);
+        param3.put("to_account", fromAccount);
+        param3.put("app_key", u8AppKey);
+        param3.put("token", getU8Token());
+        param3.put("id", inventoryCode);
+        param3.put("ds_sequence", dsSequence);
+
+        Map<String,Object> map3 = get("https://api.yonyouup.com/api/inventory/get", param3, null);
+
+        Map inventoryInfo = (Map) map3.get("inventory");
+
+        String inventoryName = getString(inventoryInfo.get("name"));
+
+        inventory.put(inventoryCode,inventoryName);
+
+        return inventoryName;
+    }
+
     @Override
     public McR testInnerTable() {
         MDC.put("MDC_KEY_PID","1019");
@@ -1689,4 +2016,32 @@ public class KabeiyiServiceImpl implements KabeiyiService {
             return accessToken;
         }
     }
+
+    @Override
+    public String getWeekRange(String dateStr) {
+        //获取所属周(每周六-下周五)
+        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(dateStr, inputFormatter);
+
+        LocalDate startOfWeek;
+
+        // 获取该周的周六(开始日期)
+        startOfWeek = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.SATURDAY));
+
+        // 获取该周的周五(结束日期)
+        LocalDate endOfWeek = startOfWeek.plusDays(6);
+
+        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM.dd");
+
+        return startOfWeek.format(outputFormatter) + "-" + endOfWeek.format(outputFormatter);
+    }
+
+    public boolean isNumber(String str) {
+        try {
+            Double.parseDouble(str);
+            return true;
+        } catch (NumberFormatException e) {
+            return false;
+        }
+    }
 }

+ 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

+ 180 - 0
mjava-kabeiyi/src/test/java/com/malk/kabeiyi/DdTest.java

@@ -1,12 +1,21 @@
 package com.malk.kabeiyi;
 
+import com.alibaba.fastjson.JSONObject;
 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.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.apache.logging.log4j.util.Strings;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -29,6 +38,10 @@ public class DdTest {
     @Autowired
     private KabeiyiService kabeiyiService;
 
+    @Autowired
+    private YDClient ydClient;
+
+
 
     @Test
     public void test(){
@@ -63,4 +76,171 @@ public class DdTest {
     public void test3(){
         kabeiyiService.testInnerTable();
     }
+
+    @Test
+    public void test4(){
+        //分层审核
+        MDC.put("MDC_KEY_PID","1009");
+
+        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-89F515967FF94C62A9031F28EF6000B1YV5Q")//问题清单
+                .pageNumber(3)
+                .pageSize(100)
+                .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+
+        for (Map data : dataList) {
+            String formInstanceId = UtilMap.getString(data, "formInstanceId");
+
+            Map formData = (Map) data.get("formData");
+
+            String status = UtilMap.getString(formData, "selectField_m0d9pkzx");//整改状态
+
+            if (Strings.isNotBlank(status)){
+                Long deadLine = (Long) formData.get("dateField_m061zyev");
+
+                Long date = (Long) formData.get("dateField_m0dbp77k");
+
+                Map updateFormDate = new HashMap();
+
+                if (Objects.isNull(date)){
+                    updateFormDate.put("selectField_m0d9pkzx","已超期");
+                }else {
+                    if (date <= deadLine && !"未超期".equals(status)){
+                        updateFormDate.put("selectField_m0d9pkzx","未超期");
+                    }
+                    if (date > deadLine && !"已超期".equals(status)){
+                        updateFormDate.put("selectField_m0d9pkzx","已超期");
+                    }
+                }
+
+                if (!updateFormDate.keySet().isEmpty()){
+                    ydClient.operateData(YDParam.builder()
+                            .formInstId(formInstanceId)
+                            .updateFormDataJson(JSONObject.toJSONString(updateFormDate))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }
+
+            }
+        }
+    }
+
+    @Test
+    public void test5(){
+        //分层审核
+        MDC.put("MDC_KEY_PID","1009");
+
+        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-F4ED246EADD8427381BC13C4F0FEF7FDYMKJ")//审核任务
+                .pageNumber(1)
+                .pageSize(100)
+                .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+
+        for (Map data : dataList) {
+            String formInstanceId = UtilMap.getString(data, "formInstanceId");
+
+            Map formData = (Map) data.get("formData");
+
+            String status = UtilMap.getString(formData, "selectField_m0dbmfxd");//审核状态
+
+            if (Strings.isNotBlank(status)){
+                Long deadLine = (Long) formData.get("dateField_m061zye7");
+
+                Long date = (Long) formData.get("dateField_m1hod4tv");
+
+                Map updateFormDate = new HashMap();
+
+                if (Objects.isNull(date)){
+                    updateFormDate.put("selectField_m0dbmfxd","已超期");
+                }else {
+                    if (date <= deadLine && !"未超期".equals(status)){
+                        updateFormDate.put("selectField_m0dbmfxd","未超期");
+                    }
+                    if (date > deadLine && !"已超期".equals(status)){
+                        updateFormDate.put("selectField_m0dbmfxd","已超期");
+                    }
+                }
+
+                if (!updateFormDate.keySet().isEmpty()){
+                    ydClient.operateData(YDParam.builder()
+                            .formInstId(formInstanceId)
+                            .updateFormDataJson(JSONObject.toJSONString(updateFormDate))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }
+
+            }
+        }
+    }
+
+    //批量删除表单所有数据
+    @Test
+    public void deleteAllData(){
+        MDC.put("MDC_KEY_PID","1019");
+
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 50;
+        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;
+                    Thread.sleep(3000);
+                }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);
+    }
+
+    @Test
+    public void test6(){
+        System.out.println("2025-06-13 "+ kabeiyiService.getWeekRange("2025-06-13"));
+
+        System.out.println("2025-06-14 "+ kabeiyiService.getWeekRange("2025-06-14"));
+        System.out.println("2025-06-15 "+ kabeiyiService.getWeekRange("2025-06-15"));
+        System.out.println("2025-06-16 "+ kabeiyiService.getWeekRange("2025-06-16"));
+        System.out.println("2025-06-17 "+ kabeiyiService.getWeekRange("2025-06-17"));
+        System.out.println("2025-06-18 "+ kabeiyiService.getWeekRange("2025-06-18"));
+        System.out.println("2025-06-19 "+ kabeiyiService.getWeekRange("2025-06-19"));
+        System.out.println("2025-06-20 "+ kabeiyiService.getWeekRange("2025-06-20"));
+
+        System.out.println("2025-06-21 "+ kabeiyiService.getWeekRange("2025-06-21"));
+    }
 }

+ 96 - 0
mjava-lilin/pom.xml

@@ -0,0 +1,96 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.malk</groupId>
+    <artifactId>lilin</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mjava-lilin</name>
+    <description>mjava-lilin</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.14.9</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.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>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.malk.lilin.MjavaLilinApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 100 - 0
mjava-lilin/src/main/java/com/malk/lilin/Controller/LiLinController.java

@@ -0,0 +1,100 @@
+package com.malk.lilin.Controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.malk.lilin.Service.LiLinService;
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@RestController
+@Slf4j
+@RequestMapping("/ll")
+public class LiLinController {
+    @Autowired
+    private LiLinService liLinService;
+    @GetMapping("/test")
+    public McR test() {
+       return McR.success();
+    }
+    @PostMapping("/lilinUpsert")
+    public McR lilinUpsert(@RequestBody Map<String,Object> map) {
+        if (Objects.nonNull(map.get("rqqj"))){
+            List<String> rqqj = (List<String>) map.get("rqqj");
+            String  bdbh = String.valueOf(map.get("ddbh"));
+            return liLinService.lilinUpsert(rqqj,bdbh);
+
+        }
+        return McR.errorParam("实例id不能为空!");
+    }
+    @PostMapping("/lilinhqbank")//获取银行联行号
+    public McR hqbank(@RequestBody Map<String,Object> map) throws IOException {
+        log.info("lilinhqbank:{}", JSON.toJSONString(map));
+        return liLinService.hqbank(map);
+    }
+    @PostMapping("/lilinZD")//付款制单
+    public McR lilinZD(@RequestBody Map<String,Object> map) throws IOException {
+        log.info("lilinZD:{}", JSON.toJSONString(map));
+            return liLinService.lilinZD(map);
+
+    }
+    @PostMapping("/lilinJG")//支付结果查询
+    public McR lilinJG(@RequestBody Map<String,Object> map) throws IOException {
+        log.info("lilinJG:{}", JSON.toJSONString(map));
+        return liLinService.lilinJG(map);
+
+    }
+    @PostMapping("/lilinLS")//查银行流水
+    public McR lilinLS(@RequestBody Map<String,Object> map) throws IOException {
+        log.info("lilinLS:{}", JSON.toJSONString(map));
+        return liLinService.lilinLS(map);
+
+    }
+    @PostMapping("/lilinLSCF")//流水拆分
+    public McR lilinLSCF(@RequestBody Map<String,Object> map) throws IOException {
+        log.info("lilinLSCF:{}", JSON.toJSONString(map));
+        return liLinService.lilinLSCF(map);
+
+    }
+//    @PostMapping("/lilinUpsert1")
+//    public McR lilinUpsert1(@RequestBody Map<String,Object> map) {
+//        if (Objects.nonNull(map.get("rqqj"))) {
+//            // 获取当前日期,替换为当天的起止时间
+//            LocalDate today = LocalDate.now();
+//            LocalDateTime startOfDay = today.atStartOfDay();
+//            LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
+//
+//            // 格式化为字符串,格式:yyyy-MM-dd HH:mm:ss
+//            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//
+//            List<String> rqqj = Arrays.asList(
+//                    startOfDay.format(formatter),
+//                    endOfDay.format(formatter)
+//            );
+//
+//            System.out.println("r===" + rqqj);
+//
+//            String bdbh = String.valueOf(map.get("bdbh"));
+//            return liLinService.lilinUpsert(rqqj, bdbh);
+//        }
+//        if (Objects.nonNull(map.get("rqqj"))){
+//            List<String> rqqj = (List<String>) map.get("rqqj");
+//            System.out.println("r==="+rqqj);
+////            String  bdbh = String.valueOf(map.get("ddbh"));
+////            return liLinService.lilinUpsert(rqqj,bdbh);
+//        }
+//        return McR.errorParam("实例id不能为空!");
+//    }
+}

+ 96 - 0
mjava-lilin/src/main/java/com/malk/lilin/Controller/taskController.java

@@ -0,0 +1,96 @@
+package com.malk.lilin.Controller;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.http.HttpUtil;
+import com.malk.lilin.Service.LiLinService;
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+@RestController
+@Configuration
+@Slf4j
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+@RequestMapping("/ll")
+public class taskController {
+    @Autowired
+    private LiLinService lilinService;
+    public static void main(String[] args) throws IOException {
+
+        System.out.println(token().getData());
+//        OkHttpClient client = new OkHttpClient();
+
+//        Request request = new Request.Builder()
+//                .url("https://openapi.xencio.com/sandbox/cfa/api/bs/dailyBalance?securityCode=15d6b107643f2b2114a157bcd87f3feb&dateId=20230901&pageNow=1&pageSize=20")
+//                .get()
+//                .addHeader("x-xencio-client-id", "sandbox")
+//                .build();
+//        HttpUtil.downloadFile("ss", FileUtil.file())
+//        Response response = client.newCall(request).execute();
+//        System.out.println(response.body().string());
+        OkHttpClient client = new OkHttpClient();
+
+        Request request = new Request.Builder()
+                .url("https://openapi.xencio.com/sandbox/cfa/api/bank/searchBranch?securityCode="+token().getData()+"&queryType=full")
+                .get()
+                .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
+                .addHeader("content-type", "application/x-www-form-urlencoded")
+                .build();
+        Response response = client.newCall(request).execute();
+    }
+    @GetMapping("/token")
+
+    public String  token1() {
+        return (String) token().getData();
+    }
+//    @Scheduled(cron = "0 44 14 * * ?")
+//    @Scheduled(fixedRate = 30 * 60 * 1000)
+    public void task() {
+        log.info("定时获取单笔付款结果开始:{}", LocalDateTime.now());
+        try {
+            lilinService.lilinJG(null);
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+
+
+    }
+
+//    @Scheduled(fixedRate = 60 * 60 * 1000)
+    public void taskLS() {
+        log.info("定时获取银行流水结果开始:{}", LocalDateTime.now());
+        try {
+            lilinService.lilinLS(null);
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+
+
+    }
+
+
+    private static McR token() {
+        String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String s = SecureUtil.md5("KHPuj0JMS6nS1ACzc#" + today);
+        return McR.success(s);
+    }
+
+}

+ 13 - 0
mjava-lilin/src/main/java/com/malk/lilin/MjavaLilinApplication.java

@@ -0,0 +1,13 @@
+package com.malk.lilin;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication(scanBasePackages = {"com.malk"})
+public class MjavaLilinApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MjavaLilinApplication.class, args);
+    }
+
+}

+ 24 - 0
mjava-lilin/src/main/java/com/malk/lilin/Service/LiLinService.java

@@ -0,0 +1,24 @@
+package com.malk.lilin.Service;
+
+
+import com.malk.server.common.McR;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+public interface LiLinService {
+
+    McR lilinUpsert(List<String> rqqj,String bdbh);
+
+
+    McR hqbank(Map<String, Object> map) throws IOException;
+
+    McR lilinZD(Map<String, Object> map) throws IOException;
+
+    McR lilinJG(Map<String, Object> map) throws IOException;
+
+    McR lilinLS(Map<String, Object> map) throws IOException;
+
+    McR lilinLSCF(Map<String, Object> map) throws IOException;
+}

Fichier diff supprimé car celui-ci est trop grand
+ 1353 - 0
mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java


+ 34 - 0
mjava-lilin/src/main/resources/application-dev.yml

@@ -0,0 +1,34 @@
+#测试学习
+server:
+  port: 9091
+  servlet:
+    context-path: /lilin
+
+enable:
+  scheduling: true
+logging:
+#  config: classpath:logback-spring.xml
+#  path: /home/server/lianxiang/log/
+  level:
+    com.malk.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: 3745118146
+  appKey: dingrlxbv5y8hrsmmrnm
+  appSecret: tnAtNJUfYmYWURK302FkLXYLRW3PnCat6wj65lOG06db86m24kRqpWnVPHFCgUCU
+  corpId:
+  aesKey:
+  token:
+#  operator: 1656315499790273 #孙海生
+#  unionId: iPPoZ001WAYlZxyoU04g2bgiEiE #孙海生
+#  spaceId: 26395140381 #钉盘-团队文件-宜搭文件库
+#  partnersDentryId: 176651024213 #钉盘-团队文件-宜搭文件库-合作伙伴文件
+#  unrestrictedDonationDentryId: 176648777099 #钉盘-团队文件-宜搭文件库-资助人费用登记文件
+
+aliwork:
+  appType: APP_V25MK3XKODKB02UVTGSH
+  systemToken: IQC66GC1L5TW5HKF6SX645RC4AXG2CFGQOMCMOQ4
+
+
+

+ 15 - 0
mjava-lilin/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

+ 13 - 0
mjava-lilin/src/test/java/com/malk/lilin/MjavaLilinApplicationTests.java

@@ -0,0 +1,13 @@
+package com.malk.lilin;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MjavaLilinApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 1 - 0
mjava-mc/pom.xml

@@ -17,6 +17,7 @@
     <version>1.0-SNAPSHOT</version>
 
     <dependencies>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>

+ 269 - 0
mjava-mc/src/main/java/com/malk/mc/controller/McCjController.java

@@ -0,0 +1,269 @@
+package com.malk.mc.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+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.UtilMap;
+import com.malk.utils.UtilServlet;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+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 javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+@Slf4j
+@RestController
+@RequestMapping("/fangan")
+public class McCjController {
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDConf ddConf;
+    @Autowired
+    private DDClient dd;
+    @SneakyThrows
+    @PostMapping("/insetXMC")
+    McR insetXMC(@RequestBody JSONObject param) {
+        MDC.put("MDC_KEY_PID","1059");
+//        Map data = UtilServlet.getParamMap(request);
+        String formInstanceId = param.getString("formInstanceId");
+//        String type = param.getString("type");
+        log.info("formInstanceId:{}", formInstanceId);
+//        log.info("type:{}", type);
+        //根据实例ID获取表单数据
+        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        log.info("data:{}", data);
+        String UUID = "";
+
+        String FORMID = "";
+
+        String ZD = "";
+
+
+        String XMLX = data.get("selectField_lt1iahs9").toString();
+
+        String hangye1 = data.get("selectField_lt1iahsi").toString();//行业1
+
+        String hangye2 = data.get("selectField_lt1iahsj").toString();//行业2
+
+        String zyyw = data.get("textField_ltr1vksn").toString();//主营业务
+
+        if (XMLX.equals("投前项目")) {
+
+            FORMID = "textField_ltjj7pre";
+
+            UUID = "FORM-6195AAEC573C4B8C897F173ABA583710X9UE";
+
+            ZD = "associationFormField_lt1jaec6, textField_lt1jaecd, textField_lt1jaecc, selectField_lt1iahs9, selectField_lt1iahsi, selectField_lt1iahsj, textField_ltr1vksn";
+
+
+        } else if (XMLX.equals("投后项目")) {
+
+            FORMID = "textField_ltjj7prg";
+
+            UUID = "FORM-0D46B270FD8D4A7187267CC6E39C5B58QXNP";
+
+            ZD = "associationFormField_lt1ouopy, textField_lt1ouopz, textField_lt1ouoq2, selectField_lt1oy6qj";
+
+        }
+
+
+        log.info("项目池, {}", data);
+
+        if (XMLX.equals("投前项目") || XMLX.equals("投后项目")) {
+
+            List<Map> associations = YDConf.associationForm("APP_PSYQ8H0CVYMKA5PVG8X1", "FORM-496C6B71B5D34E62AA46FB8CAA4FAB69BYTF", formInstanceId, data.get("serialNumberField_lt1i52jt").toString(), null, false);
+
+            log.info("associations: {}", associations);
+
+            log.info("UUID, {}", UUID);
+
+            log.info("ZD, {}", ZD);
+
+            String tquid = ydClient.operateData(YDParam.builder()
+
+                    .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                    .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                    .formUuid(UUID)
+
+                    .formDataJson(JSON.toJSONString(UtilMap.map(ZD, associations, data.get("textField_lt1i52ju"), data.get("serialNumberField_lt1i52jt"), XMLX, hangye1, hangye2, zyyw)))//这里
+
+                    .build(), YDConf.FORM_OPERATION.create).toString();////
+
+            if (tquid != "") {
+
+                ydClient.operateData(YDParam.builder()
+
+                        .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                        .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                        .formInstanceId(formInstanceId)
+
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map(FORMID, tquid)))
+
+                        .build(), YDConf.FORM_OPERATION.update);
+
+            }
+
+
+        }
+
+        return McR.success();
+
+    }
+
+    @SneakyThrows
+
+    @PostMapping("/insetTHXM")
+    McR insetTHXM(@RequestBody JSONObject param) {
+        MDC.put("MDC_KEY_PID","1059");
+        String formInstanceId = param.getString("formInstanceId");
+//        String type = param.getString("type");
+        log.info("formInstanceId:{}", formInstanceId);
+//        log.info("type:{}", type);
+        //根据实例ID获取表单数据
+        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
+                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+        log.info("data:{}", data);
+//        Map data = UtilServlet.getParamMap(request);
+
+
+        if (data.get("selectField_ltxs7o0g").toString().equals("否")) {
+
+
+            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+
+                    .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                    .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                    .formUuid("FORM-496C6B71B5D34E62AA46FB8CAA4FAB69BYTF")
+
+                    .searchFieldJson(JSON.toJSONString(UtilMap.map("serialNumberField_lt1i52jt", data.get("textField_lt1jaecc").toString())))
+
+                    .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+
+            if (dataList != null && dataList.size() > 0) {
+
+                log.info("dataList:" + dataList);
+
+                String XMCSLID = dataList.get(0).get("formInstanceId").toString();
+
+                String FORMID = "textField_ltjj7prg";
+
+                String UUID = "FORM-0D46B270FD8D4A7187267CC6E39C5B58QXNP";
+
+                String ZD = "associationFormField_lt1ouopy, textField_lt1ouopz, textField_lt1ouoq2, selectField_lt1oy6qj";
+
+                List<Map> associations = YDConf.associationForm("APP_PSYQ8H0CVYMKA5PVG8X1", "FORM-496C6B71B5D34E62AA46FB8CAA4FAB69BYTF", XMCSLID, data.get("textField_lt1jaecc").toString(), null, false);
+
+                String tquid = ydClient.operateData(YDParam.builder()
+
+                        .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                        .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                        .formUuid(UUID)
+
+                        .formDataJson(JSON.toJSONString(UtilMap.map(ZD, associations, data.get("textField_lt1jaecd"), data.get("textField_lt1jaecc"), "投后项目")))
+
+                        .build(), YDConf.FORM_OPERATION.create).toString();////
+
+                if (tquid != "") {
+
+                    ydClient.operateData(YDParam.builder()
+
+                            .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                            .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                            .formInstanceId(String.valueOf(XMCSLID))
+
+                            .updateFormDataJson(JSON.toJSONString(UtilMap.map(FORMID, tquid)))
+
+                            .build(), YDConf.FORM_OPERATION.update);
+
+                }
+
+            }
+
+            log.info("request, {}", dataList);
+
+        }
+
+        return McR.success();
+
+    }
+
+    @SneakyThrows
+
+    @PostMapping("/report/PJJStemporary")
+    McR temporary(@RequestBody Map<String, String> data) {
+
+        MDC.put("MDC_KEY_PID","1059");
+        String formid = data.get("fomid");
+
+        log.info("formid,{}", formid);
+
+        Map formdata = ydClient.queryData(YDParam.builder()
+
+                .appType("APP_PSYQ8H0CVYMKA5PVG8X1")
+
+                .systemToken("ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71")
+
+                .formUuid("FORM-82D513EC7BA24BD592EB7484C58F6604PWOZ")
+
+                .formInstanceId(String.valueOf(formid))
+
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+
+        List<Map> list = (List<Map>) JSON.parse(String.valueOf(formdata.get("attachmentField_lt468w10")));
+
+    // return McR.success(ydClient.convertTemporaryUrl(list.get(0).get("url").toString(),"APP_G951QZ32AUJNJUE4G127","HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6",ddapptonken));
+
+        //log.info("url, {}",McR.success(ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() )));
+
+//        System.out.println("URL:"+McR.success(ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() )));
+
+//        System.out.println("afasdf:" + ydClient.convertTemporaryUrl(list.get(0).get("url").toString()));
+
+        return McR.success(ydClient.convertTemporaryUrl(list.get(0).get("url").toString()));
+
+
+
+    }
+//    private String convertTemporaryUrl_PJJS(String url ) {
+//          String ddapptonken= dd.getAccessToken("dingtcx6xmpmvzihpnnd","PbzbXn065v7qqfGWO-zUdvPoFFO8oB67fyOVX7zao_YXzH7di2ekPZxDcdYKSGUH");
+//        Map param = new HashMap();
+//        param.put("systemToken", "ULD66N81VLRUVLB5E1R6A71CSI0N2NNW5NQ9MP71");
+//        param.put("userId", YDConf.PUB_ACCOUNT);
+//        param.put("fileUrl", url);          // URL在param上时, 需要编码 [UtilHttp已经做了编码] - URLEncoder.encode(url, "UTF-8")
+//        param.put("timeout", 60000);      // 默认1分钟, 最大24小时 [毫秒]
+////        System.out.println("ssss:"+(String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/APP_PSYQ8H0CVYMKA5PVG8X1" , ddClient.initTokenHeader_PJSS(), param).getResult());
+//        return (String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/APP_PSYQ8H0CVYMKA5PVG8X1" , ddClient.initTokenHeader_PJSS(), param).getResult();
+//    }
+
+}

+ 62 - 22
mjava-mc/src/main/java/com/malk/mc/controller/McYdController.java

@@ -44,12 +44,12 @@ public class McYdController {
      * @return
      */
     @PostMapping("copy")
-    public McR copy(@RequestBody JSONObject param){
-        if(PublicUtil.isNull(param,"instanceId","formUuid")){
+    public McR copy(@RequestBody JSONObject param) {
+        if (PublicUtil.isNull(param, "instanceId", "formUuid")) {
             return McR.errorNullPointer();
         }
-        ydService.mirrorFormData(param.getString("instanceId"),param.getString("formUuid"),param.getString("processCode"),param.getString("processUserId"),
-                param.getJSONObject("updateData"),param.getString("updateInstanceId"));
+        ydService.mirrorFormData(param.getString("instanceId"), param.getString("formUuid"), param.getString("processCode"), param.getString("processUserId"),
+                param.getJSONObject("updateData"), param.getString("updateInstanceId"));
         return McR.success();
     }
 
@@ -59,26 +59,27 @@ public class McYdController {
      * @return
      */
     @PostMapping("saveGl")
-    public McR saveGl(@RequestBody JSONObject param){
-        if(PublicUtil.isNull(param,"formInstId","formUuid","title","saveFormInstId","compId","appType")){
+    public McR saveGl(@RequestBody JSONObject param) {
+        if (PublicUtil.isNull(param, "formInstId", "formUuid", "title", "saveFormInstId", "compId", "appType")) {
             return McR.errorNullPointer();
         }
-        ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(param.getString("compId"),Arrays.asList(
-                UtilMap.map("appType, formType, instanceId, title, subTitle, formUuid",param.getString("appType"),"receipt",param.getString("formInstId")
-                        ,param.getString("title"),param.getString("subTitle"),param.getString("formUuid")))
+        ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(param.getString("compId"), Arrays.asList(
+                UtilMap.map("appType, formType, instanceId, title, subTitle, formUuid", param.getString("appType"), "receipt", param.getString("formInstId")
+                        , param.getString("title"), param.getString("subTitle"), param.getString("formUuid")))
         ))).formInstId(param.getString("saveFormInstId")).build(), YDConf.FORM_OPERATION.update);
         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");
+    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 : "";
@@ -106,58 +107,97 @@ public class McYdController {
 
             list.addAll((List<Map>) ddrNew.getData());
             pageNumber++;
-        }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+        } while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
         return list;
     }
 
     /**
      * 更新表单数据版本
+     *
      * @param map
      * @return
      */
     @PostMapping("/updateFormDataVersion")
-    public McR updateFormDataVersion(@RequestBody Map map){
+    public McR updateFormDataVersion(@RequestBody Map map) {
         mcYdService.updateFormDataVersion(map);
 
         return McR.success();
     }
 
+    /**
+     * 批量更新符合条件的指定数量的实例(批量上限100条)
+     * @param map
+     * @return
+     */
+    @PostMapping("/batchUpdateSpecifiedQuantityData")
+    public McR batchUpdateSpecifiedQuantityData(@RequestBody Map map){
+        mcYdService.batchUpdateSpecifiedQuantityData(map);
+        return McR.success();
+    }
+
     /**
      * 发起审批
+     *
      * @param map
      * @return
      */
     @PostMapping("initiateApproval")
-    public McR initiateApproval(@RequestBody Map map){
+    public McR initiateApproval(@RequestBody Map map) {
         return mcYdService.initiateApproval(map);
     }
 
     //子表数值转化为文本,添加千位分隔符
     @PostMapping("/convertSubTableNumber")
-    public McR convertSubTableNumber(@RequestBody Map map){
+    public McR convertSubTableNumber(@RequestBody Map map) {
         return mcYdService.convertSubTableNumber(map);
     }
 
     @PostMapping("/saveApproverToForm")
-    public McR saveApproverToForm(@RequestBody Map map){
-        McException.assertParamException_Null(map,"formInstId","key");
+    public McR saveApproverToForm(@RequestBody Map map) {
+        McException.assertParamException_Null(map, "formInstId", "key");
         return mcYdService.saveApproverToForm(map);
     }
 
     //海天二期开发部分(出库)
     @PostMapping("/multiLocationOutbound")
-    public McR multiLocationOutbound(@RequestBody Map map){
+    public McR multiLocationOutbound(@RequestBody Map map) {
         return mcYdService.multiLocationOutbound(map);
     }
+
     //海天二期开发部分(入库)
     @PostMapping("/WarehouseStorage")
-    public McR WarehouseStorage(@RequestBody Map map){
+    public McR WarehouseStorage(@RequestBody Map map) {
         return mcYdService.WarehouseStorage(map);
     }
+
     //海天二期开发(退货)
     @PostMapping("/ProductReturn")
-    public McR ProductReturn(@RequestBody Map map){return mcYdService.ProductReturn(map);}
+    public McR ProductReturn(@RequestBody Map map) {
+        return mcYdService.ProductReturn(map);
+    }
+
     //海天二期开发(调拨)
     @PostMapping("/allocateTransfer")
-    public McR allocateTransfer(@RequestBody Map map){return mcYdService.allocateTransfer(map);}
+    public McR allocateTransfer(@RequestBody Map map) {
+        return mcYdService.allocateTransfer(map);
+    }
+
+    /**
+     * 分享数据权限
+     * @param map compId 表单分享权限所属, userIds 分享人及被分享人, userId 分享人, content 代办标题, atUserId 被分享人, appUrl 移动端地址, pcUrl PC端地址
+     * @param header POC下MC服务项目pid
+     * @return
+     */
+    @PostMapping("/shareRecord")
+    public McR shareRecord(@RequestBody Map map, @RequestHeader Map header) {
+        map.put("pid",header.get("pid").toString());
+        return mcYdService.shareRecord(map);
+    }
+
+    //同意或拒绝宜搭审批任务
+    @PostMapping("/approveTask")
+    public McR approveTask(@RequestBody Map map) {
+        return mcYdService.approveTask(map);
+    }
+
 }

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

@@ -1,6 +1,7 @@
 package com.malk.mc.service;
 
 import com.malk.server.common.McR;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.scheduling.annotation.Async;
 
 import java.util.Map;
@@ -22,4 +23,10 @@ public interface McYdService {
     McR ProductReturn(Map map);
 
     McR allocateTransfer(Map map);
+
+    void batchUpdateSpecifiedQuantityData(Map map);
+
+    McR shareRecord(Map map);
+
+    McR approveTask(Map map);
 }

+ 1 - 4
mjava-mc/src/main/java/com/malk/mc/service/impl/McProjectServiceImpl.java

@@ -1,6 +1,5 @@
 package com.malk.mc.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
 import com.malk.core.McProject;
 import com.malk.mc.service.McProjectService;
 import com.malk.server.aliwork.YDConf;
@@ -13,8 +12,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -46,7 +43,7 @@ public class McProjectServiceImpl implements McProjectService {
                 Map formData=UtilMap.getMap(map,"formData");
                 ydData.put(UtilMap.getString(formData,"serialNumberField_lxlfw7nn"),new String[]{UtilMap.getString(formData,"textField_lxlfw7no"),UtilMap.getString(formData,"textField_lxlfw7np")});
                 if(!PublicUtil.isNull(formData,"textField_m7abagvx","textField_m7abagvy")){
-                    ddData.put(UtilMap.getString(formData,"serialNumberField_lxlfw7nn"),new String[]{UtilMap.getString(formData,"textField_m7abagvx"),UtilMap.getString(formData,"textField_m7abagvy")});
+                    ddData.put(UtilMap.getString(formData,"serialNumberField_lxlfw7nn"),new String[]{UtilMap.getString(formData,"textField_m7abagvx"),UtilMap.getString(formData,"textField_m7abagvy"),UtilMap.getString(formData,"textField_mbyfztyy")});
                 }
             }
         }while (i<t);

+ 328 - 76
mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java

@@ -2,6 +2,7 @@ package com.malk.mc.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -9,14 +10,18 @@ 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.McException;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR;
 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 com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.service.dingtalk.DDClient_Notice;
+import com.malk.service.dingtalk.DDClient_Workflow;
+import com.malk.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.slf4j.MDC;
@@ -24,10 +29,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import javax.rmi.CORBA.Util;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -40,83 +47,109 @@ public class McYdServiceImpl implements McYdService {
     private DDConf ddConf;
     @Autowired
     private YDConf ydConf;
+    @Autowired
+    private DDClient_Workflow ddClientWorkflow;
+
+    @Autowired
+    private DDClient_Notice ddClientNotice;
 
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
     @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 = 10;
-                DDR_New ddrNew = null;
-                do {
-                    int i1 =1 ;
-                    boolean flag1 = false;
-                    while (i1<=5 && !flag1) {
-                        try {
-                            ddrNew = ydClient.queryData(YDParam.builder()
-                                    .formUuid(formUuid)
-                                    .pageNumber(i)
-                                    .pageSize(pageSize)
-                                    .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("{}")
-                                    .noExecuteExpression(false)
-                                    .asynchronousExecution(false)
-                                    .build(),YDConf.FORM_OPERATION.multi_update);
-
-                            i++;
-                            flag1 = true;
-                        }catch (Exception e){
-                            log.error("更新表单实例版本失败:{}, 重试次数:{}",e.getMessage(),i1);
+        try {
+            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 = 10;
+                    DDR_New ddrNew = null;
+                    do {
+                        int i1 =1 ;
+                        boolean flag1 = false;
+                        while (i1<=5 && !flag1) {
                             try {
-                                Thread.sleep(3000);
-                            } catch (InterruptedException ex) {
-                                throw new RuntimeException(ex);
+                                ddrNew = ydClient.queryData(YDParam.builder()
+                                        .formUuid(formUuid)
+                                        .pageNumber(i)
+                                        .pageSize(pageSize)
+                                        .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("{}")
+                                        .noExecuteExpression(false)
+                                        .asynchronousExecution(false)
+                                        .build(),YDConf.FORM_OPERATION.multi_update);
+
+                                i++;
+                                flag1 = true;
+                            }catch (Exception e){
+                                log.error("更新表单实例版本失败:{}, 重试次数:{}",e.getMessage(),i1);
+                                try {
+                                    Thread.sleep(3000);
+                                } catch (InterruptedException ex) {
+                                    throw new RuntimeException(ex);
+                                }
+                                i1++;
                             }
-                            i1++;
                         }
-                    }
-                    if (i1 > 5){
-                        log.error("更新表单实例版本失败:{}");
-                        break;
-                    }
+                        if (i1 > 5){
+                            throw new RuntimeException("更新表单实例版本失败,超过最大重试次数!");
+                        }
 
-                }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
-            }
+                    }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
+                }
 
-            //发送工作通知给当前登陆人
+                //发送工作通知给当前登陆人
+                if (Objects.nonNull(map.get("userId"))){
+                    //获取当前时间 精确到秒
+                    String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");
+                    sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),map.get("userId").toString(),"表单实例版本已更新  时间:" + time);
+                }
+            }
+        }catch (Exception e){
+            //发送工作通知
             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);
+                String time = DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss");//获取当前时间 精确到秒
+                sendDdMsg(ddClient.getAccessToken(),ddConf.getAgentId(),map.get("userId").toString(),"更新表单实例版本异常:" + e.getMessage() + "  时间:" + time);
             }
+
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    //发送工作通知
+    public void sendDdMsg(String access_token,Number agent_id, String userid_list, String content){
+        if (Objects.nonNull(userid_list)){
+            Map param2 = new HashMap();
+            param2.put("access_token",access_token);
+            Map body3 = new HashMap();
+            body3.put("agent_id",agent_id);
+            body3.put("userid_list",userid_list);
+            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",content));
+            body3.put("msg",msg);
+            UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2",null,param2,body3);
         }
     }
 
@@ -219,12 +252,17 @@ public class McYdServiceImpl implements McYdService {
 
     @Override
     public McR saveApproverToForm(Map map) {
+        try {
+            Thread.sleep(5000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
         String key = UtilMap.getString(map,"key");
         String formInstId = UtilMap.getString(map,"formInstId");
         JSONArray jsonArray=(JSONArray) ydClient.queryData(YDParam.builder().processInstanceId(formInstId).build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult();
         List<String> userIds = new ArrayList<>();
         extractOperatorIds(jsonArray,userIds);
-        ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(key,userIds))).formInstId(formInstId).build(), YDConf.FORM_OPERATION.update);
+        ydClient.operateData(YDParam.builder().updateFormDataJson(JSONObject.toJSONString(UtilMap.map(key, userIds))).formInstId(formInstId).build(), YDConf.FORM_OPERATION.update);
         return McR.success();
     }
 
@@ -233,10 +271,10 @@ public class McYdServiceImpl implements McYdService {
 
         String formInstId = UtilMap.getString(map,"formInstId");//实例id(出库单)
         Map d = ydClient.queryData(YDParam.builder().formInstId(formInstId)
-                        .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F")
-                        .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
-                        .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
-                        .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
+                .formUuid("FORM-3208DFE5463549A9A57FB94358A75E80PV5F")
+                .appType("APP_GNQ1RGK68X4JNZUEU8RQ")
+                .systemToken("XH866P81QDOTQ0218TGZM9WCNXOF24WIP488M7A5")
+                .userId("332051151139376769").build(),YDConf.FORM_QUERY.retrieve_id).getFormData();
         System.out.println("出库单数据:"+d);
         List<Map> mapList = (List<Map>)d.get("tableField_m8mo8506");
         System.out.println("出库单明细数据:"+mapList);
@@ -248,7 +286,7 @@ public class McYdServiceImpl implements McYdService {
             BigDecimal InventoryCount = BigDecimal.valueOf(0);//库存数量
             BigDecimal OutboundQuantity = BigDecimal.valueOf(0);//
             if(!map1.get("numberField_m9qdwvu1_value").toString().isEmpty()){
-                 InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString());
+                InventoryCount = new BigDecimal( map1.get("numberField_m9qdwvu1").toString());
             }
             BigDecimal numberFieldM9qdwvu1 = InventoryCount.subtract( new BigDecimal( map1.get("numberField_m8mo8508").toString()));//存库数量 - 出库数量
             System.out.println("出库后数量:"+numberFieldM9qdwvu1);
@@ -597,6 +635,220 @@ public class McYdServiceImpl implements McYdService {
         return McR.success();
     }
 
+    @Override
+    public McR shareRecord(Map data) {
+        String pid = getString(data.get("pid"));
+        if (Strings.isNotBlank(pid)){
+            //发起审批
+            String[] dd = McProject.getDd(pid);
+            String appKey = "";
+            String appSecret = "";
+            String agentId = "";
+            if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 3) {
+                appKey = dd[0];
+                appSecret = dd[1];
+                agentId = dd[2];
+            }
+            String[] yida = McProject.getYida(pid);
+            String appType = "";
+            String systemToken = "";
+            if (!PublicUtil.isNull(pid) && dd != null && dd.length >= 2) {
+                appType = yida[0];
+                systemToken = yida[1];
+            }
+
+            // 执行分享逻辑 [ 拼接后的权限组 ]
+            McException.assertParamException_Null(data, "compId, userIds, userId, atUserId, isNotice");
+            //开始抓取宜搭对应的子表数据
+            String processInstanceId = data.get("processInstanceId").toString();
+            List<String> atUserId = (List<String>) data.get("atUserId");
+
+            Map map = new HashMap();
+            map.put(UtilMap.getString(data, "compId"),UtilMap.getList(data, "userIds"));
+
+            ydClient.operateData(YDParam.builder()
+                    .appType(appType)
+                    .systemToken(systemToken)
+                    .formInstId(processInstanceId)
+                    .updateFormDataJson(JSON.toJSONString(map))
+                    .build(), YDConf.FORM_OPERATION.update);
+
+            String userIds = String.valueOf(data.get("atUserId"));
+            String[] split = userIds.split(",");
+            ArrayList<String> names = new ArrayList<>();
+            for(Object auserId : split){
+                DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", auserId), DDR_New.class);
+                Object result = ddrNew.getResult();
+                if (result != null) {
+                    JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(result));
+                    String name = jsonObject.getString("name");
+                    names.add(name);
+                }
+            }
+            List<Map> searchCondition = new ArrayList<>();
+            searchCondition.addAll(Arrays.asList(
+                    YDConf.searchCondition_TextFiled(data.get("processKey").toString(), data.get("processInstanceId").toString(),"eq")
+            ));
+            String title = UtilMap.getString(data, "content").isEmpty() || !ObjectUtil.isNotNull(UtilMap.getString(data, "content")) ? "单据分享" : UtilMap.getString(data, "content");
+            ydClient.operateData(YDParam.builder()
+                    .appType(appType)
+                    .systemToken(systemToken)
+                    .searchCondition(JSON.toJSONString(searchCondition))
+                    .formUuid(data.get("formId").toString())
+                    .formDataJson(JSON.toJSONString(UtilMap.map(data.get("processKey").toString()+", "+data.get("empKey").toString()+", "+data.get("titleKey").toString(),
+                            data.get("processInstanceId").toString(),UtilMap.getList(data, "userIds"),title)))
+                    .useLatestVersion(true)
+                    .build(), YDConf.FORM_OPERATION.upsert_v2);
+            if (UtilMap.getBoolean(data, "isNotice")) {
+//                data.put("content", names.stream().collect(Collectors.joining(",")) + UtilMap.getString(data, "content"));
+                String appUrl = data.get("appUrl").toString();
+                String pcUrl = data.get("pcUrl").toString();
+                if ( !ObjectUtil.isNotNull(UtilMap.getString(data,"sendType")) || UtilMap.getString(data,"sendType").isEmpty() || "工作通知".equals(UtilMap.getString(data,"sendType"))){
+                    Map<String, String> contentMap = new HashMap<>();
+                    contentMap.put("title",title);
+                    contentMap.put("text",title);
+                    contentMap.put("picUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
+                    contentMap.put("messageUrl",pcUrl+"/processDetail"+"?procInsId="+processInstanceId);
+
+                    Map<String, Object> msg = new HashMap<>();
+                    msg.put("msgtype","link");
+                    msg.put("link",contentMap);
+                    sendNotification(ddClient.getAccessToken(appKey,appSecret),atUserId,null,false,msg,agentId);
+
+                } else if ("钉钉代办".equals(UtilMap.getString(data, "sendType"))) {
+                    /*查询钉钉人员*/
+                    ddClientWorkflow.createTBTask(ddClient.getAccessToken(appKey,appSecret),UtilMap.getString(data, "userId"),"流程分享:"+UtilMap.getString(data, "content"),UtilMap.getString(data, "content"),
+                            UtilDateTime.getLocalDateTimeTimeStamp(LocalDate.now().plusDays(7).atTime(LocalTime.MAX)), atUserId,null
+                            ,UtilMap.map("appUrl, pcUrl",appUrl+"/processDetail"+"?procInsId="+processInstanceId,pcUrl+"/processDetail"+"?procInsId="+processInstanceId),false,30,UtilMap.map("dingNotify","1"));
+                }
+            }
+            return McR.success();
+        }
+        return McR.errorParam("参数缺失!");
+    }
+
+    @Override
+    public McR approveTask(Map map) {
+        String outResult = UtilMap.getString(map, "outResult");
+        String userId = UtilMap.getString(map, "userId");
+
+        String processInstanceId = UtilMap.getString(map, "processInstanceId");
+        String activityId = UtilMap.getString(map, "activityId");
+        long taskId = 0;
+
+        //获取审批记录
+        List<Map> result = (List<Map>) ydClient.queryData(YDParam.builder()
+                .processInstanceId(processInstanceId)
+                .build(),YDConf.FORM_QUERY.retrieve_approval_record).getResult();
+        for (Map approveInfo : result) {
+            if (activityId.equals(UtilMap.getString(approveInfo, "activityId"))){
+                //获取taskId
+                taskId = UtilMap.getLong(approveInfo, "taskId");
+                break;
+            }
+        }
+
+        //审批
+        Map body = new HashMap();
+        body.put("outResult",outResult);//AGREE:同意 DISAGREE:拒绝。
+        body.put("appType",ydConf.getAppType());
+        body.put("systemToken",ydConf.getSystemToken());
+        body.put("remark",outResult);//审批意见
+        body.put("processInstanceId",processInstanceId);//审批实例id
+        body.put("userId",userId);//用户userid
+        body.put("taskId",taskId);//任务id
+
+        UtilHttp.doPost("https://api.dingtalk.com/v1.0/yida/tasks/execute", ddClient.initTokenHeader(), null,body);
+
+        return McR.success();
+    }
+
+    public String sendNotification(String access_token, List<String> userid_list, List<String> dept_id_list, boolean to_all_user, Map msg, String agent_id) {
+        Map body = UtilMap.map("agent_id, to_all_user, msg", new Object[]{agent_id, to_all_user, msg});
+        if (UtilList.isNotEmpty(userid_list)) {
+            body.put("userid_list", String.join(",", userid_list));
+        }
+        if (UtilList.isNotEmpty(dept_id_list)) {
+            body.put("dept_id_list", String.join(",", dept_id_list));
+        }
+
+        DDR ddr = DDR.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", (Map)null, DDConf.initTokenParams(access_token), body);
+        return ddr.getTask_id();
+    }
+
+    @Async
+    @Override
+    public void batchUpdateSpecifiedQuantityData(Map map) {
+        try {
+            String pid = UtilMap.getString(map, "pid");
+            MDC.put("MDC_KEY_PID",pid);
+
+            String formInstId = UtilMap.getString(map, "formInstId");//当前表实例id
+
+            //查询当前表formData
+            Map formData = ydClient.queryData(YDParam.builder()
+                    .formInstanceId(formInstId)
+                    .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+            //目标表筛选字段唯一标识
+            String[] searchFields = UtilMap.getString(map, "searchFieldStr").split(",");
+            //目标表筛选字段值
+            String[] searchFieldValues = UtilMap.getString(map, "searchFieldValueStr").split(",");
+
+            Map searchCondition = new HashMap();
+
+            if (searchFields.length == searchFieldValues.length){
+                for (int i = 0; i < searchFields.length; i++) {
+                    searchCondition.put(searchFields[i],searchFieldValues[i]);
+                }
+            }else {
+                log.info("筛选字段和筛选值数量不一致");
+            }
+
+            int quantity = UtilMap.getInt(map, "quantity");//指定更新数量
+            if (quantity > 100){
+                log.info("更新数量不能大于100");
+            }
+
+            String formUuid = UtilMap.getString(map, "formUuid");//目标表uuid
+
+            List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
+                    .searchCondition(JSONObject.toJSONString(searchCondition))
+                    .formUuid(formUuid)
+                    .pageSize(quantity)
+                    .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+
+
+
+            //目标表更新字段唯一标识
+            String[] fieldStrs = UtilMap.getString(map, "fieldStr").split(",");
+            //当前表字段唯一标识
+            String[] currentFieldStrs = UtilMap.getString(map, "currentFieldStrs").split(",");
+
+            Map updateFormData = new HashMap();
+
+            if (fieldStrs.length == currentFieldStrs.length){
+                for (int i = 0; i < fieldStrs.length; i++) {
+                    updateFormData.put(fieldStrs[i],YDConf.getDataByCompId(formData,currentFieldStrs[i]));
+                }
+            }else {
+                log.info("更新字段和当前表字段数量不一致");
+            }
+
+            for (Map datum : data) {
+                String formInstanceId = UtilMap.getString(datum, "formInstanceId");
+
+                ydClient.operateData(YDParam.builder()
+                        .formInstanceId(formInstanceId)
+                        .updateFormDataJson(JSONObject.toJSONString(updateFormData))
+                        .build(), YDConf.FORM_OPERATION.update);
+            }
+            log.info("批量更新成功");
+        }catch (Exception e){
+            log.info("更新数据失败:{}",e.getMessage());
+        }
+    }
+
 
     private static void extractOperatorIds(JSONArray array, List<String> result) {
         for (Object item : array) {

+ 16 - 0
mjava-pake/pom.xml

@@ -20,6 +20,16 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.13</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
@@ -61,6 +71,12 @@
             <artifactId>dingtalk</artifactId>
             <version>1.4.35</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 51 - 0
mjava-pake/src/main/java/com/malk/pake/controller/PkProjectController.java

@@ -0,0 +1,51 @@
+package com.malk.pake.controller;
+
+import com.malk.pake.service.PkProjectService;
+import com.malk.server.common.McR;
+import com.malk.utils.UtilMap;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/project")
+@Slf4j
+public class PkProjectController {
+
+    @Autowired
+    private PkProjectService pkProjectService;
+
+
+    @PostMapping("/saleUpdateProject")
+    public void saleUpdateProject(String formInstId){
+        pkProjectService.saleUpdateProject(formInstId);
+    }
+    /**
+     * 推送审批
+     */
+    @PostMapping("/oaUpdateProject")
+    public McR doApprove(String processInstanceId, String type) {
+
+        log.info("推送审批, {} {}", type, processInstanceId);
+        // OA组件name, 匹配宜搭组件ID
+        if ("差旅费报销".equals(type)){
+            Map<String, String> compsId_main = UtilMap.map("费用报销类型, 付款公司, 费用出处, 项目编号, 项目名称, 商机编号, 商机名称", "selectField_m7wq5adn, selectField_m7wq5ado, selectField_m7wq5adp, textField_m7wq5adu, textField_m7wq5adx, textField_m7wq5ae0, textField_m7wq5ae2");
+            Map<String, String> compsId_itinerary = UtilMap.map("出发时间, 返回时间, 原驻地, 出差目的地, 交通工具, 车船费, 途中补贴, 住勤费, 合计金额(元)",
+                    "dateField_m9994caw, dateField_m9994cay, textField_m9994cb2, textField_m9994cb4, textField_m9994cb6, numberField_m9994cba, numberField_m9994cbc, numberField_m9994cbe, numberField_m9994cbg");
+            compsId_main.put("行程明细", "tableField_m9994cau"); // 子表组件
+            pkProjectService.oaUpdateProject(processInstanceId, "FORM-E7D787CEA025411B9ED6CF46E0AB0C3DNXU3", compsId_main, compsId_itinerary, "行程明细");
+        }else {
+            Map<String, String> compsId_main = UtilMap.map("费用报销类型, 付款公司, 费用出处, 项目编号, 项目名称, 商机编号, 商机名称", "selectField_m7wq5adn, selectField_m7wq5ado, selectField_m7wq5adp, textField_m7wq5adu, textField_m7wq5adx, textField_m7wq5ae0, textField_m7wq5ae2");
+            Map<String, String> compsId_itinerary = UtilMap.map("报销类目, 报销内容, 报销金额(元)", "selectField_m7wq5ae7, textareaField_m7wq5ae9, numberField_m7wq5aeb");
+            compsId_main.put("报销明细", "tableField_m7wq5ae5"); // 子表组件
+            pkProjectService.oaUpdateProject(processInstanceId, "FORM-E7D787CEA025411B9ED6CF46E0AB0C3DNXU3", compsId_main, compsId_itinerary, "报销明细");
+        }
+        return McR.success();
+    }
+
+
+}

+ 39 - 0
mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java

@@ -1,7 +1,9 @@
 package com.malk.pake.schedule;
 
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.http.HttpUtil;
 import com.malk.pake.service.PkMaintenanceWarningService;
+import com.malk.pake.service.PkProjectService;
 import com.malk.pake.service.PkWorkingHoursService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +28,8 @@ public class ScheduleTask {
     private PkWorkingHoursService pkWorkingHoursService;
     @Autowired
     private PkMaintenanceWarningService pkMaintenanceWarningService;
+    @Autowired
+    private PkProjectService pkProjectService;
 
     /**
      * 工时填写提醒-按月
@@ -88,4 +92,39 @@ public class ScheduleTask {
             e.printStackTrace();
         }
     }
+    /**
+     * 阿里商旅火车票
+     * 每天00:00获取阿里商旅昨日火车票数据
+     */
+    @Scheduled(cron = "0 10 0 * * ?")
+    public void getTrainInternal() {
+        log.info("阿里商旅火车票");
+        LocalDate now = LocalDate.now();
+        String formatToday = LocalDateTimeUtil.format(now, "yyyy-MM-dd");
+        LocalDate yesterday = now.plusDays(-1);
+        String formatYesterday = LocalDateTimeUtil.format(yesterday, "yyyy-MM-dd");
+        try {
+            pkProjectService.getTrainInternal(formatYesterday,formatToday);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 阿里商旅机票
+     * 每天00:30获取阿里商旅机票昨日数据
+     */
+    @Scheduled(cron = "0 30 1 * * ?")
+    public void getAirInternal() {
+        log.info("阿里商旅机票");
+        LocalDate now = LocalDate.now();
+        String formatToday = LocalDateTimeUtil.format(now, "yyyy-MM-dd");
+        LocalDate yesterday = now.plusDays(-1);
+        String formatYesterday = LocalDateTimeUtil.format(yesterday, "yyyy-MM-dd");
+        try {
+            pkProjectService.getAirInternal(formatYesterday,formatToday);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 15 - 0
mjava-pake/src/main/java/com/malk/pake/service/PkProjectService.java

@@ -0,0 +1,15 @@
+package com.malk.pake.service;
+
+import java.util.Map;
+
+public interface PkProjectService {
+
+    void saleUpdateProject(String formInstId);
+
+    //OA通用报销审批通过后更新写入宜搭
+    void oaUpdateProject(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa);
+    //获取日期范围内阿里商旅火车票数据
+    void getTrainInternal(String startDate, String endDate);
+    //获取日期范围内阿里商旅机票数据
+    void getAirInternal(String startDate, String endDate);
+}

+ 507 - 0
mjava-pake/src/main/java/com/malk/pake/service/impl/PkProjectServiceImpl.java

@@ -0,0 +1,507 @@
+package com.malk.pake.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.pake.service.PkProjectService;
+import com.malk.pake.utils.HttpUtils;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Notice;
+import com.malk.service.dingtalk.DDClient_Workflow;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilMap;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+@Slf4j
+public class PkProjectServiceImpl implements PkProjectService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Notice ddClient_notice;
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+
+    private String projectFormUUID = "FORM-7F8921D7324F43B3B1147C1D99A3F758NFIL";
+    private String saleFormUUID = "FORM-4V966N81BW8D84BFBI41WACUKFRZ1XBFPVELLJ";
+    private String trainUUID = "FORM-78E05305A9BB4BBBABF5E34F781530D1RP78";
+    private String airUUID = "FORM-53E3974D2A074B00AA6C66DE278F7938ZNNT";
+
+    /// dingtalk
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
+    /// aliwork
+    @Value("${aliwork.appType}")
+    private String APP_TYPE;
+    @Value("${aliwork.systemToken}")
+    private String SYSTRM_TOKEN;
+    /// 阿里商旅
+    @Value("${alibusinesstravel.appKey}")
+    private String BUS_kEY;
+    @Value("${alibusinesstravel.appSecret}")
+    private String BUS_SECRET;
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final Map<String,String> AIR_FEE_TYPE  = new HashMap<>();
+    static {
+        AIR_FEE_TYPE.put("10101","机票预订");
+        AIR_FEE_TYPE.put("10202","机票改签手续费");
+        AIR_FEE_TYPE.put("10203","机票改签差价");
+        AIR_FEE_TYPE.put("10301","机票退款");
+        AIR_FEE_TYPE.put("10302","机票改签退款");
+        AIR_FEE_TYPE.put("10303","机票补退");
+        AIR_FEE_TYPE.put("10401","机票保险-航意险购买");
+        AIR_FEE_TYPE.put("10501","机票保险-航意险退保");
+        AIR_FEE_TYPE.put("11001","机票预订服务费");
+        AIR_FEE_TYPE.put("11002","机票改签服务费");
+        AIR_FEE_TYPE.put("10304","机票票据服务费退款");
+        AIR_FEE_TYPE.put("11003","机票票据服务费");
+        AIR_FEE_TYPE.put("11004","机票托管协议服务费");
+        AIR_FEE_TYPE.put("11005","机票改签托管协议服务费");
+    }
+    private static final Map<String,String> TRAIN_FEE_TYPE = new HashMap<>();
+    static {
+       TRAIN_FEE_TYPE.put("6001","火车票预订");
+       TRAIN_FEE_TYPE.put("6003","火车票改签差价");
+       TRAIN_FEE_TYPE.put("6004","火车票改签手续费");
+       TRAIN_FEE_TYPE.put("6005","火车票退票");
+       TRAIN_FEE_TYPE.put("6007","火车票预订服务费");
+       TRAIN_FEE_TYPE.put("6008","火车票改签服务费");
+       TRAIN_FEE_TYPE.put("6009","火车票预订退款");
+       TRAIN_FEE_TYPE.put("6010","火车票改签退款");
+       TRAIN_FEE_TYPE.put("6101","火车票抢票加速包");
+       TRAIN_FEE_TYPE.put("6011","火车票票据服务费");
+       TRAIN_FEE_TYPE.put("6012","火车票技术服务费");
+       TRAIN_FEE_TYPE.put("6013","火车票票据服务费退款");
+       TRAIN_FEE_TYPE.put("6014","火车票线下退改退款");
+    }
+    @Override
+    public void saleUpdateProject(String formInstId) {
+//        log.info("流程id:{}",formInstId);
+        Map formData = ydClient.queryData(YDParam.builder().formInstanceId(formInstId).build(),
+                YDConf.FORM_QUERY.retrieve_id).getFormData();
+        String contractCode = formData.get("textField_llew0vlc").toString();
+        String contractName = formData.get("textareaField_lq0s1gcw").toString();
+        String contractAmount = formData.get("numberField_llew0vlx_value").toString();
+        String projectCode = formData.get("textField_ltpbh04c").toString();
+        if (!projectCode.isEmpty() && ObjectUtil.isNotNull(projectCode)){
+            List<Map<String, Object>> dataList = (List<Map<String, Object>>)ydClient.queryData(YDParam.builder().formUuid(projectFormUUID)
+                            .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_llemcq7d", projectCode))).build(),
+                    YDConf.FORM_QUERY.retrieve_search_form).getData();
+
+            List<Map<String,Object>> association = new ArrayList<>();
+            Map<String, Object> map = UtilMap.map("appType, formType, formUuid, instanceId, subTitle, title", "APP_UNSAR4O4Y7NBDUYXLIP4", "process", saleFormUUID, formInstId, contractCode, contractName);
+            association.add(map);
+            dataList.forEach(e->{
+                ydClient.operateData(YDParam.builder()
+                        .formInstanceId(e.get("formInstanceId").toString())
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("associationFormField_lmlq4t3o, textField_lmlq4t3p, textField_lmlq4t3q, numberField_m731di5q",association,contractName,contractCode,contractAmount)))
+                        .useLatestVersion(true)
+                        .build(), YDConf.FORM_OPERATION.update);
+            });
+        }
+    }
+
+    @Override
+    public void oaUpdateProject(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa) {
+
+        String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+//        log.info("processInstanceId:{}",processInstanceId);
+        Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        long cDate = UtilDateTime.parse(UtilMap.getString(processData, "createTime"), "yyyy-MM-dd'T'HH:mm").getTime();
+        Map formData = UtilMap.map("employeeField_ltxqs53k, departmentSelectField_lu20ayky, dateField_ltxqs53j, textField_lygnetw9", Arrays.asList(userId), Arrays.asList(processData.get("originatorDeptId")), cDate, UtilMap.getString(processData, "businessId"));
+        Optional optional = formComponentValues.stream().filter(item -> "费用出处".equals(item.get("name"))).findAny();
+        if (optional.isPresent() && (UtilMap.getString((Map) optional.get(), "value").equals("项目费用") || UtilMap.getString((Map) optional.get(), "value").equals("研发费用"))){
+            Double OATravelSum = 0.0;//OA差旅费用
+            Double OATrafficSum = 0.0;//OA交通费用
+            Double OAEntertainSum = 0.0;//OA招待费用
+            Double OAOtherSum = 0.0;//OA其他费用
+            optional = formComponentValues.stream().filter(item -> "项目编号".equals(item.get("name"))).findAny();
+            if (!optional.isPresent()){
+                return;
+            }
+            String projectCode = UtilMap.getString((Map) optional.get(), "value");
+            optional = formComponentValues.stream().filter(item -> "费用报销类型".equals(item.get("name"))).findAny();
+            String type = UtilMap.getString((Map) optional.get(), "value");
+            for (String name : compsId_main.keySet()) {
+                String compId = compsId_main.get(name);
+                // 判定是否子表 [宜搭]
+                if (compId.startsWith("tableField_")) {
+                    List<Map> details = new ArrayList<>();
+                    // 兼容明细组件, 存在多条情况 [加班跨天才有有明细]
+                    optional = formComponentValues.stream().filter(item -> compId_sub_oa.equals(item.get("name"))).findAny();
+                    if (!optional.isPresent()) {
+                        continue;
+                    }
+                    String schedule = UtilMap.getString((Map) optional.get(), "value");
+                    List<Map> itineraryList = ((List<Map>) JSON.parse(schedule));
+                    // 循环明细数据
+                    for (Map itinerary : itineraryList) {
+                        List<Map> rowValue = (List<Map>) itinerary.get("rowValue");
+                        Map rowData = new HashedMap();
+                        // 循环子表组件插入宜搭表单
+                        for (String subName : compsId_itinerary.keySet()) {
+                            if ("出发时间".equals(subName) || "返回时间".equals(subName)) {
+                                rowValue.forEach(r->{
+                                    Object label = r.get("label");
+                                    if (label instanceof  JSONArray){
+                                        Object value = r.get("value");
+                                        JSONArray jsonArray = JSONArray.parseArray(value.toString());
+                                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                                        try {
+                                            rowData.put(compsId_itinerary.get("出发时间"), sdf.parse(jsonArray.get(0).toString()).getTime());
+                                            rowData.put(compsId_itinerary.get("返回时间"), sdf.parse(jsonArray.get(1).toString()).getTime());
+                                        } catch (ParseException e) {
+//                                            log.info("字符串时间转字符串出错");
+                                        }
+                                    }
+                                });
+                            }else {
+                                //  加班单跨天 [子表label为空]
+                                try {
+                                    Object value = rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value");
+                                    rowData.put(compsId_itinerary.get(subName), value);
+                                } catch (Exception e) {
+//                                    log.info("流程版本字段差异");
+                                }
+                            }
+                        }
+                        details.add(rowData);
+                        String category = "";
+                        double amount = 0.0;
+                        if ("行程明细".equals(compId_sub_oa)){
+                            amount = Double.parseDouble(rowValue.stream().filter(item -> "合计金额(元)".equals(item.get("bizAlias")) || "合计金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
+                        }else {
+                            category = rowValue.stream().filter(item -> "报销类目".equals(item.get("bizAlias")) || "报销类目".equals(item.get("label"))).findAny().get().get("value").toString();
+                            amount =  Double.parseDouble(rowValue.stream().filter(item -> "报销金额(元)".equals(item.get("bizAlias")) || "报销金额(元)".equals(item.get("label"))).findAny().get().get("value").toString());
+                        }
+                        if ("日常费用报销".equals(type)){
+                            if ("团建费".equals(category)){
+                                OAEntertainSum = OAEntertainSum + amount;
+                            } else if ("交通费".equals(category)) {
+                                OATrafficSum = OATrafficSum + amount;
+                            }else {
+                                OAOtherSum = OAOtherSum + amount;
+                            }
+                        }else if ("差旅费报销".equals(type)){
+                            OATravelSum = OATravelSum + amount;
+                        }else if ("业务招待费报销".equals(type)){
+                            OAEntertainSum = OAEntertainSum + amount;
+                        }else if ("交通费".equals(type)){
+                            OATrafficSum = OATrafficSum + amount;
+                        }
+                    }
+                    formData.put(compId, details);
+                }
+                else {
+                    optional = formComponentValues.stream().filter(item -> name.equals(item.get("name"))).findAny();
+                    if (!optional.isPresent()){
+                        continue;
+                    }
+                    formData.put(compId,UtilMap.getString((Map) optional.get(), "value"));
+                }
+            }
+
+            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
+                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+            Double finalOATravelSum = OATravelSum;
+            Double finalOATrafficSum = OATrafficSum;
+            Double finalOAEntertainSum = OAEntertainSum;
+            Double finalOAOtherSum = OAOtherSum;
+            dataList.forEach(e->{
+                Map data = (Map) e.get("formData");
+                //差旅费用
+                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                //交通费用
+                double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                //招待费用
+                double entertainAmount = Double.parseDouble(data.get("numberField_m7473opn_value")==null||data.get("numberField_m7473opn_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opn_value").toString());
+                //其他费用
+                double otherAmount = Double.parseDouble(data.get("numberField_m7473opo_value")==null||data.get("numberField_m7473opo_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opo_value").toString());
+                //累计总成本
+                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                //预算总成本
+                double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                //累计报销费
+                double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                //累计预算报销费用
+                double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
+                travelAmount = travelAmount + finalOATravelSum;
+                trafficAmount = trafficAmount + finalOATrafficSum;
+                entertainAmount = entertainAmount + finalOAEntertainSum;
+                otherAmount = otherAmount + finalOAOtherSum;
+                totalSumAmount = totalSumAmount + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
+                totalApplyCost = totalApplyCost + finalOATravelSum + finalOATrafficSum + finalOAEntertainSum + finalOAOtherSum;
+                ydClient.operateData(YDParam.builder()
+                        .appType(APP_TYPE)
+                        .systemToken(SYSTRM_TOKEN)
+                        .formInstanceId(e.get("formInstanceId").toString())
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opi, numberField_m7473opn, numberField_m7473opo, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,trafficAmount,entertainAmount,otherAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                        .build(),YDConf.FORM_OPERATION.update);
+            });
+            // 用于审批回传
+//        List<Map> tasks = UtilMap.getList(processData, "tasks");
+//        formData.put("textField_lygvvyd9", tasks.get(0).get("taskId"));
+//        formData.put("textField_lygvvyda", tasks.get(0).get("userId"));
+            formData.put("textField_lyh4y3th", processInstanceId);
+            ydClient.operateData(YDParam.builder()
+                    .appType(APP_TYPE)
+                    .systemToken(SYSTRM_TOKEN)
+                    .formUuid(formUuid)
+                    .formDataJson(JSON.toJSONString(formData))
+                    .userId(userId)
+                    .build(), YDConf.FORM_OPERATION.create);
+        }
+    }
+
+
+    @Override
+    public void getTrainInternal(String startDate, String endDate) {
+        String token = getBusinessTravelToken();
+        if (ObjectUtil.isNotNull(token)){
+            Map<String, Object> param = UtilMap.map("app_key, so_corp_token, page_no, page_size, period_start, period_end", BUS_kEY, token, 1, 100, startDate, endDate);
+            String url = "https://btripopen.alibtrip.com/api/train/v1/bill-settlement?";
+            List<Object> results = getResult(url, param);
+            if (ObjectUtil.isNotNull(results) && results.size()>0){
+                results.forEach(r->{
+                    JSONObject result = JSONObject.parseObject(r.toString());
+                    if (ObjectUtil.isNotNull(result)){
+                        if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
+                            String projectCode = result.get("project_code").toString();
+
+                            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
+                                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                            Double amount = result.get("ticket_corp_pay_price") == null || result.get("ticket_corp_pay_price").toString().isEmpty()?0.0:Double.parseDouble(result.get("ticket_corp_pay_price").toString());
+                            dataList.forEach(e->{
+                                Map data = (Map) e.get("formData");
+                                //差旅费用
+                                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                                //交通费用
+//                            double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                                //累计总成本
+                                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                                //预算总成本
+                                double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                                //累计报销费
+                                double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                                //累计预算报销费用
+                                double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
+                                travelAmount = travelAmount + amount;
+                                totalSumAmount = totalSumAmount + amount;
+                                totalApplyCost = totalApplyCost + amount;
+                                ydClient.operateData(YDParam.builder()
+                                        .appType(APP_TYPE)
+                                        .systemToken(SYSTRM_TOKEN)
+                                        .formInstanceId(e.get("formInstanceId").toString())
+                                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                                        .build(),YDConf.FORM_OPERATION.update);
+                            });
+                        }
+                        HashMap<String, Object> formData = new HashMap<>();
+                        try {
+                            formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
+                            formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
+                            formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
+                            formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
+                            formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
+                            formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
+                            formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
+                            formData.put("textField_m9jm4pj5",TRAIN_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
+                            formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//发车日期
+                            formData.put("textField_m9jm4piu",result.get("dept_time"));//发车时间
+                            formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
+                            formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
+                            formData.put("textField_m9jm4pj2",result.get("dep_city_name"));//出发城市
+                            formData.put("textField_m9jm4pj3",result.get("arr_city_name"));//到达城市
+                            formData.put("textField_m9jm4pj4",result.get("seat_type"));//坐席
+                            formData.put("numberField_m9jm4pjb",result.get("ticket_corp_pay_price"));//企业支付金额
+                            formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
+                            formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
+                            formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
+                            formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
+                            formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        ydClient.operateData(YDParam.builder()
+                                .appType(APP_TYPE)
+                                .systemToken(SYSTRM_TOKEN)
+                                .formUuid(trainUUID)
+                                .formDataJson(JSON.toJSONString(formData))
+                                .build(), YDConf.FORM_OPERATION.create);
+                    }
+                });
+            }
+        }
+    }
+
+    @Override
+    public void getAirInternal(String startDate, String endDate) {
+        String token = getBusinessTravelToken();
+        if (ObjectUtil.isNotNull(token)){
+            Map<String, Object> param = UtilMap.map("app_key, so_corp_token, page_no, page_size, period_start, period_end", BUS_kEY, token, 1, 100, startDate, endDate);
+            String url = "https://btripopen.alibtrip.com/api/flight/v1/bill-settlement?";
+            List<Object> results = getResult(url, param);
+            if (ObjectUtil.isNotNull(results) && results.size()>0){
+                results.forEach(r->{
+                    JSONObject result = JSONObject.parseObject(r.toString());
+                    if (ObjectUtil.isNotNull(result)){
+                        if (ObjectUtil.isNotNull(result.get("project_code")) && !result.get("project_code").toString().isEmpty()){
+                            String projectCode = result.get("project_code").toString();
+
+                            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-25910D3D9DA6455C9234BEC1C08687FD0OZK")
+                                    .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_llemcq7d",projectCode))).build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                            Double amount = result.get("corp_settle_price") == null || result.get("corp_settle_price").toString().isEmpty()?0.0:Double.parseDouble(result.get("corp_settle_price").toString());
+                            dataList.forEach(e->{
+                                Map data = (Map) e.get("formData");
+                                //差旅费用
+                                double travelAmount = Double.parseDouble(data.get("numberField_m7473oph_value")==null||data.get("numberField_m7473oph_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473oph_value").toString());
+                                //交通费用
+//                            double trafficAmount = Double.parseDouble(data.get("numberField_m7473opi_value")==null||data.get("numberField_m7473opi_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opi_value").toString());
+                                //累计总成本
+                                double totalSumAmount = Double.parseDouble(data.get("numberField_m7473opq_value")==null||data.get("numberField_m7473opq_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7473opq_value").toString());
+                                //预算总成本
+                                double totalBudgetedCost = Double.parseDouble(data.get("numberField_m732y3r0_value")==null||data.get("numberField_m732y3r0_value").toString().isEmpty() ? "0.0" : data.get("numberField_m732y3r0_value").toString());
+                                //累计报销费
+                                double totalApplyCost = Double.parseDouble(data.get("numberField_m7wyydmc_value")==null||data.get("numberField_m7wyydmc_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmc_value").toString());
+                                //累计预算报销费用
+                                double totalBudgetedApply = Double.parseDouble(data.get("numberField_m7wyydmd_value")==null||data.get("numberField_m7wyydmd_value").toString().isEmpty() ? "0.0" : data.get("numberField_m7wyydmd_value").toString());
+                                travelAmount = travelAmount + amount;
+                                totalSumAmount = totalSumAmount + amount;
+                                totalApplyCost = totalApplyCost + amount;
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(APP_TYPE)
+                                    .systemToken(SYSTRM_TOKEN)
+                                    .formInstanceId(e.get("formInstanceId").toString())
+                                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("numberField_m7473oph, numberField_m7473opq, numberField_m7473oqm, numberField_m7wyydmc, numberField_m7473oqi",travelAmount,totalSumAmount,totalSumAmount/totalBudgetedCost*100,totalApplyCost,totalApplyCost/totalBudgetedApply*100)))
+                                    .build(),YDConf.FORM_OPERATION.update);
+
+                            });
+                        }
+                        HashMap<String, Object> formData = new HashMap<>();
+                        try {
+                            formData.put("dateField_m9jm4pia",simpleDateFormat.parse(result.get("book_time").toString()).getTime());//预定时间
+                            formData.put("textField_m9jm4pib",result.get("booker_name"));//预定人
+                            formData.put("textField_m9jm4pic",result.get("traveler_name"));//出行人
+                            formData.put("textField_m9jm4pid",result.get("cascade_department"));//联级部门
+                            formData.put("textField_m9jm4pik",result.get("cost_center"));//成本中心名称
+                            formData.put("textField_m9jm4pil",result.get("project_name"));//项目名称
+                            formData.put("textField_m9jm4pim",result.get("project_code"));//项目编码
+                            formData.put("textField_m9jrbcig",result.get("capital_direction"));//资金方向
+                            formData.put("dateField_m9jm4pit",simpleDateFormat.parse(result.get("dept_date") + " 00:00:00").getTime());//起飞日期
+                            formData.put("textField_m9jm4piu",result.get("dept_time"));//起飞时间
+                            formData.put("dateField_m9jm4piv",simpleDateFormat.parse(result.get("arr_date") + " 00:00:00").getTime());//到达日期
+                            formData.put("textField_m9jm4piw",result.get("arr_time"));//到达时间
+                            formData.put("textField_m9jm4pj2",result.get("dept_city"));//起飞城市
+                            formData.put("textField_m9jm4pj3",result.get("arr_city"));//到达城市
+                            formData.put("textField_m9jm4pj4",result.get("cabin_class"));//舱等
+                            formData.put("textField_m9jm4pj5",AIR_FEE_TYPE.get(result.get("fee_type").toString()));//费用类型
+                            formData.put("numberField_m9jm4pjb",result.get("corp_pay_order_fee"));//订单金额
+                            formData.put("numberField_m9jrbcih",result.get("settlement_fee"));//结算金额
+                            formData.put("numberField_m9jrbcii",result.get("corp_settle_price"));//企业支付金额
+                            formData.put("numberField_m9jrbcio",result.get("person_settle_price"));//个人支付金额
+                            formData.put("numberField_m9jrbciq",result.get("refund_fee"));//退票手续费
+                            formData.put("numberField_m9jrbcir",result.get("refund_upgrade_cost"));//改签退票手续费
+                            formData.put("textField_m9jrbcit",result.get("discount"));//折扣率
+                            formData.put("numberField_m9jrbciz",result.get("advance_day"));//提前预定天数
+                            formData.put("textareaField_m9jm4pjf",result.get("business_trip_result"));//出差事由
+                            formData.put("textareaField_m9jm4pjh",result.get("refund_reason"));//退订原因
+                            formData.put("textareaField_m9jm4pjg",result.get("change_result"));//改签原因
+                            formData.put("textareaField_m9jm4pjn",result.get("exceed_reason"));//超标原因
+                            formData.put("textareaField_m9jm4pjo",result.get("remark"));//备注
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        ydClient.operateData(YDParam.builder()
+                                .appType(APP_TYPE)
+                                .systemToken(SYSTRM_TOKEN)
+                                .formUuid(airUUID)
+                                .formDataJson(JSON.toJSONString(formData))
+                                .build(), YDConf.FORM_OPERATION.create);
+                    }
+                });
+            }
+        }
+    }
+
+    //获取阿里商旅访问token
+    public static String getBusinessTravelToken(){
+        String result = HttpUtils.httpGet("https://btripopen.alibtrip.com/api/btrip-open-auth/v1/corp-token/action/take?app_key=pqm6bkfs0800&type=0&corp_id=open12pqm6bkfju87v16348dd896bc361558&app_secret=cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o");
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        if (ObjectUtil.isNotNull(jsonObject) && Boolean.parseBoolean(jsonObject.get("success").toString())){
+            Object module = jsonObject.get("module");
+            jsonObject = JSONObject.parseObject(module.toString());
+            return jsonObject.get("token").toString();
+        }
+        return null;
+    }
+    //根据token和分页获取所有数据
+    public static List<Object> getResult(String url,Map<String,Object> param){
+        int pageSize = 100;
+        if (param.containsKey("page_size")){
+            pageSize = Integer.parseInt(param.get("page_size").toString());
+        }
+        Map<String, Object> getTotalMap = new HashMap<>(param);
+        getTotalMap.put("page_no",1);
+        getTotalMap.put("page_size",1);
+        JSONObject jsonObject = toRequest(url, getTotalMap);
+        if (ObjectUtil.isNotNull(jsonObject)){
+            List<Object> objects = new ArrayList<>();
+            int totalNum = Integer.parseInt(jsonObject.get("total_num").toString());
+            int totalPages = (int) Math.ceil(totalNum / pageSize) + 1;
+            for (int i = 1; i <= totalPages; i++) {
+                param.put("page_no",i);
+                JSONObject result = toRequest(url, param);
+                List<Object> dataList = (List<Object>) result.get("data_list");
+                objects.addAll(dataList);
+            }
+            return objects;
+        }
+        return null;
+    }
+    //获取module里的数据
+    @SneakyThrows
+    public static JSONObject toRequest(String url, Map<String,Object> param){
+        final String[] redirectUrl = {url};
+        param.forEach((k,v)->{
+            redirectUrl[0] = redirectUrl[0] + k + "=" + v + "&";
+        });
+        if (redirectUrl[0].endsWith("&")){
+            redirectUrl[0] = redirectUrl[0].substring(0,redirectUrl[0].length()-1);
+        }
+        String result = HttpUtils.httpGet(redirectUrl[0]);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        boolean success = Boolean.parseBoolean(jsonObject.get("success").toString());
+        while (!success){
+            result = HttpUtils.httpGet(redirectUrl[0]);
+            jsonObject = JSONObject.parseObject(result);
+            success = Boolean.parseBoolean(jsonObject.get("success").toString());
+            Thread.sleep(1000);
+        }
+        if (ObjectUtil.isNotNull(jsonObject) && success){
+            Object module = jsonObject.get("module");
+            jsonObject = JSONObject.parseObject(module.toString());
+            return jsonObject;
+        }
+        return null;
+    }
+}

+ 285 - 0
mjava-pake/src/main/java/com/malk/pake/utils/HttpUtils.java

@@ -0,0 +1,285 @@
+package com.malk.pake.utils;
+
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.HttpConnectionFactory;
+import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
+import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
+import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
+import org.apache.http.util.EntityUtils;
+
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http请求封装
+ *
+ * @author lh
+ * @date 2022-09-23
+ */
+@Slf4j
+public class HttpUtils {
+
+    /**
+     * 默认请求类型
+     */
+    private static final String DEFAULT_CONTENT_TYPE = "application/json";
+
+    /**
+     * 默认编码
+     */
+    private static final String DEFAULT_ENCODING = "utf-8";
+
+    /**
+     * GBK编码
+     */
+    private static final String GBK_ENCODING = "GBK";
+
+    /**
+     * 默认超时时间
+     */
+    private static final int DEFAULT_TIME_OUT = 60;
+
+    private static PoolingHttpClientConnectionManager manager = null;
+
+    private static CloseableHttpClient httpClient = null;
+
+    /**
+     * 获取httpclient对象
+     *
+     * @return
+     */
+    public static synchronized CloseableHttpClient getHttpClient(int timeOut) {
+        if (null == httpClient) {
+            log.info("============================================创建");
+            // 注册访问协议相关的socket工厂
+            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+                    .register("http", PlainConnectionSocketFactory.INSTANCE)
+                    .register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
+                    .build();
+
+            // httpConnection工厂
+            HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory =
+                    new ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE
+                            , DefaultHttpResponseParserFactory.INSTANCE);
+
+            // DNS解析器
+            DnsResolver dnsResolver = SystemDefaultDnsResolver.INSTANCE;
+            // 创建池化连接管理器
+            manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, connectionFactory, dnsResolver);
+            // socket配置
+            SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
+            manager.setDefaultSocketConfig(socketConfig);
+            // 连接池最大连接数
+            manager.setMaxTotal(300);
+            manager.setDefaultMaxPerRoute(200);
+            // 5s检测一次连接池连接
+            manager.setValidateAfterInactivity(5 * 1000);
+            // 默认请求配置
+            RequestConfig requestConfig = RequestConfig.custom()
+                    // 连接超时时间
+                    .setConnectTimeout(timeOut * 1000)
+                    // 等待数据超时时间
+                    .setSocketTimeout(timeOut * 1000)
+                    // 从连接池获取连接超时时间
+                    .setConnectionRequestTimeout(timeOut * 1000)
+                    .build();
+            // 创建httpclient
+            httpClient = HttpClients.custom()
+                    .setConnectionManager(manager)
+                    // 连接池不共享
+                    .setConnectionManagerShared(false)
+                    // 定期回收空闲连接
+                    .evictIdleConnections(timeOut, TimeUnit.SECONDS)
+                    // 定期回收过期连接
+                    .evictExpiredConnections()
+                    .setConnectionTimeToLive(timeOut, TimeUnit.SECONDS)
+                    // 设置默认请求
+                    .setDefaultRequestConfig(requestConfig)
+                    // 连接重用策略
+                    .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
+                    // 长连接配置
+                    .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
+                    // 设置重试次数
+                    .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
+                    .build();
+
+            // jvm停止或重启时,关闭连接池释放连接
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+
+                @Override
+                public void run() {
+                    try {
+                        if (null != httpClient) {
+                            httpClient.close();
+                        }
+                    } catch (Exception e) {
+                        log.error("httpclient关闭异常:{}", e);
+                    }
+                }
+            });
+        }
+        return httpClient;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPost(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @param headers
+     * @param timeOut 超时时间
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params, Map<String, String> headers, int timeOut) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}", JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(timeOut);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers) {
+            for (String key : headers.keySet()) {
+                httpPost.setHeader(key, headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @return
+     */
+    public static String httpGet(String url) {
+        log.info("请求url:{}", url);
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpGet httpGet = new HttpGet(url);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpGet);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+}
+

+ 4 - 1
mjava-pake/src/main/resources/application-dev.yml

@@ -27,4 +27,7 @@ dingtalk:
 # aliwork
 aliwork:
   appType: APP_UNSAR4O4Y7NBDUYXLIP4
-  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+alibusinesstravel:
+  appKey: pqm6bkfs0800
+  appSecret: cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o

+ 8 - 5
mjava-pake/src/main/resources/application-prod.yml

@@ -4,10 +4,10 @@ server:
     context-path: /pake
 spring:
   datasource:
-      url: jdbc:mysql://47.97.181.40:3306/dingtalk?serverTimezone=GMT%2B8
-      username: root
-      password: cp-root@2022++
-      driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.97.181.40:3306/dingtalk?serverTimezone=GMT%2B8
+    username: root
+    password: cp-root@2022++
+    driver-class-name: com.mysql.cj.jdbc.Driver
 enable:
   scheduling: true
 logging:
@@ -27,4 +27,7 @@ dingtalk:
 # aliwork
 aliwork:
   appType: APP_UNSAR4O4Y7NBDUYXLIP4
-  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+  systemToken: HP666C71JQMCDBUHBETIS992J3SW3XKUKBCKL53
+alibusinesstravel:
+  appKey: pqm6bkfs0800
+  appSecret: cHFtNmJrZnMwODAwXS1ceXpINzUsazUkVT1tejohZ1o

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

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

+ 0 - 790
mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/RsQysServiceImpl.java

@@ -1,790 +0,0 @@
-package com.malk.ruisi.service.impl;
-
-import cn.hutool.core.io.FileUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.malk.ruisi.service.QysService;
-import com.malk.ruisi.service.RsQysService;
-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.service.aliwork.YDClient;
-import com.malk.utils.UtilMap;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.tomcat.util.http.fileupload.FileUtils;
-import org.apache.tomcat.util.http.fileupload.IOUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import static com.malk.ruisi.constant.QysConstant.QYS_SUCCESS_CODE;
-
-@Service
-@Slf4j
-public class RsQysServiceImpl implements RsQysService {
-    @Autowired
-    private QysService qysService;
-    @Autowired
-    private YDClient ydClient;
-    @Autowired
-    private YDConf ydConf;
-    @Autowired
-    private DDConf ddConf;
-    @Value("${qiyuesuo.bdurl}")
-    private String BDURL;
-    @Value("${qiyuesuo.pdfbdurl}")
-    private String PDFBDURL;
-    @Value("${qiyuesuo.url}")
-    private String URL;
-    private String getCust(String type, String key) throws Exception {
-        Map<String, String> map = UtilMap.empty();
-        if (type.equals("FORM-55D56A69CCCE4043A01660C8910E33BAQ4N0")) {
-            // 合同用印 组件编号
-            map.put("subject", "textField_ltsbwegw");//合同名称
-            map.put("sn", "serialNumberField_ltsbweh2");//合同编号
-            map.put("tenantName", "textField_lvz1kozf");//公司名称
-            map.put("categoryId", "textField_lvm5xmqe");//业务分类Id
-            map.put("contractId", "textField_lwah8x72");//合同Id
-            map.put("categoryName", "textField_lvz1kozg");//业务分类名称
-            map.put("fujian", "attachmentField_ltsbweir");//附件
-            map.put("creatorName", "employeeField_ltsbwefl");//创建人姓名
-            map.put("applyerNumber", "textField_lwebkb16");//创建人员工编号
-            map.put("sealName", "textField_lvw4umfr");//授权印章名称
-            map.put("count", "numberField_ltwa0vj6");//授权次数
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("tenantNameP", "textField_ltwa0vke");//对方个人签署人姓名
-            map.put("contactP", "textField_ltwa0vkf");//对方个人签署人联系电话
-            map.put("tenantNameA", "textField_ltwa0vk0");//对方公司名称
-            map.put("receiverNameA", "textField_ltwa0vk1");//对方公司签署人名称
-            map.put("contactA", "textField_ltwa0vk2");//对方公司签署人联系电话
-        } else if (type.equals("FORM-5DB656AF0F0E4EFA85A4739D55C23ED85BXO")) {
-            // 框架类用印
-            map.put("subject", "textField_lvz8coad");//合同名称
-            map.put("sn", "serialNumberField_lvz8coae");//合同编号
-            map.put("tenantName", "textField_lvza5uwu");//公司名称
-            map.put("categoryId", "textField_lvz8cobe");//业务分类Id
-            map.put("contractId", "textField_lwg205ug");//合同Id
-            map.put("categoryName", "textField_lvz8cobd");//业务分类名称
-            map.put("fujian", "attachmentField_lvz8cocl");//附件
-            map.put("creatorName", "employeeField_lvz8co98");//创建人姓名
-            map.put("applyerNumber", "textField_lweccz0q");//创建人员工编号
-            map.put("sealName", "textField_lwelg27e");//授权印章名称
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("count", "numberField_lvz8cobz");//授权次数
-            map.put("tenantNameP", "textField_lvz8cocg");//对方个人签署人姓名
-            map.put("contactP", "textField_lvz8coce");//对方个人签署人联系电话
-            map.put("tenantNameA", "textField_lvz8coc5");//对方公司名称
-            map.put("receiverNameA", "textField_lvz8coc6");//对方公司签署人名称
-            map.put("contactA", "textField_lvz8coc7");//对方公司签署人联系电话
-
-        } else if (type.equals("FORM-B27C1AE7298648F29E836B5FDF469DBDPFCK")) {
-            // 其他用印
-            map.put("subject", "textField_ltwktalv");//合同名称
-            map.put("sn", "serialNumberField_ltwktal5");//合同编号
-            map.put("tenantName", "textField_lvz45lif");//公司名称
-            map.put("categoryId", "textField_lvz45lii");//业务分类Id
-            map.put("contractId", "textField_lwg1z6hk");//合同Id
-            map.put("applyerNumber", "textField_lwelap55");//创建人员工编号
-            map.put("sealName", "textField_lx1gzqai");//授权印章名称
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("count", "numberField_ltwktalp");//授权次数
-            map.put("categoryName", "textField_lvz45lih");//业务分类名称
-            map.put("fujian", "attachmentField_ltwktamq");//附件
-//            map.put("creatorName", "employeeField_ltwktal6");//创建人姓名
-//            map.put("creatorContact", "textField_ltsbwef1");//创建人联系方式
-//            map.put("receiverNameP", "textField_ltwa0vke");//对方个人签署人姓名
-//            map.put("contactP", "textField_ltwa0vkf");//对方个人签署人联系电话
-//            map.put("tenantNameA", "textField_ltwa0vk0");//对方公司名称
-//            map.put("receiverNameA", "textField_ltwa0vk1");//对方公司签署人名称
-//            map.put("contactA", "textField_ltwa0vk2");//对方公司签署人联系电话
-        } else if (type.equals("FORM-FCDDD18FD63E49B2A4C652FBDB1874F6DPHW")) {
-            // 租赁类用印 组件编号
-            map.put("subject", "textField_ltwcj54k");//合同名称
-            map.put("sn", "serialNumberField_ltwcj54l");//合同编号
-            map.put("tenantName", "textField_lvz3j6lq");//公司名称
-            map.put("categoryId", "textField_lvz3j6ls");//业务分类Id
-            map.put("contractId", "textField_lwg1wbix");//合同Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("categoryName", "textField_ltwe0wyb");//业务分类名称
-            map.put("fujian", "attachmentField_ltwe0wyz");//附件
-            map.put("creatorName", "employeeField_ltwcj52j");//创建人姓名
-            map.put("applyerNumber", "textField_lwel4lyq");//创建人员工编号
-//            map.put("creatorContact", "textField_ltsbwef1");//创建人联系方式
-            map.put("tenantNameP", "textField_ltwe0wyw");//对方个人签署人姓名
-            map.put("contactP", "textField_ltwe0wyx");//对方个人签署人联系电话
-            map.put("tenantNameA", "textField_ltwe0wyq");//对方公司名称
-            map.put("receiverNameA", "textField_ltwe0wyr");//对方公司签署人名称
-            map.put("contactA", "textField_ltwe0wys");//对方公司签署人联系电话
-//        } else if (type.equals("FORM-53A0FB8715FB4378B0708794DFAF7089SV8P")) {
-//            // 加盟签约
-//            map.put("subject", "textField_ltsbwegw");//合同名称
-//            map.put("sn", "serialNumberField_ltsbweh2");//合同编号
-//            map.put("tenantName", "textField_lvz1kozf");//公司名称
-//            map.put("categoryId", "textField_lvm5xmqe");//业务分类Id
-//            map.put("fujian", "attachmentField_ltsbweir");//附件
-//            map.put("creatorName", "employeeField_ltsbwefl");//创建人姓名
-//            map.put("creatorContact", "textField_ltsbwef1");//创建人联系方式
-//            map.put("receiverNameP", "textField_ltwa0vke");//对方个人签署人姓名
-//            map.put("contactP", "textField_ltwa0vkf");//对方个人签署人联系电话
-//            map.put("tenantNameA", "textField_ltwa0vk0");//对方公司名称
-//            map.put("receiverNameA", "textField_ltwa0vk1");//对方公司签署人名称
-//            map.put("contactA", "textField_ltwa0vk2");//对方公司签署人联系电话
-        } else if (type.equals("FORM-88F968E75CC340EB91B1AC692F4184DC9I9W")) {
-            // 合同/申购流程
-            map.put("subject", "textField_lu7ycpub");//合同名称
-            map.put("sn", "serialNumberField_lu7ycpuc");//合同编号
-            map.put("tenantName", "textField_lw05x5rk");//公司名称
-            map.put("categoryId", "textField_lw05x5rm");//业务分类Id
-            map.put("contractId", "textField_lwg219kl");//合同Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("categoryName", "textField_lwa2350q");//业务分类名称
-            map.put("fujian", "attachmentField_lu81zomp");//附件
-            map.put("applyerNumber", "textField_lwelmmkr");//创建人员工编号
-            map.put("sealName", "textField_lwelmmks");//授权印章名称
-            map.put("count", "numberField_lual6ol8");//授权次数
-//            map.put("creatorName", "employeeField_ltsbwefl");//创建人姓名
-//            map.put("creatorContact", "textField_ltsbwef1");//创建人联系方式
-            map.put("tenantNameP", "textField_lu81zome");//对方个人签署人姓名
-            map.put("contactP", "textField_lu81zomf");//对方个人签署人联系电话
-            map.put("tenantNameA", "textField_lu81zomd");//对方公司名称
-            map.put("receiverNameA", "textField_lu81zome");//对方公司签署人名称
-            map.put("contactA", "textField_lu81zomf");//对方公司签署人联系电话
-
-        } else if (type.equals("FORM-54972289A0B7416287A9BA44DA6CCDC50QUC")) {
-            // HR用印
-            map.put("subject", "textField_lu9euh7n");//合同名称
-            map.put("sn", "serialNumberField_lu9euh7o");//合同编号
-            map.put("tenantName", "textField_lvzz59hk");//公司名称
-            map.put("categoryId", "textField_lvzz59hn");//业务分类Id
-            map.put("contractId", "textField_lwg22nvj");//合同Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("categoryName", "textField_lvzz59hm");//业务分类名称
-            map.put("applyerNumber", "textField_lweezm68");//创建人员工编号
-            map.put("sealName", "textField_lweezm69");//授权印章名称
-            map.put("count", "numberField_lu9euh8c");//授权次数
-            map.put("fujian", "attachmentField_lu9euh8d");//附件
-        } else if (type.equals("FORM-0D501EF1688247DC932E7784298BD46BRYHC")) {
-            // 新签劳动合同/协议
-            map.put("subject", "textField_luauhgb4");//合同名称
-            map.put("sn", "serialNumberField_luauhgb5");//合同编号
-            map.put("tenantName", "textField_lw4rpz1w");//公司名称
-            map.put("categoryId", "textField_lw4rpz1x");//业务分类Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("jf", "textField_lwk0stof");//甲方名称
-            map.put("txdz", "textField_lup3q6ke");//甲方通讯地址
-            map.put("yf", "textField_lup3q6kf");//乙方
-            map.put("sjhm", "textField_lup3q6kg");//乙方手机号码
-            map.put("syqksrq", "dateField_lup3q6kv");//试用期开始日期
-            map.put("syqjsrq", "dateField_lup3q6kw");//试用期结束日期
-            map.put("ldhtksrq", "dateField_lup3q6kx");//劳动合同开始日期
-            map.put("ldhtjsrq", "dateField_lup3q6ky");//劳动合同结束日期
-            map.put("gzdd", "textField_lup3q6kk");//工作地点
-            map.put("yftgfw", "textField_lup3q6kh");//乙方提供服务
-            map.put("xchsgz", "selectField_lup3q6ki");//薪酬核算规则
-            map.put("dyzmtbc", "numberField_lup3q6kj");//报酬金额
-            map.put("dyzarksrq", "dateField_lup3q6kl");//开始日期
-            map.put("dyzarjsrq", "dateField_lup3q6km");//结束日期
-            map.put("contractId", "textField_lwg241g6");//合同Id
-            map.put("categoryName", "textField_lwa1xm1p");//业务分类名称
-            map.put("tenantNameP", "textField_lup3q6kf");//对方个人签署人姓名
-            map.put("contactP", "textField_lup3q6kg");//对方个人签署人联系电话
-        } else if (type.equals("FORM-3E04D5456B2341CCBA62C955B791CF45IAH1")) {
-            // 发文审批用印
-            map.put("subject", "textField_ltwmutnp");//合同名称
-            map.put("sn", "serialNumberField_ltwmutno");//合同编号
-            map.put("tenantName", "textField_lw044nmp");//公司名称
-            map.put("categoryId", "textField_lw044nmr");//业务分类Id
-            map.put("contractId", "textField_lwg251gn");//合同Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("categoryName", "textField_ltwmutoc");//业务分类名称
-            map.put("applyerNumber", "textField_lweluap2");//创建人员工编号
-            map.put("sealName", "textField_lweluap3");//授权印章名称
-            map.put("count", "numberField_ltwmutow");//授权次数
-            map.put("fujian", "attachmentField_ltwmutq4");//附件
-        } else if (type.equals("FORM-87BD065161F84560B999FE94713255E20E6E")) {
-            //印章授权&承诺书
-            map.put("subject", "textField_ltwp3e43");//合同名称
-            map.put("sn", "serialNumberField_ltwp3e44");//合同编号
-            map.put("tenantName", "textField_lw04hhp1");//公司名称
-            map.put("categoryId", "textField_lw04hhp3");//业务分类Id
-            map.put("contractId", "textField_lwg260n6");//合同Id
-            map.put("mobile", "textField_lwzqvg93");//授权人手机号
-            map.put("categoryName", "textField_lwa29saw");//业务分类名称
-            map.put("fujian", "attachmentField_ltwp3e4g");//附件
-            map.put("tenantNameP", "textField_lw93mjk9");//授权人姓名
-            map.put("contactP", "textField_ltwp3e4d");//授权人联系电话
-            map.put("tenantNameA", "textField_lw93mjka");//被授权人姓名
-            map.put("contactA", "textField_ltwp3e4f");//被授权人联系电话
-        } else {
-            throw new Exception();
-        }
-        return map.get(key);
-    }
-
-
-    @Override
-    public McR createByFile(JSONObject param) throws Exception {
-        String formInstanceId = param.getString("formInstanceId");
-        String type = param.getString("type");
-        log.info("formInstanceId:{}", formInstanceId);
-        log.info("type:{}", type);
-        //根据实例ID获取表单数据
-        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
-                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
-                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-        log.info("data:{}", data);
-        //把文件下载到本地路径 ,并获取到文档ID
-        List<String> documentId = new ArrayList<>();
-        if (!type.equals("FORM-0D501EF1688247DC932E7784298BD46BRYHC")) {
-            documentId = createbyfile(data, type);
-        }
-        //定义参数  创建合同草稿
-        JSONObject obj = new JSONObject();
-//        obj.put("subject",data.get("textField_ltsbwef0"));//合同名称
-        obj.put("subject", data.get(getCust(type, "subject")).toString());//合同名称
-//        obj.put("sn",data.get("serialNumberField_ltsbweh2"));//合同编号流水号
-        obj.put("sn", data.get(getCust(type, "sn")));//合同编号流水号
-        obj.put("tenantName", data.get(getCust(type, "tenantName")));//发起方公司名称
-        obj.put("categoryId", data.get(getCust(type, "categoryId")));//业务分类Id   data.get("textField_lvm5xmqe")
-        if (!type.equals("FORM-0D501EF1688247DC932E7784298BD46BRYHC")) {
-            if (documentId != null) {
-                obj.put("documents", documentId);//文档ID
-            }
-        }
-        List<Map<String, Object>> params1 = new ArrayList<>();
-        List<Map<String, Object>> params2 = new ArrayList<>();
-        if (type.equals("FORM-0D501EF1688247DC932E7784298BD46BRYHC")) {
-            JSONObject jf = new JSONObject();
-            jf.put("name", "jf");
-            jf.put("value", data.get(getCust(type, "jf")));//甲方名称
-            JSONObject txdz = new JSONObject();
-            txdz.put("name", "txdz");
-            txdz.put("value", data.get(getCust(type, "txdz")));//甲方通讯地址
-            JSONObject yf = new JSONObject();
-            yf.put("name", "yf");
-            yf.put("value", data.get(getCust(type, "yf")));//乙方
-            JSONObject sjhm = new JSONObject();
-            sjhm.put("name", "sjhm");
-            sjhm.put("value", data.get(getCust(type, "sjhm")));//乙方手机号码
-            JSONObject syqksrq = new JSONObject();
-            long timestamp = (long) data.get(getCust(type, "syqksrq"));
-            // 创建 SimpleDateFormat 对象来定义输出日期的格式
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-            // 将时间戳转换为 Date 对象
-            Date date = new Date(timestamp);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate = sdf.format(date);
-            syqksrq.put("name", "syqksrq");
-            syqksrq.put("value", formattedDate);//试用期开始日期
-            JSONObject syqjsrq = new JSONObject();
-            long timestamp1 = (long) data.get(getCust(type, "syqjsrq"));
-            // 将时间戳转换为 Date 对象
-            Date date1 = new Date(timestamp1);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate1 = sdf.format(date1);
-            syqjsrq.put("name", "syqjsrq");
-            syqjsrq.put("value", formattedDate1);//试用期结束日期
-            JSONObject ldhtksrq = new JSONObject();
-            long timestamp2 = (long) data.get(getCust(type, "syqksrq"));
-            // 将时间戳转换为 Date 对象
-            Date date2 = new Date(timestamp2);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate2 = sdf.format(date2);
-            ldhtksrq.put("name", "ldhtksrq");
-            ldhtksrq.put("value", formattedDate2);//劳动合同开始日期
-            JSONObject ldhtjsrq = new JSONObject();
-            long timestamp3 = (long) data.get(getCust(type, "ldhtjsrq"));
-            // 将时间戳转换为 Date 对象
-            Date date3 = new Date(timestamp3);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate3 = sdf.format(date3);
-            ldhtjsrq.put("name", "ldhtjsrq");
-            ldhtjsrq.put("value", formattedDate3);//劳动合同结束日期
-            JSONObject gzdd = new JSONObject();
-            gzdd.put("name", "gzdd");
-            gzdd.put("value", data.get(getCust(type, "gzdd")));//工作地点
-            JSONObject yftgfw = new JSONObject();
-            yftgfw.put("name", "yftgfw");
-            yftgfw.put("value", data.get(getCust(type, "yftgfw")));//乙方提供服务
-            JSONObject xchsgz = new JSONObject();
-            xchsgz.put("name", "xchsgz");
-            xchsgz.put("value", data.get(getCust(type, "xchsgz")));//薪酬核算规则
-            JSONObject dyzmtbc = new JSONObject();
-            dyzmtbc.put("name", "dyzmtbc");
-            dyzmtbc.put("value", data.get(getCust(type, "dyzmtbc")));//报酬金额
-            JSONObject dyzarksrq = new JSONObject();
-            long timestamp4 = (long) data.get(getCust(type, "syqjsrq"));
-            // 将时间戳转换为 Date 对象
-            Date date4 = new Date(timestamp4);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate4 = sdf.format(date4);
-            dyzarksrq.put("name", "dyzarksrq");
-            dyzarksrq.put("value", formattedDate4);//开始日期
-            JSONObject dyzarjsrq = new JSONObject();
-            long timestamp5 = (long) data.get(getCust(type, "syqjsrq"));
-            // 将时间戳转换为 Date 对象
-            Date date5 = new Date(timestamp5);
-            // 使用 SimpleDateFormat 格式化 Date 对象为所需的日期格式
-            String formattedDate5 = sdf.format(date5);
-            dyzarjsrq.put("name", "dyzarjsrq");
-            dyzarjsrq.put("value", formattedDate5);//结束日期
-            params1.add(jf);
-            params1.add(txdz);
-            params1.add(yf);
-            params1.add(sjhm);
-            params1.add(syqksrq);
-            params1.add(syqjsrq);
-            params1.add(ldhtksrq);
-            params1.add(ldhtjsrq);
-            params1.add(gzdd);
-            params2.add(jf);
-            params2.add(txdz);
-            params2.add(yf);
-            params2.add(sjhm);
-            params2.add(yftgfw);
-            params2.add(xchsgz);
-            params2.add(dyzmtbc);
-            params2.add(dyzarksrq);
-            params2.add(dyzarjsrq);
-        }
-        String categoryName = data.get(getCust(type, "categoryName")).toString();
-        if (categoryName.equals("劳动合同") || categoryName.equals("校区劳动合同")
-        ) {
-            obj.put("send", true);
-            obj.put("documentParams", params1);
-        } else if (categoryName.equals("校区劳务协议") || categoryName.equals("劳务协议")) {
-            obj.put("send", true);
-            obj.put("documentParams", params2);
-        } else {
-            obj.put("send", false);// 是否发起合同;发起合同后不能再进行添加文档、指定签署位置等操作
-        }
-        //签署人数据
-        JSONArray array = new JSONArray();
-        JSONArray array1 = new JSONArray();
-
-        if (categoryName.equals("多方电子用印(个人)(我方先签)") ||
-                categoryName.equals("我方电子对方物理(个人)(我方先签)")) {
-            array.add(getCompASignatory());
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameP")).toString(), data.get(getCust(type, "contactP")).toString()));
-        } else if (categoryName.equals("我方电子对方物理(企业)(我方先签)") ||
-                categoryName.equals("多方电子用印(企业)(我方先签)")) {
-            array.add(getCompASignatory());
-            array.add(getCompSignatory(data.get(getCust(type, "tenantNameA")).toString(), data.get(getCust(type, "contactA")).toString(), data.get(getCust(type, "receiverNameA")).toString()));
-        } else if (categoryName.equals("我方电子对方物理(企业&个人)(我方先签)") ||
-                categoryName.equals("多方电子用印(企业&个人)(我方先签)")) {
-            array.add(getCompASignatory());
-            array.add(getCompSignatory(data.get(getCust(type, "tenantNameA")).toString(), data.get(getCust(type, "contactA")).toString(), data.get(getCust(type, "receiverNameA")).toString()));
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameP")).toString(), data.get(getCust(type, "contactP")).toString()));
-        } else if (categoryName.equals("我方电子对方物理(个人)") ||
-                categoryName.equals("多方电子用印(个人)(对方先签)") ||
-                categoryName.equals("劳动合同") ||
-                categoryName.equals("校区劳务协议") ||
-                categoryName.equals("校区劳动合同") ||
-                categoryName.equals("劳务协议") ||
-                categoryName.equals("续签(固定几年)") ||
-                categoryName.equals("续签(无固定期限)") ||
-                categoryName.equals("续签(员工合同到期公司不再与员工续签)") ||
-                categoryName.equals("续签(员工合同到期员工本人不愿意与公司续签时签订)") ||
-                categoryName.equals("解除劳动合同")
-        ) {
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameP")).toString(), data.get(getCust(type, "contactP")).toString()));
-            array.add(getCompASignatory());
-        } else if (categoryName.equals("我方电子对方物理(企业)") ||
-                categoryName.equals("多方电子用印(企业)(对方先签)")) {
-            array.add(getCompSignatory(data.get(getCust(type, "tenantNameA")).toString(), data.get(getCust(type, "contactA")).toString(), data.get(getCust(type, "receiverNameA")).toString()));
-            array.add(getCompASignatory());
-        } else if (categoryName.equals("我方电子对方物理(企业&个人)") ||
-                categoryName.equals("多方电子用印(企业&个人)(对方先签)")) {
-            array.add(getCompSignatory(data.get(getCust(type, "tenantNameA")).toString(), data.get(getCust(type, "contactA")).toString(), data.get(getCust(type, "receiverNameA")).toString()));
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameP")).toString(), data.get(getCust(type, "contactP")).toString()));
-            array.add(getCompASignatory());
-        } else if (categoryName.equals("内部企业单签") ||
-                categoryName.equals("默认业务分类")) {
-            array.add(getCompASignatory());
-        } else if (categoryName.equals("印章保管授权&承诺书")) {
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameP")).toString(), data.get(getCust(type, "contactP")).toString()));
-            array.add(getPeopSignatory(data.get(getCust(type, "tenantNameA")).toString(), data.get(getCust(type, "contactA")).toString()));
-        } else if (categoryName.equals("物理用印外带场景") ||
-                categoryName.equals("物理用印公司用印场景")) {
-            array1.add(getAuths(data.get(getCust(type, "sealName")).toString(), data.get(getCust(type, "count")).toString()));
-        }
-        //把所有参数传到obj中
-        if (categoryName.equals("物理用印外带场景") ||
-                categoryName.equals("物理用印公司用印场景")) {
-            obj.put("applyerNumber", data.get(getCust(type, "applyerNumber")));
-            obj.put("auths", array1);
-        } else {
-            obj.put("signatories", array);
-        }
-        System.out.println("obj:{}" + obj);
-        try {
-            if (categoryName.equals("物理用印外带场景") ||
-                    categoryName.equals("物理用印公司用印场景")) {
-                qysService.createseal(obj);
-            } else {
-                //1.调用创建合同草稿方法
-                JSONObject draft = qysService.createDraft(obj);
-                System.out.println(draft);
-                if (draft != null) {
-                    String contractId = draft.getString("contractId");
-                    if (contractId != "") {
-                        //发起合同
-                        System.out.println("contractId" + contractId);
-//                    //合同id 写入宜搭
-                        String sc = getCust(type, "sn");//合同id字段
-                        String sc_values = data.get(getCust(type, "sn")).toString();//合同id字段的值
-                        String fd = getCust(type, "contractId");//字段名称
-                        ydClient.operateData(YDParam.builder()
-                                .formUuid(type)
-                                .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, sc_values)))
-                                .formDataJson(JSONObject.toJSONString(UtilMap.map(fd, contractId)))
-                                .build(), YDConf.FORM_OPERATION.upsert).toString();
-                        qysService.send(contractId, data.get(getCust(type, "tenantName")).toString());
-//                  FileUtil.file("C:\\Users\\Administrator\\Desktop\\合同.pdf");
-//                        System.out.println("send:" + send);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return McR.success("success");
-    }
-
-    @Override
-    public McR callback(Map<String, String> param) throws Exception {
-        String sn = param.get("sn");
-        String contractId = param.get("contractId");
-        String status = param.get("status");
-        log.info("sn:{}", sn);
-        log.info("contractId:{}", contractId);
-        if (status.equals("SIGNED")) {
-            qysService.download(contractId, new File(BDURL + sn + ".zip"));
-        }
-        List<String> unzippedFiles = new ArrayList<>();
-        String zipFilePath = BDURL + sn + ".zip";
-        String destDirectory = PDFBDURL + sn;
-        try {
-            File destDir = new File(destDirectory);
-            if (!destDir.exists()) {
-                destDir.mkdir();
-            }
-            byte[] buffer = new byte[1024];
-            ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
-            ZipEntry entry = zipIn.getNextEntry();
-            while (entry != null) {
-                String filePath = destDirectory + File.separator + entry.getName();
-                if (!entry.isDirectory()) {
-                    new File(filePath).getParentFile().mkdirs();
-                    FileOutputStream fos = new FileOutputStream(filePath);
-                    int len;
-                    while ((len = zipIn.read(buffer)) > 0) {
-                        fos.write(buffer, 0, len);
-                    }
-                    fos.close();
-                    unzippedFiles.add(filePath);
-                }
-                zipIn.closeEntry();
-                entry = zipIn.getNextEntry();
-            }
-            zipIn.close();
-            System.out.println("ZIP 文件解压完成。");
-        } catch (Exception e) {
-            System.out.println("发生异常: " + e.getMessage());
-            e.printStackTrace();
-        }
-        List list = new ArrayList();
-        for (String unzippedFile : unzippedFiles) {
-            Map map = new HashMap();
-            String fileName = FileUtil.getName(unzippedFile);
-            map.put("downloadUrl", URL + sn + "/" + fileName);
-            map.put("name", fileName);
-            map.put("previewUrl", map.get("downloadUrl"));
-            map.put("url", map.get("downloadUrl"));
-            map.put("ext", FileUtil.extName(unzippedFile));
-            list.add(map);
-        }
-        log.info("list:{}", list);
-        //查询宜搭底表数据
-        String[] sns = sn.split("-");
-        Map<String, String> formUuid = getFormUuid(sns[0]);
-        List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder().formUuid(formUuid.get("type")).searchCondition(
-                JSONObject.toJSONString(UtilMap.map(formUuid.get("sn"), sn))
-        ).build(), YDConf.FORM_QUERY.retrieve_list).getData();
-        Map map = list1.get(0);
-        String instanceId = (String) map.get("formInstanceId");
-        ydClient.operateData(YDParam.builder()
-                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
-                .userId(ddConf.getOperator()).formInstId(instanceId)
-                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("attachmentField_ltsbweit", list)))
-                .build(), YDConf.FORM_OPERATION.update);
-        return null;
-    }
-
-    @Override
-    public McR appointurl(String contractId) throws Exception {
-        try {
-            log.info("获取预签署地址 {}",contractId);
-            JSONObject urlR=qysService.appointurl(contractId);
-            String presignUrl = urlR.getString("presignUrl");
-            if(!QYS_SUCCESS_CODE.equals(urlR.getString("code"))){
-                return McR.error(urlR.getString("code"),urlR.getString("message"));
-            }else{
-                return McR.success(presignUrl);
-            }
-        } catch (Exception e) {
-            return McR.error("401","获取失败");
-        }
-    }
-
-
-//    @Override
-//    public McR sendContract(String contractId,String tenantName) throws Exception {
-//        JSONObject send = qysService.send(contractId, tenantName);
-//        return McR.success(send);
-//    }
-
-    @Override
-    public McR apply(JSONObject param) throws Exception {
-        String formInstanceId = param.getString("formInstanceId");
-        String type = param.getString("type");
-        log.info("formInstanceId:{}", formInstanceId);
-        log.info("type:{}", type);
-        //根据实例ID获取表单数据
-        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
-                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-        log.info("data:{}", data);
-        JSONObject obj = new JSONObject();
-        JSONObject obj1 = new JSONObject();
-        JSONObject obj2 = new JSONObject();
-        JSONArray arr = new JSONArray();
-        JSONArray arr1 = new JSONArray();
-        obj2.put("mobile", data.get(getCust(type, "mobile")));
-        arr1.add(obj2);
-        obj1.put("sealName", data.get(getCust(type, "sealName")));
-        obj1.put("count", data.get(getCust(type, "count")));
-        obj1.put("users", arr1);
-        arr.add(obj1);
-        obj.put("subject", data.get(getCust(type, "subject")).toString());//合同名称
-        obj.put("tenantName", data.get(getCust(type, "tenantName")));//发起方公司名称
-        obj.put("applyerNumber", data.get(getCust(type, "applyerNumber")));//发起员工编号
-//        obj.put("applyerNumber", "722");//发起员工编号
-        obj.put("auths", arr);
-        JSONObject code = qysService.applyseals(obj);
-        JSONObject json = code.getJSONObject("result");
-        JSONArray sealAuthsArray = json.getJSONArray("sealAuths");
-// 检查数组是否非空且至少有一个元素
-        String vertifyCode;
-        if (sealAuthsArray != null && !sealAuthsArray.isEmpty()) {
-            JSONObject firstSealAuth = sealAuthsArray.getJSONObject(0);
-            vertifyCode = firstSealAuth.getString("vertifyCode");
-        } else {
-            vertifyCode = "物理授权码不存在";
-        }
-        // 返回结果
-        return McR.success(vertifyCode);
-    }
-
-    @Override
-    public McR signurl(JSONObject param) throws Exception {
-        String formInstanceId = param.getString("formInstanceId");
-        String type = param.getString("type");
-        log.info("formInstanceId:{}", formInstanceId);
-        log.info("type:{}", type);
-        //根据实例ID获取表单数据
-        Map data = (Map) ydClient.queryData(YDParam.builder().formInstId(formInstanceId)
-                .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
-                .userId(ddConf.getOperator()).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-        log.info("data:{}", data);
-//        String categoryName = data.get(getCust(type, "categoryName")).toString();
-        JSONObject signatory = new JSONObject();
-        signatory.put("tenantType", "COMPANY");
-        signatory.put("tenantName", data.get(getCust(type, "tenantName")));
-        signatory.put("contractId", data.get(getCust(type, "contractId")));
-        JSONObject urlR = qysService.signurla(signatory);
-        String signUrl = urlR.getString("signUrl");
-        System.out.println("aaa---------------"+signUrl);
-        System.out.println(urlR);
-        if(!QYS_SUCCESS_CODE.equals(urlR.getString("code"))){
-            return McR.error(urlR.getString("code"),urlR.getString("message"));
-        }else{
-            return McR.success(signUrl);
-        }
-    }
-    private Map<String, String> getFormUuid(String type) {
-        Map<String, String> map = UtilMap.empty();
-        switch (type) {
-            case "HT01"://合同
-                map.put("type", "FORM-55D56A69CCCE4043A01660C8910E33BAQ4N0");
-                map.put("sn", "serialNumberField_ltsbweh2");
-                break;
-            case "HT02"://框架
-                map.put("type", "FORM-5DB656AF0F0E4EFA85A4739D55C23ED85BXO");
-                map.put("sn", "serialNumberField_lvz8coae");
-                break;
-            case "HT03"://租赁
-                map.put("type", "FORM-FCDDD18FD63E49B2A4C652FBDB1874F6DPHW");
-                map.put("sn", "serialNumberField_ltwcj54l");
-                break;
-            case "XZ04"://其他
-                map.put("type", "FORM-B27C1AE7298648F29E836B5FDF469DBDPFCK");
-                map.put("sn", "serialNumberField_ltwktal5");
-                break;
-            case "HTSG"://合同/申购
-                map.put("type", "FORM-88F968E75CC340EB91B1AC692F4184DC9I9W");
-                map.put("sn", "serialNumberField_lu7ycpuc");
-                break;
-            case "HR03"://hr用印
-                map.put("type", "FORM-54972289A0B7416287A9BA44DA6CCDC50QUC");
-                map.put("sn", "serialNumberField_lu9euh7o");
-                break;
-            case "HR18"://新签劳动合同/协议
-                map.put("type", "FORM-0D501EF1688247DC932E7784298BD46BRYHC");
-                map.put("sn", "serialNumberField_luauhgb5");
-                break;
-            case "XZ05"://发文审批
-                map.put("type", "FORM-3E04D5456B2341CCBA62C955B791CF45IAH1");
-                map.put("sn", "serialNumberField_ltwmutno");
-                break;
-            case "XZ08"://印章授权
-                map.put("type", "FORM-87BD065161F84560B999FE94713255E20E6E");
-                map.put("sn", "serialNumberField_ltwp3e44");
-                break;
-        }
-        return map;
-    }
-
-    /***
-     * 获取对方公司签署对象
-     * @param name
-     * @return
-     */
-    private Map getCompSignatory(String name, String contact, String receiverName) {
-        JSONObject signatory = new JSONObject();
-        signatory.put("tenantType", "COMPANY");
-        signatory.put("tenantName", name);//对方(物理)名称
-        signatory.put("contact", contact);
-        signatory.put("receiverName", receiverName);
-        return signatory;
-    }
-    private Map getPeosignurl(String contractId, String name, String contact) {
-        JSONObject signurl = new JSONObject();
-        signurl.put("tenantType", "PERSONAL");
-        signurl.put("tenantName", name);
-        signurl.put("contractId", contractId);
-        signurl.put("contact", contact);
-        return signurl;
-    }
-    private Map getComsignurl(String contractId, String name) {
-        JSONObject signatory = new JSONObject();
-        signatory.put("tenantType", "COMPANY");
-        signatory.put("tenantName", name);
-        signatory.put("contractId", contractId);
-        return signatory;
-    }
-    //获取物理印章信息
-    private Map getAuths(String name, String count) {
-        JSONObject auths = new JSONObject();
-        auths.put("sealName", name);//印章名称
-        auths.put("count", count);//授权数量
-        return auths;
-    }
-
-    /***
-     * 获取我方公司签署对象
-     * @param
-     * @return
-     */
-    private Map getCompASignatory() {
-        JSONObject signatory = new JSONObject();
-        signatory.put("tenantType", "COMPANY");
-        return signatory;
-    }
-
-    /***
-     * 获取个人签署对象
-     * @param name
-     * @return
-     */
-    private Map getPeopSignatory(String name, String contact) {
-        JSONObject signatory = new JSONObject();
-        signatory.put("tenantType", "PERSONAL");
-        signatory.put("contact", contact);
-        signatory.put("tenantName", name);//对方(个人)名称
-        return signatory;
-    }
-
-    //根据附件创建合同文档得到文档Id
-    public List<String> createbyfile(Map data, String type) throws Exception {
-//        String jsonString = data.get("attachmentField_ltsbweir").toString();
-        String jsonString = data.get(getCust(type, "fujian")).toString();
-        JSONArray jsonArray = JSONObject.parseArray(jsonString);
-        List<String> resultList = new ArrayList<>();
-        if (jsonArray != null) {
-            for (int i = 0; i < jsonArray.size(); i++) {
-                // 将元素转换为JSONObject
-                JSONObject jsonObj = jsonArray.getJSONObject(i);
-                String fj_url = ydClient.convertTemporaryUrl(jsonObj.getString("url"));
-                String fj_name = jsonObj.getString("name");
-                String localFilePath = "/home/file/" + fj_name;
-                //下载文件到本地
-                RsQysServiceImpl.downloadFile1(fj_url, localFilePath);
-                Map<String, Object> data1 = new HashMap<>();
-                data1.put("file", FileUtil.file("/home/file/" + fj_name));
-                data1.put("title", FileUtil.mainName(fj_name));
-                data1.put("fileType", FileUtil.extName(fj_name));// 获取文件格式(通过文件名)
-                try {
-                    log.info("2. 根据文件类型创建合同文档");
-                    JSONObject draft = qysService.createbyfile(data1);
-                    if (draft != null) {
-                        resultList.add(draft.getJSONObject("result").getString("documentId"));
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-        return resultList;
-    }
-
-
-    public static void downloadFile1(String downloadUrl, String path) {
-        InputStream inputStream = null;
-        OutputStream outputStream = null;
-        try {
-            URL url = new URL(downloadUrl);
-            //这里没有使用 封装后的ResponseEntity 就是也是因为这里不适合一次性的拿到结果,放不下content,会造成内存溢出
-            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-            //使用bufferedInputStream 缓存流的方式来获取下载文件,不然大文件会出现内存溢出的情况
-            inputStream = new BufferedInputStream(connection.getInputStream());
-            File file = new File(path);
-            if (file.exists()) {
-                file.delete();
-            }
-            // 创建目录和父文件夹
-            FileUtils.forceMkdirParent(file);
-            outputStream = new FileOutputStream(file);
-            //这里也很关键每次读取的大小为5M 不一次性读取完
-            byte[] buffer = new byte[1024 * 1024 * 5];// 5MB
-            int len = 0;
-            while ((len = inputStream.read(buffer)) != -1) {
-                outputStream.write(buffer, 0, len);
-            }
-            connection.disconnect();
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            IOUtils.closeQuietly(outputStream);
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-}

+ 1 - 1
mjava-yiyao/pom.xml

@@ -42,7 +42,7 @@
     </dependencies>
 
     <build>
-        <finalName>boyang</finalName>
+        <finalName>yiyao</finalName>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

+ 102 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/controller/CallBackController.java

@@ -0,0 +1,102 @@
+package com.malk.yiyao.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.controller.DDCallbackController;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.crypto.DingCallbackCrypto;
+import com.malk.service.dingtalk.DDClient_Event;
+import com.malk.yiyao.service.YiyaoService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@Component
+@RequestMapping("/aa")
+public class CallBackController extends DDCallbackController {
+    @Autowired
+    private DDConf ddConf;
+
+    @Autowired
+    private DDClient_Event ddClient_event;
+
+    @Autowired
+    private YiyaoService yiyaoService;
+
+    /**
+     * 钉钉审批回调: [依赖包方案已弃用]
+     * -
+     * DingCallbackCrypto 方案: 官网案例 DingCallbackCrypto 不在钉钉架包, 需要单独引用
+     * 在钉钉开放平台重新保存回调地址后, 所有的注册事件会被关闭:: 通过代码注册不成功; 官方回复, 要么使用调用注册的方式 要么是后台的方式, 二选一
+     */
+    @SneakyThrows
+    public Map<String, String> invokeCallback(@RequestParam(value = "signature", required = false) String signature,
+                                              @RequestParam(value = "timestamp", required = false) String timestamp,
+                                              @RequestParam(value = "nonce", required = false) String nonce,
+                                              @RequestBody(required = false) JSONObject json) {
+        log.info("signature:{}",signature);
+        log.info("timestamp:{}",timestamp);
+        log.info("nonce:{}",nonce);
+        log.info("json:{}",json);
+
+        DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(ddConf.getToken(), ddConf.getAesKey(), ddConf.getAppKey());
+        final String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, json.getString("encrypt"));
+        JSONObject eventJson = JSON.parseObject(decryptMsg);
+        Map success = callbackCrypto.getEncryptedMap(DDConf.CALLBACK_RESPONSE, System.currentTimeMillis(), DingCallbackCrypto.Utils.getRandomStr(8));
+
+        String eventType = eventJson.getString("EventType");
+        if (DDConf.CALLBACK_CHECK.equals(eventType)) {
+            log.info("----- [DD]验证注册 -----");
+            return success;
+        }
+        if ("check_in".equals(eventType)) {
+            String eventId = eventJson.getString("eventId");//事件id
+
+            log.info("[DD]签到回调, {}", eventJson);
+
+            // 检查回调事件是否已经处理过,如果是,则忽略该回调
+            if (isCallbackProcessed(eventId)) {
+                log.info("----- [DD]该签到回调事件已处理过 忽略该回调 -----");
+                return success;
+            }else {
+                // 将回调事件和当前时间戳添加到已处理集合中
+                long currentTime = System.currentTimeMillis();
+                eventList.put(eventId, currentTime);
+            }
+
+            yiyaoService.getCheckInData(eventJson);
+
+            return success;
+        }
+        log.info("----- [DD]已注册, 未处理的其它回调 -----, {}", eventJson);
+        return success;
+    }
+
+    //保存10s内已处理的回调事件
+    private Map<String, Long> eventList = new HashMap<>();
+
+    /**
+     * 检查该回调事件在10s内是否处理过,应对钉钉瞬间重复回调
+     *
+     * @param eventId 回调事件id
+     * @return 是否处理过
+     */
+    private boolean isCallbackProcessed(String eventId) {
+        // 清理超过10s的回调事件
+        long currentTime = System.currentTimeMillis();
+        long expirationTime = currentTime - TimeUnit.MINUTES.toMillis(10);
+        eventList.entrySet().removeIf(entry -> entry.getValue() < expirationTime);
+
+        return eventList.containsKey(eventId);
+    }
+
+}

+ 5 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java

@@ -1,5 +1,6 @@
 package com.malk.yiyao.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.malk.server.common.McR;
 
 public interface YiyaoService {
@@ -20,4 +21,8 @@ public interface YiyaoService {
     McR updateYiyao8();
 
     McR updateYiyao9();
+
+    McR updateYiyao10();
+
+    void getCheckInData(JSONObject eventJson);
 }

+ 197 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java

@@ -1,6 +1,7 @@
 package com.malk.yiyao.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.IORuntimeException;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.server.aliwork.YDConf;
@@ -18,6 +19,8 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.net.UnknownHostException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1471,6 +1474,189 @@ public class YiyaoServiceImpl implements YiyaoService {
         return McR.success();
     }
 
+    //更新交付项目日报最终用户文本
+    @Override
+    public McR updateYiyao10() {
+        List<Map> a = new ArrayList<>();
+        Map map = new HashMap();
+        map.put("key","createTime");
+        map.put("value","1751299200000");
+        map.put("type","DOUBLE");
+        map.put("operator","gt");
+        map.put("componentName","DateField");
+        a.add(map);
+
+//        long beginTime = System.currentTimeMillis();
+
+        //查询所有日报档案
+//        List<Map> dataList = getYdDataList("FORM-F772E0DBE98340F690C2412B0A168EB4AG9H", JSONObject.toJSONString(a), YDConf.FORM_QUERY.retrieve_list_all);
+//        List<Map> dataList = getYdDataList("FORM-F772E0DBE98340F690C2412B0A168EB4AG9H", "", YDConf.FORM_QUERY.retrieve_list_all);
+
+        DDR_New ddrNew2 = new DDR_New();
+        int pageNumber = 1;
+        int pageSize = 100;
+        do {
+            ddrNew2 = ydClient.queryData(YDParam.builder().formUuid("FORM-F772E0DBE98340F690C2412B0A168EB4AG9H")
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize)
+                    .searchCondition(JSONObject.toJSONString(a))
+                    .build(), YDConf.FORM_QUERY.retrieve_list_all);
+
+            List<Map> dataList = (List<Map>) ddrNew2.getData();
+
+            int i = (pageNumber - 1) * pageSize + 1;
+
+            for (Map data : dataList) {
+                Map formData = (Map) data.get("formData");
+                String formInstId = data.get("formInstanceId").toString();
+
+                Map updateFormData = new HashMap();
+
+                //质保期、过保期等已交付无维保合同客户
+                List<Map> list2 = UtilMap.getList(formData, "tableField_lz0mdudy");
+                //维保内容
+                List<Map> list3 = UtilMap.getList(formData, "tableField_ltnynz04");
+
+                boolean flag1 = false;
+                boolean flag2 = false;
+
+                for (Map map1 : list2) {
+                    //移除其他键防止数据被重置
+                    map1.keySet().removeIf(key -> !key.equals("associationFormField_lxwns03h_id"));
+
+                    if (Objects.nonNull(map1.get("associationFormField_lxwns03h_id"))){
+                        String jsonString = map1.get("associationFormField_lxwns03h_id").toString();
+                        String jsonString2 = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));
+                        List<Map> customer =(List<Map>) JSONArray.parse(jsonString2);
+
+                        if (!customer.isEmpty()){
+                            map1.put("selectField_lz0mdudz",customer.get(0).get("title").toString());
+                            flag1 = true;
+                        }
+                    }
+                }
+                if (flag1){
+                    updateFormData.put("tableField_lz0mdudy",list2);
+                }
+
+
+                for (Map map1 : list3) {
+                    //移除其他键防止数据被重置
+                    map1.keySet().removeIf(key -> !key.equals("associationFormField_m9v6h9fj_id"));
+
+                    if (Objects.nonNull(map1.get("associationFormField_m9v6h9fj_id"))){
+                        String jsonString = map1.get("associationFormField_m9v6h9fj_id").toString();
+                        String jsonString2 = StringEscapeUtils.unescapeJava(jsonString.substring(1, jsonString.length() - 1));
+                        List<Map> customer =(List<Map>) JSONArray.parse(jsonString2);
+
+                        if (!customer.isEmpty()){
+                            map1.put("selectField_lyz73etd",customer.get(0).get("title").toString());
+                            flag2 = true;
+                        }
+                    }
+
+                }
+                if (flag2){
+                    updateFormData.put("tableField_ltnynz04",list3);
+                }
+
+
+                if (!updateFormData.keySet().isEmpty()){
+                    ydClient.operateData(YDParam.builder()
+                            .formInstId(formInstId)
+                            .updateFormDataJson(JSONObject.toJSONString(updateFormData))
+                            .useLatestVersion(true)
+                            .build(), YDConf.FORM_OPERATION.update);
+
+                    log.info("第{}条更新完成,实例id:{}",i,formInstId);
+                }else {
+                    log.info("第{}条无需更新,实例id:{}",i,formInstId);
+                }
+
+                i++;
+            }
+
+
+
+            pageNumber++;
+        }while (ddrNew2.getTotalCount() > ddrNew2.getPageNumber() * pageSize);
+
+        /*long endTime = System.currentTimeMillis();
+        double time = (endTime - beginTime) / 1000.0;
+
+        log.info("查询所有数据耗时:{}秒", time);*/
+
+
+        return McR.success();
+    }
+
+    @Override
+    public void getCheckInData(JSONObject eventJson) {
+        int retryCount = 0;
+        int maxRetries = 5;
+
+        long timeStamp = roundToNearestThousand(Long.parseLong(eventJson.getString("timeStamp")));//签到时间戳
+        String staffId = eventJson.getString("StaffId");//签到人userId
+        String eventId = eventJson.getString("eventId");//签到事件id
+
+        while (retryCount <= maxRetries) {
+            try {
+                //获取签到数据
+                Map body = new HashMap();
+                body.put("cursor",0);
+                body.put("size",100);
+                body.put("start_time",timeStamp);
+                body.put("end_time",timeStamp);
+                body.put("userid_list",staffId);
+
+                //查询用户详情
+                DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", staffId), DDR_New.class);
+                Map result1 = (Map) ddrNew1.getResult();
+                String userName = UtilMap.getString(result1, "name");
+
+                //查询用户考勤数据
+                DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/checkin/record/get", null, ddClient.initTokenParams(), body, DDR_New.class);
+                Map result = (Map) ddrNew.getResult();
+                List list = UtilMap.getList(result, "page_list");
+
+                if (!list.isEmpty()){
+                    Map formData = new HashMap();
+                    Map checkInData = (Map) list.get(0);
+                    Long checkinTime = UtilMap.getLong(checkInData, "checkin_time");
+                    String detailPlace = UtilMap.getString(checkInData, "detail_place");
+                    String remark = UtilMap.getString(checkInData,"remark");
+                    formData.put("employeeField_mbypt8ro",Arrays.asList(staffId));//签到人
+                    formData.put("textField_mbyq1cji",userName);//签到人-文本
+                    formData.put("dateField_mbrb3qfy",checkinTime);//签到时间
+                    formData.put("textField_mbrb3qfx",detailPlace);//签到地点
+                    formData.put("textareaField_mbypt8rp",remark);//备注
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+                    String formattedDate = sdf.format(timeStamp);
+                    formData.put("textField_mbrbdyl4","签到人:" +userName + ",签到时间:" + formattedDate + ",签到地点:" + detailPlace);//标题
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-D4389CDAD1704F959E9D38CB64927AD8PKCH")
+                            .formDataJson(JSONObject.toJSONString(formData))
+                            .build(),YDConf.FORM_OPERATION.create);
+                }
+
+                break;
+            } catch (Exception e) {
+                if (retryCount < maxRetries){
+                    retryCount++;
+                    log.info("eventId:{},第{}次重试,异常信息:{}",eventId, retryCount, e.getMessage());
+                    try {
+                        Thread.sleep(5000);
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt();// 如果线程在等待期间被中断,恢复中断状态
+                        throw new RuntimeException("Request interrupted", ie);// 抛出运行时异常,终止重试
+                    }
+                    continue;
+                }
+                throw new RuntimeException("eventId:" + eventId + ",超出最大重试次数,异常信息:" + e.getMessage());
+            }
+        }
+    }
+
 
     private List<Map> getYdDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
         List<Map> list = new ArrayList<>();
@@ -1488,4 +1674,15 @@ public class YiyaoServiceImpl implements YiyaoService {
         }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
         return list;
     }
+
+    public long roundToNearestThousand(long timestamp) {
+        // 将时间戳除以1000,得到秒级部分(带毫秒的小数部分)
+        double seconds = timestamp / 1000.0;
+
+        // 对秒级部分的个位数进行四舍五入(即对毫秒的千位四舍五入)
+        long roundedSeconds = Math.round(seconds);
+
+        // 将四舍五入后的秒级部分转换回毫秒时间戳
+        return roundedSeconds * 1000;
+    }
 }

+ 6 - 6
mjava-yiyao/src/main/resources/application-dev.yml

@@ -13,12 +13,12 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 2691784047
-  appKey: dinghbynhnd2dbgypmsa
-  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
-  corpId: dingcc1b1ffad0d5ca1d
-  aesKey:
-  token:
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
   appType: APP_HJJ3X3QN4WEWDHU2BJR2

+ 8 - 9
mjava-yiyao/src/main/resources/application-prod.yml

@@ -13,15 +13,14 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 3749205961
-  appKey: dingdcxnvojhmwi1lau0
-  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
-  corpId:
-  aesKey:
-  token:
-  operator: 344749020127590108
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
-  appType: APP_TTZS5KICGVVQNZ3RS8T4
-  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+  appType: APP_HJJ3X3QN4WEWDHU2BJR2
+  systemToken: 7X866C81QPIHJKBFFM1QW4S8BV1U3U4MFO5RLY1
 

+ 22 - 0
mjava-yiyao/src/test/java/com/malk/yiyao/YiyaoTest.java

@@ -1,5 +1,6 @@
 package com.malk.yiyao;
 
+import com.alibaba.fastjson.JSONObject;
 import com.malk.yiyao.service.YiyaoService;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
@@ -61,4 +62,25 @@ public class YiyaoTest {
         yiyaoService.updateYiyao9();
     }
 
+    @Test
+    public void test10() {
+        yiyaoService.updateYiyao10();
+    }
+
+    @Test
+    public void test11() {
+        JSONObject json = new JSONObject();
+        json.put("timeStamp", 1752738143151L);
+        json.put("eventId","7a5a1a4b42724fceb799205f4363bebd");
+        json.put("CorpId","dingf11f7d6ff834577b");
+        json.put("StaffId","694148202226282223");
+        json.put("EventType","check_in");
+        json.put("EventTime",1752738143151L);
+        json.put("BizId","c3152e9b-793a-4a34-b7a5-86448aba1566");
+        json.put("staffId","694148202226282223");
+        json.put("TimeStamp", 1752738143151L);
+
+        yiyaoService.getCheckInData(json);
+    }
+
 }