zhangkan пре 3 недеља
комит
06e2e53534
26 измењених фајлова са 7470 додато и 0 уклоњено
  1. 7 0
      .gitignore
  2. 28 0
      README.md
  3. 367 0
      pom.xml
  4. 21 0
      src/main/java/com/muzhi/baiqueling/BaiquelingApplication.java
  5. 15 0
      src/main/java/com/muzhi/baiqueling/common/EnvironmentVariables.java
  6. 77 0
      src/main/java/com/muzhi/baiqueling/common/R.java
  7. 12 0
      src/main/java/com/muzhi/baiqueling/common/ResultCode.java
  8. 58 0
      src/main/java/com/muzhi/baiqueling/controller/AccessTokenController.java
  9. 39 0
      src/main/java/com/muzhi/baiqueling/controller/DingTalkController.java
  10. 34 0
      src/main/java/com/muzhi/baiqueling/controller/DmsController.java
  11. 64 0
      src/main/java/com/muzhi/baiqueling/controller/MeikebaoxiaoController.java
  12. 36 0
      src/main/java/com/muzhi/baiqueling/controller/SapController.java
  13. 34 0
      src/main/java/com/muzhi/baiqueling/dingtalk/dingtalkWebhook.java
  14. 22 0
      src/main/java/com/muzhi/baiqueling/service/AccessTokenService.java
  15. 16 0
      src/main/java/com/muzhi/baiqueling/service/DingTalkService.java
  16. 15 0
      src/main/java/com/muzhi/baiqueling/service/DmsService.java
  17. 27 0
      src/main/java/com/muzhi/baiqueling/service/MeikebaoxiaoService.java
  18. 17 0
      src/main/java/com/muzhi/baiqueling/service/SapService.java
  19. 180 0
      src/main/java/com/muzhi/baiqueling/service/impl/AccessTokenServiceImpl.java
  20. 457 0
      src/main/java/com/muzhi/baiqueling/service/impl/DingTalkServiceImpl.java
  21. 702 0
      src/main/java/com/muzhi/baiqueling/service/impl/DmsServiceImpl.java
  22. 1943 0
      src/main/java/com/muzhi/baiqueling/service/impl/MeikebaoxiaoServiceImpl.java
  23. 2086 0
      src/main/java/com/muzhi/baiqueling/service/impl/SapServiceImpl.java
  24. 56 0
      src/main/resources/application.properties
  25. 1144 0
      src/test/java/com/muzhi/baiqueling/APITest/Test1.java
  26. 13 0
      src/test/java/com/muzhi/baiqueling/TestApplicationTests.java

+ 7 - 0
.gitignore

@@ -0,0 +1,7 @@
+.DS_Store
+.idea/
+target/
+*.iml
+.env
+.env.*
+!.env.example

+ 28 - 0
README.md

@@ -0,0 +1,28 @@
+# baiqueling
+
+Spring Boot integration service for DingTalk, Maycur, DMS, and SAP.
+
+## Configuration
+
+Set the following environment variables before using the corresponding integrations:
+
+- `DINGTALK_APP_KEY`
+- `DINGTALK_APP_SECRET`
+- `DINGTALK_CORP_ID`
+- `DINGTALK_YUNPU_APP_KEY`
+- `DINGTALK_YUNPU_APP_SECRET`
+- `MAYCUR_APP_CODE`
+- `MAYCUR_APP_SECRET`
+- `MAYCUR_COOKIE`
+- `DMS_ACCOUNT_INFO_CODE`
+- `DMS_OPEN_TYPE_CODE`
+- `DMS_OPEN_TYPE_SECRET`
+- `DMS_CLIENT_TYPE_CODE`
+- `SAP_COOKIE`
+- `YIDA_SYSTEM_TOKEN`
+- `YIDA_HR_SYSTEM_TOKEN`
+- `DINGTALK_CONTRACT_WEBHOOK_URL`
+- `DINGTALK_PAYMENT_WEBHOOK_URL`
+
+Integration tests additionally use `DINGTALK_TEST_MOBILE` and
+`DINGTALK_TEST_ACCESS_TOKEN`, `TEST_FILE_DOWNLOAD_URL`.

+ 367 - 0
pom.xml

@@ -0,0 +1,367 @@
+<?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.3.3.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.muzhi.xinjinqiao</groupId>
+    <artifactId>baiqueling</artifactId>
+<!--    <packaging>jar</packaging>-->
+    <version>1.0-SNAPSHOT</version>
+    <name>xinjinqiao</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <fastjson.version>1.2.33</fastjson.version>
+        <gson.version>2.8.2</gson.version>
+        <json.version>20170516</json.version>
+        <poi.version>3.17</poi.version>
+        <jodatime.version>2.10.1</jodatime.version>
+        <swagger.version>2.7.0</swagger.version>
+        <commons-fileupload.version>1.3.1</commons-fileupload.version>
+        <!--        <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>-->
+        <!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本-->
+        <!--        <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>-->
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>sonatype-nexus-staging</id>
+            <name>Sonatype Nexus Staging</name>
+            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <!-- httpClient -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.konghq</groupId>
+            <artifactId>unirest-java</artifactId>
+            <version>2.3.17</version>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.slf4j</groupId>-->
+<!--            <artifactId>slf4j-api</artifactId>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>commons-io</groupId>-->
+<!--            <artifactId>commons-io</artifactId>-->
+<!--        </dependency>-->
+
+        <!--json 组件 -->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>fastjson</artifactId>-->
+<!--            <scope>provided</scope>-->
+<!--        </dependency>-->
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.cxf</groupId>-->
+        <!--            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>-->
+        <!--            <version>3.3.1</version>-->
+        <!--        </dependency>-->
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
+        <!--&lt;!&ndash;            <version>2.3.3.RELEASE</version>&ndash;&gt;-->
+        <!--        </dependency>-->
+
+        <!--钉钉相关-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.4.35</version>
+        </dependency>
+
+        <!--json相关-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>net.sf.json-lib</groupId>-->
+        <!--            <artifactId>json-lib</artifactId>-->
+        <!--            <version>2.4</version>-->
+        <!--        </dependency>-->
+
+
+        <!-- JSONObject对象依赖的jar包 -->
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.ezmorph</groupId>
+            <artifactId>ezmorph</artifactId>
+            <version>1.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.2.3</version>
+            <classifier>jdk15</classifier><!-- 指定jdk版本 -->
+        </dependency>
+
+
+        <!--xls-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--xlsx-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--文件上传-->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
+        <!--        </dependency>-->
+
+        <!--引入web模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>2.3.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+            <version>1.18.10</version>
+        </dependency>
+
+        <!--MD5加密-->
+        <dependency>
+            <groupId>org.apache.directory.studio</groupId>
+            <artifactId>org.apache.commons.codec</artifactId>
+            <version>1.8</version>
+        </dependency>
+
+        <!--Map缓存方法:可设置Map中的Entry在一段时间后自动过期-->
+        <dependency>
+            <groupId>net.jodah</groupId>
+            <artifactId>expiringmap</artifactId>
+            <version>0.5.8</version>
+        </dependency>
+
+<!--        &lt;!&ndash;mybatis-plus数据库连接&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-boot-starter</artifactId>-->
+<!--            <version>3.2.0</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;引入mysql:数据库驱动&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>mysql</groupId>-->
+<!--            <artifactId>mysql-connector-java</artifactId>-->
+<!--            <scope>runtime</scope>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;引入druid数据源&ndash;&gt;-->
+<!--        &lt;!&ndash; https://mvnrepository.com/artifact/com.alibaba/druid &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid</artifactId>-->
+<!--            <version>1.1.9</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid-spring-boot-starter</artifactId>-->
+<!--            <version>1.1.9</version>-->
+<!--        </dependency>-->
+
+        <!--引入jpa模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <!--日期时间工具-->
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>${jodatime.version}</version>
+        </dependency>
+
+        <!--日期工具-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>4.6.8</version>
+        </dependency>
+
+        <!--log4j-->
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <!--swagger ui-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>utf8</encoding>
+                </configuration>
+            </plugin>
+
+            <!--打包跳过测试-->
+<!--            <plugin>-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-surefire-plugin</artifactId>-->
+<!--                <version>2.4.2</version>-->
+<!--                <configuration>-->
+<!--                    <skipTests>true</skipTests>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+        </plugins>
+
+        <!--映射mapper中对应的xml配置文件,如果没有mapper.xml文件则将下列注释-->
+<!--        <resources>-->
+<!--            <resource>-->
+<!--                <directory>src/main/java</directory>-->
+<!--                <includes>-->
+<!--                    <include>**/*.xml</include>-->
+
+<!--                    <include>**/*.properties</include>-->
+<!--                    <include>**/*.tld</include>-->
+<!--                    <include>**/*.xls</include>-->
+<!--                    <include>**/*.xlsx</include>-->
+<!--                </includes>-->
+<!--                <filtering>false</filtering>-->
+<!--            </resource>-->
+<!--        </resources>-->
+    </build>
+
+</project>

+ 21 - 0
src/main/java/com/muzhi/baiqueling/BaiquelingApplication.java

@@ -0,0 +1,21 @@
+package com.muzhi.baiqueling;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+//@MapperScan("com.muzhi.huaxiao.mapper")
+@EnableAsync//开启异步注解
+@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)//启动时不加载数据库(exclude= DataSourceAutoConfiguration.class)
+@EnableScheduling//开启定时任务
+//@ComponentScan(basePackages = {"com.muzhi"})
+public class BaiquelingApplication {
+
+    public static void main(String[] args){
+        SpringApplication.run(BaiquelingApplication.class, args);
+    }
+
+}

+ 15 - 0
src/main/java/com/muzhi/baiqueling/common/EnvironmentVariables.java

@@ -0,0 +1,15 @@
+package com.muzhi.baiqueling.common;
+
+public final class EnvironmentVariables {
+
+    private EnvironmentVariables() {
+    }
+
+    public static String require(String name) {
+        String value = System.getenv(name);
+        if (value == null || value.trim().isEmpty()) {
+            throw new IllegalStateException("Required environment variable is not set: " + name);
+        }
+        return value;
+    }
+}

+ 77 - 0
src/main/java/com/muzhi/baiqueling/common/R.java

@@ -0,0 +1,77 @@
+package com.muzhi.baiqueling.common;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 11:20
+ */
+
+//统一返回结果类
+@Data
+public class R {
+
+    @ApiModelProperty(value = "是否成功")
+    private Boolean success;
+
+    @ApiModelProperty(value = "返回码")
+    private Integer code;
+
+    @ApiModelProperty(value = "返回消息")
+    private String message;
+
+    @ApiModelProperty(value = "返回数据")
+    private Map<String, Object> data = new HashMap<String, Object>();
+
+    //把构造方法私有
+    private R(){}
+
+    //成功静态方法
+    public static R ok(){
+
+        R r = new R();
+        r.setSuccess(true);
+        r.setCode(ResultCode.SUCCESS);
+        r.setMessage("成功");
+        return r;
+    }
+
+    //失败静态方法
+    public static R error(){
+
+        R r = new R();
+        r.setSuccess(false);
+        r.setCode(ResultCode.ERROR);
+        r.setMessage("失败");
+        return r;
+    }
+
+    public R message(String message){
+        this.setMessage(message);
+        return this;
+    }
+
+    public R code(Integer code){
+        this.setCode(code);
+        return this;
+    }
+
+    public R data(String key, Object value){
+        this.data.put(key, value);
+        return this;
+    }
+
+    public R data(String key, String value){
+        this.data.put(key, value);
+        return this;
+    }
+
+    public R data(Map<String, Object> map){
+        this.setData(map);
+        return this;
+    }
+}

+ 12 - 0
src/main/java/com/muzhi/baiqueling/common/ResultCode.java

@@ -0,0 +1,12 @@
+package com.muzhi.baiqueling.common;
+
+/**
+ * @Author ZhangKan
+ * @Data 11:15
+ */
+public interface ResultCode {
+
+    public static Integer SUCCESS = 200;//成功
+
+    public static Integer ERROR = 201;//失败
+}

+ 58 - 0
src/main/java/com/muzhi/baiqueling/controller/AccessTokenController.java

@@ -0,0 +1,58 @@
+package com.muzhi.baiqueling.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "钉钉授权AccessToken")
+@RestController
+@RequestMapping("/dingservice")
+@CrossOrigin//解决跨域问题
+public class AccessTokenController {
+
+    @Autowired
+    private com.muzhi.baiqueling.service.AccessTokenService AccessTokenService;
+
+    //获取钉钉中的access_token(钉钉应用)
+    @ApiOperation(value = "获取钉钉中的access_token")
+    @GetMapping("getAccessToken_YunpuPOC")
+    public String getAccessToken_YunpuPOC(){
+
+        String accessToken_yunpuPOC = AccessTokenService.getAccessToken_YunpuPOC();
+        return accessToken_yunpuPOC;
+    }
+
+    //获取钉钉中的access_token(钉钉应用)
+    @ApiOperation(value = "获取钉钉中的access_token")
+    @GetMapping("getAccessToken")
+    public String getAccessToken(){
+
+        String accessToken = AccessTokenService.getAccessToken();
+        return accessToken;
+    }
+
+    //获取每刻报销token授权码
+    @ApiOperation(value = "获取每刻报销token授权码")
+    @GetMapping("getAccessToken_meike")
+    public JSONObject getAccessToken_meike(){
+
+        JSONObject accessToken_meike = AccessTokenService.getAccessToken_meike();
+        return accessToken_meike;
+    }
+
+    //获取DMS的token授权码
+    @ApiOperation(value = "获取DMS的token授权码")
+    @GetMapping("getAccessToken_dms")
+    public String getAccessToken_dms(){
+
+        String accessToken_dms = AccessTokenService.getAccessToken_dms();
+        return accessToken_dms;
+    }
+}

+ 39 - 0
src/main/java/com/muzhi/baiqueling/controller/DingTalkController.java

@@ -0,0 +1,39 @@
+package com.muzhi.baiqueling.controller;
+
+import com.muzhi.baiqueling.service.DingTalkService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+import com.muzhi.baiqueling.common.R;
+
+
+@Api(description = "钉钉")
+@RestController
+@RequestMapping("/dingservice")
+//@CrossOrigin//解决跨域问题
+public class DingTalkController {
+
+    @Autowired
+    private DingTalkService dingTalkService;
+
+    /**获取钉钉组织架构人员花名册信息同步至宜搭*/
+    @ApiOperation(value = "获取钉钉组织架构人员花名册信息同步至宜搭")
+    @PostMapping("synHuamingce")
+    public R getHuamingce(){
+
+        dingTalkService.getHuamingce();
+        return R.ok();
+    }
+
+    /**更新花名册信息*/
+    @ApiOperation(value = "更新花名册信息")
+    @PostMapping("updateHuamingce")
+    public R updateHuamingce(){
+
+        dingTalkService.updateHuamingce();
+        return R.ok();
+    }
+}

+ 34 - 0
src/main/java/com/muzhi/baiqueling/controller/DmsController.java

@@ -0,0 +1,34 @@
+package com.muzhi.baiqueling.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.common.R;
+import com.muzhi.baiqueling.service.DmsService;
+import com.muzhi.baiqueling.service.SapService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "DMS接口")
+@RestController
+@RequestMapping("/dmsService")
+@CrossOrigin//解决跨域问题
+public class DmsController {
+
+    @Autowired
+    private DmsService dmsService;
+
+    //智能合同推送同步DMS销售合同
+    @ApiOperation(value = "智能合同推送同步DMS销售合同")
+    @PostMapping("syncDmsXSHT")
+    public R syncDmsXSHT(@RequestBody JSONObject obj){
+
+        R syncDmsXSHT = dmsService.syncDmsXSHT(obj);
+        return syncDmsXSHT;
+    }
+}

+ 64 - 0
src/main/java/com/muzhi/baiqueling/controller/MeikebaoxiaoController.java

@@ -0,0 +1,64 @@
+package com.muzhi.baiqueling.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.service.MeikebaoxiaoService;
+import com.muzhi.baiqueling.common.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "每刻报销接口")
+@RestController
+@RequestMapping("/meikebaoxiaoService")
+@CrossOrigin//解决跨域问题
+public class MeikebaoxiaoController {
+
+    @Autowired
+    private MeikebaoxiaoService meikebaoxiaoService;
+
+    //智能合同推送同步每刻报销付款单
+    @ApiOperation(value = "智能合同推送同步每刻报销付款单")
+    @PostMapping("syncMeikebaoxiaoFK")
+    public R syncMeikebaoxiaoFK(@RequestBody JSONObject obj){
+
+        R syncMeikebaoxiaoFK = meikebaoxiaoService.syncMeikebaoxiaoFK(obj);
+        return syncMeikebaoxiaoFK;
+    }
+
+    //每刻报销付款单webhook推送创建智能合同账款
+    @ApiOperation(value = "每刻报销付款单webhook推送创建智能合同账款")
+    @PostMapping("syncZhinenghetongZK")
+    public Map syncZhinenghetongZK(@RequestBody JSONObject obj){
+
+        Map syncZhinenghetongZK = meikebaoxiaoService.syncZhinenghetongZK(obj);
+        return syncZhinenghetongZK;
+    }
+
+    //NOTE 20260416新增需求
+    //钉钉OA审批推送同步每刻报销申请单
+    @ApiOperation(value = "钉钉OA审批推送同步每刻报销申请单")
+    @PostMapping("syncMeikebaoxiaoSQ")
+    public R syncMeikebaoxiaoSQ(String processInstanceId){
+
+        R syncMeikebaoxiaoSQ = meikebaoxiaoService.syncMeikebaoxiaoSQ(processInstanceId);
+        return syncMeikebaoxiaoSQ;
+    }
+
+    //NOTE 20260715新增需求
+    //每刻报销付款单webhook推送创建智能合同单据
+    @ApiOperation(value = "每刻报销付款单webhook推送创建智能合同单据")
+    @PostMapping("syncZhinenghetongHT")
+    public Map syncZhinenghetongHT(@RequestBody JSONObject obj){
+
+        Map syncZhinenghetongHT = meikebaoxiaoService.syncZhinenghetongHT(obj);
+        return syncZhinenghetongHT;
+    }
+}

+ 36 - 0
src/main/java/com/muzhi/baiqueling/controller/SapController.java

@@ -0,0 +1,36 @@
+package com.muzhi.baiqueling.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.common.R;
+import com.muzhi.baiqueling.service.MeikebaoxiaoService;
+import com.muzhi.baiqueling.service.SapService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "每刻报销接口")
+@RestController
+@RequestMapping("/sapService")
+@CrossOrigin//解决跨域问题
+public class SapController {
+
+    @Autowired
+    private SapService sapService;
+
+    //智能合同推送同步SAP销售指标
+    @ApiOperation(value = "智能合同推送同步SAP销售指标")
+    @PostMapping("syncSapXSZB")
+    public R syncSapXSZB(@RequestBody JSONObject obj){
+
+        R syncSapXSZB = sapService.syncSapXSZB(obj);
+        return syncSapXSZB;
+    }
+}

+ 34 - 0
src/main/java/com/muzhi/baiqueling/dingtalk/dingtalkWebhook.java

@@ -0,0 +1,34 @@
+package com.muzhi.baiqueling.dingtalk;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class dingtalkWebhook {
+
+
+    public static void dingtalkWebhook(String webhookUrl, String mapStr){
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("text/plain");
+        RequestBody body = RequestBody.create(mediaType, mapStr);
+        Request request = new Request.Builder()
+                .url(webhookUrl)
+                .method("POST", body)
+                .build();
+        JSONObject jsonObject = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            jsonObject = JSON.parseObject(bodyStr);
+            System.out.println("返回体body{}:" + jsonObject);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+}

+ 22 - 0
src/main/java/com/muzhi/baiqueling/service/AccessTokenService.java

@@ -0,0 +1,22 @@
+package com.muzhi.baiqueling.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface AccessTokenService {
+
+    //获取access_token的方法(钉钉应用)
+    String getAccessToken_YunpuPOC();
+
+    //获取access_token的方法(钉钉应用)
+    String getAccessToken();
+
+    //获取每刻报销token授权码
+    JSONObject getAccessToken_meike();
+
+    //获取DMS的token授权码
+    String getAccessToken_dms();
+}

+ 16 - 0
src/main/java/com/muzhi/baiqueling/service/DingTalkService.java

@@ -0,0 +1,16 @@
+package com.muzhi.baiqueling.service;
+
+import com.muzhi.baiqueling.common.R;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface DingTalkService {
+
+    /**获取钉钉组织架构人员花名册信息同步至宜搭*/
+    R getHuamingce();
+
+    /**更新花名册信息*/
+    R updateHuamingce();
+}

+ 15 - 0
src/main/java/com/muzhi/baiqueling/service/DmsService.java

@@ -0,0 +1,15 @@
+package com.muzhi.baiqueling.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.common.R;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface DmsService {
+
+    //智能合同推送同步DMS销售合同
+    R syncDmsXSHT(JSONObject obj);
+
+}

+ 27 - 0
src/main/java/com/muzhi/baiqueling/service/MeikebaoxiaoService.java

@@ -0,0 +1,27 @@
+package com.muzhi.baiqueling.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.common.R;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface MeikebaoxiaoService {
+
+    //智能合同推送同步每刻报销付款单
+    R syncMeikebaoxiaoFK(JSONObject obj);
+
+    //每刻报销付款单webhook推送创建智能合同账款
+    Map syncZhinenghetongZK(JSONObject obj);
+
+    //NOTE 20260416新增需求
+    //钉钉OA审批推送同步每刻报销申请单
+    R syncMeikebaoxiaoSQ(String processInstanceId);
+
+    //NOTE 20260715新增需求
+    //每刻报销付款单webhook推送创建智能合同单据
+    Map syncZhinenghetongHT(JSONObject obj);
+}

+ 17 - 0
src/main/java/com/muzhi/baiqueling/service/SapService.java

@@ -0,0 +1,17 @@
+package com.muzhi.baiqueling.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.baiqueling.common.R;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface SapService {
+
+    //智能合同推送同步SAP销售指标
+    R syncSapXSZB(JSONObject obj);
+
+}

+ 180 - 0
src/main/java/com/muzhi/baiqueling/service/impl/AccessTokenServiceImpl.java

@@ -0,0 +1,180 @@
+package com.muzhi.baiqueling.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.response.OapiGettokenResponse;
+import com.google.common.collect.Maps;
+import com.muzhi.baiqueling.common.EnvironmentVariables;
+import com.muzhi.baiqueling.service.AccessTokenService;
+import com.taobao.api.ApiException;
+import okhttp3.*;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @Author ZhangKan
+ * @Data 15:39
+ */
+
+@Service
+public class AccessTokenServiceImpl implements AccessTokenService {
+
+    public static String DingtalkAccessToken_YunpuPOC = null;
+
+    //获取dingtalk授权码(钉钉应用)
+    @Override
+    public String getAccessToken_YunpuPOC() {
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        request.setAppkey(EnvironmentVariables.require("DINGTALK_YUNPU_APP_KEY"));
+        request.setAppsecret(EnvironmentVariables.require("DINGTALK_YUNPU_APP_SECRET"));
+        request.setHttpMethod("GET");
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            DingtalkAccessToken_YunpuPOC = response.getAccessToken();
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+        return DingtalkAccessToken_YunpuPOC;
+    }
+
+    public static String DingtalkAccessToken = null;
+
+    //获取dingtalk授权码(钉钉应用)
+    @Override
+    public String getAccessToken() {
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        request.setAppkey(EnvironmentVariables.require("DINGTALK_APP_KEY"));
+        request.setAppsecret(EnvironmentVariables.require("DINGTALK_APP_SECRET"));
+        request.setHttpMethod("GET");
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            DingtalkAccessToken = response.getAccessToken();
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+        return DingtalkAccessToken;
+    }
+
+    /**
+     *每刻钉钉云服务器环境地址(钉版)
+     *正式环境:https://dt.maycur.com
+     */
+    private static String HTTP_HOST = "https://dt.maycur.com";
+
+
+    //获取每刻报销token授权码
+    @Override
+    public JSONObject getAccessToken_meike() {
+        //appCode和appSecret请联系每刻工作人员
+        String appCode = EnvironmentVariables.require("MAYCUR_APP_CODE");
+        String appSecret = EnvironmentVariables.require("MAYCUR_APP_SECRET");
+
+        long timeMillis = System.currentTimeMillis();
+        System.out.println("timeMillis:" + timeMillis);
+
+        String secret = DigestUtils.sha256Hex(appSecret + ":" + appCode + ":" + timeMillis);
+
+        Map map = Maps.newHashMap();
+        map.put("secret", secret);
+        map.put("appCode", appCode);
+        map.put("timestamp", timeMillis);
+        String parmsStr = JSON.toJSONString(map);
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, parmsStr);
+        Request request = new Request.Builder()
+                .url(HTTP_HOST +"/api/openapi/auth/login")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Cookie", EnvironmentVariables.require("MAYCUR_COOKIE"))
+                .build();
+        String code = "";
+        String message = "";
+        JSONObject dataObj = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObjectMK = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObjectMK);
+            code = jsonObjectMK.getString("code");
+            message = jsonObjectMK.getString("message");
+
+            dataObj = jsonObjectMK.getJSONObject("data");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询每刻报销【接口授权码】接口返回的状态码(code):" + code);
+        System.out.println("查询每刻报销【接口授权码】接口返回的信息(message):" + message);
+
+        String tokenId = null;
+        String entCode = null;
+        if (dataObj != null){
+            tokenId = dataObj.getString("tokenId");
+            entCode = dataObj.getString("entCode");
+        }
+
+        return dataObj;
+    }
+
+    /**
+     * DMS接口环境地址
+     * 测试环境:http://121.37.206.131:17000
+     * 正式环境:https://dms.pechoin.com
+     * */
+    private static String HTTP_HOST_DMS_TEST = "http://121.37.206.131:17000";
+    private static String HTTP_HOST_DMS = "https://dms.pechoin.com";
+
+    //获取DMS的token授权码
+    @Override
+    public String getAccessToken_dms() {
+        //密钥参数由DMS侧提供
+        String accountinfocode = EnvironmentVariables.require("DMS_ACCOUNT_INFO_CODE");
+        String opentypecode = EnvironmentVariables.require("DMS_OPEN_TYPE_CODE");
+        String opentypesecret = EnvironmentVariables.require("DMS_OPEN_TYPE_SECRET");
+        String clienttypecode = EnvironmentVariables.require("DMS_CLIENT_TYPE_CODE");
+
+        Map map = new HashMap<>();
+        map.put("accountinfocode", accountinfocode);
+        map.put("opentypecode", opentypecode);
+        map.put("opentypesecret", opentypesecret);
+        map.put("clienttypecode", clienttypecode);
+        String parmsStr = JSON.toJSONString(map);
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, parmsStr);
+        Request request = new Request.Builder()
+                .url(HTTP_HOST_DMS_TEST +"/api/auth/openlogin")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .build();
+
+        String token = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObjectDMS = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObjectDMS);
+            JSONObject resp_data = jsonObjectDMS.getJSONObject("resp_data");
+            System.out.println("resp_data===>" + resp_data);
+
+            token = resp_data.getString("token");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return token;
+    }
+}

Разлика између датотеке није приказан због своје велике величине
+ 457 - 0
src/main/java/com/muzhi/baiqueling/service/impl/DingTalkServiceImpl.java


+ 702 - 0
src/main/java/com/muzhi/baiqueling/service/impl/DmsServiceImpl.java

@@ -0,0 +1,702 @@
+package com.muzhi.baiqueling.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse;
+import com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muzhi.baiqueling.common.EnvironmentVariables;
+import com.muzhi.baiqueling.common.R;
+import com.muzhi.baiqueling.service.AccessTokenService;
+import com.muzhi.baiqueling.service.DmsService;
+import com.muzhi.baiqueling.service.SapService;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.text.SimpleDateFormat;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * @Author ZhangKan
+ * @Data 15:39
+ */
+
+@Service
+@Slf4j
+public class DmsServiceImpl implements DmsService {
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    public static com.aliyun.dingtalkworkflow_1_0.Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkworkflow_1_0.Client(config);
+    }
+
+    //宜搭接口调用
+    public static com.aliyun.dingtalkyida_1_0.Client createClient_yida() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkyida_1_0.Client(config);
+    }
+
+    /**
+     * DMS接口环境地址
+     * 测试环境:http://121.37.206.131:17000
+     * 正式环境:https://dms.pechoin.com
+     * */
+    private static String URL_test = "http://121.37.206.131:17000";
+    private static String URL = "https://dms.pechoin.com";
+
+    public void createDmsXSZB(String processInstanceId, String year,
+                              String kehuId, String kehumingcheng, String htbh, String htmc,
+                              String htksrq, String htjsrq, String htje,
+                              String fenxiaoqudao, String pinpai, String htzt, String file){
+        String message = null;
+        String success = null;
+        JSONObject jsonObjectDMS = null;
+
+        String error_type = null;
+        String error_code = null;
+
+        htzt = "3";//TODO 正式环境该参数需切换成传文本
+
+        Map map1 = new HashMap();
+        map1.put("id", "");//主键
+        map1.put("contract_number", htbh);//合同编号
+        map1.put("contract_name", htmc);//合同名称
+        map1.put("begin_time", htksrq);//合同开始日期
+        map1.put("end_time", htjsrq);//合同结束日期
+        map1.put("total_amount", htje);//合同总金额
+        map1.put("channel", fenxiaoqudao);//渠道
+        map1.put("brand", pinpai);//品牌
+        map1.put("channel_code", kehuId);//经销商编号(智能合同:客户编号)
+        map1.put("status", htzt);//合同状态【执行中=0;已终止=1;诉讼中=2;履约完成=3;-->默认=3(按照智能合同归档完成状态进行推送)】
+        map1.put("text_data", "");//合同正文
+        map1.put("annex_data", file);//合同附件
+        map1.put("channel_name", kehumingcheng);//客户名称
+        map1.put("type", "2");//合同类型【默认=2(销售合同)】
+        map1.put("old_id", "");//原合同id
+
+        List listMX = new ArrayList();
+        listMX.add(map1);
+
+        //封装查询参数
+        Map mapAll = new HashMap();
+        mapAll.put("tn_contract_system_data_new_use", listMX);
+
+        String mapJsonString = JSON.toJSONString(mapAll);
+        System.out.println("封装DMS【销售合同】更新接口的参数:" + mapJsonString);
+
+        /**调用dms销售合同写入接口*/
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, mapJsonString);
+        Request request = new Request.Builder()
+                .url(URL + "/api/teapi/dy-biz/1712024982718124130/1934778210931839075")
+                .method("POST", body)
+                .addHeader("token", accessTokenService.getAccessToken_dms())
+                .addHeader("Content-Type", "application/json")
+                .build();
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            jsonObjectDMS = JSON.parseObject(bodyStr);
+            System.out.println("返回体body{}:" + jsonObjectDMS);
+
+            if (!jsonObjectDMS.isEmpty() && jsonObjectDMS != null) {
+                //{"error_type":500,"error_code":"入参的类型不正确,请检查参数!"}
+                try {
+                    error_type = jsonObjectDMS.getString("error_type");
+                    error_code = jsonObjectDMS.getString("error_code");
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+                if (error_type != null){
+                    log.info("推送dms【销售合同】接口返回的错误信息(error_code):" + error_type);
+                }else {
+                    message = jsonObjectDMS.getJSONObject("resp_data").getJSONObject("result").getString("message");
+                    success = jsonObjectDMS.getJSONObject("resp_data").getJSONObject("result").getString("status");
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("推送dms【销售合同】接口返回的结果信息(message):" + message);
+        System.out.println("推送dms【销售合同】接口返回的成功与否(success):" + success);
+
+        if (success != null && success.equals("success")){
+            log.info("推送dms【销售合同】接口返回成功!");
+            /**调用更新宜搭日志记录表*/
+            createYiDaoLog("DMS","同步成功",message,null,null,null,processInstanceId,null,null,null, kehuId,
+                    kehumingcheng, htksrq, htjsrq, htje, fenxiaoqudao, pinpai, htzt, null);
+        }else {
+            log.info("推送dms【销售合同】接口返回失败!");
+            /**调用更新宜搭日志记录表*/
+            createYiDaoLog("DMS","同步失败",message + "-->error_code:" + error_code,null,null,null,processInstanceId,null,null,null, kehuId,
+                    kehumingcheng, htksrq, htjsrq, htje, fenxiaoqudao, pinpai, htzt,null);
+        }
+    }
+
+    //获取钉钉合同审批单信息(销售审批),用于判断单据内容
+    public JSONObject getDingHetongXS(String slid){
+
+        JSONObject result = null;
+        try {
+            com.aliyun.dingtalkworkflow_1_0.Client client = createClient();
+            com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders getProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders();
+            getProcessInstanceHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceRequest getProcessInstanceRequest = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceRequest()
+                    .setProcessInstanceId(slid);
+
+            GetProcessInstanceResponse processInstanceWithOptions = client.getProcessInstanceWithOptions(getProcessInstanceRequest, getProcessInstanceHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(processInstanceWithOptions.getBody());
+//            System.out.println("审批实例详情:" + s);
+            JSONObject jsonObject = JSONObject.parseObject(s);
+            result = jsonObject.getJSONObject("result");
+//            formComponentValues = result.getJSONArray("formComponentValues");
+//            System.out.println("审批实例详情,表单内容:" + formComponentValues);
+//            if (formComponentValues.size() > 0 && formComponentValues != null && !formComponentValues.isEmpty()){
+//                for (int i = 0; i < formComponentValues.size(); i++) {
+//                    String name = formComponentValues.getJSONObject(i).getString("name");
+//                    switch (name){
+//                        case "客户编码":
+//                            if (formComponentValues.getJSONObject(i).getString("value") != null){
+//                                String value = formComponentValues.getJSONObject(i).getString("value");
+//                                System.out.println("***《《《客户编码》》》***-->" + value);
+//
+//                                map.put("客户编码", value);
+//                            }
+//                            break;
+//                    }
+//                }
+//            }
+
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        }
+
+        return result;
+    }
+
+    //创建DMS销售合同【通用】
+    public void createDmsXSHT(String processInstanceId, String year, JSONArray formComponentValues,
+                                     String htbh, String htmc, String htksrq, String htjsrq, String htje, String file){
+        log.info("【销售合同通用】钉钉审批单数据:" + formComponentValues);
+        log.info("传参解析中......");
+
+        //客户id
+        String kehuId = null;
+        //客户名称
+        String kehumingcheng = null;
+        //分销渠道
+        String fenxiaoqudao = null;
+        //品牌
+        String pinpai = null;
+
+        for (int i = 0; i < formComponentValues.size(); i++) {
+            String name = formComponentValues.getJSONObject(i).getString("name");
+            if (name != null){
+                switch (name){
+                    case "分销渠道":
+                        if (formComponentValues.getJSONObject(i).getString("value") != null){
+                            fenxiaoqudao = formComponentValues.getJSONObject(i).getString("value");
+                            System.out.println("***《《《分销渠道》》》***-->" + fenxiaoqudao);
+                        }
+                        break;
+                    case "品牌":
+                        if (formComponentValues.getJSONObject(i).getString("value") != null){
+                            pinpai = formComponentValues.getJSONObject(i).getString("value");
+                            System.out.println("***《《《品牌》》》***-->" + pinpai);
+                        }
+                        break;
+                    case "客户编码":
+                        if (formComponentValues.getJSONObject(i).getString("value") != null){
+                            kehuId = formComponentValues.getJSONObject(i).getString("value");
+                            System.out.println("***《《《客户编码》》》***-->" + kehuId);
+                        }
+                        break;
+                    case "客户名称":
+                        if (formComponentValues.getJSONObject(i).getString("value") != null){
+                            kehumingcheng = formComponentValues.getJSONObject(i).getString("value");
+                            System.out.println("***《《《客户名称》》》***-->" + kehumingcheng);
+                        }
+                        break;
+                }
+            }
+        }
+
+        /**调用DMS合同信息写入接口*/
+        createDmsXSZB(processInstanceId, year, kehuId, kehumingcheng, htbh, htmc, htksrq, htjsrq, htje, fenxiaoqudao, pinpai, "已归档", file);
+    }
+
+    //新增或更新宜搭日志记录表
+    public void createYiDaoLog(String type, String status, String logStr,
+                               String contractId, String contractNo, String contractName,
+                               String processInstanceId, String contractStatus, String amountType, String year, String kehuid,
+                               String kehumingcheng, String htksrq, String htjsrq, String htje, String qudao, String pinpai, String htzt,
+                               String fileNewUrl) {
+        /**将接收参数先同步创建至宜搭日志记录表*/
+        //新增或更新表单实例【宜搭】
+        Map map = new HashMap();
+        map.put("selectField_mdlip8xx", type);//目标系统(SAP、每刻报销、DMS)
+        map.put("selectField_madnfm71", status);//同步状态「参数已记录、同步成功、同步失败」
+        map.put("textareaField_madnfm73", logStr);//日志说明
+        map.put("textField_mdo6t6wo", kehuid);//客户编号
+
+        map.put("textField_mewmhr4x", kehumingcheng);//客户名称
+        map.put("textField_mewmhr4l", qudao);//渠道
+        map.put("textField_mewmhr4m", pinpai);//品牌
+
+        if (status.equals("参数已记录")){
+            map.put("textField_manvwy3j", processInstanceId);//钉钉审批数据实例ID
+            map.put("textField_mdlip8yf", contractId);//合同id(智能合同)
+            map.put("textField_mdlip8yg", contractNo);//合同编号(钉钉审批)
+            map.put("textField_mdlip8yh", contractName);//合同名称
+            map.put("textField_mdlip8yo", contractStatus);//合同状态
+            map.put("textField_mdlip8yp", amountType);//金额类型
+            map.put("textField_mdlip8yq", year);//合同所属年份
+
+            map.put("textField_mewmhr4d", htksrq);//合同开始日期
+            map.put("textField_mewmhr4e", htjsrq);//合同结束日期
+            map.put("numberField_mewmhr4k", htje);//合同金额
+            map.put("numberField_mewmhr4t", htzt);//dms合同状态
+
+            map.put("textField_mewmhr4w", fileNewUrl);//【百雀羚服务器】文件地址
+        }
+
+        String mapJson = JSON.toJSONString(map);
+        System.out.println("mapJson:" + mapJson);
+
+        /**
+         * 宜搭表单判断查询条件
+         * 项目推送TB日志记录
+         * */
+        //宜搭表单判断查询条件
+        Map map1 = new HashMap();
+        //字段编号
+        map1.put("key", "textField_manvwy3j");
+        //同步类型
+        map1.put("value", processInstanceId);
+        //控件类型
+        map1.put("type", "TEXT");
+        //逻辑判断符
+        map1.put("operator", "eq");
+        //控件名称
+        map1.put("componentName", "TextField");
+
+        Map map2 = new HashMap();
+        //字段编号
+        map2.put("key", "selectField_mdlip8xx");
+        //同步类型
+        map2.put("value", type);
+        //控件类型
+        map2.put("type", "ARRAY");
+        //逻辑判断符
+        map2.put("operator", "eq");
+        //控件名称
+        map2.put("componentName", "SelectField");
+
+        List list11 = new ArrayList();
+        list11.add(map1);
+        list11.add(map2);
+
+        String listJson = JSON.toJSONString(list11);
+        System.out.println("查询条件listJson:" + listJson);
+
+        JSONObject jsonObjectYD = null;
+        String slidFalg = null;
+        try {
+            com.aliyun.dingtalkyida_1_0.Client client11 = createClient_yida();
+            com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
+            createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
+                    //应用秘钥
+                    .setSystemToken(EnvironmentVariables.require("YIDA_SYSTEM_TOKEN"))
+                    //表单编码
+                    .setFormUuid("FORM-349A5D1A8CBD4271BCEDBE94A60A7BCDOSXX")//云璞POC:FORM-64009DF27F5F479BBC82CD6C1768B5FAC0DY
+                    .setUserId("yida_pub_account")
+                    .setSearchCondition(listJson)
+                    //应用编码
+                    .setAppType("APP_TQ5O9UKY2WDJV3QQE1VO")//云璞POC:APP_WLGLCYJR57ZJ51VAE8VK
+                    .setFormDataJson(mapJson);
+
+            CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
+            jsonObjectYD = JSON.parseObject(s);
+            System.out.println("【创建或更新】表单object对象:" + jsonObjectYD);
+            if (jsonObjectYD != null && !jsonObjectYD.isEmpty()) {
+                //新增或更新的表单实例id
+                slidFalg = jsonObjectYD.getJSONArray("result").getString(0);
+            }
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        }
+        System.out.println("新增或更新的表单实例id:" + slidFalg);
+    }
+
+    /**
+     * 从指定URL下载文件到本地路径
+     */
+    public static File downloadFile(String urlPath, String downloadDir, String fileName) {
+        File file = null;
+        try {
+
+            URL url = new URL(urlPath);
+
+            URLConnection urlConnection = url.openConnection();
+
+            HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;// http的连接类
+
+            //String contentType = httpURLConnection.getContentType();//请求类型,可用来过滤请求,
+
+            httpURLConnection.setConnectTimeout(1000*5);//设置超时
+
+            httpURLConnection.setRequestMethod("GET");//设置请求方式,默认是GET
+
+            httpURLConnection.setRequestProperty("Charset", "UTF-8");// 设置字符编码
+
+
+            httpURLConnection.connect();// 打开连接
+
+            BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
+
+            //TODO 修改成动态文件名称:当前审批单的文件名称
+//            String fileName = "ceshi.pdf";// 指定文件名称
+
+            String path = "file" + File.separatorChar + downloadDir + File.separatorChar + fileName;// 指定存放位置,此处使用的是全局变量的文件名称
+            file = new File(path);
+            // 校验文件夹目录是否存在,不存在就创建一个目录
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+
+            OutputStream out = new FileOutputStream(file);
+            int size = 0;
+
+            byte[] b = new byte[2048];
+            //把输入流的文件读取到字节数据b中,然后输出到指定目录的文件
+            while ((size = bin.read(b)) != -1) {
+                out.write(b, 0, size);
+            }
+            // 关闭资源
+            bin.close();
+            out.close();
+            System.out.println("文件下载成功!");
+        } catch (MalformedURLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            return null;
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            System.out.println("文件下载失败!");
+            return null;
+        } finally {
+            return file;
+        }
+
+    }
+
+    public static boolean isBetween0And5() {
+        LocalTime now = LocalTime.now(); // 获取当前本地时间
+        LocalTime start = LocalTime.of(0, 0);  // 00:00
+        LocalTime end = LocalTime.of(6, 0);    // 06:00(不包含)
+
+        return !now.isBefore(start) && now.isBefore(end);
+        // 等价于:now >= 00:00 且 now < 06:00
+    }
+
+    //【启用】智能合同推送同步DMS销售合同
+    @Override
+    public R syncDmsXSHT(JSONObject obj){
+        log.info("接收传参「智能合同单据上的钉钉OA审批单实例id」:" + obj);
+
+        log.info("传参解析中......");
+
+        /**
+         * 判断是否为每天的0点~5点,如果属于该天的该时段,就不执行该接口
+         * 原因:因为智能合同中,会在合同到期日的凌晨批量推送到期合同信息,避免执行该批数据,导致推送b2b异常
+         * */
+        if (isBetween0And5()) {
+            System.out.println("当前时间在 0:00 ~ 5:59 之间,不执行该接口推送!");
+        } else {
+            System.out.println("当前时间属于正常工作时段,正常执行该接口===");
+
+            //合同id(智能合同)
+            String contractId = null;
+            //合同编号(钉钉审批)
+            String contractNo = null;
+            //合同名称
+            String contractName = null;
+
+            //合同金额
+            String htje = "0";
+            //合同开始时间
+            String contractStartDateText = null;
+            //合同结束时间
+            String contractEndDateText = null;
+
+            //审批实例id
+            String processInstanceId = null;
+            //合同状态
+            String contractStatus = null;
+            //金额类型
+            String amountType = null;
+            //合同所属年份
+            String year = null;
+
+            //客户编号
+            String khbh = null;
+            //客户名称
+            String khmc = null;
+            //渠道
+            String qd = null;
+            //品牌
+            String pp = null;
+            //dms合同状态
+            String dmshtzt = "3";
+
+            //合同附件
+            String file = "";
+
+            //【百雀羚服务器】合同归档文件下载地址
+            String fileNewUrl = null;
+
+            //查询传参标记(手动同步、系统同步)
+            String flag = obj.getString("flag");
+
+            if (flag.equals("手动同步")){
+                processInstanceId = obj.getString("processInstanceId");
+                System.out.println("钉钉审批实例id:" + processInstanceId);
+                contractStatus = obj.getString("contractStatus");
+                System.out.println("智能合同状态:" + contractStatus);
+                amountType = obj.getString("amountType");
+                System.out.println("智能合同类型:" + amountType);
+                year = obj.getString("year");
+                System.out.println("合同所属年份:" + year);
+
+                khbh = obj.getString("khbh");
+                System.out.println("客户编号:" + khbh);
+                khmc = obj.getString("khmc");
+                System.out.println("客户名称:" + khmc);
+                contractNo = obj.getString("htbh");
+                System.out.println("钉钉合同编号:" + contractNo);
+                contractName = obj.getString("htmc");
+                System.out.println("钉钉合同名称:" + contractName);
+                contractStartDateText = obj.getString("htksrq");
+                System.out.println("合同开始日期:" + contractStartDateText);
+                contractEndDateText = obj.getString("htjsrq");
+                System.out.println("合同结束日期:" + contractEndDateText);
+                htje = obj.getString("htje");
+                System.out.println("合同金额:" + htje);
+                qd = obj.getString("qd");
+                System.out.println("分销渠道:" + qd);
+                pp = obj.getString("pp");
+                System.out.println("品牌:" + pp);
+                dmshtzt = obj.getString("dmshtzt");
+                System.out.println("dms合同状态:" + dmshtzt);
+                fileNewUrl = obj.getString("file");
+                System.out.println("合同附件:" + file);
+            }else {
+                //【推送数据:object】
+                JSONObject data = obj.getJSONObject("data");
+
+                //合同id
+                contractId = data.getString("contractId");
+                //合同编号(合同编号,企业根据需要设置的合同编号)
+                contractNo = data.getString("contractNo");
+                System.out.println("合同编号(合同编号,企业根据需要设置的合同编号):" + contractNo);
+                System.out.println("合同id:" + contractId);
+                //合同名称
+                contractName = data.getString("contractName");
+                System.out.println("合同名称:" + contractName);
+
+                //审批实例id(审批实例 id,仅通过审批发起的合同有值)
+                processInstanceId = data.getString("processInstanceId");
+                System.out.println("审批实例id(审批实例 id,仅通过审批发起的合同有值):" + processInstanceId);
+
+                //合同状态(合同状态: approving: 审批中, signing: 签署中, canceled: 已作废, withdraw: 已撤销, refused: 已拒绝, not-archive: 待归档, archive-confirming: 归档确认中, archived: 已归档)
+                contractStatus = data.getString("contractStatus");
+                System.out.println("合同状态: approving: 审批中, signing: 签署中, canceled: 已作废, withdraw: 已撤销, refused: 已拒绝, not-archive: 待归档, archive-confirming: 归档确认中, archived: 已归档:" + contractStatus);
+                //金额类型(payment_party_other: 收入, payment_party_our: 支出, none: 无金额)
+                amountType = data.getString("amountType");
+                System.out.println("金额类型(payment_party_other: 收入, payment_party_our: 支出, none: 无金额):" + amountType);
+
+                //金额数量(浮点型)
+                htje = data.getString("contractAmount");
+                System.out.println("金额数量(浮点型):" + htje);
+
+                //合同开始时间(Unix时间戳,单位毫秒)
+                long contractStartDate = 0;
+                long contractEndDate = 0;
+                try {
+                    contractStartDate = data.getLong("contractStartDate") != null ? data.getLong("contractStartDate") : 0;
+                    System.out.println("合同开始时间(Unix时间戳,单位毫秒):" + contractStartDate);
+                    //将合同开始时间的毫秒级时间戳转成年月日文本格式
+                    if (contractStartDate != 0){
+                        contractStartDateText = DateUtil.format(new Date(contractStartDate), "yyyy-MM-dd");
+                        System.out.println("合同开始时间(文本):" + contractStartDateText);
+                    }
+                    //合同结束时间(Unix时间戳,单位毫秒)
+                    contractEndDate = data.getLong("contractEndDate");
+                    System.out.println("合同结束时间(Unix时间戳,单位毫秒):" + contractEndDate);
+                    if (contractEndDate != 0){
+                        //将合同结束时间的毫秒级时间戳转成年月日文本格式
+                        contractEndDateText = DateUtil.format(new Date(contractEndDate), "yyyy-MM-dd");
+                        System.out.println("合同结束时间(文本):" + contractEndDateText);
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+                if (contractStartDate != 0){
+                    int yearInt = DateUtil.year(new Date(contractStartDate));
+                    year = String.valueOf(yearInt);
+                    System.out.println("获取合同开始日期的时间戳年份:" + year);
+                }else {
+                    //获取当前年份
+                    year = DateUtil.format(new Date(), "yyyy");
+                    System.out.println("获取当前年份:" + year);
+                }
+
+                if (contractStatus.equals("archived") && amountType.equals("payment_party_other")) {
+                    //TODO 合同附件,需要将智能合同的附件下载到客户服务器,并将服务器文件的完整地址传入dms接口
+                    //【合同归档文件:array】
+                    JSONArray contractArchiveFiles = data.getJSONArray("contractArchiveFiles");
+                    if (contractArchiveFiles.size() > 0) {
+                        JSONObject contractArchiveItems = contractArchiveFiles.getJSONObject(0);
+                        //文件名称
+                        String contractArchiveFileName = contractArchiveItems.getString("fileName");
+                        System.out.println("合同归档文件名称:" + contractArchiveFileName);
+                        //文件类型
+                        String contractArchiveFileType = contractArchiveItems.getString("fileType");
+                        System.out.println("合同归档文件类型:" + contractArchiveFileType);
+                        //文件大小
+                        String contractArchiveFileSize = contractArchiveItems.getString("fileSize");
+                        System.out.println("合同归档文件大小:" + contractArchiveFileSize);
+                        //文件下载地址
+                        String contractArchiveFileDownloadUrl = contractArchiveItems.getString("fileDownloadUrl");
+                        System.out.println("合同归档文件下载地址:" + contractArchiveFileDownloadUrl);
+
+                        try {
+                            String destinationDir = "/file"; // Linux 路径
+//                    String destinationDir = "/Users/zhangkan/Documents/静态资源/图片/生成的新图片";
+                            String fileName = contractArchiveFileName;
+
+                            //获取当前日期,用于创建文件保存目录中增加当前日期的文件夹作区分
+                            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式 yyyy-MM-dd HH:mm:ss
+                            String format = df.format(new Date());
+                            System.out.println(format);// new Date()为获取当前系统时间
+
+                            File file1 = downloadFile(contractArchiveFileDownloadUrl, format, fileName);
+
+                            if (file1 != null){
+                                fileNewUrl = "http://192.168.200.156/file/" + format + File.separator + fileName;
+                            }else {
+//                            fileNewUrl = "【转存失败】" + "http://192.168.200.156/file/" + format + File.separator + fileName;
+                                log.info("【百雀羚服务器】合同归档文件下载转存失败,服务器转存新地址为空!");
+                            }
+                        } catch (Exception e) {
+                            System.err.println("下载失败: " + e.getMessage());
+                            e.printStackTrace();
+                        }
+                    }
+                    System.out.println("【百雀羚服务器】合同归档文件下载地址:" + fileNewUrl);
+                }
+            }
+
+            if (contractStatus.equals("archived") && amountType.equals("payment_party_other")) {
+                log.info("智能合同已归档、并且该合同类型属于【收入】,开始同步销售合同指标到DMS!");
+
+                //TODO 测试实例id
+//            String processInstanceId = "wHmd-0t0TZKpU2N_2QKP7w00451753239482";
+//            String year = "2025";
+
+                /**在执行方法前,将参数记录到宜搭日志表中*/
+                createYiDaoLog("DMS","参数已记录",null,contractId,contractNo,contractName,processInstanceId,contractStatus,amountType,year,null,
+                        null, contractStartDateText, contractEndDateText, htje, null, null, "3", fileNewUrl);
+
+                /**查询钉钉OA审批详情「合同审批信息」,主要是获取客户编码、品牌、各项指标*/
+                JSONObject dingHetongXS = getDingHetongXS(processInstanceId);
+                JSONArray formComponentValues = dingHetongXS.getJSONArray("formComponentValues");
+                if (formComponentValues.size() > 0 && formComponentValues != null && !formComponentValues.isEmpty()){
+                    //审批单实例标题
+                    String title = dingHetongXS.getString("title");
+
+                    //判断标题中是否包含指定字符
+                    if (title.contains("草本")){
+                        log.info("当前审批单标题包含:{草本}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("经典")){
+                        log.info("当前审批单标题包含:{经典}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("气韵")){
+                        log.info("当前审批单标题包含:{气韵}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("销售合同申请(三生花)") || title.contains("销售合同申请(施美,三生花、新零售、生物医药、拼多多)")){//remark 2026-02-03新增:销售合同申请(施美,三生花、新零售、生物医药、拼多多)
+                        log.info("当前审批单标题包含:{销售合同申请(三生花)}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("销售合同申请(施美,三生花洗护)")){
+                        log.info("当前审批单标题包含:{销售合同申请(施美,三生花洗护)}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("销售合同申请(施美)")){
+                        log.info("当前审批单标题包含:{销售合同申请(施美)}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }else if (title.contains("销售合同申请(施美补充协议)")){
+                        log.info("当前审批单标题包含:{销售合同申请(施美补充协议)}",title);
+                        /**调用创建DMS销售合同方法*/
+                        createDmsXSHT(processInstanceId, year, dingHetongXS.getJSONArray("formComponentValues"), contractNo, contractName, contractStartDateText, contractEndDateText, htje, fileNewUrl);
+                    }
+                }else {
+                    log.info("当前审批单未获取到表单信息,审批实例id【" + processInstanceId + "】");
+                    /**更新宜搭日志记录表*/
+                }
+            }
+        }
+
+        log.info("智能合同推送同步推送dms「销售合同」-->执行完成,成功与否请查看日志记录");
+        return R.ok().message("智能合同推送同步推送dms「销售合同」-->执行完成,成功与否请查看日志记录");
+    }
+}

Разлика између датотеке није приказан због своје велике величине
+ 1943 - 0
src/main/java/com/muzhi/baiqueling/service/impl/MeikebaoxiaoServiceImpl.java


Разлика између датотеке није приказан због своје велике величине
+ 2086 - 0
src/main/java/com/muzhi/baiqueling/service/impl/SapServiceImpl.java


+ 56 - 0
src/main/resources/application.properties

@@ -0,0 +1,56 @@
+server.port=8116
+server.servlet.context-path=/baiqueling
+
+server.tomcat.uri-encoding=UTF-8
+
+#?????????
+ribbon:
+    ReadTimeoutMillis: 5000
+    ConnectTimeoutMillis: 5000
+
+## 服务名
+#spring.application.name=simaner-yd
+## 环境设置:dev、test、prod(开发环境、测试环境、生产环境)
+#spring.profiles.active=dev
+
+# mysql数据库连接
+# 本地测试数据库
+#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dingtalk?serverTimezone=GMT%2B8
+#spring.datasource.username=root
+#spring.datasource.password=123456
+
+#定时同步
+
+#配置日志,当前为默认的控制台输出,也可以用log4j
+#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+#控制台显示sql
+#spring.jpa.show-sql=true
+#更新或者创建数据表结构
+#spring.jpa.hibernate.ddl-auto=update
+
+#返回json的全局时间格式
+spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
+spring.jackson.time-zone=GMT+8
+#配置mapper xml文件的路径
+#mybatis-plus.mapper-locations=classpath:com/muzhi/lz/mapper/xml/*.xml
+
+#mybatis-plus.config-location=classpath:mybatis/mybatis-config.xml
+
+#禁用缓存
+spring.thymeleaf.cache=false
+#spring.thymeleaf.mode= LEGACYHTML5
+#spring.resources.chain.strategy.content.enabled=true
+#spring.resources.chain.strategy.content.paths=/**
+#spring.thymeleaf.check-template = true
+#spring.thymeleaf.servlet.content-type=text/html
+#spring.thymeleaf.enabled = true
+#spring.thymeleaf.encoding = UTF-8
+#spring.thymeleaf.prefix = classpath:/static/
+#spring.thymeleaf.suffix = .html
+
+#定义日期提交的格式(日期的格式化):SpingMVC将页面提交的值需要转换为指定类型;默认的是yyyy/MM/dd
+#spring.mvc.date-format=yyyy-MM-dd
+
+spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/templates/

Разлика између датотеке није приказан због своје велике величине
+ 1144 - 0
src/test/java/com/muzhi/baiqueling/APITest/Test1.java


+ 13 - 0
src/test/java/com/muzhi/baiqueling/TestApplicationTests.java

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