Selaa lähdekoodia

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

lfx 11 kuukautta sitten
vanhempi
commit
72b1c5f8c2
56 muutettua tiedostoa jossa 3208 lisäystä ja 15 poistoa
  1. 78 0
      mjava-jiangshi/pom.xml
  2. 19 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/JiangshiApplication.java
  3. 42 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/controller/JiangshiController.java
  4. 33 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/entity/Product.java
  5. 9 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/mapper/ProductMapper.java
  6. 14 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/service/JiangshiService.java
  7. 44 0
      mjava-jiangshi/src/main/java/com/malk/jiangshi/service/impl/JiangshiServiceImpl.java
  8. 59 0
      mjava-jiangshi/src/main/resources/application-dev.yml
  9. 49 0
      mjava-jiangshi/src/main/resources/application-prod.yml
  10. 15 0
      mjava-jiangshi/src/main/resources/application.yml
  11. 61 0
      mjava-jiangshi/src/main/resources/logback-spring.xml
  12. 8 0
      mjava-jiangshi/src/main/resources/mapper/ProductMapper.xml
  13. 88 0
      mjava-lingmingguangzi/pom.xml
  14. 17 0
      mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/LingmingguangziApplication.java
  15. 31 0
      mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/controller/LingmingguangziController.java
  16. 20 0
      mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/service/LingmingguangziService.java
  17. 104 0
      mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/service/LingmingguangziServiceImpl.java
  18. 60 0
      mjava-lingmingguangzi/src/main/resources/application-dev.yml
  19. 60 0
      mjava-lingmingguangzi/src/main/resources/application-prod.yml
  20. 15 0
      mjava-lingmingguangzi/src/main/resources/application.yml
  21. 61 0
      mjava-lingmingguangzi/src/main/resources/logback-spring.xml
  22. 18 0
      mjava-mc/src/main/java/com/malk/mc/entity/PocTbWeekly.java
  23. 11 0
      mjava-mc/src/main/java/com/malk/mc/event/McTbEventImpl.java
  24. 9 0
      mjava-mc/src/main/java/com/malk/mc/mapper/PocTbWeeklyMapper.java
  25. 11 0
      mjava-mc/src/main/java/com/malk/mc/service/McPocTbService.java
  26. 50 0
      mjava-mc/src/main/java/com/malk/mc/service/impl/McPocTbServiceImpl.java
  27. 13 3
      mjava-mc/src/test/java/com/malk/mc/PocTbTest.java
  28. 33 0
      mjava-ruisi/.gitignore
  29. 71 0
      mjava-ruisi/pom.xml
  30. 16 0
      mjava-ruisi/src/main/java/com/malk/ruisi/MjavaRuisiApplication.java
  31. 40 0
      mjava-ruisi/src/main/java/com/malk/ruisi/constant/QysConstant.java
  32. 40 0
      mjava-ruisi/src/main/java/com/malk/ruisi/controller/QysApiTestController.java
  33. 83 0
      mjava-ruisi/src/main/java/com/malk/ruisi/controller/QysHuiDaoController.java
  34. 77 0
      mjava-ruisi/src/main/java/com/malk/ruisi/controller/RsQysController.java
  35. 105 0
      mjava-ruisi/src/main/java/com/malk/ruisi/controller/ScheduleTask.java
  36. 23 0
      mjava-ruisi/src/main/java/com/malk/ruisi/entity/RsQysConfigInfo.java
  37. 18 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/QysApiService.java
  38. 30 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/QysService.java
  39. 24 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/RsQysService.java
  40. 15 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/dingshiqi.java
  41. 147 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/QysApiServiceImpl.java
  42. 92 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/QysServiceImpl.java
  43. 790 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/RsQysServiceImpl.java
  44. 318 0
      mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/dingshiqiImpl.java
  45. 38 0
      mjava-ruisi/src/main/resources/application-dev.yml
  46. 0 0
      mjava-ruisi/src/main/resources/application-prod.yml
  47. 15 0
      mjava-ruisi/src/main/resources/application.yml
  48. 61 0
      mjava-ruisi/src/main/resources/logback-spring.xml
  49. 13 0
      mjava-ruisi/src/test/java/com/malk/ruisi/MjavaRuisiApplicationTests.java
  50. 107 0
      mjava-ruisi/src/test/java/com/malk/ruisi/test.java
  51. 1 1
      mjava-shantai/src/main/java/com/malk/shantai/controller/StYkbController.java
  52. 6 0
      mjava-shantai/src/main/java/com/malk/shantai/entity/Shantai.java
  53. 26 9
      mjava-shantai/src/main/java/com/malk/shantai/service/impl/StDingProcServiceImpl.java
  54. 18 0
      mjava-shantai/src/main/resources/application-prod.yml
  55. 1 1
      mjava-shantai/src/main/resources/application.yml
  56. 1 1
      mjava-shantai/src/test/java/com/malk/shantai/DdTest.java

+ 78 - 0
mjava-jiangshi/pom.xml

@@ -0,0 +1,78 @@
+<?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.jiangshi</groupId>
+    <artifactId>mjava-jiangshi</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <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.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>jiangshi</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>

+ 19 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/JiangshiApplication.java

@@ -0,0 +1,19 @@
+package com.malk.jiangshi;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+@MapperScan("com.malk.jiangshi.mapper")
+public class JiangshiApplication {
+    public static void main(String[] args) {
+        try {
+            SpringApplication.run(JiangshiApplication.class,args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 42 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/controller/JiangshiController.java

@@ -0,0 +1,42 @@
+package com.malk.jiangshi.controller;
+
+import com.malk.jiangshi.entity.Product;
+import com.malk.jiangshi.service.JiangshiService;
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Slf4j
+public class JiangshiController {
+    @Autowired
+    private JiangshiService jiangshiService;
+
+    @GetMapping("/test")
+    public McR test() {
+        log.info("test");
+        return McR.success();
+    }
+
+
+    @PostMapping("/addProduct")
+    public McR addProduct(@RequestBody Product product) {
+        log.info("addProduct");
+        jiangshiService.addProduct(product);
+        return McR.success();
+    }
+
+    @PostMapping("/updateProduct")
+    public McR updateProduct(@RequestBody Map map) {
+        log.info("updateProduct");
+        jiangshiService.updateProduct(map);
+        return McR.success();
+    }
+}

+ 33 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/entity/Product.java

@@ -0,0 +1,33 @@
+package com.malk.jiangshi.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "jiangshi_product")
+public class Product {
+    @TableId(value = "id", type = IdType.AUTO)
+    private String id;
+
+    private String name;
+
+    private String code;
+
+    private String specification;
+
+    private String model;
+
+    private int num;
+
+    private String warningNum;
+
+    private int price;
+
+    private String company;
+
+    private String companyPhone;
+
+    private String validFlag;
+}

+ 9 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/mapper/ProductMapper.java

@@ -0,0 +1,9 @@
+package com.malk.jiangshi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.jiangshi.entity.Product;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ProductMapper extends BaseMapper<Product> {
+}

+ 14 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/service/JiangshiService.java

@@ -0,0 +1,14 @@
+package com.malk.jiangshi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.jiangshi.entity.Product;
+
+import java.util.List;
+import java.util.Map;
+
+public interface JiangshiService extends IService<Product> {
+
+    void addProduct(Product product);
+
+    void updateProduct(Map map);
+}

+ 44 - 0
mjava-jiangshi/src/main/java/com/malk/jiangshi/service/impl/JiangshiServiceImpl.java

@@ -0,0 +1,44 @@
+package com.malk.jiangshi.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.jiangshi.entity.Product;
+import com.malk.jiangshi.mapper.ProductMapper;
+import com.malk.jiangshi.service.JiangshiService;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class JiangshiServiceImpl extends ServiceImpl<ProductMapper, Product> implements JiangshiService {
+    @Autowired
+    private ProductMapper productMapper;
+
+
+    @Override
+    public void addProduct(Product product) {
+        productMapper.insert(product);
+
+    }
+
+    @Override
+    public void updateProduct(Map map) {
+        String code = String.valueOf(map.get("code"));
+        int num = Integer.parseInt(String.valueOf(map.get("num")));
+        String type = String.valueOf(map.get("type"));
+        LambdaQueryWrapper<Product> productLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        productLambdaQueryWrapper.eq(Product::getCode, code)
+                        .eq(Product::getValidFlag,"1");
+        Product product = productMapper.selectOne(productLambdaQueryWrapper);
+        if (type.equals("add")){
+            product.setNum(product.getNum()+num);
+        }else if (type.equals("sub")){
+            product.setNum(product.getNum()-num);
+        }
+
+        productMapper.updateById(product);
+    }
+}

+ 59 - 0
mjava-jiangshi/src/main/resources/application-dev.yml

@@ -0,0 +1,59 @@
+server:
+  port: 8115
+  servlet:
+    context-path: /jiangshi
+
+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
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/jiangshi/log/
+  level:
+    com.malk.*: debug
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.jiangshi.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+
+
+# dingtalk
+dingtalk:
+  agentId: 3088485347
+  appKey: dingryt7ulefpiziveoj
+  appSecret: qBdVqoK1UP9J3yN0ulaKuBmse4nrZPfNbVxjLGjaODGoRqbtws0__f3A5GpD5bLz
+  corpId: ding2c2e3f1dbf2b3ffebc961a6cb783455b
+  aesKey: uCSTfCFVU18QJjECfZTBWyC9mi10qqY1Spuqjl4ghct
+  token: Adib7WsRXHYrLGkOAUNcgl6gLY9nBIIaeprkhfmxGg6ca6atYWWKDkuE
+
+  #poc
+  #agentId: 2995824312
+  #appKey: ding3ap1jk1tg44tz3s2
+  #appSecret: PaWTDG-FiX-RW5fnV9r8CzEmR-9QlJpubC88txhprL_Z_iREO62B-iRW6w7gkA_K
+  #corpId: ding321c72787fffc78b35c2f4657eb6378f
+  #aesKey: LSIc7r5uHAP0dd6v23J3LWRmjECMNzbkIcxAwdx63RE
+  #token: yqXHMHaK4oHYvjyQshU4zFqgrHFq7PcBxVSqGo1BAQk0
+
+
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType:
+  systemToken:

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

@@ -0,0 +1,49 @@
+server:
+  port: 8115
+  servlet:
+    context-path: /jiangshi
+
+spring:
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/shantai?serverTimezone=GMT%2B8
+    username: root
+    password: ST-cloudpure2024
+    driver-class-name: com.mysql.cj.jdbc.Driver
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/jiangshi/log/
+  level:
+    com.malk.*: debug
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.jiangshi.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+
+
+# dingtalk
+dingtalk:
+  agentId: 3088485347
+  appKey: dingryt7ulefpiziveoj
+  appSecret: qBdVqoK1UP9J3yN0ulaKuBmse4nrZPfNbVxjLGjaODGoRqbtws0__f3A5GpD5bLz
+  corpId: ding2c2e3f1dbf2b3ffebc961a6cb783455b
+  aesKey: uCSTfCFVU18QJjECfZTBWyC9mi10qqY1Spuqjl4ghct
+  token: Adib7WsRXHYrLGkOAUNcgl6gLY9nBIIaeprkhfmxGg6ca6atYWWKDkuE
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType:
+  systemToken:

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

+ 61 - 0
mjava-jiangshi/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.zitoo.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 8 - 0
mjava-jiangshi/src/main/resources/mapper/ProductMapper.xml

@@ -0,0 +1,8 @@
+<?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.jiangshi.mapper.ProductMapper">
+
+
+</mapper>
+

+ 88 - 0
mjava-lingmingguangzi/pom.xml

@@ -0,0 +1,88 @@
+<?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.lingmingguangzi</groupId>
+    <artifactId>mjava-lingmingguangzi</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <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.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.32</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>lingmingguangzi</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-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/LingmingguangziApplication.java

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

+ 31 - 0
mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/controller/LingmingguangziController.java

@@ -0,0 +1,31 @@
+package com.malk.lingmingguangzi.controller;
+
+import com.malk.lingmingguangzi.service.LingmingguangziService;
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Slf4j
+public class LingmingguangziController {
+    @Autowired
+    private LingmingguangziService lingmingguangziService;
+
+    @GetMapping("/test")
+    public McR test() {
+        return lingmingguangziService.test();
+    }
+
+    //获取‘客户满意度调查-车载’不同客户数量
+    @GetMapping("/getVehicleCustomerCount")
+    public McR getVehicleCustomerCount() {
+        return lingmingguangziService.getVehicleCustomerCount();
+    }
+
+    @GetMapping("/getConsumeCustomerCount")
+    public McR getConsumeCustomerCount() {
+        return lingmingguangziService.getConsumeCustomerCount();
+    }
+}

+ 20 - 0
mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/service/LingmingguangziService.java

@@ -0,0 +1,20 @@
+package com.malk.lingmingguangzi.service;
+
+import com.malk.server.common.McR;
+
+public interface LingmingguangziService {
+    McR test();
+
+    /**
+     * 获取车载不同客户问卷数量
+     * @return
+     */
+    McR getVehicleCustomerCount();
+
+    /**
+     * 获取消费客户问卷数量
+     * @return
+     */
+    McR getConsumeCustomerCount();
+
+}

+ 104 - 0
mjava-lingmingguangzi/src/main/java/com/malk/lingmingguangzi/service/LingmingguangziServiceImpl.java

@@ -0,0 +1,104 @@
+package com.malk.lingmingguangzi.service;
+
+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.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@Slf4j
+public class LingmingguangziServiceImpl implements LingmingguangziService {
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private YDConf ydConf;
+
+    @Override
+    public McR test() {
+        log.info("test");
+        return McR.success();
+    }
+
+    @Override
+    public McR getVehicleCustomerCount() {
+        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-5CC9748D283C49FC8C8A86EE0529730A4I1D")
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> dataList = (List<Map>) ddrNew.getData();
+        int importantCustomerCount = 0;
+        int orderCustomerCount = 0;
+        int strategicCustomerCount = 0;
+
+        for (Map data : dataList) {
+            Map formData = (Map) data.get("formData");
+            String customerLevel = String.valueOf(formData.get("textField_lx4fx2u1"));
+            switch (customerLevel){
+                case "重要客户": importantCustomerCount++; break;
+                case "订单客户": orderCustomerCount++; break;
+                case "战略客户": strategicCustomerCount++; break;
+            }
+        }
+
+        Map<String,Integer> result = new HashMap<>();
+        result.put("importantCustomerCount", importantCustomerCount);
+        result.put("orderCustomerCount", orderCustomerCount);
+        result.put("strategicCustomerCount", strategicCustomerCount);
+
+        return McR.success(result);
+    }
+
+    @Override
+    public McR getConsumeCustomerCount() {
+        Set<String> customerSet = new HashSet<>();
+
+        //商务端
+        DDR_New ddrNew1 = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-36BF81FD5E43496FABB060190302A7615WBT")
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> dataList1 = (List<Map>) ddrNew1.getData();
+
+        for (Map data : dataList1) {
+            Map formData = (Map) data.get("formData");
+            String customer = String.valueOf(formData.get("textField_lwq1vxnj"));
+            System.out.println(customer);
+            customerSet.add(customer);
+        }
+
+        //技术端
+        DDR_New ddrNew2 = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-7AB4677010554E81BAA0AC26A46F1940PTIR")
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> dataList2 = (List<Map>) ddrNew2.getData();
+
+        for (Map data : dataList2) {
+            Map formData = (Map) data.get("formData");
+            String customer = String.valueOf(formData.get("textField_lwq1vxnj"));
+            System.out.println(customer);
+            customerSet.add(customer);
+        }
+
+        //质量端
+        DDR_New ddrNew3 = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-06A0188FF4E840CA82CBE51604C8C0D6SYTU")
+                .build(), YDConf.FORM_QUERY.retrieve_list);
+        List<Map> dataList3 = (List<Map>) ddrNew3.getData();
+
+        for (Map data : dataList3) {
+            Map formData = (Map) data.get("formData");
+            String customer = String.valueOf(formData.get("textField_lwq1vxnj"));
+            System.out.println(customer);
+            customerSet.add(customer);
+        }
+
+        return McR.success(customerSet.size());
+    }
+}

+ 60 - 0
mjava-lingmingguangzi/src/main/resources/application-dev.yml

@@ -0,0 +1,60 @@
+server:
+  port: 8113
+  servlet:
+    context-path: /lingmingguangzi
+
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/floe?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
+    username: root
+    password: 111111
+    driver-class-name: com.mysql.cj.jdbc.Driver
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/lingmingguangzi/log/
+  level:
+    com.malk.*: debug
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.shantai.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+
+
+# dingtalk
+dingtalk:
+  agentId: 3128251568
+  appKey: dingptadvrtbwyh9lyyn
+  appSecret: fGWLVUpiYjbw-DDEuK-fJyMwh7av2XfhDhiDNSh28TYciH5So4-SSIwHPDMF_tWx
+  corpId:
+  aesKey:
+  token:
+
+  #poc
+  #agentId: 2995824312
+  #appKey: ding3ap1jk1tg44tz3s2
+  #appSecret: PaWTDG-FiX-RW5fnV9r8CzEmR-9QlJpubC88txhprL_Z_iREO62B-iRW6w7gkA_K
+  #corpId: ding321c72787fffc78b35c2f4657eb6378f
+  #aesKey: LSIc7r5uHAP0dd6v23J3LWRmjECMNzbkIcxAwdx63RE
+  #token: yqXHMHaK4oHYvjyQshU4zFqgrHFq7PcBxVSqGo1BAQk0
+
+
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType: APP_MOIYIC856NRIBCMXEXVD
+  systemToken: G9666BC1BUHLKS20E7YQRATFDE4F39EOK5QWL06
+

+ 60 - 0
mjava-lingmingguangzi/src/main/resources/application-prod.yml

@@ -0,0 +1,60 @@
+server:
+  port: 8113
+  servlet:
+    context-path: /lingmingguangzi
+
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/floe?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
+    username: root
+    password: 111111
+    driver-class-name: com.mysql.cj.jdbc.Driver
+enable:
+  scheduling: false
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/lingmingguangzi/log/
+  level:
+    com.malk.*: debug
+
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.shantai.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+
+
+# dingtalk
+dingtalk:
+  agentId: 3088485347
+  appKey: dingryt7ulefpiziveoj
+  appSecret: qBdVqoK1UP9J3yN0ulaKuBmse4nrZPfNbVxjLGjaODGoRqbtws0__f3A5GpD5bLz
+  corpId: ding2c2e3f1dbf2b3ffebc961a6cb783455b
+  aesKey: uCSTfCFVU18QJjECfZTBWyC9mi10qqY1Spuqjl4ghct
+  token: Adib7WsRXHYrLGkOAUNcgl6gLY9nBIIaeprkhfmxGg6ca6atYWWKDkuE
+
+  #poc
+  #agentId: 2995824312
+  #appKey: ding3ap1jk1tg44tz3s2
+  #appSecret: PaWTDG-FiX-RW5fnV9r8CzEmR-9QlJpubC88txhprL_Z_iREO62B-iRW6w7gkA_K
+  #corpId: ding321c72787fffc78b35c2f4657eb6378f
+  #aesKey: LSIc7r5uHAP0dd6v23J3LWRmjECMNzbkIcxAwdx63RE
+  #token: yqXHMHaK4oHYvjyQshU4zFqgrHFq7PcBxVSqGo1BAQk0
+
+
+# teambition
+teambition:
+  AppID:
+  AppSecret:
+  TenantId:
+  OperatorId:    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType:
+  systemToken:
+

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

+ 61 - 0
mjava-lingmingguangzi/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.zitoo.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 18 - 0
mjava-mc/src/main/java/com/malk/mc/entity/PocTbWeekly.java

@@ -0,0 +1,18 @@
+package com.malk.mc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("poc_tb_weekly")
+public class PocTbWeekly {
+    @TableId(value = "id", type = IdType.INPUT)
+    String id;
+    String taskId;
+    String content;
+    String creatorId;
+    String createDate;
+    String updateDate;
+}

+ 11 - 0
mjava-mc/src/main/java/com/malk/mc/event/McTbEventImpl.java

@@ -10,6 +10,8 @@ import org.springframework.context.annotation.Primary;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 @Primary
 @Service
 @Slf4j
@@ -21,6 +23,15 @@ public class McTbEventImpl implements TBEvent {
 
     @Override
     public void callBackTask(JSONObject eventJson) {
+        Map data = (Map) eventJson.get("data");
+        String activityId = String.valueOf(data.get("activityId"));
+        Map content = (Map) data.get("content");
+        String creatorId = String.valueOf(data.get("creatorId"));
+        String taskId = String.valueOf(data.get("taskId"));
+        String createDate = String.valueOf(data.get("created"));
+        String updateDate = String.valueOf(data.get("updated"));
+
+        mcPocTbService.saveWeekly(activityId, content, creatorId, taskId, createDate, updateDate);
 
     }
 

+ 9 - 0
mjava-mc/src/main/java/com/malk/mc/mapper/PocTbWeeklyMapper.java

@@ -0,0 +1,9 @@
+package com.malk.mc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.mc.entity.PocTbWeekly;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PocTbWeeklyMapper extends BaseMapper<PocTbWeekly> {
+}

+ 11 - 0
mjava-mc/src/main/java/com/malk/mc/service/McPocTbService.java

@@ -1,9 +1,20 @@
 package com.malk.mc.service;
 
 import java.util.List;
+import java.util.Map;
 
 public interface McPocTbService {
 
     void saveWorkTimes(String taskId,String userId,List<String> ids);
 
+    /**
+     * 保存周报
+     * @param activityId
+     * @param content
+     * @param creatorId
+     * @param taskId
+     * @param createDate
+     * @param updateDate
+     */
+    void saveWeekly(String activityId, Map content, String creatorId, String taskId, String createDate, String updateDate);
 }

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

@@ -1,11 +1,16 @@
 package com.malk.mc.service.impl;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.malk.mc.entity.PocTbTask;
+import com.malk.mc.entity.PocTbWeekly;
 import com.malk.mc.entity.PocTbWorkTime;
 import com.malk.mc.mapper.PocTbTaskMapper;
 import com.malk.mc.mapper.PocTbUserMapper;
+import com.malk.mc.mapper.PocTbWeeklyMapper;
 import com.malk.mc.mapper.PocTbWorkTimeMapper;
 import com.malk.mc.service.McPocTbService;
 import com.malk.server.aliwork.YDConf;
@@ -18,6 +23,7 @@ import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -36,6 +42,8 @@ public class McPocTbServiceImpl implements McPocTbService {
     private PocTbUserMapper pocTbUserMapper;
     @Autowired
     private YDClient ydClient;
+    @Autowired
+    private PocTbWeeklyMapper pocTbWeeklyMapper;
 
     private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
     private SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -77,6 +85,48 @@ public class McPocTbServiceImpl implements McPocTbService {
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveWeekly(String activityId, Map content, String creatorId, String taskId, String createDate, String updateDate) {
+        Map task=tbClient.queryTaskDetail(taskId,"","").get(0);
+        String projectId=UtilMap.getString(task,"projectId");
+        if(!projectId.equals("66124f3f6f4d77e0259b40d5")){
+            return;
+        }
+        //若任务不存在则创建
+        PocTbTask pocTbTask=pocTbTaskMapper.selectById(taskId);
+        if(pocTbTask==null){
+            pocTbTask=new PocTbTask();
+            pocTbTask.setTaskId(taskId);
+            pocTbTask.setTaskName(UtilMap.getString(task,"content"));
+            pocTbTaskMapper.insert(pocTbTask);
+        }
+        String ddUserId = pocTbUserMapper.selectById(creatorId).getDdUserId();
+        //创建周报
+        PocTbWeekly pocTbWeekly = pocTbWeeklyMapper.selectById(activityId);
+        if (Objects.isNull(pocTbWeekly)){
+            pocTbWeekly = new PocTbWeekly();
+            pocTbWeekly.setId(activityId);
+            pocTbWeekly.setContent(String.valueOf(content.get("text")));
+            pocTbWeekly.setTaskId(taskId);
+            pocTbWeekly.setCreatorId(creatorId);
+            pocTbWeekly.setCreateDate(createDate);
+            pocTbWeekly.setUpdateDate(updateDate);
+            pocTbWeeklyMapper.insert(pocTbWeekly);
+
+            //在宜搭周报表中新增数据
+            Map data=new HashMap();
+            data.put("employeeField_lxu7g60o", Arrays.asList(ddUserId));//员工
+            data.put("textField_lxu7g60r", pocTbTask.getTaskName());//项目名称
+            data.put("textareaField_lxu7g60p",String.valueOf(content.get("text")));//周报内容
+            data.put("dateField_lxu7g60q",DateUtil.parse(createDate));//周报创建日期
+
+            ydClient.operateData(YDParam.builder().formUuid("FORM-4EFCFB6F0E3D4187BCDEBEEA60F4F555RTIK").formDataJson(JSONObject.toJSONString(data)).build(), YDConf.FORM_OPERATION.create);
+        }
+
+
+    }
+
     private String timeFormat(String startDate){
         String result = "";
         Date rwStateTime = null;

+ 13 - 3
mjava-mc/src/test/java/com/malk/mc/PocTbTest.java

@@ -1,5 +1,7 @@
 package com.malk.mc;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.malk.mc.entity.PocTbUser;
 import com.malk.mc.mapper.PocTbUserMapper;
 import com.malk.mc.service.McPocTbService;
@@ -16,9 +18,9 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.util.*;
 
 @Slf4j
 @SpringBootTest
@@ -45,4 +47,12 @@ public class PocTbTest {
                 Arrays.asList("153620324221442254"),Arrays.asList(),UtilMap.map("pcUrl, appUrl",url,url),true,10,null);
     }
 
+    @Test
+    public void test2() {
+        Map content = new HashMap<>();
+        content.put("attachments",new Array[]{});
+        content.put("text","已经完成,在协助客户测试,解决客>户提出的问题");
+        mcPocTbService.saveWeekly("667a8acecb1f84f76e4e1b4e",content,"61e6614bd80be3b12f0ba72d","665c9db8ae4a37f6c0fc5be4","2024-06-25T09:15:58.230Z","2024-06-25T09:15:58.230Z" );
+    }
+
 }

+ 33 - 0
mjava-ruisi/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 71 - 0
mjava-ruisi/pom.xml

@@ -0,0 +1,71 @@
+<?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.ruisi</groupId>
+    <artifactId>mjava-ruisi</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mjava-ruisi</name>
+    <description>mjava-ruisi</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>
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot 依赖 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>2.2.13.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.9</version> <!-- 检查最新版本 -->
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>ruisi</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>
+        </plugins>
+    </build>
+</project>

+ 16 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/MjavaRuisiApplication.java

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

+ 40 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/constant/QysConstant.java

@@ -0,0 +1,40 @@
+package com.malk.ruisi.constant;
+
+import com.malk.ruisi.entity.RsQysConfigInfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class QysConstant {
+
+    public static Map<String,Map<String, RsQysConfigInfo>> QYS_CONFIG_DATA=new HashMap();// 契约锁密钥配置
+
+    public static String QYS_SUCCESS_CODE="0";
+
+    public static String QYS_API_SEALLIST="/seal/innercompany/seallist";
+
+    public static String QYS_API_CREATEBYFILE="/v2/document/createbyfile";
+
+    public static String QYS_API_MULTIPLE="/seal/apply/multiple";
+
+    public static String QYS_API_CREATEBYCATEGORY="/contract/createbycategory";
+
+    public static String QYS_API_DETAIL="/seal/detail";
+
+    public static String QYS_API_PRESIGNURL="/contract/presignurl";
+
+    public static String QYS_API_SIGNURL="/contract/signurl";
+
+    public static String QYS_API_CONTRACT_DETAIL="/contract/detail";
+
+    public static String QYS_API_SEND="/contract/send";
+
+    public static String QYS_API_CATEGORIES="/contract/categories";
+
+    public static String QYS_API_SEALBYCATEGORY="/seal/apply/mulitipleByCategory";
+
+    public static String QYS_API_LEGALPERSONSIGN="/v2/contract/legalpersonsign";
+
+    public static String QYS_API_DOWNLOAD="/contract/download";
+
+}

+ 40 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/controller/QysApiTestController.java

@@ -0,0 +1,40 @@
+package com.malk.ruisi.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.ruisi.service.QysApiService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/***
+ * 测试契约锁
+ */
+@RestController
+@Slf4j
+@RequestMapping("/qys/")
+public class QysApiTestController {
+    @Autowired
+    private QysApiService qysApiService;
+
+    @PostMapping("test")
+    public JSONObject testJSon(@RequestBody() JSONObject param){
+        log.info("JSON格式请求参数:{}",param);
+        try {
+            Map data=(Map) param.get("data");
+            String url=String.valueOf(param.get("url"));
+            boolean isPost=(Boolean) param.get("isPost");
+            if(isPost){
+                return qysApiService.sendPost(data,url);
+            }else {
+                return qysApiService.sendGet(data,url,false);
+            }
+        } catch (Exception apiException) {
+            return new JSONObject().fluentPut("msg","失败");
+        }
+    }
+}

+ 83 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/controller/QysHuiDaoController.java

@@ -0,0 +1,83 @@
+package com.malk.ruisi.controller;
+
+
+import com.malk.ruisi.service.RsQysService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.common.McR;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.UrlResource;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+
+@RestController
+@Slf4j
+@RequestMapping("/qys")
+public class QysHuiDaoController {
+    @Autowired
+    private RsQysService qysService;
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDConf ddConf;
+
+    /***
+     * 第三步
+     * 契约锁签署完成回调、保存文件
+     * @return
+     */
+    @PostMapping("/callback")
+    public McR callback(@RequestParam Map<String, String> param) throws Exception {
+        log.info("callback:{}", param);
+//
+        //1.content解析为json字符   并获得contractId
+        //2.根据contractId 获取附件到本地获得一个本地地址  接口:/contract/download zip保存到本地   并解压zip
+
+        //3.根据contractId查询对应的数据实例ID,根据实例ID把本地地址对的文件传到对应的 附件签署后
+
+        //("attachmentField_ltsbweit",文件)
+        return qysService.callback(param);
+    }
+
+
+    private static final String FILE_DIRECTORY = "C:\\Users\\Administrator\\Desktop\\";
+
+    @GetMapping("/download/{sn}/{fileName}")
+    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName,@PathVariable String sn) {
+        Path filePath = Paths.get(FILE_DIRECTORY.concat(sn.concat("\\"))).resolve(fileName).normalize();
+        try {
+            Resource resource = new UrlResource(filePath.toUri());
+            if (resource.exists()) {
+                HttpHeaders headers = new HttpHeaders();
+                headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + resource.getFilename());
+                return ResponseEntity.ok()
+                        .headers(headers)
+                        .contentType(MediaType.parseMediaType("application/octet-stream"))
+                        .body(resource);
+            } else {
+                return ResponseEntity.notFound().build();
+            }
+        } catch (MalformedURLException e) {
+            return ResponseEntity.notFound().build();
+        } catch (IOException e) {
+            return ResponseEntity.notFound().build();
+        }
+    }
+}
+
+
+

+ 77 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/controller/RsQysController.java

@@ -0,0 +1,77 @@
+package com.malk.ruisi.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.ruisi.service.RsQysService;
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Slf4j
+@RequestMapping("/qys")
+public class RsQysController {
+    @Autowired
+    private RsQysService rsQysService;
+    /* 契约锁回调密钥 */
+
+    /***
+     * 第一步
+     * 根据文件类型创建合同文档
+     * @param
+     * @return
+     */
+
+    @PostMapping("/createbyfile")
+    public McR createByFile(@RequestBody JSONObject param) throws Exception {
+        return rsQysService.createByFile(param);
+    }
+
+    /***
+     * 预签署  可重复获取
+     * @param
+     * @return
+     */
+    @PostMapping("/appointurl")
+    public McR appointurl(String contractId) throws Exception {
+        log.info("进入 预签署 接口,参数:{}",contractId);
+//            String contractId=String.valueOf(param.getString("contractId"));
+//            return McR.success(contractId);
+        return rsQysService.appointurl(contractId);
+    }
+//    /***
+//     * 第二步
+//     * 发起合同、完成发起方签署
+//     * @param
+//     * @return
+//     */
+//    @PostMapping("/send")
+//    public McR sendContract(String contractId) throws Exception {
+//        log.info("进入 step two 接口,参数:{}",contractId);
+//        return rsQysService.sendContract(contractId);
+//    }
+    /***
+     * 授权物理印章码
+     * @param
+     * @return
+     */
+    @PostMapping("/apply")
+    public McR apply(@RequestBody JSONObject param) throws Exception {
+        log.info("进入 apply 接口,参数:{}",param);
+        return rsQysService.apply(param);
+    }
+
+    /***
+     * 合同签署页面
+     * @param
+     * @return
+     */
+    @PostMapping("/signurl")
+    public McR signurl(@RequestBody JSONObject param) throws Exception {
+        log.info("进入 apply 接口,参数:{}",param);
+        return rsQysService.signurl(param);
+    }
+}

+ 105 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/controller/ScheduleTask.java

@@ -0,0 +1,105 @@
+package com.malk.ruisi.controller;
+
+import cn.hutool.core.io.FileUtil;
+import com.malk.ruisi.service.dingshiqi;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.http.fileupload.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class ScheduleTask {
+    @Autowired
+    private dingshiqi ds;
+    @Value("${qiyuesuo.pdfbdurl}")
+    private String PDFBDURL;
+    /**
+     * 每天查询业务ID
+     */
+//    @Scheduled(cron = "0 0 0 * * ?")
+//    @Scheduled(cron = "0/10 * * * * ?")
+    public void syncRecruitSource() {
+        try {
+           System.out.println("开始上传业务ID");
+            System.out.println(LocalDateTime.now());
+            ds.getYWFLid( );
+            System.out.println("结束业务ID");
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 每天查询物理印章ID
+     */
+//    @Scheduled(cron = "0/1 * * * * ?")
+//    @Scheduled(cron = "0 09 22 * * ?")
+//    @Scheduled(cron = "0 0/10 * * * ?")
+    public void syncRecruitSource1() {
+        try {
+            System.out.println("开始上传物理印章ID");
+            System.out.println(LocalDateTime.now());
+            ds.getYWFLid1( );
+            System.out.println("结束物理印章ID");
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 每天查询电子印章ID
+//     */
+//    @Scheduled(cron = "0/1 * * * * ?")
+//    @Scheduled(cron = "0 01 23 * * ?")
+    public void syncRecruitSource2() {
+        try {
+            System.out.println("开始上传电子印章ID");
+            System.out.println(LocalDateTime.now());
+            ds.getYWFLid2( );
+            System.out.println("结束电子印章ID");
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+
+//    @Scheduled(cron = "0 1 0 * * ?")
+//    @Scheduled(cron = "0 0 * * 0")
+    public void delTempFile() {
+        log.info("开始删除文件");
+        File directory = new File(PDFBDURL);
+        try {
+            FileUtils.cleanDirectory(directory);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+//        @Scheduled(cron = "0/1 * * * * ?")
+    public void syncDelete() {
+
+        log.info("开始删除数据");
+
+        try {
+             ds.syncDelete();
+            System.out.println(LocalDateTime.now());
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+}

+ 23 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/entity/RsQysConfigInfo.java

@@ -0,0 +1,23 @@
+package com.malk.ruisi.entity;
+
+import lombok.Data;
+
+@Data
+public class RsQysConfigInfo {
+    private String aId;// 公司ID
+
+    private String type;// 业务分类代码
+
+    private String categoryId;// 业务分类契约锁ID
+
+    private String callBackSecretKey;// 业务分类回调密钥
+
+    public RsQysConfigInfo(){}
+
+    public RsQysConfigInfo(String aId, String type, String categoryId, String callBackSecretKey){
+        this.aId=aId;
+        this.type=type;
+        this.categoryId=categoryId;
+        this.callBackSecretKey=callBackSecretKey;
+    }
+}

+ 18 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/QysApiService.java

@@ -0,0 +1,18 @@
+package com.malk.ruisi.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.File;
+import java.util.Map;
+
+public interface QysApiService {
+    JSONObject sendPost(Map param, String url)throws Exception;
+
+    JSONObject sendGet(Map param, String url)throws Exception;
+
+    JSONObject sendGet(Map param, String url,Boolean isUnicode)throws Exception;
+
+    JSONObject sendPostFile(Map param, String url)throws Exception;
+
+    void getFile(Map param, String url, File file)throws Exception;
+}

+ 30 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/QysService.java

@@ -0,0 +1,30 @@
+package com.malk.ruisi.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface QysService {
+    JSONObject createDraft(Map param)throws Exception;
+
+    JSONObject createbyfile(Map da) throws Exception;
+
+    JSONObject appointurl(String contractId)throws Exception;
+
+    JSONObject createbycategory(Map data) throws Exception;
+
+    JSONObject getDetail(String bizId, String tenantName) throws Exception;
+
+    JSONObject send(String contractId, String tenantName) throws Exception;
+
+
+    void download(String contractId, File file)throws Exception;
+
+    JSONObject createseal(Map map) throws Exception;
+
+    JSONObject applyseals(Map param) throws Exception;
+
+    JSONObject signurla(Map signatory) throws Exception;
+}

+ 24 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/RsQysService.java

@@ -0,0 +1,24 @@
+package com.malk.ruisi.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.common.McR;
+
+import java.util.Map;
+
+public interface RsQysService {
+
+    McR createByFile(JSONObject param) throws Exception;
+
+    McR callback( Map<String, String> param) throws Exception;
+
+    McR appointurl(String contractId) throws Exception;
+
+//    McR sendContract(String contractId) throws Exception;
+
+    McR apply(JSONObject param) throws Exception;
+
+    McR signurl(JSONObject param) throws Exception;
+
+
+//    String callback(JSONObject param);
+}

+ 15 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/dingshiqi.java

@@ -0,0 +1,15 @@
+package com.malk.ruisi.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface dingshiqi {
+    JSONObject getYWFLid()throws Exception;
+
+    JSONObject getYWFLid1()throws Exception;
+
+    JSONObject getYWFLid2()throws Exception;
+
+    void syncDelete()throws Exception;
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 147 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/QysApiServiceImpl.java


+ 92 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/QysServiceImpl.java

@@ -0,0 +1,92 @@
+package com.malk.ruisi.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.ruisi.service.QysApiService;
+import com.malk.ruisi.service.QysService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.malk.ruisi.constant.QysConstant.*;
+
+@Slf4j
+@Service
+public class QysServiceImpl implements QysService {
+   @Autowired
+   private QysApiService qysApiService;
+    @Override
+    public JSONObject createDraft(Map param) throws Exception {
+        return qysApiService.sendPost(param,QYS_API_CREATEBYCATEGORY);
+    }
+
+    @Override
+    public JSONObject createbyfile(Map da) throws Exception {
+        return qysApiService.sendPostFile(da,QYS_API_CREATEBYFILE);
+    }
+
+    @Override
+    public JSONObject appointurl(String contractId) throws Exception {
+
+            Map<String,Object> data=new HashMap();
+            data.put("contractId",contractId);
+            return qysApiService.sendGet(data,QYS_API_PRESIGNURL);
+//            return qysApiService.sendPost(data,QYS_API_PRESIGNURL);
+
+    }
+
+    @Override
+    public JSONObject createbycategory(Map data) throws Exception {
+        return qysApiService.sendPost(data,QYS_API_CREATEBYCATEGORY);
+    }
+
+    @Override
+    public JSONObject getDetail(String bizId, String tenantName) throws Exception {
+        Map<String ,Object> data = new HashMap();
+        data.put("bizId",bizId);
+        data.put("tenantName",tenantName);
+        return qysApiService.sendGet(data,QYS_API_CONTRACT_DETAIL);
+    }
+
+    @Override
+    public JSONObject send(String contractId, String tenantName) throws Exception {
+        Map<String,Object> data=new HashMap();
+        data.put("contractId",contractId);
+        data.put("tenantName",tenantName);
+        return qysApiService.sendPost(data,QYS_API_SEND);
+    }
+    public JSONObject getYWFLid(Map data) throws Exception {
+        return qysApiService.sendGet(data,QYS_API_CATEGORIES,false);
+    }
+    /***
+     * 下载签署后文件
+     * @param contractId
+     * @param file
+     * @throws Exception
+     */
+    @Override
+    public void download(String contractId, File file) throws Exception {
+        log.info("下载文件:{}",file.getPath());
+        qysApiService.getFile(new JSONObject().fluentPut("contractId",contractId),QYS_API_DOWNLOAD,file);
+        log.info("下载完成:文件大小:{}",file.length());
+    }
+
+    @Override
+    public JSONObject createseal(Map map) throws Exception {
+        return qysApiService.sendPost(map,QYS_API_SEALBYCATEGORY);
+    }
+
+    @Override
+    public JSONObject applyseals(Map param) throws Exception {
+        return qysApiService.sendPost(param,QYS_API_MULTIPLE);
+    }
+
+    @Override
+    public JSONObject signurla(Map signatory) throws Exception {
+        return qysApiService.sendPost(signatory,QYS_API_SIGNURL);
+    }
+}

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

@@ -0,0 +1,790 @@
+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);
+        }
+    }
+}

+ 318 - 0
mjava-ruisi/src/main/java/com/malk/ruisi/service/impl/dingshiqiImpl.java

@@ -0,0 +1,318 @@
+package com.malk.ruisi.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.malk.ruisi.service.QysApiService;
+import com.malk.ruisi.service.QysService;
+import com.malk.ruisi.service.dingshiqi;
+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_Contacts;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.malk.ruisi.constant.QysConstant.*;
+import static jdk.nashorn.internal.objects.NativeError.printStackTrace;
+
+
+@Service
+@Slf4j
+public class dingshiqiImpl implements dingshiqi {
+    @Autowired
+    private QysService qysService;
+    @Autowired
+    private QysServiceImpl qysServiceImpl;
+    @Autowired
+    private QysApiService qysApiService;
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+    @Override
+    public JSONObject getYWFLid() throws Exception {
+        Map<String, Object> data = new HashMap();
+        //通过接口获取所有业务分类列表
+        JSONObject ywfLid = qysApiService.sendGet(data, QYS_API_CATEGORIES, false);
+        JSONArray ids = ywfLid.getJSONArray("categories");//得到所有业务分类数据
+        if (ids != null && ids.size() > 0) {
+            for (int i = 0; i < ids.size(); i++) {
+                String scon = "";//签署配置
+                //判断所需数据是否为空
+                if (ids.getJSONObject(i).getString("name") != "" && ids.getJSONObject(i).getString("id") != ""
+                        && ids.getJSONObject(i).getString("tenantName") != "" && ids.getJSONObject(i).getString("tenantId") != ""
+                        && ids.getJSONObject(i).getString("config") != "") {
+                    String name = ids.getJSONObject(i).getString("name");//业务分类名称
+                    String id = ids.getJSONObject(i).getString("id");//业务分类id
+                    String config = ids.getJSONObject(i).getString("config");
+                    String tenantName = ids.getJSONObject(i).getString("tenantName");//公司名称
+                    String tenantID = ids.getJSONObject(i).getString("tenantId");//公司id
+                    String sc = "textField_lvkbxugq, textField_lvkbxugr, textField_lvyy8a3l";
+                    String fd = "textField_lvkbxugq, textField_lvkbxugr, textField_lvyy8a3l, textField_lvyy8a3m, textareaField_lw1py1td";
+                    //把配置数据转换成json
+                    Gson gson = new Gson();
+                    JsonObject jsonObject = gson.fromJson(config, JsonObject.class);
+                    JsonArray signatories = jsonObject.getAsJsonArray("signatories");
+                    if (signatories == null || signatories.size() == 0) {
+                        signatories = new JsonArray();
+                    }
+                    //封装所需配置数据为列表
+                    List<Map<String, Object>> signatoriesData = new ArrayList<>();
+                    for (JsonElement signatory : signatories) {
+                        JsonObject signatoryObj = signatory.getAsJsonObject();
+                        String tenantType = signatoryObj.has("tenantType") ? signatoryObj.get("tenantType").getAsString() : "COMPANY";
+                        int serialNo = signatoryObj.get("serialNo").getAsInt();
+                        List<Map<String, Object>> actionData = new ArrayList<>();
+                        JsonArray actions = signatoryObj.getAsJsonArray("actions");
+                        for (JsonElement action : actions) {
+                            JsonObject actionObj = action.getAsJsonObject();
+                            String type = actionObj.get("type").getAsString();
+                            String name1 = actionObj.get("name").getAsString();
+                            int actionSerialNo = actionObj.get("serialNo").getAsInt();
+                            Map<String, Object> actionMap = new HashMap<>();
+                            actionMap.put("type", type);
+                            actionMap.put("name", name1);
+                            actionMap.put("serialNo", actionSerialNo);
+                            actionData.add(actionMap);
+                        }
+                        Map<String, Object> signatoryMap = new HashMap<>();
+                        if (tenantType != null) {
+                            signatoryMap.put("tenantType", tenantType);
+                        }
+                        signatoryMap.put("serialNo", serialNo);
+                        signatoryMap.put("actions", actionData);
+                        signatoriesData.add(signatoryMap);
+                    }
+                    //把配置数据转换成json
+                    Gson gson1 = new Gson();
+                    scon = gson1.toJson(signatoriesData);
+                    //把数据插入宜搭基础表单中
+                    String tquid = ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-417576F4EE9F4AA1B2395BCD93B7A08C8ASN")
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, id, tenantName)))
+                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd, name, id, tenantName, tenantID, scon)))
+                            .build(), YDConf.FORM_OPERATION.upsert).toString();
+                    System.out.println("tquid:" + tquid);
+                }
+            }
+
+        }
+        return null;
+    }
+
+    @Override
+    public JSONObject getYWFLid1() throws Exception {
+        Map<String, Object> data = new HashMap();
+        data.put("category", "PHYSICS");
+        JSONObject qysid = qysApiService.sendGet(data, QYS_API_SEALLIST, false);
+        JSONArray result = qysid.getJSONArray("result");//得到物理印章所有数据
+        if (result != null && result.size() > 0) {
+            for (int i = 0; i < result.size(); i++) {
+                JSONObject sealData = result.getJSONObject(i);
+                String charger = sealData.getString("charger"); // 印章负责人
+                String name = sealData.getString("name"); // 公司名称
+                String id = sealData.getString("id"); // 公司id
+                JSONArray seals = sealData.getJSONArray("seals"); // 公司id
+                String sc = "textField_lw6aecvd, textField_lw6aecvg, textField_lw6aecve, textField_lw6aecvh";
+                String fd = "employeeField_lwr509pq, textField_lw6aecvd, textField_lw6aecvg, textField_lw6aecve, textField_lw6aecvh, textField_lwywohh0";
+                String fd1 = "textField_lw6aecvd, textField_lw6aecvg, textField_lw6aecve, textField_lw6aecvh";
+
+                // 如果 seals 为空,则设置 id、name、category 为空字符串
+                if (seals != null && seals.size() > 0) {
+                    for (int i1 = 0; i1 < seals.size(); i1++) {
+                        JSONObject seal = seals.getJSONObject(i1);
+                        String sealId = seal.getString("id"); // 印章id
+                        String sealName = seal.getString("name"); // 印章名称
+//                        String sealCategory = seal.getString("category"); // 印章类别
+//                        if (sealCategory.equals("PHYSICS")) {
+//                            sealCategory = "物理";
+//                        }
+                        Map<String, Object> data5 = new HashMap();
+                        data5.put("sealId", sealId);
+                        JSONObject detail = qysApiService.sendGet(data5, QYS_API_DETAIL, false);
+                        JSONObject seal3 = detail.getJSONObject("seal");//得到电子印章所有数据
+                        JSONArray users = seal3.getJSONArray("users");//得到电子印章所有数据
+
+                        if (users != null && users.size() > 0) {
+                            List<String> usersList = new ArrayList<>();
+                            for (int k = 0; k < users.size(); k++) {
+                                JSONObject usersData = users.getJSONObject(k);
+
+                                String mobile = usersData.getString("mobile");
+                                try {
+                                    Map userInfoByMobile = ddClient_contacts.getUserInfoByMobile(ddClient.getAccessToken(), mobile);
+                                    String userid = UtilMap.getString(userInfoByMobile, "userid");
+                                    if (userid != null) {
+                                        log.info("userInfoByMobile:{}", userInfoByMobile.get("userid"));
+                                        usersList.add(userid);
+                                    } else {
+                                        usersList.add(null);
+                                    }
+                                } catch (McException e) {
+                                    if (e.getCode() == "60121") {
+                                        // 处理用户不存在的特定情况,如记录日志、添加特定消息等
+                                        log.warn("用户不存在: 手机号={}", mobile);
+                                    } else {
+                                        // 其他错误处理
+                                        log.error("获取用户信息时发生错误", e);
+                                    }
+                                }
+                                System.out.println("物理印章使用人----------------" + mobile);
+                                if (usersList != null){
+                                    ydClient.operateData(YDParam.builder()
+                                            .formUuid("FORM-7ACCB70D96FA4187BD2042243641E54CD6VH")
+                                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId, sealName, id)))
+                                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd, usersList, name, sealId, sealName, id, mobile)))
+                                            .build(), YDConf.FORM_OPERATION.upsert);
+                                }else{
+                                    ydClient.operateData(YDParam.builder()
+                                            .formUuid("FORM-7ACCB70D96FA4187BD2042243641E54CD6VH")
+                                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId, sealName, id)))
+                                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd1, name, sealId, sealName, id)))
+                                            .build(), YDConf.FORM_OPERATION.upsert);
+                                }
+
+                            }
+                        }
+
+                    }
+                } else {
+                    String sealId = ""; // 印章id
+                    String sealName = ""; // 印章名称
+                    String sealCategory = ""; // 印章类别
+
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-7ACCB70D96FA4187BD2042243641E54CD6VH")
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId, sealName, id)))
+                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd1,  name, sealId, sealName, id)))
+                            .build(), YDConf.FORM_OPERATION.upsert).toString();
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public JSONObject getYWFLid2() throws Exception {
+        Map<String, Object> data = new HashMap();
+        data.put("category", "ELECTRONIC");
+        JSONObject qysid = qysApiService.sendGet(data, QYS_API_SEALLIST, false);
+        JSONArray result = qysid.getJSONArray("result");//得到电子印章所有数据
+        if (result != null && result.size() > 0) {
+            for (int i = 0; i < result.size(); i++) {
+                JSONObject sealData = result.getJSONObject(i);
+                String charger = sealData.getString("charger"); // 印章负责人
+                String name = sealData.getString("name"); // 公司名称
+                String id = sealData.getString("id"); // 公司id
+                JSONArray seals = sealData.getJSONArray("seals"); // 印章id
+                String sc = "textField_lu0k70cf, textField_lw5pfnr9";
+                String fd = "employeeField_lwqbilgc, textField_lu0k70cf, textField_lw5pfnr9, textField_lu0k70cg, textField_lw5qtyzw, textField_lwywvrx9";
+                String fd1 = "textField_lu0k70cf, textField_lw5pfnr9, textField_lu0k70cg, textField_lw5qtyzw";
+                // 如果 seals 为空,则设置 id、name、category 为空字符串
+                if (seals != null && seals.size() > 0) {
+                    for (int i1 = 0; i1 < seals.size(); i1++) {
+                        JSONObject seal = seals.getJSONObject(i1);
+                        String sealId = seal.getString("id"); // 印章id
+                        String sealName = seal.getString("name"); // 印章名称
+//                        String sealCategory = seal.getString("category"); // 印章类别
+//                        if (sealCategory.equals("ELECTRONIC")) {
+//                            sealCategory = "电子";
+//                        }
+                        Map<String, Object> data5 = new HashMap();
+                        data5.put("sealId", sealId);
+                        JSONObject detail = qysApiService.sendGet(data5, QYS_API_DETAIL, false);
+                        JSONObject seal3 = detail.getJSONObject("seal");//得到电子印章所有数据
+                        JSONArray users = seal3.getJSONArray("users");//得到电子印章所有数据
+
+                        if (users != null && users.size() > 0) {
+                            List<String> usersList = new ArrayList<>();
+                            for (int k = 0; k < users.size(); k++) {
+                                JSONObject usersData = users.getJSONObject(k);
+//                                String name3 = usersData.getString("name");
+                                String mobile = usersData.getString("mobile");
+                                try {
+                                    Map userInfoByMobile = ddClient_contacts.getUserInfoByMobile(ddClient.getAccessToken(), mobile);
+                                    String userid = UtilMap.getString(userInfoByMobile, "userid");
+                                    if (userid != null) {
+                                        log.info("userInfoByMobile:{}", userInfoByMobile.get("userid"));
+                                        usersList.add(userid);
+                                    } else {
+                                        usersList.add(null);
+                                    }
+                                } catch (McException e) {
+                                    if (e.getCode() == "60121") {
+                                        // 处理用户不存在的特定情况,如记录日志、添加特定消息等
+                                        log.warn("用户不存在: 手机号={}", mobile);
+                                    } else {
+                                        // 其他错误处理
+                                        log.error("获取用户信息时发生错误", e);
+                                    }
+                                }
+                                System.out.println("印章使用人----------------" + mobile);
+                                if (usersList != null) {
+                                    ydClient.operateData(YDParam.builder()
+                                            .formUuid("FORM-6D5B2C469B45456F9287C3575BFF92C7KUF6")
+                                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId)))
+                                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd, usersList, name, sealId, sealName, id, mobile)))
+                                            .build(), YDConf.FORM_OPERATION.upsert);
+                                } else {
+                                    ydClient.operateData(YDParam.builder()
+                                            .formUuid("FORM-6D5B2C469B45456F9287C3575BFF92C7KUF6")
+                                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId)))
+                                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd1, name, sealId, sealName, id)))
+                                            .build(), YDConf.FORM_OPERATION.upsert);
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    String sealId = ""; // 印章id
+                    String sealName = ""; // 印章名称
+                    String sealCategory = ""; // 印章类别
+
+                    ydClient.operateData(YDParam.builder()
+                            .formUuid("FORM-6D5B2C469B45456F9287C3575BFF92C7KUF6")
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map(sc, name, sealId)))
+                            .formDataJson(JSONObject.toJSONString(UtilMap.map(fd1, name, sealId, sealName, id)))
+                            .build(), YDConf.FORM_OPERATION.upsert).toString();
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void syncDelete() {
+        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-7ACCB70D96FA4187BD2042243641E54CD6VH")
+                .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+        System.out.println(ddrNew.getTotalCount());
+
+        ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-7ACCB70D96FA4187BD2042243641E54CD6VH")
+                .asynchronousExecution(true)
+                .formInstanceIdList((List<String>) ddrNew.getData())
+                .build(), YDConf.FORM_OPERATION.delete_batch);
+
+    }
+}

+ 38 - 0
mjava-ruisi/src/main/resources/application-dev.yml

@@ -0,0 +1,38 @@
+server:
+  port: 9020
+  servlet:
+    context-path: /ruisi
+
+enable:
+  scheduling: true
+logging:
+  config: classpath:logback-spring.xml
+  path: /home/server/connect/canrui/log/
+  level:
+    com.zitoo.connect.*: debug
+
+# dingtalk
+dingtalk:
+  agentId: "3079562924"
+  appKey: "dingprswtas7kluqst2c"
+  appSecret: "ukquGx_DjznsTQtKQtFFNutn1NFhSgL9ZbTfCtl_9mJYWacFYu--vj_zThTxjsYN"
+  corpId: dingccd7fff754e440cf24f2f5cc6abecb85
+  aesKey:
+  token:
+qiyuesuo:
+  doman: http://esign.risechina.com:9182
+  token: wSIHewkJqu
+  secret: IS2QWwM7ktcYa80LzhpvQyHYhYfgBZ
+  bdurl: C:\Users\Administrator\Desktop\file\
+  pdfbdurl: C:\Users\Administrator\Desktop\
+  url: https://67451e9e.r28.cpolar.top/download/
+# teambition
+teambition:
+  AppID: 63589b8bb6803e162f9a57d8
+  AppSecret: 5mB3b73OFhSwo38xEVqahCLwQVhG1MW3
+  TenantId: 5ca44db8ca4fd40001b10559
+  OperatorId: 5e698cca21f5ad70dfba7d2b    # 公共账号, 需要有操作权限 [牧语]
+# aliwork
+aliwork:
+  appType: APP_VCTRP6227CC8368NDOID
+  systemToken: 5H9662C1X8XJLFFCE841M5VBEBQ73DM5IBPULPI3

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


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

+ 61 - 0
mjava-ruisi/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.zitoo.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>

+ 13 - 0
mjava-ruisi/src/test/java/com/malk/ruisi/MjavaRuisiApplicationTests.java

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

+ 107 - 0
mjava-ruisi/src/test/java/com/malk/ruisi/test.java

@@ -0,0 +1,107 @@
+package com.malk.ruisi;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.json.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.ruisi.service.QysApiService;
+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 org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class test {
+
+    @Autowired
+    private QysApiService qysApiService;
+    @Autowired
+    private QysService qysService;
+    @Autowired
+    private RsQysService rsQysService;
+//上传文件得到文档Id
+    @Test
+    public void test() throws Exception {
+        Map data=new HashMap();
+        data.put("file", FileUtil.file("/home/file/123.docx"));
+        data.put("title","123");
+        data.put("fileType","docx");
+//        data.put("bizId",bizId);
+//        data.put("title",FileUtil.mainName(file));
+//        data.put("file", file);
+//        data.put("fileSuffix", FileUtil.extName(file));
+//        data.put("tenantName",tenantName);
+//        qysApiService.sendPostFile(data,"/v2/document/createbyfile");
+        qysService.createbyfile(data);
+    }
+
+
+//    @Test
+//    public void test222(){
+//        JSONObject obj=new JSONObject();
+//        obj.put("formInstanceId","");
+//        rsQysService.createbyfile("6552b416-09d0-4cd4-af9a-2b549144a508");
+//    }
+
+
+//    String bizId=param.getString("bizId");
+//    String formInstanceId=param.getString("formInstanceId");
+//    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:{}",JSONObject.toJSONString(data));
+//
+//    JSONObject obj=new JSONObject();
+//        obj.put("subject",data.get("textField_ltsbwef0"));
+//        obj.put("sn",data.get("serialNumberField_ltsbweh2"));
+//        obj.put("categoryName",data.get("textField_ltsbweif"));
+//        obj.put("signatory",data.get("textField_ltwa0vk0"));
+//        obj.put("send",false);// 是否发起合同;发起合同后不能再进行添加文档、指定签署位置等操作
+//
+//    JSONArray array=new JSONArray();
+//    JSONObject signatory=new JSONObject();
+////        signatory.put("tenantType",data.get("selectField_ltsbwei6"));
+//        signatory.put("tenantType","COMPANY");
+//        signatory.put("tenantName",data.get("selectField_ltsbwei5"));
+//    // 假设 data 是一个 Map<String, String> 对象
+////        String selectFieldValue = (String) data.get("selectField_lu69xx6q");
+////        List<Integer> result;
+////
+////        if ("是".equals(selectFieldValue)) {
+////            result = Arrays.asList(1, 2, 3);
+////        } else {
+////            result = Arrays.asList(1, 1, 1);
+////        }
+////
+////        signatory.put("serialNo",result);
+//        array.add(signatory);
+////
+//        obj.put("signatories",array);
+//
+//        log.info("obj:{}",obj);
+//        try {
+//        log.info("1. 创建合同草稿 {}",bizId);
+//        JSONObject draft=qysService.createDraft(obj);
+//        System.out.println(draft);
+//    } catch (Exception e) {
+//        e.printStackTrace();
+//    }
+
+    @Test
+    public void qystest() throws Exception {
+        Map map=new HashMap();
+        map.put("sn","HT01-HTYY-202405200047");
+        map.put("contractId","3230485872831869324");
+        map.put("status","SIGNED");
+        rsQysService.callback(map);
+    }
+}

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
mjava-shantai/src/main/java/com/malk/shantai/controller/StYkbController.java


+ 6 - 0
mjava-shantai/src/main/java/com/malk/shantai/entity/Shantai.java

@@ -1,10 +1,13 @@
 package com.malk.shantai.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 @TableName(value = "shantai")
 @Data
 public class Shantai {
+    @TableId(value = "id", type = IdType.AUTO)
     private String id;
 
     //单据id
@@ -19,5 +22,8 @@ public class Shantai {
     //有效位 1:正常  0:删除
     private String validFlag;
 
+    //OA提交人用户id
+    private String userId;
+
 
 }

+ 26 - 9
mjava-shantai/src/main/java/com/malk/shantai/service/impl/StDingProcServiceImpl.java

@@ -212,14 +212,22 @@ public class StDingProcServiceImpl extends ServiceImpl<ShantaiMapper, Shantai> i
         body.put("form",form);
 
         Map document = JSONObject.parseObject(UtilHttp.doPost(stEkbConfig.getPreUrl() + ("/api/openapi/v2.2/flow/data"), null, param, body));
+
+        Shantai shantai = new Shantai();
+        shantai.setProcInstId(procInstId);
+        shantai.setState("3");
+        shantai.setUserId(userId);
+        shantaiMapper.insert(shantai);
+
         log.info("新增单据成功:{}",document);
     }
 
     @Override
     public McR commentSync(Map map,String flowId){
+        String procInstId = map.get("procInstId").toString();
         //查询表中是否存在同步评论记录
         LambdaQueryWrapper<Shantai> shantaiLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        shantaiLambdaQueryWrapper.eq(Shantai::getFlowId,flowId)
+        shantaiLambdaQueryWrapper.eq(Shantai::getProcInstId,procInstId)
                 .eq(Shantai::getValidFlag,"1");
         Shantai shantai = shantaiMapper.selectOne(shantaiLambdaQueryWrapper);
 
@@ -257,9 +265,9 @@ public class StDingProcServiceImpl extends ServiceImpl<ShantaiMapper, Shantai> i
         }
 
         String state = map.get("state").toString();
-        String procInstId = map.get("procInstId").toString();
 
-        if (Objects.nonNull(shantai) && dentries.isEmpty()){
+
+        if (Objects.nonNull(shantai) && shantai.getState().equals("2") && dentries.isEmpty()){
             log.info("该单据Id:{}本次无水单上传,不进行同步",flowId);
             return McR.success();
         }
@@ -267,17 +275,26 @@ public class StDingProcServiceImpl extends ServiceImpl<ShantaiMapper, Shantai> i
         //新增评论
         comment(dentries,state,userId,procInstId);
 
-        //更新表中同步状态
-        if (dentries.isEmpty()){
-            shantai.setState("2");
-        }else {
-            shantai.setState("1");
-        }
         if (Objects.isNull(shantai)){
+            //更新表中同步状态
+            shantai = new Shantai();
+            if (dentries.isEmpty()){
+                shantai.setState("2");
+            }else {
+                shantai.setState("1");
+            }
             shantai.setFlowId(flowId);
             shantai.setProcInstId(procInstId);
             shantaiMapper.insert(shantai);
         }else {
+            //更新表中同步状态
+            if (dentries.isEmpty()){
+                shantai.setState("2");
+                shantai.setFlowId(flowId);
+            }else {
+                shantai.setState("1");
+                shantai.setFlowId(flowId);
+            }
             //更新评论状态
             shantaiMapper.updateById(shantai);
         }

+ 18 - 0
mjava-shantai/src/main/resources/application-prod.yml

@@ -3,6 +3,12 @@ server:
   servlet:
     context-path: /shantai
 
+spring:
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/shantai?serverTimezone=GMT%2B8
+    username: root
+    password: ST-cloudpure2024
+    driver-class-name: com.mysql.cj.jdbc.Driver
 enable:
   scheduling: false
 logging:
@@ -11,6 +17,18 @@ logging:
   level:
     com.malk.*: debug
 
+mybatis-plus:
+  configuration:
+    #开启驼峰命名自动映射
+    map-underscore-to-camel-case: true
+    #开启日志打印
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  type-aliases-package: com.malk.shantai.entity
+  #扫描mapper文件
+  mapper-locations: classpath:mapper/*.xml
+
+
+
 # dingtalk
 dingtalk:
   agentId: 3088485347

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

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

+ 1 - 1
mjava-shantai/src/test/java/com/malk/shantai/DdTest.java

@@ -40,7 +40,7 @@ public class DdTest {
 //        stDingProcService.fkdSync("_ynuK9h3RYW4oE06B-D44A06971715048029");
 //        stDingProcService.fkdSync("lReoTnLiRbSreZKodGsyRg06971715650847");
 //        stDingProcService.fkdSync("o2zdfQO-TP6ipxqzZh9cjA06971715405894");
-        stDingProcService.fkdSync("7exy_23hSbmeenjL5oIrsg06971715765099");
+        stDingProcService.fkdSync("XCjqMX0gQ-yyacyP6RpZEw06971717501752");
 
 
     }