Przeglądaj źródła

整理并迁移 paizhi 项目

zhangkan 3 tygodni temu
rodzic
commit
991e4d42d9
25 zmienionych plików z 1991 dodań i 6544 usunięć
  1. 4 0
      .gitignore
  2. 0 0
      README.md
  3. 0 43
      main/java/com/muzhi/huanshi/controller/DingOaController.java
  4. 0 14
      main/java/com/muzhi/huanshi/service/AccessTokenService.java
  5. 0 14
      main/java/com/muzhi/huanshi/service/DingOaService.java
  6. 0 86
      main/java/com/muzhi/huanshi/service/impl/AccessTokenServiceImpl.java
  7. 0 2921
      main/java/com/muzhi/huanshi/service/impl/DingOaServiceImpl.java
  8. 367 0
      pom.xml
  9. 4 4
      main/java/com/muzhi/huanshi/HuanshiApplication.java
  10. 77 77
      main/java/com/muzhi/huanshi/common/R.java
  11. 12 12
      main/java/com/muzhi/huanshi/common/ResultCode.java
  12. 48 43
      main/java/com/muzhi/huanshi/controller/AccessTokenController.java
  13. 40 0
      src/main/java/com/muzhi/paizhi/controller/DingTalkController.java
  14. 34 0
      src/main/java/com/muzhi/paizhi/controller/TbController.java
  15. 36 0
      src/main/java/com/muzhi/paizhi/dingtalk/dingtalkWebhook.java
  16. 17 0
      src/main/java/com/muzhi/paizhi/service/AccessTokenService.java
  17. 16 0
      src/main/java/com/muzhi/paizhi/service/DingTalkService.java
  18. 10 0
      src/main/java/com/muzhi/paizhi/service/TbService.java
  19. 137 0
      src/main/java/com/muzhi/paizhi/service/impl/AccessTokenServiceImpl.java
  20. 329 0
      src/main/java/com/muzhi/paizhi/service/impl/DingTalkServiceImpl.java
  21. 622 0
      src/main/java/com/muzhi/paizhi/service/impl/TbServiceImpl.java
  22. 7 8
      main/resources/application.properties
  23. 230 0
      src/test/java/com/muzhi/paizhi/APITest/Test1.java
  24. 1 1
      test/java/com/muzhi/huanshi/TestApplicationTests.java
  25. 0 3321
      test/java/com/muzhi/huanshi/APITest/Test1.java

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+.DS_Store
+.idea/
+target/
+*.iml

+ 0 - 0
README.md


+ 0 - 43
main/java/com/muzhi/huanshi/controller/DingOaController.java

@@ -1,43 +0,0 @@
-package com.muzhi.huanshi.controller;
-
-import com.muzhi.huanshi.service.DingOaService;
-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.*;
-
-
-@Api(description = "钉钉")
-@RestController
-@RequestMapping("/dingservice")
-//@CrossOrigin//解决跨域问题
-public class DingOaController {
-
-    @Autowired
-    private DingOaService dingOaService;
-
-    //获取钉钉人员-同步至宜搭人员信息表
-    @ApiOperation(value = "获取钉钉人员-同步至宜搭人员信息表")
-    @PostMapping("addDingdingRenyuan")
-//    @Scheduled(cron = "0 10 23 * * ?")//每天23:10触发(也就是凌晨23点10分触发)
-//    @Scheduled(cron = "0 0/10 * * * ?")//每10分钟执行一次
-//    @Scheduled(cron = "0 */10 * * * ?")//每隔10分钟执行一次
-    public String getKaoqin(){
-
-        String addDingdingRenyuan = dingOaService.addDingdingRenyuan();
-        return addDingdingRenyuan;
-    }
-
-    //统计钉钉考勤、请假、TB项目/任务工时
-    @ApiOperation(value = "统计钉钉考勤、请假、TB项目/任务工时表")
-    @PostMapping("allTongji")
-//    @Scheduled(cron = "0 30 10 * * ?")//每天01:30触发(也就是凌晨01点30分触发)
-//    @Scheduled(cron = "0 0/10 * * * ?")//每10分钟执行一次
-//    @Scheduled(cron = "0 */10 * * * ?")//每隔10分钟执行一次
-    public String allTongji(int type){
-
-        String allTongji = dingOaService.allTongji(type);
-        return allTongji;
-    }
-}

+ 0 - 14
main/java/com/muzhi/huanshi/service/AccessTokenService.java

@@ -1,14 +0,0 @@
-package com.muzhi.huanshi.service;
-
-/**
- * @Author ZhangKan
- * @Data 15:34
- */
-public interface AccessTokenService {
-
-    //获取access_token的方法(环世)
-    String getAccessToken();
-
-    //获取access_token的方法(环世TB应用)
-    String getAppToken();
-}

+ 0 - 14
main/java/com/muzhi/huanshi/service/DingOaService.java

@@ -1,14 +0,0 @@
-package com.muzhi.huanshi.service;
-
-/**
- * @Author ZhangKan
- * @Data 15:34
- */
-public interface DingOaService {
-
-    //获取钉钉人员-同步至宜搭人员信息表
-    String addDingdingRenyuan();
-
-    //统计钉钉考勤、请假、TB项目/任务工时
-    String allTongji(int type);
-}

+ 0 - 86
main/java/com/muzhi/huanshi/service/impl/AccessTokenServiceImpl.java

@@ -1,86 +0,0 @@
-package com.muzhi.huanshi.service.impl;
-
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.dingtalk.api.DefaultDingTalkClient;
-import com.dingtalk.api.request.OapiGettokenRequest;
-import com.dingtalk.api.response.OapiGettokenResponse;
-import com.muzhi.huanshi.service.AccessTokenService;
-import com.taobao.api.ApiException;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
-
-import java.util.Date;
-
-
-/**
- * @Author ZhangKan
- * @Data 15:39
- */
-
-@Service
-public class AccessTokenServiceImpl implements AccessTokenService {
-
-    //环世
-    //APPKEY
-    private static String APPKEY = "dingobpyhlo3vioasyo9";
-    //APPSECRET
-    private static String APPSECRET = "RNLnat9hiz8zQGSyOhLf1GEAx9qS66_VoFZFYJTwT_uy2aB_5sEoByTdd7oWc3Y0";
-    //AgenthId:2769663130
-
-    public static String accessToken = null;
-
-
-
-    //获取access_token的方法(环世)
-    @Override
-    public String getAccessToken() {
-        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-        OapiGettokenRequest request = new OapiGettokenRequest();
-        request.setAppkey(APPKEY);
-        request.setAppsecret(APPSECRET);
-        request.setHttpMethod("GET");
-        try {
-            OapiGettokenResponse response = client.execute(request);
-            accessToken = response.getAccessToken();
-            System.out.println("环世AccessToken:" + accessToken);
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-        return accessToken;
-    }
-
-    public static final Long   EXPIRES_IN = 1 * 3600 * 1000L;
-    public static final String TOKEN_APPID = "_appId";
-
-    public static String appId = "6555d03b73aa2fd874f4cc12";
-    public static String appSecret = "HDMqRuUY08eY1FtEzxs0hNB6A2Tq58aL";
-    //获取access_token的方法(环世TB应用)
-    @Override
-    public String getAppToken() {
-        if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(appSecret)) {
-            return null;
-        }
-
-        Algorithm algorithm = Algorithm.HMAC256(appSecret);
-        long timestamp = System.currentTimeMillis();
-        Date issuedAt = new Date(timestamp);
-        Date expiresAt = new Date(timestamp + EXPIRES_IN);
-
-//        return JWT.create()
-//                .withClaim(TOKEN_APPID, appId)
-//                .withIssuedAt(issuedAt)
-//                .withExpiresAt(expiresAt)
-//                .sign(algorithm);
-
-        String sign = JWT.create()
-                .withClaim(TOKEN_APPID, appId)
-                .withIssuedAt(issuedAt)
-                .withExpiresAt(expiresAt)
-                .sign(algorithm);
-        System.out.println("环世TB应用的AccessToken:" + sign);
-
-        return sign;
-
-    }
-}

Plik diff jest za duży
+ 0 - 2921
main/java/com/muzhi/huanshi/service/impl/DingOaServiceImpl.java


+ 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.paizhi</groupId>
+    <artifactId>paizhi</artifactId>
+<!--    <packaging>jar</packaging>-->
+    <version>1.0-SNAPSHOT</version>
+    <name>paizhi</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>2.2.34</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>

+ 4 - 4
main/java/com/muzhi/huanshi/HuanshiApplication.java

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

+ 77 - 77
main/java/com/muzhi/huanshi/common/R.java

@@ -1,77 +1,77 @@
-package com.muzhi.huanshi.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;
-    }
-}
+package com.muzhi.paizhi.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 - 12
main/java/com/muzhi/huanshi/common/ResultCode.java

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

+ 48 - 43
main/java/com/muzhi/huanshi/controller/AccessTokenController.java

@@ -1,43 +1,48 @@
-package com.muzhi.huanshi.controller;
-
-import com.muzhi.huanshi.service.AccessTokenService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @Author ZhangKan
- * @Data 15:03
- */
-
-@Api(description = "钉钉授权AccessToken")
-@RestController
-@RequestMapping("/dingservice")
-@CrossOrigin//解决跨域问题
-public class AccessTokenController {
-
-    @Autowired
-    private AccessTokenService AccessTokenService;
-
-    //获取钉钉中的access_token(斯曼尔)
-    @ApiOperation(value = "获取钉钉中的access_token")
-    @GetMapping("getAccessToken")
-    public String getAccessToken(){
-
-        String accessToken = AccessTokenService.getAccessToken();
-        return accessToken;
-    }
-
-    //获取钉钉中的access_token(环世TB应用)
-    @ApiOperation(value = "获取钉钉中的access_token")
-    @GetMapping("getAppToken")
-    public String getAppToken(){
-
-        String AppToken = AccessTokenService.getAppToken();
-        return AppToken;
-    }
-}
+package com.muzhi.paizhi.controller;
+
+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.paizhi.service.AccessTokenService AccessTokenService;
+
+    //获取钉钉中的access_token(钉钉应用)
+    @ApiOperation(value = "获取钉钉的access_token")
+    @GetMapping("getAccessToken")
+    public String getAccessToken(){
+
+        String accessToken = AccessTokenService.getAccessToken();
+        return accessToken;
+    }
+
+    //获取钉钉中的access_token(派智TB应用)
+    @ApiOperation(value = "获取钉钉中的access_token")
+    @GetMapping("getAppToken")
+    public String getAppToken(){
+
+        String AppToken = AccessTokenService.getAppToken();
+        return AppToken;
+    }
+
+    //获取派智CRM授权码
+    @ApiOperation(value = "获取派智CRM授权码")
+    @GetMapping("getCrmAccessToken")
+    public String getCrmAccessToken(){
+
+        String accessToken = AccessTokenService.getCrmAccessToken();
+        return accessToken;
+    }
+}

+ 40 - 0
src/main/java/com/muzhi/paizhi/controller/DingTalkController.java

@@ -0,0 +1,40 @@
+package com.muzhi.paizhi.controller;
+
+import com.muzhi.paizhi.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.paizhi.common.R;
+
+
+@Api(description = "钉钉")
+@RestController
+@RequestMapping("/dingservice")
+//@CrossOrigin//解决跨域问题
+public class DingTalkController {
+
+    @Autowired
+    private DingTalkService dingTalkService;
+
+    /**调用CRM接口查询客户信息*/
+    @ApiOperation(value = "调用CRM接口查询客户信息")
+    @GetMapping("getCrmCustomerInfo")
+    @Scheduled(cron = "0 0 22 * * ?")//每天22:00触发(也就是晚上22点00分触发)
+    public R getCrmCustomerInfo(){
+
+        dingTalkService.getCrmCustomerInfo();
+        return R.ok();
+    }
+
+    /**调用PLM接口创建项目信息*/
+    @ApiOperation(value = "调用PLM接口创建项目信息")
+    @GetMapping("getProjectCreate")
+    public R getProjectCreate(String projectName, long timeLong, String deptName, String pm, String type){
+
+        dingTalkService.getProjectCreate(projectName, timeLong, deptName, pm, type);
+        return R.ok();
+    }
+}

+ 34 - 0
src/main/java/com/muzhi/paizhi/controller/TbController.java

@@ -0,0 +1,34 @@
+package com.muzhi.paizhi.controller;
+
+import com.muzhi.paizhi.service.TbService;
+import io.swagger.annotations.Api;
+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;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "TB接口")
+@RestController
+@RequestMapping("/tbservice")
+//@CrossOrigin//解决跨域问题
+public class TbController {
+
+    @Autowired
+    private TbService tbService;
+
+    //接收TB推送的数据
+    @PostMapping("callback")
+    public String callback(@RequestBody Map body) throws Exception{
+
+        String s = tbService.callBack(body);
+        return s;
+    }
+}

+ 36 - 0
src/main/java/com/muzhi/paizhi/dingtalk/dingtalkWebhook.java

@@ -0,0 +1,36 @@
+package com.muzhi.paizhi.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){
+        log.info("钉钉webhookUrl:" + webhookUrl);
+
+        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();
+        }
+    }
+
+}

+ 17 - 0
src/main/java/com/muzhi/paizhi/service/AccessTokenService.java

@@ -0,0 +1,17 @@
+package com.muzhi.paizhi.service;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface AccessTokenService {
+
+    //获取access_token的方法(钉钉应用)
+    String getAccessToken();
+
+    //获取access_token的方法(锡鼎TB应用)
+    String getAppToken();
+
+    //获取派智CRM的access_token方法
+    String getCrmAccessToken();
+}

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

@@ -0,0 +1,16 @@
+package com.muzhi.paizhi.service;
+
+import com.muzhi.paizhi.common.R;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface DingTalkService {
+
+    /**调用CRM接口查询客户信息*/
+    R getCrmCustomerInfo();
+
+    /**调用PLM接口创建项目信息*/
+    R getProjectCreate(String projectName, long timeLong, String deptName, String pm, String type);
+}

+ 10 - 0
src/main/java/com/muzhi/paizhi/service/TbService.java

@@ -0,0 +1,10 @@
+package com.muzhi.paizhi.service;
+
+import java.util.Map;
+
+public interface TbService {
+
+    /**TB WebHook*/
+    //接收TB的WebHook推送过来的数据
+    String callBack(Map body) throws Exception;
+}

+ 137 - 0
src/main/java/com/muzhi/paizhi/service/impl/AccessTokenServiceImpl.java

@@ -0,0 +1,137 @@
+package com.muzhi.paizhi.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.response.OapiGettokenResponse;
+import com.muzhi.paizhi.service.AccessTokenService;
+import com.taobao.api.ApiException;
+import okhttp3.*;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.Date;
+
+
+/**
+ * @Author ZhangKan
+ * @Data 15:39
+ */
+
+@Service
+public class AccessTokenServiceImpl implements AccessTokenService {
+
+    /**钉钉应用*/
+    //APPKEY
+    private static String APPKEY = "dingaf61sbyhpqt7ajyp";
+    //APPSECRET
+    private static String APPSECRET = "u__ASvI-1f6liwSg3Yg-OtFEw3VM_VnM0Mg2D4ed0cyzJEx-oqN1CM0j67pR4dby";
+    //AgenthId:3771823929
+    //corpId:
+
+    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(APPKEY);
+        request.setAppsecret(APPSECRET);
+        request.setHttpMethod("GET");
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            DingtalkAccessToken = response.getAccessToken();
+            System.out.println("派智钉钉AccessToken:" + DingtalkAccessToken);
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+        return DingtalkAccessToken;
+    }
+
+    public static final Long   EXPIRES_IN = 1 * 3600 * 1000L;
+    public static final String TOKEN_APPID = "_appId";
+
+    public static String appId = "68cb9daa9b5799d842c8d620";
+    public static String appSecret = "sg59F90GFDg6JqwVroOipGP6VgN1H63H";
+    //获取access_token的方法(派智TB应用)
+    @Override
+    public String getAppToken() {
+        if (StringUtils.isEmpty(appId) || StringUtils.isEmpty(appSecret)) {
+            return null;
+        }
+
+        Algorithm algorithm = Algorithm.HMAC256(appSecret);
+        long timestamp = System.currentTimeMillis();
+        Date issuedAt = new Date(timestamp);
+        Date expiresAt = new Date(timestamp + EXPIRES_IN);
+
+//        return JWT.create()
+//                .withClaim(TOKEN_APPID, appId)
+//                .withIssuedAt(issuedAt)
+//                .withExpiresAt(expiresAt)
+//                .sign(algorithm);
+
+        String sign = JWT.create()
+                .withClaim(TOKEN_APPID, appId)
+                .withIssuedAt(issuedAt)
+                .withExpiresAt(expiresAt)
+                .sign(algorithm);
+        System.out.println("派智TB应用的AccessToken:" + sign);
+
+        return sign;
+    }
+
+    //获取派智CRM授权码
+    @Override
+    public String getCrmAccessToken() {
+        //测试环境
+        String url_test = "http://atest.pytesgroup.com:8899";
+
+        //正式环境
+        String url = "http://openapi.pytesgroup.com";
+
+        //密钥
+//        String key = "ZGluZ2Rpbmc6ZGluZ3B4aXNkZ2s=";//【第一版】
+        String key = "ZGluZ2Rpbmc6ZGluZ3B4aXhldw==";
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, "{}");
+        Request request = new Request.Builder()
+                .url(url + "/api-uaa/oauth/token?grant_type=client_credentials")
+                .method("POST", body)
+                .addHeader("Authorization", "Basic " + key)
+                .addHeader("Content-Type", "application/json")
+                .build();
+        int code = 0;
+        String message = null;
+        int status = 0;
+        String access_token = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObject);
+            code = jsonObject.getInteger("resp_code");
+            message = jsonObject.getString("resp_msg");
+            status = jsonObject.getInteger("status");
+
+            access_token = jsonObject.getJSONObject("datas").getString("access_token");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("获取CRM【授权码】接口返回的状态码status(200成功,400异常):" + status);
+        System.out.println("获取CRM【授权码】接口返回的code:" + code);
+        System.out.println("获取CRM【授权码】接口返回的message:" + message);
+        System.out.println("获取CRM【授权码】接口返回的access_token:" + access_token);
+
+        return access_token;
+    }
+}

+ 329 - 0
src/main/java/com/muzhi/paizhi/service/impl/DingTalkServiceImpl.java

@@ -0,0 +1,329 @@
+package com.muzhi.paizhi.service.impl;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiReportCreateRequest;
+import com.dingtalk.api.response.OapiReportCreateResponse;
+import com.muzhi.paizhi.service.AccessTokenService;
+import com.muzhi.paizhi.service.DingTalkService;
+import com.muzhi.paizhi.common.R;
+import com.taobao.api.ApiException;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+
+@Service
+@Slf4j
+public class DingTalkServiceImpl implements DingTalkService {
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+
+    //宜搭接口调用
+    public static com.aliyun.dingtalkyida_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.dingtalkyida_1_0.Client(config);
+    }
+
+    public static com.aliyun.dingtalkyida_2_0.Client createClient2() 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_2_0.Client(config);
+    }
+
+    //宜搭接口服务【审批单实例详情】
+    public static com.aliyun.dingtalkworkflow_1_0.Client createClient3() 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 void updateYidaSubForm(String slid, String tableFieldId, String updateFormDataJson){
+        try {
+            com.aliyun.dingtalkyida_2_0.Client client = createClient2();
+            com.aliyun.dingtalkyida_2_0.models.UpdateSubTableHeaders updateSubTableHeaders = new com.aliyun.dingtalkyida_2_0.models.UpdateSubTableHeaders();
+            updateSubTableHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_2_0.models.UpdateSubTableRequest updateSubTableRequest = new com.aliyun.dingtalkyida_2_0.models.UpdateSubTableRequest()
+                    .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                    .setFormInstanceId(slid)
+                    .setUserId("yida_pub_account")
+                    .setTableFieldIds(tableFieldId)
+                    .setUpdateFormDataJson(updateFormDataJson)
+                    .setAppType("APP_FJSLK9BJ20K1NL3G2PUW");
+
+            client.updateSubTableWithOptions(updateSubTableRequest, updateSubTableHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } 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 属性,可帮助开发定位问题
+            }
+
+        }
+    }
+
+    /**
+     * 调用CRM接口查询客户档案
+     */
+    @Override
+    public R getCrmCustomerInfo(){
+
+        /**调用CRM接口查询客户信息*/
+        log.info("调用CRM接口查询客户信息===");
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("text/plain");
+        RequestBody body = RequestBody.create(mediaType, "");
+        Request request = new Request.Builder()
+                .url("http://openapi.pytesgroup.com:8895/open-api/crm/customer/info?limit=1000&page=1")
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer "+accessTokenService.getCrmAccessToken())
+                .build();
+        int code = 0;
+        String message = null;
+        int status = 0;
+        JSONArray jsonArray = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObject);
+
+            code = jsonObject.getInteger("resp_code");
+            message = jsonObject.getString("resp_msg");
+            status = jsonObject.getInteger("status");
+
+            jsonArray = jsonObject.getJSONObject("datas").getJSONArray("records");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("获取CRM【客户信息】接口返回的状态码status(200成功,400异常):" + status);
+        System.out.println("获取CRM【客户信息】接口返回的code:" + code);
+        System.out.println("获取CRM【客户信息】接口返回的message:" + message);
+
+        if (jsonArray != null && jsonArray.size() > 0){
+            for (int i = 0; i < jsonArray.size(); i++) {
+                //客户名称
+                String accountName = jsonArray.getJSONObject(i).getString("accountName");
+                System.out.println("客户名称:" + accountName);
+                //客户编号
+                String customerCode = jsonArray.getJSONObject(i).getString("customerCode") != null ? jsonArray.getJSONObject(i).getString("customerCode") : null;
+                System.out.println("客户编号:" + customerCode);
+                //客户等级
+                String level = jsonArray.getJSONObject(i).getString("level");
+                System.out.println("客户等级:" + level);
+
+                //客户负责人姓名
+                String ownerName = jsonArray.getJSONObject(i).getString("ownerName");
+                System.out.println("客户负责人姓名:" + ownerName);
+                //TODO CRM手机号未匹配钉钉
+                /**获取客户负责人的钉钉userId*/
+
+                //客户联系人
+                String primaryContact = jsonArray.getJSONObject(i).getString("primaryContact");
+                System.out.println("客户联系人:" + primaryContact);
+                //客户联系电话
+                String primaryContactPhone = jsonArray.getJSONObject(i).getString("primaryContactPhone");
+                System.out.println("客户联系电话:" + primaryContactPhone);
+                //客户联系人职务
+                String primaryContactPosition = jsonArray.getJSONObject(i).getString("primaryContactPosition");
+                System.out.println("客户联系人职务:" + primaryContactPosition);
+
+                if (customerCode.length() > 1 && customerCode != "" && customerCode != null) {
+                    log.info("客户ID不为空,开始写入宜搭客户档案表===");
+
+                    /**写入宜搭客户档案表*/
+                    Map map = new HashMap();
+                    map.put("textField_maw7b9k0", customerCode);//客户ID
+                    map.put("textField_lqesy4sy", accountName);//客户名称
+                    map.put("selectField_lqesy4t1", level);//客户等级
+                    map.put("textField_mh8j17hy", ownerName);//客户负责人姓名
+//                map.put("employeeField_lqesy4t2", );//客户负责人组件
+
+                    String mapJson = JSON.toJSONString(map);
+                    System.out.println("mapJson:" + mapJson);
+
+                    //新增或更新表单实例【宜搭】
+                    /**
+                     * 宜搭表单判断查询条件
+                     * 客户档案更新
+                     * */
+                    //宜搭表单判断查询条件
+                    Map map1 = new HashMap();
+                    //字段编号
+                    map1.put("key", "textField_maw7b9k0");
+                    //同步类型
+                    map1.put("value", customerCode);
+                    //控件类型
+                    map1.put("type", "TEXT");
+                    //逻辑判断符
+                    map1.put("operator", "eq");
+                    //控件名称
+                    map1.put("componentName", "TextField");
+
+                    List list11 = new ArrayList();
+                    list11.add(map1);
+
+                    String listJson = JSON.toJSONString(list11);
+                    System.out.println("查询条件listJson:" + listJson);
+
+                    JSONObject jsonObject2 = null;
+                    try {
+                        com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
+                        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("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                                //表单编码
+                                .setFormUuid("FORM-BD31E2C07C7448DD931F686A5D881E96DQV8")
+                                .setUserId("yida_pub_account")
+                                .setSearchCondition(listJson)
+                                //应用编码
+                                .setAppType("APP_FJSLK9BJ20K1NL3G2PUW")
+                                .setFormDataJson(mapJson);
+
+                        CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
+                        String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
+                        jsonObject2 = JSON.parseObject(s);
+                        System.out.println("【创建或更新】表单object对象:" + jsonObject2);
+                    } 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 属性,可帮助开发定位问题
+                        }
+                    }
+
+                    String slid = null;
+                    try {
+                        slid = jsonObject2.getJSONArray("result").getString(0);
+                        System.out.println("【创建或更新】表单返回实例id:" + slid);
+                    }catch (Exception e){
+                        log.info("【创建或更新】表单返回实例id为空!");
+                    }
+                    if (slid != null){
+                        log.info("【更新】宜搭子表单===");
+                        //明细数据
+                        Map mapXX = new HashMap<>();
+                        List listXXX = new ArrayList<>();
+                        Map mapXXX = new HashMap<>();
+                        mapXXX.put("textField_lqesy4t7", primaryContact);//客户联系人
+                        mapXXX.put("textField_makozait", primaryContactPhone);//客户联系电话
+                        mapXXX.put("textField_lqesy4t6", primaryContactPosition);//客户联系人职务
+//                        mapXXX.put("textField_lqesy4t5", null);//备注
+                        listXXX.add(mapXXX);
+                        mapXX.put("tableField_lqesy4t4", listXXX);//客户联系人明细
+                        String updateFormDataJson = JSON.toJSONString(mapXX);
+                        System.out.println("updateFormDataJson:" + updateFormDataJson);
+                        /**更新客户档案子表单明细*/
+                        updateYidaSubForm(slid,"tableField_lqesy4t4",updateFormDataJson);
+                    }
+                }
+            }
+        }else {
+            log.info("获取CRM【客户信息】接口返回的jsonArray为空!");
+        }
+
+        return R.ok().message("获取CRM客户信息-->同步至宜搭客户信息表完成!");
+    }
+
+    /**
+     * 调用PLM接口创建项目信息
+     */
+    @Override
+    public R getProjectCreate(String projectName, long timeLong, String deptName, String pm, String type){
+
+        /**调用PLM接口创建项目信息*/
+        log.info("调用PLM接口创建项目信息===");
+
+        //将宜搭获取的时间戳转成时间文本
+        // 指定时区(中国)
+        ZoneId chinaZone = ZoneId.of("Asia/Shanghai");
+
+        // 将时间戳转为 LocalDateTime(带时区)
+        String finishTime = Instant.ofEpochMilli(timeLong)
+                .atZone(chinaZone)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        System.out.println("将宜搭获取的时间戳转成时间文本(预计完成时间):" + finishTime); // 输出:2025-12-01 22:43:00
+
+        Map mapAll = new HashMap();
+        mapAll.put("name", projectName);//项目名称
+        mapAll.put("limitTime", finishTime);//预计完成时间,yyyy-MM-dd HH:mm:ss
+        mapAll.put("belong", deptName);//部门
+        mapAll.put("manager", pm);//项目经理
+        mapAll.put("type", type);//业务类型,默认2
+
+        String mapStr = JSON.toJSONString(mapAll);
+        System.out.println("封装更新的字段参数:" + mapStr);
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, mapStr);
+        Request request = new Request.Builder()
+                .url("http://openapi.pytesgroup.com/open-api/dingtalk/plm/project/create")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Authorization", "Bearer "+accessTokenService.getCrmAccessToken())
+                .build();
+        int code = 0;
+        String message = null;
+        int status = 0;
+        String plmNo = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObject);
+
+            code = jsonObject.getInteger("resp_code");
+            message = jsonObject.getString("resp_msg");
+            status = jsonObject.getInteger("status");
+
+            plmNo = jsonObject.getJSONObject("datas").getString("no");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("创建PLM【项目信息】接口返回的状态码status(200成功,400异常):" + status);
+        System.out.println("创建PLM【项目信息】接口返回的code:" + code);
+        System.out.println("创建PLM【项目信息】接口返回的message:" + message);
+        System.out.println("创建PLM【项目信息】接口返回的plmNo:" + plmNo);
+
+        if (status == 200){
+            return R.ok().message("创建PLM【项目信息】成功!返回PLM编码为【" + plmNo + "】");
+        }else {
+            return R.error().message("创建PLM【项目信息】失败!失败原因【" + message + "】");
+        }
+    }
+}

+ 622 - 0
src/main/java/com/muzhi/paizhi/service/impl/TbServiceImpl.java

@@ -0,0 +1,622 @@
+package com.muzhi.paizhi.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkyida_1_0.models.SearchFormDatasResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muzhi.paizhi.common.R;
+import com.muzhi.paizhi.service.AccessTokenService;
+import com.muzhi.paizhi.service.TbService;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+@Service
+@Slf4j
+public class TbServiceImpl implements TbService {
+
+    //宜搭接口调用
+    public static com.aliyun.dingtalkyida_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.dingtalkyida_1_0.Client(config);
+    }
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    //派智TB企业ID(tbOrganizationId)
+    public static String tbOrganizationId = "61a57d86ea9aa2f22415088e";
+
+    //通过任务id查询任务详情
+    public JSONArray getRenwuxiangqing(String rwid){
+
+        //获取属于该区域名称的项目集id
+        OkHttpClient client1 = new OkHttpClient().newBuilder()
+                .build();
+        Request request1 = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/task/query?taskId="+ rwid)
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        int code1 = 0;
+        JSONArray result1 = null;
+        try {
+            Response response1 = client1.newCall(request1).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+
+            result1 = jsonObject1.getJSONArray("result");
+            System.out.println("result===>" + result1);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询【通过任务id查询所属项目id】接口返回的状态码(200成功,400异常):" + code1);
+
+        //任务类型id
+//        String sfcId = null;
+//        if (!result1.isEmpty() || result1 != null) {
+//            JSONObject jsonObject1 = result1.getJSONObject(0);
+//
+//            //任务类型id
+//            sfcId = jsonObject1.getString("sfcId");
+//            System.out.println("任务类型id:" + sfcId);
+//        }
+
+        return result1;
+    }
+
+    //更新项目自定义字段值
+    public R updateXmCustomField(String operatorId, String xmid, String customfieldId, String title){
+
+        Map mapTitle = new HashMap();
+        mapTitle.put("title", title);
+
+        List listTitle = new ArrayList();
+        listTitle.add(mapTitle);
+
+        Map mapAll = new HashMap();
+        mapAll.put("customfieldId", customfieldId);
+        mapAll.put("value", listTitle);
+
+        String mapStr = JSON.toJSONString(mapAll);
+        System.out.println("封装更新的字段参数:" + mapStr);
+
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, mapStr);
+        Request request = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/project/"+ xmid +"/status/customfield/create")
+                .method("POST", body)
+                .addHeader("x-operator-id", operatorId)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .addHeader("Content-Type", "application/json")
+                .build();
+
+        int code1 = 0;
+        try {
+            Response response1 = client.newCall(request).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("【更新项目自定义字段值】接口返回的状态码(200成功,400异常):" + code1);
+
+        return R.ok();
+    }
+
+    //通过项目id查询项目「里程碑」任务类型id
+    public String getXiangmuLichengbeiRenwuleixingid(String xmid){
+
+        OkHttpClient client1 = new OkHttpClient().newBuilder()
+                .build();
+        Request request1 = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/project/"+ xmid +"/scenariofieldconfig/search?q=里程碑")
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        int code1 = 0;
+        JSONArray result1 = null;
+        try {
+            Response response1 = client1.newCall(request1).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+
+            result1 = jsonObject1.getJSONArray("result");
+            System.out.println("result===>" + result1);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询【通过项目id查询项目「里程碑」任务类型id】接口返回的状态码(200成功,400异常):" + code1);
+
+        //任务类型id
+        String rwlxId = null;
+        if (!result1.isEmpty() || result1 != null) {
+            JSONObject jsonObject1 = result1.getJSONObject(0);
+
+            //任务类型id
+            rwlxId = jsonObject1.getString("id");
+            System.out.println("任务类型id:" + rwlxId);
+        }
+
+        return rwlxId;
+    }
+
+    //根据项目id和工作流名称,获取「里程碑」工作流id
+    public String getXiangmuLichengbeiGongzuoliuid(String xmid){
+
+        OkHttpClient client1 = new OkHttpClient().newBuilder()
+                .build();
+        Request request1 = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/project/"+ xmid +"/taskflow/search?q=里程碑工作流")
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        int code1 = 0;
+        JSONArray result1 = null;
+        try {
+            Response response1 = client1.newCall(request1).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+
+            result1 = jsonObject1.getJSONArray("result");
+            System.out.println("result===>" + result1);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询【根据项目id和工作流名称,获取「里程碑」工作流id】接口返回的状态码(200成功,400异常):" + code1);
+
+        //工作流id
+        String gzlId = null;
+        if (!result1.isEmpty() || result1 != null) {
+            JSONObject jsonObject1 = result1.getJSONObject(0);
+
+            //工作流id
+            gzlId = jsonObject1.getString("id");
+            System.out.println("工作流id:" + gzlId);
+        }
+
+        return gzlId;
+    }
+
+    //根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id
+    public String getXiangmuLichengbeiGongzuoliuYiwanchengzhuangtaiid(String xmid, String gzlId){
+
+        OkHttpClient client1 = new OkHttpClient().newBuilder()
+                .build();
+        Request request1 = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/project/"+ xmid +"/taskflowstatus/search?q=已完成&tfIds="+ gzlId)
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        int code1 = 0;
+        JSONArray result1 = null;
+        try {
+            Response response1 = client1.newCall(request1).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+
+            result1 = jsonObject1.getJSONArray("result");
+            System.out.println("result===>" + result1);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询【根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id】接口返回的状态码(200成功,400异常):" + code1);
+
+        //已完成状态id
+        String ywcztId = null;
+        if (!result1.isEmpty() || result1 != null) {
+            JSONObject jsonObject1 = result1.getJSONObject(0);
+
+            //已完成状态id
+            ywcztId = jsonObject1.getString("id");
+            System.out.println("已完成状态id:" + ywcztId);
+        }
+
+        return ywcztId;
+    }
+
+    //根据项目id,查询项目概览自定义字段列表中「项目状态」id
+    public String getXiangmuZidingyiziduanid(String xmid, String zidingyiziduanName){
+
+        OkHttpClient client1 = new OkHttpClient().newBuilder()
+                .build();
+        Request request1 = new Request.Builder()
+                .url("https://open.teambition.com/api/v3/project/"+ xmid +"/status/customfield/list")
+                .method("GET", null)
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                .addHeader("X-Tenant-Id", tbOrganizationId)
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        int code1 = 0;
+        JSONArray result1 = null;
+        try {
+            Response response1 = client1.newCall(request1).execute();
+            String bodyStr1 = response1.body().string();
+            JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
+            System.out.println("返回体body:" + jsonObject1);
+            code1 = jsonObject1.getInteger("code");
+
+            result1 = jsonObject1.getJSONArray("result");
+            System.out.println("result===>" + result1);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询【根据项目id,查询项目概览自定义字段列表中「项目状态」id】接口返回的状态码(200成功,400异常):" + code1);
+
+        //自定义「项目状态id」
+        String xmztId = null;
+        if (!result1.isEmpty() || result1 != null) {
+            for (int i = 0; i < result1.size(); i++) {
+                JSONObject jsonObject1 = result1.getJSONObject(i);
+                //自定义「项目状态名称」
+                String xmztName = jsonObject1.getString("name");
+                System.out.println("自定义「项目状态名称」:" + xmztName);
+
+                if (xmztName.equals(zidingyiziduanName)){
+                    //自定义「项目状态id」
+                    xmztId = jsonObject1.getString("cfId");
+                    System.out.println("自定义「项目状态id」:" + xmztId);
+                }
+            }
+        }
+
+        return xmztId;
+    }
+
+    //根据TB项目id查询宜搭IPD项目档案的单据,并获取该档案中关联的LEV的项目档案数据实例id
+    public String getYidaiIpdProjectAndLEVslId(String tbXmid){
+        JSONObject jsonObject = null;
+
+        int size = 100;
+        int page = 1;
+
+        //TODO 指定筛选信息
+        Map mapAll = new HashMap();
+        //TB项目id
+        mapAll.put("textField_lqxtykce", tbXmid);
+        String mapAllStr = JSON.toJSONString(mapAll);
+        System.out.println("封装查询的字段参数:" + mapAllStr);
+
+        //LEV项目档案的实例id
+        String slid_lev = null;
+        do {
+
+            try {
+                com.aliyun.dingtalkyida_1_0.Client client = createClient();
+                com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders();
+                searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+                com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest()
+                        .setSystemToken("1W9669D1HQZUJCB5D3Q8S5T6XUXZ2EL3V42AMYQ1")
+
+                        .setSearchFieldJson(mapAllStr)
+
+                        .setCurrentPage(page)
+                        .setPageSize(size)
+                        .setFormUuid("FORM-2CC97D2F8D7D4F7C925538CC5758755DOA4W")
+                        .setUserId("yida_pub_account")
+                        .setAppType("APP_H2HQQ5I9E0HHGHAY7KSL");
+
+                SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+//                System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody()));
+                String s = JSON.toJSONString(searchFormDatasResponse.getBody());
+                jsonObject = JSON.parseObject(s);
+//                System.out.println("宜搭数据高级条件查询【IPD项目档案】接口object对象:" + jsonObject);
+            } 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 属性,可帮助开发定位问题
+                }
+
+            }
+
+            JSONArray data = jsonObject.getJSONArray("data");
+//            System.out.println("返回的宜搭data:" + data);
+
+            if (data.isEmpty()) {
+                System.out.println("查询【IPD项目档案】返回数据为空!");
+            } else {
+                for (int i = 0; i < data.size(); i++) {
+                    JSONObject formData = data.getJSONObject(i).getJSONObject("formData");
+                    Map map = new HashMap<>();
+
+                    //实例ID
+                    String shiliID = data.getJSONObject(i).getString("formInstanceId");
+                    System.out.println("实例ID===>" + shiliID);
+
+                    //LEV项目档案的实例id
+                    slid_lev = null;
+                    try {
+                        slid_lev = formData.getString("textField_lrj7vnxf") != null ? formData.getString("textField_lrj7vnxf") : null;
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                    System.out.println("LEV项目档案的实例id:" + slid_lev);
+                }
+            }
+
+            if (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")){
+                page = page + 1;
+                System.out.println("下一次待查询分页:" + page);
+            }
+
+        }while (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage"));
+
+        System.out.println("根据TB项目id查询【IPD项目档案】匹配到的【LEV项目档案】数据实例id:" + slid_lev);
+
+        return slid_lev;
+    }
+
+    //根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段
+    public void updateYidaLEVxmzt(String slid_lev, String xmzt){
+
+        Map map = new HashMap();
+        map.put("selectField_m71o2kk8", xmzt);
+
+        String mapJson = JSON.toJSONString(map);
+        System.out.println("mapJson:" + mapJson);
+
+        try {
+            /**
+             * 更新表单数据「按照数据版本」
+             * 注:非表单字段调整不开启
+             * */
+
+            com.aliyun.dingtalkyida_1_0.Client client = createClient();
+            com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders updateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders();
+            updateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest updateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest()
+                    .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                    .setFormInstanceId(slid_lev)
+                    .setUserId("yida_pub_account")
+                    .setUseLatestVersion(true)
+                    .setAppType("APP_FJSLK9BJ20K1NL3G2PUW")
+                    .setUpdateFormDataJson(mapJson);
+
+            client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } 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 属性,可帮助开发定位问题
+            }
+        }
+    }
+
+    //接收TB的WebHook推送过来的数据
+    @Async
+    @Override
+    public String callBack(Map body) throws Exception{
+
+        String s = JSON.toJSONString(body);
+        System.out.println("TB推送过来的数据:" + s);
+
+        //解析TB推送过来的数据
+        JSONObject jsonObject = JSON.parseObject(s);
+        String event = jsonObject.getString("event");
+        System.out.println("事件名称「推送类型」:" + event);
+        String timestamp = jsonObject.getString("timestamp");
+        System.out.println("事件触发时间「毫秒级时间戳」:" + timestamp);
+
+//        休眠10秒
+//        try {
+//            Thread.sleep(10000);
+//        }catch (InterruptedException e){
+//            e.printStackTrace();
+//        }
+
+        if (event.equals("v3.task.taskflowstatus.update")) {//======任务状态更新======
+            log.info("【任务状态更新】,开始执行===》");
+            JSONObject data = jsonObject.getJSONObject("data");
+            System.out.println("任务信息data:" + data);
+
+            //里程碑任务类型id
+            String lcbrwlxid = null;
+            System.out.println("里程碑任务类型id:" + lcbrwlxid);
+            //里程碑工作流id
+            String lcbgzlid = null;
+            System.out.println("里程碑工作流id:" + lcbgzlid);
+            //任务完成状态id
+            String rwwcztid = null;
+            System.out.println("任务完成状态id:" + rwwcztid);
+            //项目概览自定义字段「项目状态id」
+            String xmztid = null;
+            System.out.println("项目概览自定义字段「项目状态id」:" + xmztid);
+
+
+            //项目id
+            String xmid = data.getString("projectId");
+            System.out.println("项目id:" + xmid);
+            //任务id
+            String taskId = data.getString("taskId");
+            System.out.println("任务id:" + taskId);
+            //操作者id
+            String operatorId = data.getString("creatorId");
+            System.out.println("操作者id:" + operatorId);
+            //当前任务状态id
+            String tfsId = data.getString("tfsId");
+            System.out.println("当前任务状态id:" + tfsId);
+
+            /**根据TB项目id查询宜搭IPD项目档案的单据,并获取该档案中关联的LEV的项目档案数据实例id*/
+            String slid_lev = getYidaiIpdProjectAndLEVslId(xmid);
+
+            /**根据项目id,查询项目概览自定义字段列表中「项目状态」id*/
+            xmztid = getXiangmuZidingyiziduanid(xmid, "项目状态");
+            if (xmztid != null){
+                log.info("【根据项目id,查询项目概览自定义字段列表中「项目状态」id】不为空,开始执行后续业务===》");
+
+                /**通过任务id查询任务详情,获取任务类型id*/
+                JSONArray renwuxiangqingArray = getRenwuxiangqing(taskId);
+                //任务类型id
+                String renwuleixingid = null;
+                if (!renwuxiangqingArray.isEmpty() || renwuxiangqingArray != null) {
+                    JSONObject jsonObject1 = renwuxiangqingArray.getJSONObject(0);
+                    //当前任务类型id
+                    renwuleixingid = jsonObject1.getString("sfcId");
+                    System.out.println("当前任务类型id:" + renwuleixingid);
+
+                    /**根据项目id获取项目下的「里程碑」任务类型id*/
+                    lcbrwlxid = getXiangmuLichengbeiRenwuleixingid(xmid);
+                    if (lcbrwlxid != null){
+                        log.info("【通过项目id查询项目「里程碑」任务类型id】不为空,开始判断是否为里程碑任务===》");
+
+                        if (renwuleixingid.equals(lcbrwlxid)){
+                            log.info("【任务类型为里程碑】,开始判断任务状态是否完成===》");
+
+                            /**根据项目id和工作流名称,获取「里程碑」工作流id*/
+                            lcbgzlid = getXiangmuLichengbeiGongzuoliuid(xmid);
+                            if (lcbgzlid != null){
+                                log.info("【通过项目id和工作流名称,获取「里程碑」工作流id】不为空,开始获取里程碑的任务完成状态id===》");
+
+                                /**根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id*/
+                                rwwcztid = getXiangmuLichengbeiGongzuoliuYiwanchengzhuangtaiid(xmid, lcbgzlid);
+                                if (rwwcztid != null){
+                                    log.info("【通过项目id和工作流id,获取「里程碑」任务完成状态id】不为空,开始判断任务状态是否完成===》");
+
+                                    if (tfsId.equals(rwwcztid)){
+                                        log.info("【任务状态为完成】,开始执行===》");
+                                        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+                                        SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+                                        //任务截止时间
+                                        String dueDate = jsonObject1.getString("dueDate");
+                                        System.out.println("任务截止时间:" + dueDate);
+                                        //任务截止时间文本
+                                        String renwujiezhiTime = "";
+                                        //任务截止时间戳
+                                        long time1 = 0;
+                                        //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
+                                        String renwujiezhiTimeStr = dueDate.replace("Z", " UTC");
+                                        try {
+                                            Date renwujiezhiDate = format.parse(renwujiezhiTimeStr);
+                                            renwujiezhiTime = defaultFormat.format(renwujiezhiDate);
+                                            System.out.println("任务截止时间文本:" + renwujiezhiTime);
+                                            time1 = renwujiezhiDate.getTime();
+                                            System.out.println("任务截止时间戳:" + time1);
+                                        } catch (Exception e) {
+                                            e.printStackTrace();
+                                        }
+                                        System.out.println("任务截止时间(时间格式文本):" + renwujiezhiTime);
+                                        System.out.println("任务截止时间(时间戳):" + time1);
+
+                                        //获取任务完成时间
+                                        String accomplishTime = jsonObject1.getString("accomplishTime");
+                                        System.out.println("任务完成时间:" + accomplishTime);
+                                        //任务完成时间文本
+                                        String renwuwanchengTime = "";
+                                        //任务完成时间戳
+                                        long time2 = 0;
+                                        //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
+                                        String renwuwanchengTimeStr = accomplishTime.replace("Z", " UTC");
+                                        try {
+                                            Date renwuwanchengDate = format.parse(renwuwanchengTimeStr);
+                                            renwuwanchengTime = defaultFormat.format(renwuwanchengDate);
+                                            System.out.println("任务完成时间文本:" + renwuwanchengTime);
+                                            time2 = renwuwanchengDate.getTime();
+                                            System.out.println("任务完成时间戳:" + time2);
+                                        } catch (Exception e) {
+                                            e.printStackTrace();
+                                        }
+                                        System.out.println("任务完成时间(时间格式文本):" + renwuwanchengTime);
+                                        System.out.println("任务完成时间(时间戳):" + time2);
+
+                                        //比较时间戳
+                                        if (time1 > time2){
+                                            log.info("【任务完成时间未超过任务截止时间,正常】,开始更新项目概览自定义字段「项目状态」");
+                                            /**更新项目概览自定义字段「项目状态」*/
+                                            updateXmCustomField(operatorId, xmid, xmztid,"正常");
+
+                                            /**根据TB项目id查询宜搭IPD应用的项目档案记录的TB项目id,获取宜搭项目档案编号,进行回写更新宜搭LEV应用中项目档案的状态*/
+                                            if (slid_lev != null){
+                                                log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「不为空」】,开始根据实例id执行更新LEV项目档案的「项目状态」===》");
+
+                                                /**根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段*/
+                                                updateYidaLEVxmzt(slid_lev, "正常");
+                                            }else {
+                                                log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「为空」】,终止更新LEV项目档案的「项目状态」!");
+                                            }
+                                        }else {
+                                            log.info("【任务完成时间超过任务截止时间,逾期】,开始更新项目概览自定义字段「项目状态」");
+                                            /**更新项目概览自定义字段「项目状态」*/
+                                            updateXmCustomField(operatorId, xmid, xmztid,"逾期");
+
+                                            /**根据TB项目id查询宜搭IPD应用的项目档案记录的TB项目id,获取宜搭项目档案编号,进行回写更新宜搭LEV应用中项目档案的状态*/
+                                            if (slid_lev != null){
+                                                log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「不为空」】,开始根据实例id执行更新LEV项目档案的「项目状态」===》");
+
+                                                /**根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段*/
+                                                updateYidaLEVxmzt(slid_lev, "延期");
+                                            }else {
+                                                log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「为空」】,终止更新LEV项目档案的「项目状态」!");
+                                            }
+                                        }
+                                    }else {
+                                        log.info("【任务状态非完成】,执行结束!");
+                                    }
+                                }else{
+                                    log.info("【通过项目id和工作流id,获取「里程碑」任务完成状态id】为空,结束判断任务状态是否完成!");
+                                }
+                            }else {
+                                log.info("【通过项目id和工作流名称,获取「里程碑」工作流id】为空,结束判断任务状态是否完成!");
+                            }
+                        }else {
+                            log.info("【任务类型非里程碑】,执行结束!");
+                        }
+                    }else{
+                        log.info("【通过项目id查询项目「里程碑」任务类型id】为空,结束判断是否为里程碑任务!");
+                    }
+                }
+            }else{
+                log.info("【根据项目id,查询项目概览自定义字段列表中「项目状态」id】为空,结束执行后续业务!");
+            }
+        }
+
+        return "【TB】数据WebHook更新完成!";
+    }
+}

+ 7 - 8
main/resources/application.properties

@@ -1,8 +1,13 @@
-server.port=8107
-server.servlet.context-path=/huanshi
+server.port=8118
+server.servlet.context-path=/paizhi
 
 server.tomcat.uri-encoding=UTF-8
 
+#?????????
+ribbon:
+    ReadTimeoutMillis: 5000
+    ConnectTimeoutMillis: 5000
+
 ## 服务名
 #spring.application.name=simaner-yd
 ## 环境设置:dev、test、prod(开发环境、测试环境、生产环境)
@@ -15,12 +20,6 @@ server.tomcat.uri-encoding=UTF-8
 #spring.datasource.username=root
 #spring.datasource.password=123456
 
-# 云璞【47.98.130.40服务器】测试数据库
-#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-#spring.datasource.url=jdbc:mysql://47.97.181.40:3306/dingtalk?serverTimezone=GMT%2B8
-#spring.datasource.username=root
-#spring.datasource.password=cp-root@2022++
-
 #定时同步
 
 #配置日志,当前为默认的控制台输出,也可以用log4j

+ 230 - 0
src/test/java/com/muzhi/paizhi/APITest/Test1.java

@@ -0,0 +1,230 @@
+package com.muzhi.paizhi.APITest;
+
+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.SearchFormDatasResponse;
+import com.aliyun.dingtalkyida_2_0.models.CreateOrUpdateFormDataResponse;
+import com.aliyun.dingtalkyida_2_0.models.GetFormDataByIDResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muzhi.paizhi.service.AccessTokenService;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@SpringBootTest
+@Slf4j
+public class Test1 {
+
+    @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_2_0.Client createClient2() 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_2_0.Client(config);
+    }
+
+    //宜搭接口调用
+    public static com.aliyun.dingtalkyida_1_0.Client createClient3() 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);
+    }
+
+    @Test
+    public void test1(){
+        JSONObject jsonObject2 = null;
+        try {
+            com.aliyun.dingtalkyida_2_0.Client client = createClient2();
+            com.aliyun.dingtalkyida_2_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_2_0.models.CreateOrUpdateFormDataHeaders();
+            createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_2_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_2_0.models.CreateOrUpdateFormDataRequest()
+                    .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                    .setFormUuid("FORM-BD31E2C07C7448DD931F686A5D881E96DQV8")
+                    .setUserId("yida_pub_account")
+                    .setSearchCondition("[{\"componentName\":\"TextField\",\"type\":\"TEXT\",\"value\":\"BC2000029\",\"key\":\"textField_maw7b9k0\",\"operator\":\"eq\"}]")
+                    .setAppType("APP_FJSLK9BJ20K1NL3G2PUW")
+                    .setFormDataJson("{\"selectField_lqesy4t1\":\"D\",\"textField_maw7b9k0\":\"BC2000029\",\"textField_lqesy4sy\":\"KETTLER Alu-Rad GmbH\",\"textField_mh8j17hy\":\"袁铷玥\"}");
+
+            CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
+            jsonObject2 = JSON.parseObject(s);
+            System.out.println("【创建或更新】表单object对象:" + jsonObject2);
+        } 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 属性,可帮助开发定位问题
+            }
+        }
+    }
+
+    @Test
+    public void test2(){
+        try {
+            com.aliyun.dingtalkyida_2_0.Client client = createClient2();
+            com.aliyun.dingtalkyida_2_0.models.GetFormDataByIDHeaders getFormDataByIDHeaders = new com.aliyun.dingtalkyida_2_0.models.GetFormDataByIDHeaders();
+            getFormDataByIDHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_2_0.models.GetFormDataByIDRequest getFormDataByIDRequest = new com.aliyun.dingtalkyida_2_0.models.GetFormDataByIDRequest()
+                    .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                    .setUserId("yida_pub_account")
+                    .setAppType("APP_FJSLK9BJ20K1NL3G2PUW");
+
+            GetFormDataByIDResponse formDataByIDWithOptions = client.getFormDataByIDWithOptions("FINST-R8E66381FS30I83TKR2W4DO14O8V35TY6QBHM5NH", getFormDataByIDRequest, getFormDataByIDHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(formDataByIDWithOptions.getBody());
+            JSONObject jsonObject = JSON.parseObject(s);
+            System.out.println("【查询】表单object对象:" + jsonObject);
+        } 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 属性,可帮助开发定位问题
+            }
+
+        }
+    }
+
+    @Test
+    public void test3(){
+        try {
+            com.aliyun.dingtalkyida_2_0.Client client = createClient2();
+            com.aliyun.dingtalkyida_2_0.models.UpdateSubTableHeaders updateSubTableHeaders = new com.aliyun.dingtalkyida_2_0.models.UpdateSubTableHeaders();
+            updateSubTableHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_2_0.models.UpdateSubTableRequest updateSubTableRequest = new com.aliyun.dingtalkyida_2_0.models.UpdateSubTableRequest()
+                    .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
+                    .setFormInstanceId("FINST-R8E66381FS30I83TKR2W4DO14O8V35TY6QBHM5NH")
+                    .setUserId("yida_pub_account")
+                    .setTableFieldIds("tableField_lqesy4t4")
+                    .setUpdateFormDataJson("{     \"tableField_lqesy4t4\": [         {             \"textField_makozait\": \"0519-68198299\",             \"textField_lqesy4t7\": \"\",             \"textField_lqesy4t6\": \"\"         }     ] }")
+                    .setAppType("APP_FJSLK9BJ20K1NL3G2PUW");
+
+            client.updateSubTableWithOptions(updateSubTableRequest, updateSubTableHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } 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 属性,可帮助开发定位问题
+            }
+
+        }
+    }
+
+
+    @Test
+    public void test4(){
+
+        JSONObject jsonObject = null;
+
+        int size = 100;
+        int page = 1;
+
+        //TODO 指定筛选信息
+        Map mapAll = new HashMap();
+        //TB项目id
+        mapAll.put("textField_lqxtykce", "6912e527d299b1cc63ab2960");
+        String mapAllStr = JSON.toJSONString(mapAll);
+        System.out.println("封装查询的字段参数:" + mapAllStr);
+
+        //LEV项目档案的实例id
+        String slid_lev = null;
+        do {
+
+            try {
+                com.aliyun.dingtalkyida_1_0.Client client = createClient3();
+                com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders();
+                searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+                com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest()
+                        .setSystemToken("1W9669D1HQZUJCB5D3Q8S5T6XUXZ2EL3V42AMYQ1")
+
+                        .setSearchFieldJson(mapAllStr)
+
+                        .setCurrentPage(page)
+                        .setPageSize(size)
+                        .setFormUuid("FORM-2CC97D2F8D7D4F7C925538CC5758755DOA4W")
+                        .setUserId("yida_pub_account")
+                        .setAppType("APP_H2HQQ5I9E0HHGHAY7KSL");
+
+                SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
+//                System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody()));
+                String s = JSON.toJSONString(searchFormDatasResponse.getBody());
+                jsonObject = JSON.parseObject(s);
+//                System.out.println("宜搭数据高级条件查询【IPD项目档案】接口object对象:" + jsonObject);
+            } 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 属性,可帮助开发定位问题
+                }
+
+            }
+
+            JSONArray data = jsonObject.getJSONArray("data");
+//            System.out.println("返回的宜搭data:" + data);
+
+            if (data.isEmpty()) {
+                System.out.println("查询【IPD项目档案】返回数据为空!");
+            } else {
+                for (int i = 0; i < data.size(); i++) {
+                    JSONObject formData = data.getJSONObject(i).getJSONObject("formData");
+                    Map map = new HashMap<>();
+
+                    //实例ID
+                    String shiliID = data.getJSONObject(i).getString("formInstanceId");
+                    System.out.println("实例ID===>" + shiliID);
+
+                    //LEV项目档案的实例id
+                    slid_lev = null;
+                    try {
+                        slid_lev = formData.getString("textField_lrj7vnxf") != null ? formData.getString("textField_lrj7vnxf") : null;
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                    System.out.println("LEV项目档案的实例id:" + slid_lev);
+                }
+            }
+
+            if (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")){
+                page = page + 1;
+                System.out.println("下一次待查询分页:" + page);
+            }
+
+        }while (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage"));
+
+        System.out.println("根据TB项目id查询【IPD项目档案】匹配到的LEV项目档案数据实例id:" + slid_lev);
+    }
+
+}

+ 1 - 1
test/java/com/muzhi/huanshi/TestApplicationTests.java

@@ -1,4 +1,4 @@
-package com.muzhi.huanshi;
+package com.muzhi.paizhi;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;

Plik diff jest za duży
+ 0 - 3321
test/java/com/muzhi/huanshi/APITest/Test1.java