zhang-kan-kan преди 3 години
ревизия
30efd4060b

+ 37 - 0
.gitignore

@@ -0,0 +1,37 @@
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+/log/
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+mvnw
+mvnw.cmd
+
+# tmp file
+.tmp
+/tmp/

+ 346 - 0
pom.xml

@@ -0,0 +1,346 @@
+<?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.tb</groupId>
+    <artifactId>tb</artifactId>
+<!--    <packaging>jar</packaging>-->
+    <version>1.0-SNAPSHOT</version>
+    <name>tb</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <fastjson.version>1.2.33</fastjson.version>
+        <gson.version>2.8.2</gson.version>
+        <json.version>20170516</json.version>
+        <poi.version>3.17</poi.version>
+        <jodatime.version>2.10.1</jodatime.version>
+        <swagger.version>2.7.0</swagger.version>
+        <commons-fileupload.version>1.3.1</commons-fileupload.version>
+        <!--        <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>-->
+        <!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本-->
+        <!--        <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>-->
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>sonatype-nexus-staging</id>
+            <name>Sonatype Nexus Staging</name>
+            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <!-- httpClient -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.konghq</groupId>
+            <artifactId>unirest-java</artifactId>
+            <version>2.3.17</version>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.slf4j</groupId>-->
+<!--            <artifactId>slf4j-api</artifactId>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>commons-io</groupId>-->
+<!--            <artifactId>commons-io</artifactId>-->
+<!--        </dependency>-->
+
+        <!--json 组件 -->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>fastjson</artifactId>-->
+<!--            <scope>provided</scope>-->
+<!--        </dependency>-->
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.apache.cxf</groupId>-->
+        <!--            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>-->
+        <!--            <version>3.3.1</version>-->
+        <!--        </dependency>-->
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
+        <!--&lt;!&ndash;            <version>2.3.3.RELEASE</version>&ndash;&gt;-->
+        <!--        </dependency>-->
+
+        <!--钉钉相关-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.4.35</version>
+        </dependency>
+
+        <!--json相关-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>net.sf.json-lib</groupId>-->
+        <!--            <artifactId>json-lib</artifactId>-->
+        <!--            <version>2.4</version>-->
+        <!--        </dependency>-->
+
+
+        <!-- JSONObject对象依赖的jar包 -->
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.ezmorph</groupId>
+            <artifactId>ezmorph</artifactId>
+            <version>1.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.2.3</version>
+            <classifier>jdk15</classifier><!-- 指定jdk版本 -->
+        </dependency>
+
+
+        <!--xls-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--xlsx-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--文件上传-->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
+        <!--        </dependency>-->
+
+        <!--引入web模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>2.3.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+            <version>1.18.10</version>
+        </dependency>
+
+<!--        &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>
+
+        <!--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>

+ 26 - 0
src/main/java/com/muzhi/tb/TBApplication.java

@@ -0,0 +1,26 @@
+package com.muzhi.tb;
+
+import com.aliyun.tea.TeaException;
+import com.muzhi.tb.service.impl.TbServiceImpl;
+//import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+//@MapperScan("com.muzhi.tb.mapper")
+@EnableAsync
+@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)
+@EnableScheduling//开启定时任务
+//@ComponentScan(basePackages = {"com.muzhi"})
+public class TBApplication {
+
+    public static void main(String[] args){
+        SpringApplication.run(TBApplication.class, args);
+    }
+
+}

+ 50 - 0
src/main/java/com/muzhi/tb/controller/AccessTokenController.java

@@ -0,0 +1,50 @@
+package com.muzhi.tb.controller;
+
+import com.muzhi.tb.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.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")
+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(牧之测试架构4)
+    @ApiOperation(value = "获取钉钉中的access_token")
+    @GetMapping("getMuZhiAccessToken")
+    public String getMuZhiAccessToken(){
+
+        String muZhiAccessToken = AccessTokenService.getMuZhiAccessToken();
+        return muZhiAccessToken;
+    }
+
+    //获取钉钉中的access_token(TB应用)
+    @ApiOperation(value = "获取钉钉中的access_token")
+    @GetMapping("getAppToken")
+    public String getAppToken(){
+
+        String AppToken = AccessTokenService.getAppToken();
+        return AppToken;
+    }
+}

+ 57 - 0
src/main/java/com/muzhi/tb/controller/TbController.java

@@ -0,0 +1,57 @@
+package com.muzhi.tb.controller;
+
+import com.muzhi.tb.service.TbService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "TB接口")
+@RestController
+@RequestMapping("/tbservice")
+public class TbController {
+
+    @Autowired
+    private TbService tbService;
+
+    //获取TB中的企业成员列表(TB应用)
+    @ApiOperation(value = "获取TB中的企业成员列表(TB应用)")
+    @GetMapping("getUserList")
+    public String getUserList(){
+
+        String userList = tbService.getUserList();
+        return userList;
+    }
+
+    @GetMapping("userGet")
+    public String userGet(String userId){
+
+        String s = tbService.userGet(userId);
+        return s;
+    }
+
+    //接收TB推送的数据
+    @PostMapping("callback")
+    public String callback(@RequestBody Map body) throws Exception{
+
+        String s = tbService.callBack(body);
+        System.out.println(s);
+        return s;
+    }
+
+    //创建宜搭项目表单
+//    @PostMapping("createYiDaXM")
+//    public String createYiDaXM() throws Exception{
+//
+//        String yiDaXM = tbService.createYiDaXM();
+//        System.out.println(yiDaXM);
+//        return yiDaXM;
+//    }
+}

+ 43 - 0
src/main/java/com/muzhi/tb/controller/YiDaController.java

@@ -0,0 +1,43 @@
+package com.muzhi.tb.controller;
+
+import com.muzhi.tb.service.TbService;
+import com.muzhi.tb.service.YiDaService;
+import com.muzhi.tb.service.impl.YiDaServiceImpl;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "TB接口")
+@RestController
+@RequestMapping("/yidaservice")
+public class YiDaController {
+
+    @Autowired
+    private YiDaService yiDaService;
+
+    //创建宜搭项目表单
+    @PostMapping("createYiDaXM")
+    public String createYiDaXM(String dingUserid,String mapJson) throws Exception{
+
+        String yiDaXM = yiDaService.createYiDaXM(dingUserid,mapJson);
+        System.out.println(yiDaXM);
+        return yiDaXM;
+    }
+
+    //创建宜搭任务表单
+    @PostMapping("createYiDaRW")
+    public String createYiDaRW(String dingUserid,String mapJson) throws Exception{
+
+        String yiDaRW = yiDaService.createYiDaRW(dingUserid,mapJson);
+        System.out.println(yiDaRW);
+        return yiDaRW;
+    }
+}

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

@@ -0,0 +1,17 @@
+package com.muzhi.tb.service;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface AccessTokenService {
+
+    //获取access_token的方法(云璞)
+    String getAccessToken();
+
+    //获取access_token的方法(牧之测试架构4)
+    String getMuZhiAccessToken();
+
+    //获取access_token的方法(TB应用)
+    String getAppToken();
+}

+ 18 - 0
src/main/java/com/muzhi/tb/service/TbService.java

@@ -0,0 +1,18 @@
+package com.muzhi.tb.service;
+
+import java.util.Map;
+
+public interface TbService {
+
+    //获取TB企业成员列表
+    String getUserList();
+
+    //批量获取TB企业成员(目前仅用作查询TB某个人员的信息)
+    String userGet(String userId);
+
+    //接收TB推送的数据
+    String callBack(Map body) throws Exception;
+
+//    //创建宜搭项目表单
+//    String createYiDaXM() throws Exception;
+}

+ 12 - 0
src/main/java/com/muzhi/tb/service/YiDaService.java

@@ -0,0 +1,12 @@
+package com.muzhi.tb.service;
+
+import java.util.Map;
+
+public interface YiDaService {
+
+    //创建宜搭项目表单
+    String createYiDaXM(String dingUserid,String mapJson) throws Exception;
+
+    //创建宜搭任务表单
+    String createYiDaRW(String dingUserid,String mapJson) throws Exception;
+}

+ 114 - 0
src/main/java/com/muzhi/tb/service/impl/AccessTokenServiceImpl.java

@@ -0,0 +1,114 @@
+package com.muzhi.tb.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.tb.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 {
+    //AccessTokenService
+
+    //云璞(牧之宜搭测试使用)
+    //AgentId:1894218371
+    //APPKEY
+    private static String APPKEY = "dingcyam301x0oatyfmy";
+    //APPSECRET
+    private static String APPSECRET = "6DUwt_XS46RD7QPnhkALxmUcVyl1sk9AffgUK0SXGBvgFSMDAPFr_RMeEQpZLYfB";
+
+    public static String accessToken = null;
+
+
+    //牧之测试架构4
+    //APPKEY
+    private static String APPKEY1 = "ding2katvzyqvlkunqtb";
+    //APPSECRET
+    private static String APPSECRET1 = "vSctQrVm5cGos0X6K86NN0A8Vv6-SmN4W_VRXjsqPqZRhZtbG6xfPATOZhPi3VBE";
+
+    public static String accessToken1 = 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;
+    }
+
+    //获取access_token的方法(牧之测试架构4)
+    @Override
+    public String getMuZhiAccessToken() {
+        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        OapiGettokenRequest request = new OapiGettokenRequest();
+        request.setAppkey(APPKEY1);
+        request.setAppsecret(APPSECRET1);
+        request.setHttpMethod("GET");
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            accessToken1 = response.getAccessToken();
+            System.out.println("牧之测试架构4的AccessToken:" + accessToken1);
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+        return accessToken1;
+    }
+
+
+    public static final Long   EXPIRES_IN = 1 * 3600 * 1000L;
+    public static final String TOKEN_APPID = "_appId";
+
+    public static String appId = "63218a98d4b83fe98c507a47";
+    public static String appSecret = "xbp4kN6j4FBKPsJAdEX9Gd2cJMeuyP4Y";
+    //获取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;
+
+    }
+
+}

+ 394 - 0
src/main/java/com/muzhi/tb/service/impl/TbServiceImpl.java

@@ -0,0 +1,394 @@
+package com.muzhi.tb.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.tea.TeaException;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
+import com.dingtalk.api.response.OapiGettokenResponse;
+import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
+import com.muzhi.tb.service.AccessTokenService;
+import com.muzhi.tb.service.TbService;
+import com.muzhi.tb.service.YiDaService;
+import com.taobao.api.ApiException;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+@Service
+public class TbServiceImpl implements TbService{
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    @Autowired
+    private YiDaService yiDaService;
+
+    public static String body = null;
+    public static String result = null;
+
+    //云璞(牧之宜搭测试使用)
+    //AgentId:1894218371
+    //APPKEY
+    private static String APPKEY = "dingcyam301x0oatyfmy";
+    //APPSECRET
+    private static String APPSECRET = "6DUwt_XS46RD7QPnhkALxmUcVyl1sk9AffgUK0SXGBvgFSMDAPFr_RMeEQpZLYfB";
+
+    public static String accessToken = null;
+
+    //TB(TB对接宜搭应用)
+    //TB授权码时效(1小时)
+    public static final Long   EXPIRES_IN = 1 * 3600 * 1000L;
+    public static final String TOKEN_APPID = "_appId";
+
+    public static String appId = "63218a98d4b83fe98c507a47";
+    public static String appSecret = "xbp4kN6j4FBKPsJAdEX9Gd2cJMeuyP4Y";
+
+    //获取TB企业成员列表(===TEST===)
+    @Override
+    public String getUserList() {
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        Request request = new Request.Builder()
+                .url("https://open.teambition.com/api/org/member/list?orgId=5ca44db8ca4fd40001b10559")
+                .method("GET", null)
+                .addHeader("Content-Type", "application/json")
+                //TB应用授权码
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                //企业ID
+                .addHeader("X-Tenant-Id", "5ca44db8ca4fd40001b10559")
+                //租户类型,默认为 organization
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+        try {
+            Response response = client.newCall(request).execute();
+            body = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(body);
+            System.out.println("返回体body:" + jsonObject);
+        }catch (IOException e){
+            e.printStackTrace();
+        }
+
+        return body;
+    }
+
+    //批量获取TB企业成员(目前仅用作查询TB某个人员的信息)
+    @Override
+    public String userGet(String userId){
+
+        //1、将TB的userid放在数组中
+        List list = new ArrayList();
+        list.add(userId);
+        System.out.println("list:" + list);
+        //2、将TB接口指定传入的body请求体封装成集合
+        Map map = new HashMap();
+        map.put("orgId","5ca44db8ca4fd40001b10559");
+        map.put("userIds",list);
+        String userBody = JSON.toJSONString(map);
+        System.out.println("userBody:" + userBody);
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        //传入上面封装好的userBody请求体
+        RequestBody body = RequestBody
+                .create(mediaType, userBody);
+        Request request = new Request.Builder()
+                .url("https://open.teambition.com/api/org/member/batchGet")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                //TB应用授权码
+                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+                //企业ID
+                .addHeader("X-Tenant-Id", "5ca44db8ca4fd40001b10559")
+                //租户类型,默认为 organization
+                .addHeader("X-Tenant-Type", "organization")
+                .build();
+
+        String name = null;
+        String phone = null;
+        try {
+            Response response = client.newCall(request).execute();
+            result = response.body().string();
+            JSONObject jsonObject = JSON.parseObject(result);
+            System.out.println("返回结果result:" + jsonObject);
+
+            JSONArray result = jsonObject.getJSONArray("result");
+            System.out.println("解析数组result:" + result);
+            name = result.getJSONObject(0).getString("name");
+            System.out.println("提取name:" + name);
+            String phone1 = result.getJSONObject(0).getString("phone");
+            phone = phone1.substring(3);
+            System.out.println("提取phone:" + phone);
+        }catch (IOException e){
+            e.printStackTrace();
+        }
+
+        //【钉钉:根据手机号查询用户】
+        String dingUserId = null;
+        try {
+            DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
+            OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
+            req.setMobile(phone);
+            OapiV2UserGetbymobileResponse rsp = client1.execute(req, accessTokenService.getAccessToken());
+            System.out.println(rsp.getBody());
+            dingUserId = JSON.parseObject(rsp.getBody()).getJSONObject("result").getString("userid");
+            System.out.println("钉钉userid(和宜搭一致):" + dingUserId);
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+
+        return dingUserId;
+    }
+
+    //接收TB的WebHookt推送过来的数据
+    @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);
+
+        //======项目创建======
+        if (event.equals("project.create")) {
+            JSONObject data = jsonObject.getJSONObject("data");
+            System.out.println("项目信息data:" + data);
+
+            JSONObject project = data.getJSONObject("project");
+            System.out.println("TB新建项目project:" + project);
+
+            //摘取需要的字段信息
+            String projectName = project.getString("name");
+            System.out.println("项目名称:" + projectName);
+            String projectId = project.getString("projectId");
+            System.out.println("项目ID:" + projectId);
+//            String created = data.getString("created");
+//            System.out.println("创建时间:" + created);
+//            String creatorId = data.getString("creatorId");
+//            System.out.println("创建人ID:" + creatorId);
+
+            //根据TB推送过来的数据中的userid获取钉钉userid
+//            String dingUserid = userGet(creatorId);
+
+            Map map = new HashMap();
+            map.put("textField_l88d4swp", projectId);
+            map.put("textField_l82qfm9t", projectName);
+            map.put("employeeField_l82qfm9u", null);
+            map.put("dateField_l82qfm9y", timestamp);
+            String mapJson = JSON.toJSONString(map);
+
+            String yiDaXM = yiDaService.createYiDaXM(null, mapJson);
+            System.out.println("创建宜搭表单返回信息:" + yiDaXM);
+        }
+        //======项目更新======
+        else if (event.equals("v3.project.name.update")){
+            JSONObject data = jsonObject.getJSONObject("data");
+            System.out.println("项目信息data:" + data);
+
+            //摘取需要的字段信息
+            String projectName = data.getString("name");
+            System.out.println("项目名称:" + projectName);
+            String projectId = data.getString("projectId");
+            System.out.println("项目ID:" + projectId);
+            String created = data.getString("created");
+            System.out.println("创建时间:" + created);
+            String creatorId = data.getString("creatorId");
+            System.out.println("创建人ID:" + creatorId);
+
+            //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
+            created = created.replace("Z", " UTC");
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+            SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String dateTime = "";
+            long time1 = 0;
+            try {
+                Date time = format.parse(created);
+                dateTime = defaultFormat.format(time);
+                System.out.println("dateTime:" + dateTime);
+                time1 = time.getTime();
+                System.out.println("时间戳:" + time1);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //根据TB推送过来的数据中的userid获取钉钉userid
+            String dingUserid = userGet(creatorId);
+
+            Map map = new HashMap();
+            map.put("textField_l88d4swp", projectId);
+            map.put("textField_l82qfm9t", projectName);
+            map.put("employeeField_l82qfm9u", dingUserid);
+            map.put("dateField_l82qfm9y", time1);
+            String mapJson = JSON.toJSONString(map);
+
+            String yiDaXM = yiDaService.createYiDaXM(dingUserid, mapJson);
+            System.out.println("创建宜搭表单返回信息:" + yiDaXM);
+        }
+        //TODO ======任务创建======
+        else if (event.equals("task.create")){
+            JSONObject data = jsonObject.getJSONObject("data");
+            JSONObject task = data.getJSONObject("task");
+            System.out.println("任务信息data:" + data);
+
+            //摘取需要的字段信息
+            String projectId = task.getString("projectId");
+            System.out.println("项目ID:" + projectId);
+            String taskName = task.getString("content");
+            System.out.println("任务名称:" + taskName);
+            String taskId = task.getString("taskId");
+            System.out.println("任务ID:" + taskId);
+            String created = task.getString("created");
+            System.out.println("创建时间:" + created);
+            String creatorId = task.getString("creatorId");
+            System.out.println("创建人ID:" + creatorId);
+
+            String startDate = task.getString("startDate");
+            System.out.println("任务开始时间:" + startDate);
+            String dueDate = task.getString("dueDate");
+            System.out.println("任务结束时间:" + dueDate);
+
+            JSONArray participants = task.getJSONArray("participants");
+
+//            for (int i = 0; participants.size() > i; i++){
+//
+//            }
+
+            //根据TB推送过来的数据中的userid获取钉钉userid
+            String creatorId1 = userGet(creatorId);
+
+            //创建时间
+            created = created.replace("Z", " UTC");
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+            SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String dateTime = "";
+            long time1 = 0;
+            try {
+                Date time = format.parse(created);
+                dateTime = defaultFormat.format(time);
+                System.out.println("dateTime:" + dateTime);
+                time1 = time.getTime();
+                System.out.println("时间戳:" + time1);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //任务开始时间
+            startDate = startDate.replace("Z", " UTC");
+            SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+            SimpleDateFormat defaultFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String dateTime1 = "";
+            long time11 = 0;
+            try {
+                Date time2 = format1.parse(startDate);
+                dateTime1 = defaultFormat1.format(time2);
+                System.out.println("dateTime1:" + dateTime1);
+                time11 = time2.getTime();
+                System.out.println("时间戳:" + time11);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //任务结束时间
+            dueDate = dueDate.replace("Z", " UTC");
+            SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+            SimpleDateFormat defaultFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String dateTime2 = "";
+            long time111 = 0;
+            try {
+                Date time3 = format2.parse(dueDate);
+                dateTime2 = defaultFormat2.format(time3);
+                System.out.println("dateTime2:" + dateTime2);
+                time111 = time3.getTime();
+                System.out.println("时间戳:" + time111);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            //======任务表单中的项目关联表单控件值======
+            Map xmMap = new HashMap();
+            //表单类型:默认
+            xmMap.put("formType","receipt");
+            //项目表单ID
+            xmMap.put("formUuid","FORM-OS566L91S9Y3NHB9CFHMU6HZEQAJ22C6NP28L4");
+            //项目表单实例ID
+            xmMap.put("instanceId","FINST-J0A66981JGX305I3BFO1N6MSB8552E402848LUL5");
+            //标题
+            xmMap.put("subTitle","张侃");
+            //应用编码appType
+            xmMap.put("appType","APP_NOQGHDKUDXD7VDWZUC6I");
+            //表单实例标题
+            xmMap.put("title","测试项目");
+            System.out.println("项目关联表单控件值map:" + xmMap);
+
+            //转换成数组集合
+            List xmList = new ArrayList();
+            xmList.add(xmMap);
+            String xmListString = JSON.toJSONString(xmList);
+            System.out.println("项目关联表单控件值list文本json:" + xmListString);
+
+            //参与人ID集合
+            List list = new ArrayList();
+            list.add("16583692962961532");
+            list.add("16163038167819429");
+
+            //TODO 执行人ID集合
+//            List list1 = new ArrayList();
+//            list1.add("16583692962961532");
+
+            //任务时间集合(时间戳区间)
+            List listTime = new ArrayList();
+            listTime.add(time11);
+            listTime.add(time111);
+
+            Map map = new HashMap();
+            //项目编码
+            map.put("textField_l88d67g3", projectId);
+            //项目名称(关联表单组件)
+            map.put("associationFormField_l82r3cm1", xmListString);
+            //任务编码
+            map.put("textField_l88d67g2",taskId);
+            //任务名称
+            map.put("textField_l82r3cm2",taskName);
+            //参与者ID列表
+            map.put("employeeField_l82r3cm5",list);
+            //TODO 执行者ID列表
+//            map.put("employeeField_l82r3cm4",list1);
+            //任务时间(时间戳区间)
+            map.put("cascadeDateField_l82r3cm7",listTime);
+            //创建人员ID(钉钉ID)
+            map.put("employeeField_l82r3cm3", creatorId1);
+            //创建时间
+            map.put("dateField_l82r3cm8", time1);
+            String mapJson = JSON.toJSONString(map);
+
+            String yiDaRW = yiDaService.createYiDaRW(creatorId1, mapJson);
+            System.out.println("创建宜搭表单返回信息:" + yiDaRW);
+        }
+        //======任务更新======
+        else if (event.equals("task.update")){
+
+        }
+
+        return "【TB】数据同步推送【宜搭】成功!";
+    }
+}

+ 122 - 0
src/main/java/com/muzhi/tb/service/impl/YiDaServiceImpl.java

@@ -0,0 +1,122 @@
+package com.muzhi.tb.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkyida_1_0.models.StartInstanceHeaders;
+import com.aliyun.dingtalkyida_1_0.models.StartInstanceRequest;
+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.OapiV2UserGetbymobileRequest;
+import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
+import com.muzhi.tb.service.AccessTokenService;
+import com.muzhi.tb.service.YiDaService;
+import com.taobao.api.ApiException;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class YiDaServiceImpl implements YiDaService {
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    public static String body = null;
+    public static String result = null;
+
+
+    /**
+     * 使用 Token 初始化账号Client
+     * @return Client
+     * @throws Exception
+     */
+    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);
+    }
+
+    @Override
+    public String createYiDaXM(String dingUserid,String mapJson) throws Exception{
+
+        //创建宜搭表单(项目管理表单)
+        com.aliyun.dingtalkyida_1_0.Client client = createClient();
+        com.aliyun.dingtalkyida_1_0.models.SaveFormDataHeaders saveFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.SaveFormDataHeaders();
+        //钉钉token授权码
+        saveFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+        com.aliyun.dingtalkyida_1_0.models.SaveFormDataRequest saveFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.SaveFormDataRequest()
+                //宜搭应用秘钥(宜搭使用的是钉钉token授权码)
+                .setSystemToken("WP966ZB1A4S3UPKK874E098BVPXN2EHYMP28LZE")
+                //宜搭表单ID(项目管理表单)
+                .setFormUuid("FORM-OS566L91S9Y3NHB9CFHMU6HZEQAJ22C6NP28L4")
+                //TODO 发起人:用户useId
+                .setUserId(dingUserid)
+                //宜搭应用编码
+                .setAppType("APP_NOQGHDKUDXD7VDWZUC6I")
+                //TODO 宜搭表单控件传参:json格式,同时对应表单的控件id进行传值创建表单数据
+                .setFormDataJson(mapJson);
+        try {
+            client.saveFormDataWithOptions(saveFormDataRequest, saveFormDataHeaders, 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 属性,可帮助开发定位问题
+            }
+
+        }
+
+        return "创建宜搭项目表单成功!";
+    }
+
+    @Override
+    public String createYiDaRW(String dingUserid,String mapJson) throws Exception{
+
+        com.aliyun.dingtalkyida_1_0.Client client = createClient();
+        StartInstanceHeaders startInstanceHeaders = new StartInstanceHeaders();
+        startInstanceHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+        StartInstanceRequest startInstanceRequest = new StartInstanceRequest()
+                .setAppType("APP_NOQGHDKUDXD7VDWZUC6I")
+                .setSystemToken("WP966ZB1A4S3UPKK874E098BVPXN2EHYMP28LZE")
+                .setUserId(dingUserid)
+                .setLanguage("zh_CN")
+                .setFormUuid("FORM-2J6666D178X3VAUFCFHXRCEX9QF825S63R28LI")
+                .setFormDataJson(mapJson);
+//                //流程编码
+//                .setProcessCode("TPROC--EF6Y4xxx")
+//                //发起人所在部门ID
+//                .setDepartmentId("18295");
+        try {
+            client.startInstanceWithOptions(startInstanceRequest, startInstanceHeaders, new 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 属性,可帮助开发定位问题
+            }
+
+        }
+
+        return "创建宜搭任务表单成功!";
+    }
+
+}

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

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

+ 189 - 0
src/test/java/com/muzhi/tb/APITest/Test1.java

@@ -0,0 +1,189 @@
+//package com.muzhi.tb.APITest;
+//
+//import com.muzhi.tb.service.AccessTokenService;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//
+//@SpringBootTest
+//public class Test1 {
+//
+//    @Autowired
+//    private AccessTokenService dingAccessTokenService;
+//
+////    @Test
+////    public void list(){
+////
+////        //***获取指定用户的所有父部门列表
+////        String bumen111 = null;
+////        try {
+////            DingTalkClient client111 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listparentbyuser");
+////            OapiV2DepartmentListparentbyuserRequest req111 = new OapiV2DepartmentListparentbyuserRequest();
+////
+////            //传入用户id
+////            req111.setUserid("1606903117970600");
+////
+////            OapiV2DepartmentListparentbyuserResponse rsp111 = client111.execute(req111, dingAccessTokenService.getAccessToken());
+////            bumen111 = rsp111.getBody();
+////            System.out.println(rsp111.getBody());
+////        } catch (ApiException e) {
+////            e.printStackTrace();
+////        }
+////
+////        JSONObject jsonObject = JSON.parseObject(bumen111);
+////        JSONObject result = jsonObject.getJSONObject("result");
+////        JSONArray parent_list = result.getJSONArray("parent_list");
+////        System.out.println("初步解析处理:" + parent_list);
+////
+////        for (int a = 0; a<parent_list.size(); a++){
+////            JSONArray parent_dept_id_list = parent_list.getJSONObject(a).getJSONArray("parent_dept_id_list");
+////            System.out.println("多部门列表解析:" + parent_dept_id_list);
+////
+////            //获取部门详情(主要用于获取部门名称)
+////            for (int b = 0; b<parent_dept_id_list.size(); b++){
+////                String bmid111 = parent_dept_id_list.getString(b);
+////                long bmid222 = Long.parseLong(bmid111);
+////                System.out.println("最终解析的每个独立的部门id:" + bmid111);
+////
+////                System.out.println("部门分组长度:" + parent_dept_id_list.size());
+////
+////                String bumenXQ = null;
+////                try {
+////                    DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
+////                    OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
+////
+////                    //部门id
+////                    req.setDeptId(bmid222);
+////
+////                    OapiV2DepartmentGetResponse rsp = client.execute(req, dingAccessTokenService.getAccessToken());
+////                    bumenXQ = rsp.getBody();
+////                    System.out.println(rsp.getBody());
+////                } catch (ApiException e) {
+////                    e.printStackTrace();
+////                }
+////
+////                //TODO 解析出来部门名称
+////                JSONObject jsonObject1 = JSON.parseObject(bumenXQ);
+////                System.out.println("初步解析处理(部门详情):" + jsonObject1);
+////
+////                JSONObject result1 = jsonObject1.getJSONObject("result");
+////                String BMname = result1.getString("name");
+////                System.out.println("部门名称:" + BMname);
+////
+////                //TODO 每组部门id都插入一条员工信息到数据库
+////
+////
+////            }
+////            System.out.println("-------------------------分组分割线-------------------------");
+////        }
+////    }
+////
+////    @Test
+////    public void lizhi(){
+////        //***获取员工的离职信息
+////        String lizhi = null;
+////        try {
+////            DingTalkClient clientLZ = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/listdimission");
+////            OapiSmartworkHrmEmployeeListdimissionRequest reqLZ = new OapiSmartworkHrmEmployeeListdimissionRequest();
+////
+////            //离职员工id
+////            reqLZ.setUseridList("1606903117970600");
+////
+////            OapiSmartworkHrmEmployeeListdimissionResponse rspLZ = clientLZ.execute(reqLZ, dingAccessTokenService.getAccessToken());
+////            lizhi = rspLZ.getBody();
+////            System.out.println(rspLZ.getBody());
+////        } catch (ApiException e) {
+////            e.printStackTrace();
+////        }
+////
+////        JSONObject jsonObjectLizhi;
+////        JSONArray resultLizhi;
+////        String lastWorkDay = null;
+////        String main_dept_id = null;
+////        Date date1 = null;
+////
+////        try {
+////            jsonObjectLizhi = JSON.parseObject(lizhi);
+////            resultLizhi = jsonObjectLizhi.getJSONArray("result");
+////
+////            lastWorkDay = resultLizhi.getJSONObject(0).getString("last_work_day");
+////
+////            main_dept_id = resultLizhi.getJSONObject(0).getString("main_dept_id");
+////
+////            //时间戳转为日期格式
+////            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //24小时制
+////            String timeStamp = lastWorkDay;
+////            long time = Long.parseLong(timeStamp);
+////            Date date = new Date();
+////            date.setTime(time);
+////            String timeLizhi = simpleDateFormat.format(date);
+////            System.out.println("时间戳转日期格式:" + timeLizhi);
+////
+////            //String型日期转换成Date型
+////            date1 = simpleDateFormat.parse(timeLizhi);
+////
+////        }catch (Exception e){
+////            e.printStackTrace();
+////        }
+////
+////        System.out.println("lastWorkDay:" + lastWorkDay);
+////        System.out.println("main_dept_id:" + main_dept_id);
+////        System.out.println("Date类型最后工作日期:" + date1);
+////    }
+////
+////    @Test
+////    public void copy(){
+////
+////        //有数据的表
+////        Test1Copy test1Copy = new Test1Copy();
+////
+////        QueryWrapper<Test1Copy> test1CopyQueryWrapper = new QueryWrapper<>();
+////        List<Test1Copy> test1CopyList = test1CopyMapper.selectList(test1CopyQueryWrapper);
+////        System.out.println("test1CopyList" + test1CopyList);
+////
+////
+////        //无数据的表
+////        Test1 test1 = new Test1();
+////
+////        QueryWrapper<Test1> test1QueryWrapper = new QueryWrapper<>();
+////        List<Test1> test1List = test1Mapper.selectList(test1QueryWrapper);
+////        System.out.println("test1List" + test1List);
+////
+////
+////
+////        //将有数据的表数据插入无数据的表对应的字段中
+////        for (int a = 0; a<test1CopyList.size(); a++){
+////            test1.setId(test1CopyList.get(a).getId());
+////            test1.setName(test1CopyList.get(a).getName());
+////            test1.setSex(test1CopyList.get(a).getSex());
+////            test1.setTeacher(test1CopyList.get(a).getTeacher());
+////            test1Mapper.insert(test1);
+////        }
+////    }
+//
+////    @Test
+////    public void panduan(){
+////        /*判断数据库入职表中是否存在该人员的id*/
+//////        String id111 = null;
+////        Integer id111 = 0;
+////        try {
+////            QueryWrapper<EmployeeLzRuzhiCopy> queryWrapper = new QueryWrapper<>();
+////            queryWrapper.select("id").eq("id", "16359029338988172");
+////
+////            Integer integer = employeeLzRuzhiCopyMapper.selectCount(queryWrapper);
+////            System.out.println("查询当前人员的id在数据库中是否存在,返回数据条数:" + integer);
+//////            id111 = employeeLzRuzhiCopy1.getId();
+////            id111 = integer;
+////            System.out.println("查询数据库入职表中的存在人员的id条数:" + id111);
+////        }catch (Exception e){
+////            e.printStackTrace();
+////        }
+////        /*判断数据库入职表中是否存在该人员的id*/
+////
+////        //【***如果入职首次同步表中不存在律政架构中当前循环的该人员id,将该部门及人员信息插入当前的入职copy表***】
+////        if (id111==null || id111==0){
+////            System.out.println("数据库不存在该人员,插入!");
+////        }else {
+////            System.out.println("数据库中该人员已存在,不执行任何操作!");
+////        }
+////    }
+//}

+ 289 - 0
src/test/java/com/muzhi/tb/APITest/Test2.java

@@ -0,0 +1,289 @@
+//package com.muzhi.tb.APITest;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.aliyun.dingtalkyida_1_0.models.StartInstanceHeaders;
+//import com.aliyun.dingtalkyida_1_0.models.StartInstanceRequest;
+//import com.aliyun.tea.TeaException;
+//import com.aliyun.teautil.models.RuntimeOptions;
+//import com.auth0.jwt.JWT;
+//import com.auth0.jwt.algorithms.Algorithm;
+//import com.dingtalk.api.DefaultDingTalkClient;
+//import com.dingtalk.api.DingTalkClient;
+//import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
+//import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
+//import com.muzhi.tb.service.AccessTokenService;
+//import com.muzhi.tb.service.impl.TbServiceImpl;
+//import com.taobao.api.ApiException;
+//import okhttp3.*;
+//import org.junit.jupiter.api.Test;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.test.context.SpringBootTest;
+//import org.springframework.util.StringUtils;
+//
+//import java.io.IOException;
+//import java.text.SimpleDateFormat;
+//import java.util.*;
+//
+//@SpringBootTest
+//public class Test2 {
+//
+//    @Autowired
+//    private AccessTokenService accessTokenService;
+//
+//    public static String result = null;
+//
+//    public static final Long   EXPIRES_IN = 1 * 3600 * 1000L;
+//    public static final String TOKEN_APPID = "_appId";
+//
+//    //企业ID:5ca44db8ca4fd40001b10559
+//    public static final String appId = "63218a98d4b83fe98c507a47";
+//    public static final String appSecret = "xbp4kN6j4FBKPsJAdEX9Gd2cJMeuyP4Y";
+//
+//    @Test
+//    public void tb(){
+//
+//        //1、将TB的userid放在数组中
+//        String userId = "5f3a250040ce230ba377bf3c";
+//        List list = new ArrayList();
+//        list.add(userId);
+//        System.out.println("list:" + list);
+//        //2、将TB接口指定传入的body请求体封装成集合
+//        Map map = new HashMap();
+//        map.put("orgId","5ca44db8ca4fd40001b10559");
+//        map.put("userIds",list);
+//        String userBody = JSON.toJSONString(map);
+//        System.out.println("userBody:" + userBody);
+//
+//        OkHttpClient client = new OkHttpClient().newBuilder()
+//                .build();
+//        MediaType mediaType = MediaType.parse("application/json");
+//        //传入上面封装好的userBody请求体
+//        RequestBody body = RequestBody
+//                .create(mediaType, userBody);
+//        Request request = new Request.Builder()
+//                .url("https://open.teambition.com/api/org/member/batchGet")
+//                .method("POST", body)
+//                .addHeader("Content-Type", "application/json")
+//                //TB应用授权码
+//                .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
+//                //企业ID
+//                .addHeader("X-Tenant-Id", "5ca44db8ca4fd40001b10559")
+//                //租户类型,默认为 organization
+//                .addHeader("X-Tenant-Type", "organization")
+//                .build();
+//
+//        String name = null;
+//        String phone = null;
+//        try {
+//            Response response = client.newCall(request).execute();
+//            result = response.body().string();
+//            JSONObject jsonObject = JSON.parseObject(result);
+//            System.out.println("返回结果result:" + jsonObject);
+//
+//            JSONArray result = jsonObject.getJSONArray("result");
+//            System.out.println("解析数组result:" + result);
+//            name = result.getJSONObject(0).getString("name");
+//            System.out.println("提取name:" + name);
+//            String phone1 = result.getJSONObject(0).getString("phone");
+//            phone = phone1.substring(3);
+//            System.out.println("提取phone:" + phone);
+//        }catch (IOException e){
+//            e.printStackTrace();
+//        }
+//
+//        //【钉钉:根据手机号查询用户】
+//        String dingUserId = null;
+//        try {
+//            DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
+//            OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
+//            req.setMobile(phone);
+//            OapiV2UserGetbymobileResponse rsp = client1.execute(req, accessTokenService.getAccessToken());
+//            System.out.println(rsp.getBody());
+//            dingUserId = JSON.parseObject(rsp.getBody()).getJSONObject("result").getString("userid");
+//            System.out.println("钉钉userid(和宜搭一致):" + dingUserId);
+//        } catch (ApiException e) {
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    /**
+//     * 使用 Token 初始化账号Client
+//     * @return Client
+//     * @throws Exception
+//     */
+//    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);
+//    }
+//
+//    @Test
+//    public void tbTOyida() throws Exception{
+//        String created = "2022-09-21T08:51:29.669Z";
+//
+//        created = created.replace("Z", " UTC");
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+//        SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String dateTime = "";
+//        long time1 = 0;
+//        try {
+//            Date time = format.parse(created);
+//            dateTime = defaultFormat.format(time);
+//            System.out.println("dateTime:" + dateTime);
+//            time1 = time.getTime();
+//            System.out.println("时间戳:" + time1);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//
+//        Map map = new HashMap();
+//        map.put("textField_l88d4swp", "111222333");
+//        map.put("textField_l82qfm9t", "这是一个测试项目");
+//        map.put("employeeField_l82qfm9u", "15973727592422668");
+//        map.put("dateField_l82qfm9y", time1);
+//        String mapJson = JSON.toJSONString(map);
+//
+//        //参数args默认传值,无固定值,传固定值也可。
+////        String[] args_ = {"123"};
+////        java.util.List<String> args = java.util.Arrays.asList(args_);
+//        com.aliyun.dingtalkyida_1_0.Client client = createClient();
+//        com.aliyun.dingtalkyida_1_0.models.SaveFormDataHeaders saveFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.SaveFormDataHeaders();
+//        //钉钉token授权码
+//        saveFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+//        com.aliyun.dingtalkyida_1_0.models.SaveFormDataRequest saveFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.SaveFormDataRequest()
+//                //宜搭应用秘钥(宜搭使用的是钉钉token授权码)
+//                .setSystemToken("WP966ZB1A4S3UPKK874E098BVPXN2EHYMP28LZE")
+//                //宜搭表单ID(项目管理表单)
+//                .setFormUuid("FORM-OS566L91S9Y3NHB9CFHMU6HZEQAJ22C6NP28L4")
+//                //TODO 发起人:用户useId
+//                .setUserId("15973727592422668")
+//                //宜搭应用编码
+//                .setAppType("APP_NOQGHDKUDXD7VDWZUC6I")
+//                //TODO 宜搭表单控件传参:json格式,同时对应表单的控件id进行传值创建表单数据
+//                .setFormDataJson(mapJson);
+//        try {
+//            client.saveFormDataWithOptions(saveFormDataRequest, saveFormDataHeaders, 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 createYiDaRW() throws Exception{
+//
+//        String created = "2022-09-21T08:51:29.669Z";
+//
+//        created = created.replace("Z", " UTC");
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
+//        SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String dateTime = "";
+//        long time1 = 0;
+//        try {
+//            Date time = format.parse(created);
+//            dateTime = defaultFormat.format(time);
+//            System.out.println("dateTime:" + dateTime);
+//            time1 = time.getTime();
+//            System.out.println("时间戳:" + time1);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//
+//        //======任务表单中的项目关联表单控件值======
+//        Map xmMap = new HashMap();
+//        //表单类型:默认
+//        xmMap.put("formType","receipt");
+//        //项目表单ID
+//        xmMap.put("formUuid","FORM-OS566L91S9Y3NHB9CFHMU6HZEQAJ22C6NP28L4");
+//        //项目表单实例ID
+//        xmMap.put("instanceId","FINST-J0A66981JGX305I3BFO1N6MSB8552E402848LUL5");
+//        //标题
+//        xmMap.put("subTitle","张侃");
+//        //应用编码appType
+//        xmMap.put("appType","APP_NOQGHDKUDXD7VDWZUC6I");
+//        //表单实例标题
+//        xmMap.put("title","测试项目");
+//        System.out.println("项目关联表单控件值map:" + xmMap);
+//
+//        //转换成数组集合
+//        List xmList = new ArrayList();
+//        xmList.add(xmMap);
+//        String xmListString = JSON.toJSONString(xmList);
+//        System.out.println("项目关联表单控件值list文本json:" + xmListString);
+//
+//        //参与人ID集合
+//        List list = new ArrayList();
+//        list.add("16583692962961532");
+//        list.add("16163038167819429");
+//
+//        //执行人ID集合
+//        List list1 = new ArrayList();
+//        list1.add("16583692962961532");
+//
+//        //任务时间集合(时间戳区间)
+//        List listTime = new ArrayList();
+//        listTime.add("1663664888000");
+//        listTime.add("1664528888000");
+//
+//        Map map = new HashMap();
+//        //项目编码
+//        map.put("textField_l88d67g3", "111222333");
+//        //项目名称(关联表单组件)
+//        map.put("associationFormField_l82r3cm1", xmListString);
+//        //任务编码
+//        map.put("textField_l88d67g2","123123123");
+//        //任务名称
+//        map.put("textField_l82r3cm2","任务名称111");
+//        //参与者ID列表
+//        map.put("employeeField_l82r3cm5",list);
+//        //执行者ID列表
+//        map.put("employeeField_l82r3cm4",list1);
+//        //任务时间(时间戳区间)
+//        map.put("cascadeDateField_l82r3cm7",listTime);
+//        //创建人员ID(钉钉ID)
+//        map.put("employeeField_l82r3cm3", "15973727592422668");
+//        //创建时间
+//        map.put("dateField_l82r3cm8", time1);
+//        String mapJson = JSON.toJSONString(map);
+//
+//        com.aliyun.dingtalkyida_1_0.Client client = createClient();
+//        StartInstanceHeaders startInstanceHeaders = new StartInstanceHeaders();
+//        startInstanceHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+//        StartInstanceRequest startInstanceRequest = new StartInstanceRequest()
+//                .setAppType("APP_NOQGHDKUDXD7VDWZUC6I")
+//                .setSystemToken("WP966ZB1A4S3UPKK874E098BVPXN2EHYMP28LZE")
+//                .setUserId("15973727592422668")
+//                .setLanguage("zh_CN")
+//                .setFormUuid("FORM-2J6666D178X3VAUFCFHXRCEX9QF825S63R28LI")
+//                .setFormDataJson(mapJson);
+////                //流程编码
+////                .setProcessCode("TPROC--EF6Y4xxx")
+////                //发起人所在部门ID
+////                .setDepartmentId("18295");
+//        try {
+//            client.startInstanceWithOptions(startInstanceRequest, startInstanceHeaders, new 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 属性,可帮助开发定位问题
+//            }
+//
+//        }
+//    }
+//}

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

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