소스 검색

Initial import

zhangkan 3 주 전
커밋
dba8b4dc9d

+ 9 - 0
.gitignore

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

+ 15 - 0
README.md

@@ -0,0 +1,15 @@
+# ruilaipu
+
+Spring Boot integration service for DingTalk, Yida, and Maycur.
+
+## Required environment variables
+
+- `DINGTALK_APP_KEY`
+- `DINGTALK_APP_SECRET`
+- `DINGTALK_ACCESS_TOKEN` (used by integration tests)
+- `MAYCUR_APP_CODE`
+- `MAYCUR_APP_SECRET`
+- `YIDA_SYSTEM_TOKEN`
+- `TEST_OSS_SIGNED_URL` (used by integration tests)
+
+Do not commit real credentials. Configure these variables in the runtime or IDE launch configuration.

+ 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.ruilaipu</groupId>
+    <artifactId>ruilaipu</artifactId>
+<!--    <packaging>jar</packaging>-->
+    <version>1.0-SNAPSHOT</version>
+    <name>ruilaipu</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.33</version>
+        </dependency>
+
+        <!--json相关-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>${json.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>net.sf.json-lib</groupId>-->
+        <!--            <artifactId>json-lib</artifactId>-->
+        <!--            <version>2.4</version>-->
+        <!--        </dependency>-->
+
+
+        <!-- JSONObject对象依赖的jar包 -->
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.ezmorph</groupId>
+            <artifactId>ezmorph</artifactId>
+            <version>1.0.6</version>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.2.3</version>
+            <classifier>jdk15</classifier><!-- 指定jdk版本 -->
+        </dependency>
+
+
+        <!--xls-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--xlsx-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <!--文件上传-->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>org.springframework.boot</groupId>-->
+        <!--            <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
+        <!--        </dependency>-->
+
+        <!--引入web模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <version>2.3.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+            <version>1.18.10</version>
+        </dependency>
+
+        <!--MD5加密-->
+        <dependency>
+            <groupId>org.apache.directory.studio</groupId>
+            <artifactId>org.apache.commons.codec</artifactId>
+            <version>1.8</version>
+        </dependency>
+
+        <!--Map缓存方法:可设置Map中的Entry在一段时间后自动过期-->
+        <dependency>
+            <groupId>net.jodah</groupId>
+            <artifactId>expiringmap</artifactId>
+            <version>0.5.8</version>
+        </dependency>
+
+<!--        &lt;!&ndash;mybatis-plus数据库连接&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-boot-starter</artifactId>-->
+<!--            <version>3.2.0</version>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;引入mysql:数据库驱动&ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>mysql</groupId>-->
+<!--            <artifactId>mysql-connector-java</artifactId>-->
+<!--            <scope>runtime</scope>-->
+<!--        </dependency>-->
+<!--        &lt;!&ndash;引入druid数据源&ndash;&gt;-->
+<!--        &lt;!&ndash; https://mvnrepository.com/artifact/com.alibaba/druid &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid</artifactId>-->
+<!--            <version>1.1.9</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid-spring-boot-starter</artifactId>-->
+<!--            <version>1.1.9</version>-->
+<!--        </dependency>-->
+
+        <!--引入jpa模块-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <!--日期时间工具-->
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>${jodatime.version}</version>
+        </dependency>
+
+        <!--日期工具-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>4.6.8</version>
+        </dependency>
+
+        <!--log4j-->
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+        </dependency>
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <!--swagger ui-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.vintage</groupId>
+                    <artifactId>junit-vintage-engine</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>utf8</encoding>
+                </configuration>
+            </plugin>
+
+            <!--打包跳过测试-->
+<!--            <plugin>-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-surefire-plugin</artifactId>-->
+<!--                <version>2.4.2</version>-->
+<!--                <configuration>-->
+<!--                    <skipTests>true</skipTests>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+        </plugins>
+
+        <!--映射mapper中对应的xml配置文件,如果没有mapper.xml文件则将下列注释-->
+<!--        <resources>-->
+<!--            <resource>-->
+<!--                <directory>src/main/java</directory>-->
+<!--                <includes>-->
+<!--                    <include>**/*.xml</include>-->
+
+<!--                    <include>**/*.properties</include>-->
+<!--                    <include>**/*.tld</include>-->
+<!--                    <include>**/*.xls</include>-->
+<!--                    <include>**/*.xlsx</include>-->
+<!--                </includes>-->
+<!--                <filtering>false</filtering>-->
+<!--            </resource>-->
+<!--        </resources>-->
+    </build>
+
+</project>

+ 21 - 0
src/main/java/com/muzhi/ruilaipu/RuilaipuApplication.java

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

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

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

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

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

+ 40 - 0
src/main/java/com/muzhi/ruilaipu/controller/AccessTokenController.java

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

+ 39 - 0
src/main/java/com/muzhi/ruilaipu/controller/MeikebaoxiaoController.java

@@ -0,0 +1,39 @@
+package com.muzhi.ruilaipu.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.ruilaipu.service.MeikebaoxiaoService;
+import com.muzhi.ruilaipu.common.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:03
+ */
+
+@Api(description = "每刻报销接口")
+@RestController
+@RequestMapping("/meikebaoxiaoService")
+@CrossOrigin//解决跨域问题
+public class MeikebaoxiaoController {
+
+    @Autowired
+    private MeikebaoxiaoService meikebaoxiaoService;
+
+    //宜搭推送同步每刻报销付款单
+    @ApiOperation(value = "宜搭推送同步每刻报销付款单")
+    @PostMapping("syncMeikebaoxiaoFK")
+    public R syncMeikebaoxiaoFK(String formInstanceId, String contract_id, String creator_userId, String contract_name,
+                                String contract_amount, long contract_startDate, long contract_endDate, String contract_file_link_array,
+                                String or_not_to_pay, String contract_type, String current_unit_id, String current_unit_name, String contract_currency){
+
+        R syncMeikebaoxiaoFK = meikebaoxiaoService.syncMeikebaoxiaoFK(formInstanceId, contract_id, creator_userId, contract_name,
+                contract_amount, contract_startDate, contract_endDate, contract_file_link_array,
+                or_not_to_pay, contract_type, current_unit_id, current_unit_name, contract_currency);
+        return syncMeikebaoxiaoFK;
+    }
+}

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

@@ -0,0 +1,36 @@
+package com.muzhi.ruilaipu.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();
+        }
+    }
+
+}

+ 16 - 0
src/main/java/com/muzhi/ruilaipu/service/AccessTokenService.java

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

+ 19 - 0
src/main/java/com/muzhi/ruilaipu/service/MeikebaoxiaoService.java

@@ -0,0 +1,19 @@
+package com.muzhi.ruilaipu.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muzhi.ruilaipu.common.R;
+
+import java.util.Map;
+
+/**
+ * @Author ZhangKan
+ * @Data 15:34
+ */
+public interface MeikebaoxiaoService {
+
+    //宜搭推送同步每刻报销付款单
+    R syncMeikebaoxiaoFK(String formInstanceId, String contract_id, String creator_userId, String contract_name,
+                         String contract_amount, long contract_startDate, long contract_endDate, String contract_file_link_array,
+                         String or_not_to_pay, String contract_type, String current_unit_id, String current_unit_name, String contract_currency);
+
+}

+ 123 - 0
src/main/java/com/muzhi/ruilaipu/service/impl/AccessTokenServiceImpl.java

@@ -0,0 +1,123 @@
+package com.muzhi.ruilaipu.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.response.OapiGettokenResponse;
+import com.google.common.collect.Maps;
+import com.muzhi.ruilaipu.service.AccessTokenService;
+import com.taobao.api.ApiException;
+import okhttp3.*;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.Map;
+
+
+/**
+ * @Author ZhangKan
+ * @Data 15:39
+ */
+
+@Service
+public class AccessTokenServiceImpl implements AccessTokenService {
+
+    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(requiredEnv("DINGTALK_APP_KEY"));
+        request.setAppsecret(requiredEnv("DINGTALK_APP_SECRET"));
+        request.setHttpMethod("GET");
+        try {
+            OapiGettokenResponse response = client.execute(request);
+            DingtalkAccessToken = response.getAccessToken();
+            System.out.println("瑞莱谱钉钉AccessToken:" + DingtalkAccessToken);
+        } catch (ApiException e) {
+            e.printStackTrace();
+        }
+        return DingtalkAccessToken;
+    }
+
+    /**
+     *每刻钉钉云服务器环境地址(钉版)
+     *正式环境:https://dt.maycur.com
+     */
+
+    private static String HTTP_HOST = "https://ng.maycur.com";
+
+
+    //获取每刻报销token授权码
+    @Override
+    public JSONObject getAccessToken_meike() {
+        //appCode和appSecret请联系每刻工作人员
+        String appCode = requiredEnv("MAYCUR_APP_CODE");
+        String appSecret = requiredEnv("MAYCUR_APP_SECRET");
+
+        long timeMillis = System.currentTimeMillis();
+        System.out.println("timeMillis:" + timeMillis);
+
+        String secret = DigestUtils.sha256Hex(appSecret + ":" + appCode + ":" + timeMillis);
+        System.out.println("secret:" + secret);
+
+        Map map = Maps.newHashMap();
+        map.put("secret", secret);
+        map.put("appCode", appCode);
+        map.put("timestamp", timeMillis);
+        String parmsStr = JSON.toJSONString(map);
+        System.out.println("封装秘钥参数parmsStr:" + parmsStr);
+
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, parmsStr);
+        Request request = new Request.Builder()
+                .url(HTTP_HOST +"/api/openapi/auth/login")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .build();
+        String code = "";
+        String message = "";
+        JSONObject dataObj = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            JSONObject jsonObjectMK = JSON.parseObject(bodyStr);
+            System.out.println("返回体body:" + jsonObjectMK);
+            code = jsonObjectMK.getString("code");
+            message = jsonObjectMK.getString("message");
+
+            dataObj = jsonObjectMK.getJSONObject("data");
+            System.out.println("dataObj===>" + dataObj);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("查询每刻报销【接口授权码】接口返回的状态码(code):" + code);
+        System.out.println("查询每刻报销【接口授权码】接口返回的信息(message):" + message);
+        System.out.println("查询每刻报销【接口授权码】接口返回的内容(data):" + dataObj);
+
+        String tokenId = null;
+        String entCode = null;
+        if (dataObj != null){
+            tokenId = dataObj.getString("tokenId");
+            entCode = dataObj.getString("entCode");
+        }
+        System.out.println("查询每刻报销【接口授权码】接口返回的内容(tokenId):" + tokenId);
+        System.out.println("查询每刻报销【接口授权码】接口返回的内容(entCode):" + entCode);
+
+        return dataObj;
+    }
+
+    private static String requiredEnv(String name) {
+        String value = System.getenv(name);
+        if (value == null || value.trim().isEmpty()) {
+            throw new IllegalStateException("Missing required environment variable: " + name);
+        }
+        return value;
+    }
+}

+ 434 - 0
src/main/java/com/muzhi/ruilaipu/service/impl/MeikebaoxiaoServiceImpl.java

@@ -0,0 +1,434 @@
+package com.muzhi.ruilaipu.service.impl;
+
+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.GetOpenUrlResponse;
+import com.aliyun.dingtalkyida_2_0.models.GetInstanceByIdResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muzhi.ruilaipu.service.AccessTokenService;
+import com.muzhi.ruilaipu.service.MeikebaoxiaoService;
+import com.muzhi.ruilaipu.common.R;
+import com.muzhi.ruilaipu.dingtalk.dingtalkWebhook;
+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.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * @Author ZhangKan
+ * @Data 15:39
+ */
+
+@Service
+@Slf4j
+public class MeikebaoxiaoServiceImpl implements MeikebaoxiaoService {
+
+    @Autowired
+    private AccessTokenService accessTokenService;
+
+    /**
+     *每刻钉钉云服务器环境地址(钉版)
+     *正式环境:https://dt.maycur.com
+     */
+
+    /**
+     * 每刻阿里云服务器环境地址(阿里云)
+     * 正式环境:https://ng.maycur.com
+     * */
+    private static String HTTP_HOST = "https://ng.maycur.com";
+
+    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);
+    }
+
+    //每刻报销和钉钉userId互查
+    public String getMeikeUserId(String userid){
+
+        /**调用每刻报销接口授权码*/
+        JSONObject accessTokenMeike = accessTokenService.getAccessToken_meike();
+        String tokenId = null;
+        String entCode = null;
+        if (accessTokenMeike != null && !accessTokenMeike.isEmpty()) {
+            tokenId = accessTokenMeike.getString("tokenId");
+            entCode = accessTokenMeike.getString("entCode");
+        }
+
+        Map mapAll = new HashMap();
+        mapAll.put("ids", Arrays.asList(userid));//【是】合同责任人工号列表
+
+        String mapJsonString = JSON.toJSONString(mapAll);
+        System.out.println("封装每刻报销【合同台账】创建接口的参数:" + mapJsonString);
+
+        /**调用【每刻报销和钉钉userId互查】接口*/
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, mapJsonString);
+        Request request = new Request.Builder()
+                .url(HTTP_HOST + "/api/openapi/employee/search/user/ids?idType=userId")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("entCode", entCode)
+                .addHeader("tokenId", tokenId)
+                .build();
+
+        JSONObject jsonObjectMK = null;
+        String code = null;
+        String message = null;
+        String success = null;
+        JSONArray dataMK = null;
+        String employeeId = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            jsonObjectMK = JSON.parseObject(bodyStr);
+            System.out.println("返回体body{}:" + jsonObjectMK);
+
+            if (!jsonObjectMK.isEmpty() && jsonObjectMK != null) {
+                code = jsonObjectMK.getString("code");
+                message = jsonObjectMK.getString("message");
+                success = jsonObjectMK.getString("success");
+
+                dataMK = jsonObjectMK.getJSONArray("data");
+                System.out.println("dataMK[]:" + dataMK);
+                if (dataMK.size() > 0 && dataMK != null && !dataMK.isEmpty()){
+                    employeeId = dataMK.getJSONObject(0).getString("employeeId");
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("【每刻报销和钉钉userId互查】接口返回的状态码(code):" + code);
+        System.out.println("【每刻报销和钉钉userId互查】接口返回的结果信息(message):" + message);
+        System.out.println("【每刻报销和钉钉userId互查】接口返回的成功与否(success):" + success);
+
+        System.out.println("当前人员的钉钉userId查询到的【每刻报销系统工号】:" + employeeId);
+
+        return employeeId;
+    }
+
+    //每刻报销根据工号查询部门信息
+    public String getMeikeDeptId(String employeeId){
+
+        /**调用每刻报销接口授权码*/
+        JSONObject accessTokenMeike = accessTokenService.getAccessToken_meike();
+        String tokenId = null;
+        String entCode = null;
+        if (accessTokenMeike != null && !accessTokenMeike.isEmpty()) {
+            tokenId = accessTokenMeike.getString("tokenId");
+            entCode = accessTokenMeike.getString("entCode");
+        }
+
+        List listAll = new ArrayList();
+        Map mapAll = new HashMap();
+        mapAll.put("employeeId", employeeId);//【是】合同责任人工号列表
+        listAll.add(mapAll);
+
+        String listJsonString = JSON.toJSONString(listAll);
+        System.out.println("封装每刻报销【合同台账】创建接口的参数:" + listJsonString);
+
+        /**调用【每刻报销和钉钉userId互查】接口*/
+        OkHttpClient client = new OkHttpClient().newBuilder()
+                .build();
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, listJsonString);
+        Request request = new Request.Builder()
+                .url(HTTP_HOST + "/api/openapi/employee/dept")
+                .method("POST", body)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("entCode", entCode)
+                .addHeader("tokenId", tokenId)
+                .build();
+
+        JSONObject jsonObjectMK = null;
+        String code = null;
+        String message = null;
+        String success = null;
+        JSONArray dataMK = null;
+        String businessCode = null;
+        try {
+            Response response = client.newCall(request).execute();
+            String bodyStr = response.body().string();
+            jsonObjectMK = JSON.parseObject(bodyStr);
+            System.out.println("返回体body{}:" + jsonObjectMK);
+
+            if (!jsonObjectMK.isEmpty() && jsonObjectMK != null) {
+                code = jsonObjectMK.getString("code");
+                message = jsonObjectMK.getString("message");
+                success = jsonObjectMK.getString("success");
+
+                dataMK = jsonObjectMK.getJSONArray("data");
+                System.out.println("dataMK[]:" + dataMK);
+                if (dataMK.size() > 0 && dataMK != null && !dataMK.isEmpty()){
+                    businessCode = dataMK.getJSONObject(0).getString("businessCode");
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        System.out.println("【每刻报销根据工号查询部门信息】接口返回的状态码(code):" + code);
+        System.out.println("【每刻报销根据工号查询部门信息】接口返回的结果信息(message):" + message);
+        System.out.println("【每刻报销根据工号查询部门信息】接口返回的成功与否(success):" + success);
+
+        System.out.println("每刻报销根据工号查询部门id:" + businessCode);
+
+        return businessCode;
+    }
+
+    //获取宜搭流程实例id详情
+    public JSONArray getYidaSlid(String slid) {
+        JSONObject jsonObject = null;
+        try {
+            com.aliyun.dingtalkyida_2_0.Client client = createClient2();
+            com.aliyun.dingtalkyida_2_0.models.GetInstanceByIdHeaders getInstanceByIdHeaders = new com.aliyun.dingtalkyida_2_0.models.GetInstanceByIdHeaders();
+            getInstanceByIdHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_2_0.models.GetInstanceByIdRequest getInstanceByIdRequest = new com.aliyun.dingtalkyida_2_0.models.GetInstanceByIdRequest()
+                    .setSystemToken(System.getenv("YIDA_SYSTEM_TOKEN"))
+                    .setUserId("yida_pub_account")
+                    .setAppType("APP_A1U3R89IHBD21BJZVX06");
+
+            GetInstanceByIdResponse instanceByIdWithOptions = client.getInstanceByIdWithOptions(slid, getInstanceByIdRequest, getInstanceByIdHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(instanceByIdWithOptions.getBody());
+            jsonObject = JSON.parseObject(s);
+            System.out.println("获取审批流程中盖章合同附件:" + 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 属性,可帮助开发定位问题
+            }
+        }
+
+        JSONObject jsonObject1 = jsonObject.getJSONObject("data");
+        JSONArray jsonArray = jsonObject1.getJSONArray("attachmentField_mdsafagg");
+        System.out.println("合同盖章附件jsonArray[]:" + jsonArray);
+        return jsonArray;
+    }
+
+    //获取宜搭附件免登地址
+    public String getYidafile(String url) {
+
+        String fileUrl = "";
+        JSONObject jsonObject = null;
+        try {
+            com.aliyun.dingtalkyida_1_0.Client client = createClient3();
+            com.aliyun.dingtalkyida_1_0.models.GetOpenUrlHeaders getOpenUrlHeaders = new com.aliyun.dingtalkyida_1_0.models.GetOpenUrlHeaders();
+            getOpenUrlHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
+            com.aliyun.dingtalkyida_1_0.models.GetOpenUrlRequest getOpenUrlRequest = new com.aliyun.dingtalkyida_1_0.models.GetOpenUrlRequest()
+                    .setSystemToken(System.getenv("YIDA_SYSTEM_TOKEN"))
+                    .setFileUrl(url)//宜搭附件url
+                    .setUserId("yida_pub_account")
+                    .setTimeout(86400000L);//最大值: 86400000 , 即24小时。不填则默认60000,即1分钟。填0或者负数无效。
+
+            GetOpenUrlResponse appA1U3R89IHBD21BJZVX06 = client.getOpenUrlWithOptions("APP_A1U3R89IHBD21BJZVX06", getOpenUrlRequest, getOpenUrlHeaders, new RuntimeOptions());
+            String s = JSON.toJSONString(appA1U3R89IHBD21BJZVX06.getBody());
+            jsonObject = JSON.parseObject(s);
+            System.out.println("获取宜搭附件免登地址:" + jsonObject);
+
+            fileUrl = jsonObject.getString("result");
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        }
+        System.out.println("获取宜搭附件免登地址:" + fileUrl);
+        return fileUrl;
+    }
+
+    //【启用】宜搭推送同步每刻报销付款单
+    @Override
+    public R syncMeikebaoxiaoFK(String formInstanceId, String contract_id, String creator_userId, String contract_name,
+                                String contract_amount, long contract_startDate, long contract_endDate, String contract_file_link_array,
+                                String or_not_to_pay, String contract_type, String current_unit_id, String current_unit_name, String contract_currency){
+        log.info("接收传参「宜搭实例id」:" + formInstanceId);
+        log.info("接收传参「合同id」:" + contract_id);
+        log.info("接收传参「创建人userId」:" + creator_userId);
+        log.info("接收传参「合同名称」:" + contract_name);
+        log.info("接收传参「合同金额」:" + contract_amount);
+        log.info("接收传参「合同开始日期」:" + contract_startDate);
+        log.info("接收传参「合同结束日期」:" + contract_endDate);
+        log.info("接收传参「合同附件列表」:" + contract_file_link_array);
+
+        log.info("接收传参「是否付款」:" + or_not_to_pay);
+        log.info("接收传参「合同类型(采购合同审批、采购订单合同审批)」:" + contract_type);
+        log.info("接收传参「往来单位编号」:" + current_unit_id);
+        log.info("接收传参「往来单位名称」:" + current_unit_name);
+        log.info("接收传参「合同币种」:" + contract_currency);
+
+        log.info("开始封装参数......");
+
+        if (or_not_to_pay.equals("是")) {
+            log.info("是否属于付款合同=是,开始同步合同数据到每刻报销!");
+
+            /**获取每刻报销用户id*/
+            String meikeUserId = getMeikeUserId(creator_userId);
+            String meikeDeptId = null;
+            if (meikeUserId == null){
+                return R.error().message("通过当前归属人id没有查询到每刻报销对应的工号,同步中断!");
+            }else {
+                /**根据每刻工号获取每刻部门id*/
+                meikeDeptId = getMeikeDeptId(meikeUserId);
+                if (meikeDeptId == null){
+                    return R.error().message("通过当前归属人id没有查询到每刻报销对应的部门,同步中断!");
+                }
+            }
+
+            //金额货币编码(金额货币编码,目前仅支持人民币:CNY)
+            String currencyCode = contract_currency;
+            System.out.println("金额货币编码(金额货币编码,目前仅支持人民币:CNY):" + currencyCode);
+
+            /**获取宜搭审批实例详情*/
+            List listHTFJ  = new ArrayList();
+            JSONArray yidaFileArray = getYidaSlid(formInstanceId);
+            if (yidaFileArray.size() > 0){
+                for (int i = 0; i < yidaFileArray.size(); i++) {
+                    String url = yidaFileArray.getJSONObject(i).getString("url");
+                    String yidafile = getYidafile(url);
+                    System.out.println("获取第【" + i+1 + "】条宜搭免登附件地址:" + yidafile);
+
+                    String name = yidaFileArray.getJSONObject(i).getString("name");
+                    //截取.这个字符后面的所有字符
+                    String[] split = name.split("\\.");
+                    String type = split[1];
+                    System.out.println("文件类型:" + type);
+
+                    Map mapFujian = new HashMap();
+                    mapFujian.put("url", yidafile);
+                    mapFujian.put("fileName", name);
+                    mapFujian.put("fileType", type);
+                    listHTFJ.add(mapFujian);
+                }
+            }
+            //封装所有的合同附件列表
+            Map mapHTFJ = new HashMap();
+            mapHTFJ.put("CF38", listHTFJ);
+
+
+            /**调用每刻报销接口授权码*/
+            JSONObject accessTokenMeike = accessTokenService.getAccessToken_meike();
+            String tokenId = null;
+            String entCode = null;
+            if (accessTokenMeike != null && !accessTokenMeike.isEmpty()) {
+                tokenId = accessTokenMeike.getString("tokenId");
+                entCode = accessTokenMeike.getString("entCode");
+            } else {
+                return R.error().message("每刻报销接口授权码获取失败");
+            }
+
+            //封装查询参数
+            Map map1 = new HashMap();
+            map1.put("amount", contract_amount);//付款金额
+            map1.put("currency", currencyCode);//合同币种
+            Map map2 = new HashMap();
+            map2.put("startDate", contract_startDate);//合同开始日期
+            map2.put("endDate", contract_endDate);//合同结束日期
+
+            Map mapAll = new HashMap();
+            mapAll.put("formCode", contract_id);//【否】合同的单据Code,有值时会使用该值作为单据号
+            mapAll.put("formSubTypeBizCode", "FT169939391584677905");//【是】系统字段,合同的单据类型业务编码,固定指向每刻报销的表单code
+            mapAll.put("requestUserEmployeeId", meikeUserId);//【是】系统字段,合同的提单人工号(单据所属人)
+            mapAll.put("responsibleUserEmployeeIds", Arrays.asList(meikeUserId));//【是】合同责任人工号列表
+            mapAll.put("responsibleDepartmentBizCode", meikeDeptId);//【是】责任部门编码
+            mapAll.put("contractName", contract_name);//【是】合同名称
+            mapAll.put("contractNum", contract_id);//【是】合同编码
+            mapAll.put("contractAmount", map1);//【是】合同金额
+            /**【说明】往来单位编号不做同步*/
+//            mapAll.put("tradingPartnerBizCode", current_unit_id);//往来单位编号
+            mapAll.put("formAssociatedList", null);//【否】关联单据组件
+            mapAll.put("contractDateDto", map2);//合同日期
+            mapAll.put("customObject", mapHTFJ);//合同附件列表
+
+            String mapJsonString = JSON.toJSONString(mapAll);
+            System.out.println("封装每刻报销【合同台账】创建接口的参数:" + mapJsonString);
+
+            /**调用每刻报销合同台账导入接口*/
+            OkHttpClient client = new OkHttpClient().newBuilder()
+                    .build();
+            MediaType mediaType = MediaType.parse("application/json");
+            RequestBody body = RequestBody.create(mediaType, mapJsonString);
+            Request request = new Request.Builder()
+                    .url(HTTP_HOST + "/api/openapi/receive/contract")
+                    .method("POST", body)
+                    .addHeader("Content-Type", "application/json")
+                    .addHeader("entCode", entCode)
+                    .addHeader("tokenId", tokenId)
+                    .build();
+
+            JSONObject jsonObjectMK = null;
+            String code = null;
+            String message = null;
+            String success = null;
+            JSONArray dataMK = null;
+            try {
+                Response response = client.newCall(request).execute();
+                String bodyStr = response.body().string();
+                jsonObjectMK = JSON.parseObject(bodyStr);
+                System.out.println("返回体body{}:" + jsonObjectMK);
+
+                if (!jsonObjectMK.isEmpty() && jsonObjectMK != null) {
+                    code = jsonObjectMK.getString("code");
+                    message = jsonObjectMK.getString("message");
+                    success = jsonObjectMK.getString("success");
+
+                    //推送接口返回的字段内容,该业务中不需要启用
+//                dataMK = jsonObjectMK.getJSONArray("data");
+//                System.out.println("dataMK[]:" + dataMK);
+//                if (dataMK.size() > 0 && dataMK != null && !dataMK.isEmpty()){
+//
+//                }
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            System.out.println("推送每刻报销【合同台账】接口返回的状态码(code):" + code);
+            System.out.println("推送每刻报销【合同台账】接口返回的结果信息(message):" + message);
+            System.out.println("推送每刻报销【合同台账】接口返回的成功与否(success):" + success);
+
+
+            if (success.equals("true")) {
+                log.info("宜搭合同推送同步每刻报销「合同台账」-->成功" + "【data】" + jsonObjectMK);
+                return R.ok().message("宜搭合同推送同步每刻报销「合同台账」-->成功").data("data", jsonObjectMK);
+            } else {
+                log.info("宜搭合同推送同步每刻报销「合同台账」-->失败" + "【data】" + jsonObjectMK);
+                return R.error().message("智能合同推送同步每刻报销「合同台账」-->失败").data("data", jsonObjectMK);
+            }
+        }else {
+            log.info("宜搭合同推送同步每刻报销「合同台账」-->是否付款属于【" + or_not_to_pay + "】不符合推送条件!");
+            return R.error().message("宜搭合同推送同步每刻报销「合同台账」-->是否付款属于【" + or_not_to_pay + "】不符合推送条件!");
+        }
+    }
+}

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

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

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1113 - 0
src/test/java/com/muzhi/ruilaipu/APITest/Test1.java


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

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