소스 검색

三养财务系统对接

hxx 2 일 전
부모
커밋
e11607e9e1
26개의 변경된 파일3986개의 추가작업 그리고 0개의 파일을 삭제
  1. 117 0
      mjava-sanyang/pom.xml
  2. 20 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/SanyangApplication.java
  3. 76 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/ChanjetBase.java
  4. 18 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/ChanjetEncryptMsg.java
  5. 32 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/CjtAppticket.java
  6. 138 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/DingTalkFormUtils.java
  7. 43 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/MapUtils.java
  8. 65 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/OpenapiHelper.java
  9. 28 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/UtilToken.java
  10. 23 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/FormComponentValue.java
  11. 51 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/FormFieldLabels.java
  12. 45 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/OpenApiConfig.java
  13. 53 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/ReimburseConfig.java
  14. 28 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/StartupRunner.java
  15. 42 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/SupplierConfig.java
  16. 42 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/SchduleTask.java
  17. 499 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/oaLinkcjt.java
  18. 9 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/tempStore.java
  19. 9 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/ddMessageServer.java
  20. 42 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/oaLinkcjtServer.java
  21. 2156 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/serviceImpl/aoLinkserverImpl.java
  22. 28 0
      mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/serviceImpl/ddMesserverImpl.java
  23. 193 0
      mjava-sanyang/src/main/resources/application-dev.yml
  24. 187 0
      mjava-sanyang/src/main/resources/application-prod.yml
  25. 23 0
      mjava-sanyang/src/main/resources/application.yml
  26. 19 0
      mjava-sanyang/src/test/java/sanyangwl/pro/sanyang/SanyangApplicationTests.java

+ 117 - 0
mjava-sanyang/pom.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>sanyangwl.pro</groupId>
+    <artifactId>mjava-sanyang</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>mjava-sanyang</name>
+    <description>mjava-sanyang</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>base</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.10.1</version> <!-- 使用最新版本 -->
+        </dependency>
+
+        <dependency>
+            <groupId>com.chanjet</groupId>
+            <artifactId>chanjet-openapi-java-sdk</artifactId>
+            <version>1.0.15-RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.15.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.15.3</version> <!-- 必须与 databind 版本一致 -->
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.0</version>
+            <scope>compile</scope>
+        </dependency>
+
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>sanyangwl.pro.sanyang.SanyangApplication</mainClass>
+<!--                    <skip>true</skip>-->
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+            <resources>
+                <resource>
+                    <directory>src/main/resources</directory>
+                    <filtering>true</filtering>
+                </resource>
+            </resources>
+    </build>
+
+</project>

+ 20 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/SanyangApplication.java

@@ -0,0 +1,20 @@
+package sanyangwl.pro.sanyang;
+
+import com.malk.server.common.VenR;
+import com.malk.utils.UtilHttp;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.malk.service","com.malk.server","com.malk.delegate","sanyangwl.pro.sanyang"})
+public class SanyangApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SanyangApplication.class, args);
+    }
+
+}

+ 76 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/ChanjetBase.java

@@ -0,0 +1,76 @@
+package sanyangwl.pro.sanyang.Utils;
+
+import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
+import com.chanjet.openapi.sdk.java.request.GetTokenRequest;
+import com.chanjet.openapi.sdk.java.response.GetTokenResponse;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static sanyangwl.pro.sanyang.Utils.CjtAppticket.APP_TICKET;
+import static sanyangwl.pro.sanyang.Utils.CjtAppticket.TEMP_AUTH_CODE;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/8/28 16:45
+ */
+@RestController
+@RequestMapping("/chanjet")
+@Slf4j
+public class ChanjetBase {
+
+    //    消息通知配置
+    private final String ENCRYPT_KEY = "5gH8pK2qR9sT4wL7"; // 环境密钥
+
+    @PostMapping("/getMessage")
+    public Map<String, String> getMessage(@RequestBody ChanjetEncryptMsg encryptMsg) throws Exception {
+        log.info("收到消息通知:{}", encryptMsg);
+        String enMsg = encryptMsg.getEncryptMsg();
+        String decryptMsg = OpenapiHelper.aesDecrypt(enMsg, ENCRYPT_KEY);
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode rootNode = mapper.readTree(decryptMsg);
+        JsonNode bizContent = rootNode.path("bizContent");
+        if( rootNode.path("msgType").equals("APP_TICKET")){
+            String appTicket = bizContent.path("appTicket").asText();
+            System.out.println("appTicket"+rootNode.path("appKey").asText() );
+            APP_TICKET = appTicket;
+        }else if( rootNode.path("msgType").equals("TEMP_AUTH_CODE")){
+            String tmpAuthCode = bizContent.path("tempAuthCode").asText();
+            System.out.println("tmpAuthCode"+tmpAuthCode);
+            TEMP_AUTH_CODE = tmpAuthCode;
+
+        }
+        log.info("appTicket:{}",APP_TICKET);
+        log.info("tmpAuthCode:{}",TEMP_AUTH_CODE);
+        return receiveMsgOK(String.valueOf(rootNode));
+    }
+    private Map<String, String> receiveMsgOK( String data) {
+        Map<String, String> result = new HashMap<>();
+        result.put("result", "success");
+        result.put("data", data);
+        return result;
+    }
+
+
+    @GetMapping("/receiveCode")
+    public String oAuth(@RequestParam String code, @RequestParam String state) {
+        System.out.println("Code:" + code);
+        return code;
+    }
+
+
+
+
+
+
+
+
+
+
+}

+ 18 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/ChanjetEncryptMsg.java

@@ -0,0 +1,18 @@
+package sanyangwl.pro.sanyang.Utils;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/5/21 15:20
+ */
+public class ChanjetEncryptMsg {
+    private String encryptMsg;
+
+    public String getEncryptMsg() {
+        return encryptMsg;
+    }
+
+    public void setEncryptMsg(String encryptMsg) {
+        this.encryptMsg = encryptMsg;
+    }
+}

+ 32 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/CjtAppticket.java

@@ -0,0 +1,32 @@
+package sanyangwl.pro.sanyang.Utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/6/3 9:32
+ */
+public class CjtAppticket {
+
+
+//
+    public static volatile String APP_TICKET = "";
+
+    public static String TEMP_AUTH_CODE = "";
+
+    public final static String PERM_AUTH_CODE_SH = "op-ff351414444147238752404b3e8f550c";
+    public final static String PERM_AUTH_CODE_QD = "op-d01e0ca764f643b8af5ed291aa7f33b9";
+    //用户永久授权码_SH_支付凭证
+    public final static String USER_PERM_CODE_SH = "up-8de4f321720045ec9ad7bccfea8848b7";
+//    用户永久授权码_QD_支付凭证
+    public final static String USER_PERM_CODE_QD = "up-c38d3a217aee4a16a3845607c5646d20";
+
+//    用户永久授权码_QD_转账凭证
+    public final static String USER_PERM_CODE_QD_TRANSFER = "up-8e0053c3e0674460be8702e474650480";
+    //    用户永久授权码_SH_转账凭证
+    public final static String USER_PERM_CODE_SH_TRANSFER = "up-fb2dab8c93a843e5b65821e3765a1628";
+
+    public static Map<String, String> TICKET_MAP = new HashMap<>();
+}

+ 138 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/DingTalkFormUtils.java

@@ -0,0 +1,138 @@
+package sanyangwl.pro.sanyang.Utils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import sanyangwl.pro.sanyang.config.FormComponentValue;
+import sanyangwl.pro.sanyang.config.FormFieldLabels;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/11/11 16:48
+ */
+public class DingTalkFormUtils {
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+
+    /**
+     * 判断是否为表格/明细类字段(你可以根据实际中文名调整)
+     */
+    private static boolean isTableField(String fieldName) {
+        // 可以根据你的业务扩展,比如:
+        return "明细".equals(fieldName) || "费用明细".equals(fieldName) || "报销明细".equals(fieldName) || "tableField_mb7zu6q0".equals(fieldName);
+        // 或者如果你知道原始 key,也可以在调用前标记,但这里按中文名判断更直接
+    }
+
+    /**
+     * 标准化 value 为字符串(通用)
+     */
+    public static String stringifyValue(Object value) {
+        if (value == null) {
+            return "";
+        }
+        if (value instanceof String) {
+            return (String) value;
+        }
+        try {
+            return objectMapper.writeValueAsString(value);
+        } catch (Exception e) {
+            return value.toString();
+        }
+    }
+
+    /**
+     * 处理明细表格:解析 → 转中文 key → 重新序列化
+     */
+    public static String processTableValue(String jsonStr) {
+        // 1. 边界检查
+        if (jsonStr == null || jsonStr.trim().isEmpty()) {
+            return "[]";
+        }
+
+        try {
+            // 2. 用 Fastjson 解析为 JSONArray
+            JSONArray rawTable = JSONArray.parseArray(jsonStr);
+            if (rawTable.isEmpty()) {
+                return "[]";
+            }
+
+            // 3. 构建结果:List<List<Map<String, String>>>
+            List<List<Map<String, String>>> resultTable = new ArrayList<>();
+
+            for (Object rowObj : rawTable) {
+                if (!(rowObj instanceof JSONObject)) {
+                    continue; // 跳过非对象行
+                }
+
+                JSONObject row = (JSONObject) rowObj;
+                List<Map<String, String>> formattedRow = new ArrayList<>();
+
+                // 遍历该行所有字段
+                for (Map.Entry<String, Object> entry : row.entrySet()) {
+                    String machineKey = entry.getKey();
+                    Object rawValue = entry.getValue();
+
+                    // 获取中文列名
+                    String columnName = FormFieldLabels.KEY_TO_LABEL.getOrDefault(machineKey, machineKey);
+
+                    // 处理日期字段(毫秒时间戳 → yyyy-MM-dd)
+                    String cellValue;
+                    if (machineKey.startsWith("dateField_") && rawValue instanceof Number) {
+                        long timestamp = ((Number) rawValue).longValue();
+                        cellValue = DATE_FORMAT.format(new Date(timestamp));
+                    } else {
+                        cellValue = rawValue == null ? "" : rawValue.toString();
+                    }
+
+                    // 构造 { "name": "列名", "value": "值" }
+                    Map<String, String> cell = new HashMap<>();
+                    cell.put("name", columnName);
+                    cell.put("value", cellValue);
+                    formattedRow.add(cell);
+                }
+
+                resultTable.add(formattedRow);
+            }
+
+            // 4. 序列化为 JSON 字符串(Fastjson)
+            return JSONArray.toJSONString(resultTable);
+
+        } catch (Exception e) {
+            System.err.println("处理表格失败,返回空数组。原始输入: " + jsonStr);
+            e.printStackTrace();
+            return "[]"; // 安全回退
+        }
+    }
+
+    /**
+     * 主方法:将 labeledMap 转为 formComponentValues 格式,并特殊处理明细字段
+     */
+    public static List<Map<String, String>> toFormComponentValueMaps(Map<String, Object> labeledMap) {
+        if (labeledMap == null || labeledMap.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<Map<String, String>> result = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : labeledMap.entrySet()) {
+            String name = entry.getKey();
+            Object rawValue = entry.getValue();
+
+            String stringValue;
+            if (isTableField(name)) {
+                // 特殊处理:明细类字段
+                stringValue = processTableValue(rawValue.toString());
+            } else {
+                // 普通字段
+                stringValue = stringifyValue(rawValue);
+            }
+
+            Map<String, String> item = new HashMap<>();
+            item.put("name", name);
+            item.put("value", stringValue);
+            result.add(item);
+        }
+        return result;
+    }
+}

+ 43 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/MapUtils.java

@@ -0,0 +1,43 @@
+package sanyangwl.pro.sanyang.Utils;
+import sanyangwl.pro.sanyang.config.FormFieldLabels;
+
+import java.util.*;
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/11/11 16:33
+ */
+public class MapUtils {
+    /**
+     * 将单个 map 的 key 替换为中文 label(未匹配的保留原 key)
+     */
+    public static Map<String, Object> replaceKeysWithLabels(Map<String, Object> originalMap) {
+        if (originalMap == null || originalMap.isEmpty()) {
+            return new LinkedHashMap<>();
+        }
+
+        Map<String, Object> result = new LinkedHashMap<>(); // 保持插入顺序
+        for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
+            String oldKey = entry.getKey();
+            Object value = entry.getValue();
+
+            String newKey = FormFieldLabels.KEY_TO_LABEL.getOrDefault(oldKey, oldKey);
+            result.put(newKey, value);
+        }
+        return result;
+    }
+
+    /**
+     * 批量处理:将 List<Map> 中每个 map 的 key 转为中文,返回新列表
+     */
+    public static List<Map<String, Object>> convertListToLabelKeys(List<Map<String, Object>> originalList) {
+        if (originalList == null) {
+            return new ArrayList<>();
+        }
+        List<Map<String, Object>> resultList = new ArrayList<>(originalList.size());
+        for (Map<String, Object> map : originalList) {
+            resultList.add(replaceKeysWithLabels(map));
+        }
+        return resultList;
+    }
+}

+ 65 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/OpenapiHelper.java

@@ -0,0 +1,65 @@
+package sanyangwl.pro.sanyang.Utils;
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * 功能:AES加密解密工具类
+ * 作者:hanxue
+ * 日期:2025/5/21 15:21
+ */
+public class OpenapiHelper {
+
+        /**
+         * AES 加密
+         * @param str 明文(待加密)
+         * @param key 密钥
+         * @return 加密后的Base64字符串
+         */
+        public static String aesEncrypt(String str, String key) {
+            if (str == null || str.isEmpty()) {
+                return null;
+            }
+
+            try {
+                byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
+                SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
+
+                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+                cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+
+                byte[] encryptedBytes = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
+                return Base64.getEncoder().encodeToString(encryptedBytes);
+            } catch (Exception e) {
+                throw new RuntimeException("AES加密失败", e);
+            }
+        }
+
+        /**
+         * AES 解密
+         * @param str 待解密的Base64字符串
+         * @param key 密钥
+         * @return 解密后的原始字符串
+         */
+        public static String aesDecrypt(String str, String key) {
+            if (str == null || str.isEmpty()) {
+                return null;
+            }
+
+            try {
+                byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
+                SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
+
+                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+                cipher.init(Cipher.DECRYPT_MODE, secretKey);
+
+                byte[] encryptedBytes = Base64.getDecoder().decode(str);
+                byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
+                return new String(decryptedBytes, StandardCharsets.UTF_8);
+            } catch (Exception e) {
+                throw new RuntimeException("AES解密失败", e);
+            }
+        }
+
+}

+ 28 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/Utils/UtilToken.java

@@ -0,0 +1,28 @@
+package sanyangwl.pro.sanyang.Utils;
+
+import cn.hutool.cache.CacheUtil;
+import cn.hutool.cache.impl.TimedCache;
+
+/**
+ * token过期处理
+ */
+public abstract class UtilToken {
+
+    private static final TimedCache<String, String> TIMED_CACHE = CacheUtil.newTimedCache(0);
+
+    public static void put(String key, String value, Long timeout) {
+        if (timeout > 5000) timeout -= 5000; // 避免极端情况, 冗余5s容错处理
+        /** 设置消逝时间 */
+        TIMED_CACHE.put(key, value, timeout);
+    }
+
+    public static String get(String key) {
+        // 不刷新消逝时间
+        return TIMED_CACHE.get(key, false);
+    }
+
+    public static String getWithRefresh(String key) {
+        // 重新刷新消逝时间
+        return TIMED_CACHE.get(key);
+    }
+}

+ 23 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/FormComponentValue.java

@@ -0,0 +1,23 @@
+package sanyangwl.pro.sanyang.config;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/11/11 16:47
+ * 修改记录:停用
+ */
+public class FormComponentValue {
+    private String name;
+    private String value;
+
+    public FormComponentValue(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    // getter / setter / toString (按需添加)
+    public String getName() { return name; }
+    public void setName(String name) { this.name = name; }
+    public String getValue() { return value; }
+    public void setValue(String value) { this.value = value; }
+}

+ 51 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/FormFieldLabels.java

@@ -0,0 +1,51 @@
+package sanyangwl.pro.sanyang.config;
+import java.util.*;
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/11/11 16:32
+ */
+
+
+public final class FormFieldLabels {
+
+    private FormFieldLabels() {
+        // 私有构造,防止实例化
+    }
+    public static final Map<String, String> KEY_TO_LABEL;
+
+    static {
+        Map<String, String> temp = new HashMap<>();
+
+        temp.put("employeeField_mb7zu6qb", "申请人");
+        temp.put("applyDept", "申请部门");
+        temp.put("applyTime", "申请日期");
+        temp.put("textField_mcog8v86", "关联申请单");
+        temp.put("selectField_mbdp8h0o", "发票抬头");
+        temp.put("radioField_mb7zu6pz", "是否推送凭证");
+        temp.put("textField_mbrt9xg4", "付款科目");
+        temp.put("textField_mbhdyeq9", "制单日期");
+        temp.put("selectField_mfdo6rvo", "付款方式");
+        temp.put("note", "付款用途");
+        temp.put("fromAccount", "付款账号");
+        temp.put("fromAccountName", "付款账户名");
+        temp.put("textField_mb7zu6q5", "供应商");
+        temp.put("numberField_mb7zu6q1", "报销金额(元)");
+        temp.put("textField_mb7zu6q2", "费用类型");
+        temp.put("dateField_mbdpen3v", "费用发生日期");
+        temp.put("textField_mb7zu6q3", "费用说明");
+        temp.put("textField_mbqacm31", "发票类型");
+        temp.put("numberField_mbqacm32", "税额(元)");
+        temp.put("numberField_mbqacm33", "不含税金额(元)");
+        temp.put("numberField_mhszk922", "付款总额(元)");
+        temp.put("selectField_mbg6p8cc", "申请类型");
+        temp.put("tableField_mb7zu6q0", "明细");
+        temp.put("toAccountCode", "收款账号");
+        temp.put("toAccountName", "收款账户名");
+        temp.put("toBankName", "收款银行支行");
+//        temp.put("textField_mb7zu6qd", "关联审批编号");
+
+        // 转为不可变 map,防止误修改
+        KEY_TO_LABEL = Collections.unmodifiableMap(temp);
+    }
+}

+ 45 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/OpenApiConfig.java

@@ -0,0 +1,45 @@
+package sanyangwl.pro.sanyang.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 畅捷通开放平台的配置
+ *
+ * @author zsc
+ * @create 2020/9/8 2:51 下午
+ **/
+@Data
+@Configuration
+@ConfigurationProperties("chanjet.openapi")
+public class OpenApiConfig {
+    /**
+     * 开放平台网关地址
+     */
+    private String gatewayUrl;
+    /**
+     * 开放平台申请的appKey
+     */
+    private String appKey;
+    /**
+     * 开放平台申请的appSecret
+     */
+    private String appSecret;
+    /**
+     * 连接超时时间,单位ms
+     */
+    private int connectTimeout;
+    /**
+     * 读取超时时间,单位ms
+     */
+    private int readTimeout;
+    /**
+     * 加签key,用于加签和解密
+     */
+    private String secret;
+    /**
+     * Oauth重定向地址
+     */
+    private String redirectUri;
+}

+ 53 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/ReimburseConfig.java

@@ -0,0 +1,53 @@
+package sanyangwl.pro.sanyang.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/6/12 10:08
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "reimburse")
+public class ReimburseConfig {
+    private Map<String, ReimburseTypeConfig> types;
+
+    @Data
+        public static class ReimburseTypeConfig {
+        private String formKey;
+        private String accountSetKey;
+        private String paymentSubjectKey;
+        private String pushVoucherKey;
+        private String reportType;
+        private DetailMapping detailMapping;
+        private String makeReportKey;
+        private String paymentDateKey;
+        private String supplierKey;
+        private String accountKey;
+        private String note;
+        private String fromAccountCode;
+        private String fromAccountName;
+        private String paymentTypeKey;
+        private String paymentNote;
+        private String summaryKey;
+
+        @Data
+        public static class DetailMapping {
+            private String categoryKey;
+            private String dateKey;
+            private String amountKey;
+            private String descriptionKey;
+            private String invoiceTypeKey;
+            private String taxAmountKey;
+            private String nonTaxAmountKey;
+            private String attachmentKey;
+            private String deptKey;
+        }
+    }
+
+}

+ 28 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/StartupRunner.java

@@ -0,0 +1,28 @@
+package sanyangwl.pro.sanyang.config;
+import com.malk.server.common.VenR;
+import com.malk.utils.UtilHttp;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+
+public class StartupRunner implements ApplicationRunner {
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        Map header = new HashMap();
+
+
+        header.put("appKey", "h2mqX7By");
+        header.put("appSecret", "CB5150BA2FDB8E7935EFA3C4717F5B63");
+        UtilHttp.doPost(" https://openapi.chanjet.com/auth/appTicket/resend", header,null, VenR.class);
+////青岛
+//        header.put("appKey", "cRVReMm7");
+//        header.put("appSecret", "B59660C134F7B1AFBF4C2175A126F2E7");
+//        UtilHttp.doPost(" https://openapi.chanjet.com/auth/appTicket/resend", header,null, VenR.class);
+
+    }
+}

+ 42 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/config/SupplierConfig.java

@@ -0,0 +1,42 @@
+package sanyangwl.pro.sanyang.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 功能:供应商
+ * 作者:hanxue
+ * 日期:2025/6/13 20:05
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "supplier")
+public class SupplierConfig {
+    private Map<String, SupplierTypeConfig> types;
+
+    @Data
+    public static class SupplierTypeConfig {
+        String applier ;
+        String applierDept ;
+        String applierDate ;
+        String supplierName ;
+        String supplierCode ;
+        String companyCode ;
+        String registAddress ;
+        String represent ;
+        String phone ;
+        String hangye ;
+        String bankName ;
+        String bank ;
+        String account ;
+        String happenTimes ;
+        String belongsTo ;
+        String note ;
+        String dengjibiao ;
+        String yiye ;
+
+    }
+}

+ 42 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/SchduleTask.java

@@ -0,0 +1,42 @@
+package sanyangwl.pro.sanyang.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import sanyangwl.pro.sanyang.service.oaLinkcjtServer;
+
+import java.time.LocalDateTime;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/8/8 14:18
+ */
+
+@RestController
+@Configuration
+@Slf4j
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+@RequestMapping("/sanyang")
+public class SchduleTask {
+    @Autowired
+    private oaLinkcjtServer oaLinkcjtService;
+
+
+    @Scheduled(cron = "0 */60 * * * *")
+    public void task() {
+        log.info("定时获取单笔付款结果开始:{}", LocalDateTime.now());
+        try {
+            oaLinkcjtService.getPayResult();
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+}

+ 499 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/oaLinkcjt.java

@@ -0,0 +1,499 @@
+package sanyangwl.pro.sanyang.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.aliwork.YDSearch;
+import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import sanyangwl.pro.sanyang.Utils.ChanjetEncryptMsg;
+import sanyangwl.pro.sanyang.Utils.OpenapiHelper;
+import sanyangwl.pro.sanyang.service.oaLinkcjtServer;
+import sanyangwl.pro.sanyang.service.ddMessageServer;
+
+import java.time.Instant;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+import static java.lang.System.currentTimeMillis;
+import static sanyangwl.pro.sanyang.Utils.CjtAppticket.*;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/5/28 18:01
+ */
+@RestController
+@RequestMapping("/sanyang")
+@Slf4j
+public class oaLinkcjt {
+
+    @Autowired
+    private oaLinkcjtServer oaLinkcjtService;
+    @Autowired
+    private YDClient ydClient;
+
+
+
+//    ============================================付款推送见知START===================================================
+    /**
+     * 获取银行支行
+     */
+    @PostMapping("/getBankCode")
+    public McR getBankCode(@RequestBody Map param){
+        try{
+            List data =oaLinkcjtService.getBankCode(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    @PostMapping("/getBankSerial")
+    public McR getBankSerial(@RequestBody Map param){
+        try{
+            String data =oaLinkcjtService.getBankSerial(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    /**
+     * 推送付款数据
+     * @param param
+     * @return
+     */
+    @PostMapping("/pushPayment")
+    public McR pushPayment(@RequestBody Map param){
+        log.info("推送付款数据:{}",param);
+        try{
+            Map data =oaLinkcjtService.processPayment(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+
+    }
+
+//    ============================================付款推送见知END===================================================
+
+
+
+//    =================================================供应商接口START==============================================
+    /**
+     * 新增供应商
+     * @param param
+     * @return
+     */
+    @PostMapping("/processSupplier")
+    public McR supplier(@RequestBody Map param){
+        log.info("供应商数据处理");
+        try{
+            String data =oaLinkcjtService.processSupplier(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+    /**
+     * 修改供应商
+     * @param param
+     * @return
+     */
+    @PostMapping("/changeSupplier")
+    public McR changeSupplier(@RequestBody Map param){
+        log.info("供应商数据处理");
+        try{
+            Map data =oaLinkcjtService.changeSupplier(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+//    =================================================供应商接口END==============================================================
+
+//    =================================================凭证推送接口START===========================================================
+
+    //    从宜搭获取付款科目接口
+    @PostMapping("/getPaySubject")
+    public McR getPaySubject()  {
+        List data =oaLinkcjtService.getPaySubject();
+        return  McR.success(data);
+    }
+    /**
+     * 付款单单数据处理
+     * @RequestBody Map param(processInstanceId,flag=0/1,reimburseType=”payment")
+     * @return McR
+     */
+    @PostMapping("/processVoucher")
+    public McR voucher(@RequestBody Map param){
+        log.info("付款单凭证数据处理:{}",param);
+        try{
+            Map data =oaLinkcjtService.processVoucher(param);
+            return McR.success(data);
+        } catch (Exception e) {
+            log.error("同步失败信息:{}", e);
+            return McR.errorParam(e.getMessage());
+        }
+    }
+    /**
+     * 报销单数据处理
+     * @RequestBody Map param(processInstanceId,flag=0/1,reimburseType="daily"/"travel"/"business")
+     * @return McR
+     */
+    @PostMapping("/processReimbursement")
+    public McR reimbursement(@RequestBody Map param){
+        log.info("报销单凭证数据处理:{}",param);
+        try{
+            Map data =oaLinkcjtService.processReimbursement(param);
+            return McR.success(data);
+        } catch (Exception e) {
+            log.error("同步失败信息:{}", e);
+            return McR.errorParam(e.getMessage());
+        }
+    }
+//================================================凭证推送接口END==============================================================
+
+//============================================cjt消息通知配置及获取token接口START==================================================
+
+//    消息通知配置
+    private static final String ENCRYPT_KEY = "5gH8pK2qR9sT4wL7"; // 环境密钥
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    @PostMapping("/getMessage")
+    public Map<String, String> getMessage(@RequestBody ChanjetEncryptMsg encryptMsg) throws Exception {
+        // 主线程:只提取并保存 appTicket(不解密完整消息)
+        try {
+            String enMsg = encryptMsg.getEncryptMsg();
+            String decryptMsg = OpenapiHelper.aesDecrypt(enMsg, ENCRYPT_KEY);
+            log.info("收到消息通知:{}", decryptMsg);
+            // 快速提取 appTicket
+            if (decryptMsg.contains("appTicket")) {
+                // 可以用正则或 substring 快速提取,避免完整解析
+                String appTicket = extractAppTicketFast(decryptMsg);
+                if (appTicket != null) {
+                    APP_TICKET = appTicket;
+                    log.info("主线程快速保存 appTicket: {}", appTicket);
+                }
+            }
+        } catch (Exception e) {
+            log.warn("主线程快速提取失败,依赖异步处理", e);
+            // 不抛出,继续返回 success
+        }
+        // 异步处理完整逻辑(日志、其他类型等)
+        CompletableFuture.runAsync(() -> {
+            try {
+                String enMsg = encryptMsg.getEncryptMsg();
+                String decryptMsg = OpenapiHelper.aesDecrypt(enMsg, ENCRYPT_KEY);
+                JsonNode rootNode = OBJECT_MAPPER.readTree(decryptMsg);
+                String msgType = rootNode.path("msgType").asText();
+
+                if ("APP_TICKET".equals(msgType)) {
+                    String appTicket = rootNode.path("bizContent").path("appTicket").asText();
+                    APP_TICKET = appTicket; // 再次确认
+                    log.info("异步最终确认 appTicket: {}", appTicket);
+                } else if ("TEMP_AUTH_CODE".equals(msgType)) {
+                    String tmpAuthCode = rootNode.path("bizContent").path("tempAuthCode").asText();
+                    TEMP_AUTH_CODE = tmpAuthCode;
+                    log.info("异步保存 tempAuthCode: {}", tmpAuthCode);
+                }
+            } catch (Exception e) {
+                log.error("异步处理失败", e);
+            }
+        });
+        return receiveMsgOK();
+    }
+    //快速从解密后的 JSON 字符串中提取 appTicket
+    private static final Pattern APP_TICKET_PATTERN = Pattern.compile("\"appTicket\"\\s*:\\s*\"([^\"]+)\"");
+    private String extractAppTicketFast(String decryptMsg) {
+        if (decryptMsg == null || decryptMsg.isEmpty()) return null;
+        Matcher matcher = APP_TICKET_PATTERN.matcher(decryptMsg);
+        return matcher.find() ? matcher.group(1) : null;
+    }
+    private Map<String, String> receiveMsgOK() {
+        Map<String, String> result = new HashMap<>();
+        result.put("result", "success");
+        return result;
+    }
+
+    @GetMapping("/receiveCode")
+    public String oAuth(@RequestParam String code, @RequestParam String state) {
+        System.out.println("Code:" + code);
+        return code;
+    }
+
+    @PostMapping("/getToken")
+    public McR getToken(@RequestBody Map param ) throws Exception {
+        String data =oaLinkcjtService.getToken((String) param.get("type"), (String) param.get("makeReport"));
+        return  McR.success(data);
+    }
+
+//  ==========================================cjt消息通知配置及获取token接口END===========================================================
+
+
+//  =================================================get测试接口START==================================================================
+    @GetMapping("/test")
+    public long test(){
+        return currentTimeMillis();
+    }
+
+    @GetMapping("/get")
+    public McR get(@RequestBody Map param){
+        log.info("get:{}",param);
+        return null;
+    }
+
+//    ==========================================get测试接口END===============================================
+
+//    =================================停用接口START==============================================================
+
+    /**
+     * 同步供应商数据--停用
+     */
+    @PostMapping("/syncSupplier")
+    public McR syncSupplier(@RequestBody Map param){
+        log.info("供应商数据处理");
+        try{
+            Map data =oaLinkcjtService.syncSupplier(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+
+    //    获取供应商档案数据--停用
+    @PostMapping("/getSupplier")
+    public McR getSupplier(){
+        log.info("供应商档案数据处理");
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 100;
+        JSONArray supplierList = new JSONArray();
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid("FORM-795A93DE8B9F4195BC731C86DE7278AEQT9R")
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize)
+                    .build(), YDConf.FORM_QUERY.retrieve_list);
+            if (ddrNew != null && ddrNew.getData() != null) {
+                JSONArray currentPageData = (JSONArray) ddrNew.getData();
+                supplierList.addAll(currentPageData);
+                System.out.println("已处理第 " + pageNumber + " 页数据,当前页记录数: " + currentPageData.size());
+                if (currentPageData.size() < pageSize) {
+                    break;
+                }
+            }
+            pageNumber++;  // 准备查询下一页
+        } while (ddrNew != null && ddrNew.getTotalCount() > (pageNumber - 1) * pageSize);
+        List supplierArray = new ArrayList();
+        for(Object ddrNewItem:supplierList){
+            Map ddrNewMap = (Map) ddrNewItem;
+            Map ddrsNewMap = (Map) ddrNewMap.get("formData");
+            String ddrNewCode = ddrsNewMap.get("textField_mb7w3zbf").toString();
+            supplierArray.add(ddrNewCode);
+
+        }
+        return McR.success(supplierArray);
+    }
+
+    //    填充供应商档案数据--停用
+    @PostMapping("/fillSupplier")
+    public McR fillSupplier(@RequestBody Map param){
+        log.info("供应商档案数据处理");
+        DDR_New ddrNew;
+        int pageNumber = 1;
+        int pageSize = 100;
+        JSONArray supplierList = new JSONArray();
+        do {
+            ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid("FORM-795A93DE8B9F4195BC731C86DE7278AEQT9R")
+                    .searchCondition(JSONObject.toJSONString(Arrays.asList(
+                            new YDSearch("textField_mb7w3zbf", param.get("supplierName"), "textField_mb7w3zbf",
+                                    YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ) )))// 精准匹配
+                    .pageNumber(pageNumber)
+                    .pageSize(pageSize)
+                    .build(), YDConf.FORM_QUERY.retrieve_list);
+            if (ddrNew != null && ddrNew.getData() != null) {
+                JSONArray currentPageData = (JSONArray) ddrNew.getData();
+                supplierList.addAll(currentPageData);
+                System.out.println("已处理第 " + pageNumber + " 页数据,当前页记录数: " + currentPageData.size());
+                if (currentPageData.size() < pageSize) {
+                    break;
+                }
+            }
+            pageNumber++;  // 准备查询下一页
+        } while (ddrNew != null && ddrNew.getTotalCount() > (pageNumber - 1) * pageSize);
+        Map ddrNewMap = (Map) supplierList.get(0);
+        Map ddrsNewMap = (Map) ddrNewMap.get("formData");
+        return McR.success(ddrsNewMap);
+    }
+
+    //    获取日常报销单oa数据--停用
+    @PostMapping("/processDaily")
+    public McR processDaily(@RequestBody Map param){
+        log.info("日常报销单凭证数据处理");
+        try{
+            Map data =oaLinkcjtService.processDailyVoucher(param);
+            return McR.success(data);
+        }catch (Exception e) {
+            log.error("同步失败:{}", e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    //    获取差旅报销单oa数据--停用
+    @PostMapping("/processTravel")
+    public McR processTravel(@RequestBody Map param){
+        log.info("差旅报销单凭证数据处理");
+        try{
+            Map data =oaLinkcjtService.processTravelVoucher(param);
+            return McR.success(data);
+        }catch (Exception e) {
+            log.error("同步失败:{}", e);
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    //    获取业务招待费用单oa数据--停用
+    @PostMapping("/processBusiness")
+    public McR processBusiness(@RequestBody Map param){
+        log.info("业务招待费用凭证数据处理");
+        try{
+            Map data =oaLinkcjtService.processBusinessVoucher(param);
+            return McR.success(data);
+        }catch (Exception e) {
+            log.error("同步失败:{}", e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+
+
+//    ========================================停用接口END================================================
+
+
+
+//    ================================新需求钉钉流程相关接口START===========================================
+    /***
+     * 自动发起支付复核流程
+     * @param param
+     * @return
+     */
+    @PostMapping("/autoPayment")
+    public McR autoPayment(@RequestBody Map param){
+        try{
+            return oaLinkcjtService.autoPayment(param);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    /**
+     * 更新线下付款宜搭付款状态
+     * @param param
+     * @return
+     */
+    @PostMapping("/updateStatus")
+    public McR updateStatus(@RequestBody Map param){
+        log.info("线下支付更新审核状态:reimburseType:{},formInstanceId:{}",param.get("reimburseType"),param.get("formInstanceId"));
+        String formUUid = "";
+        if(param.get("reimburseType").equals("payment")){
+            formUUid ="FORM-8151C4EB020A4D79821D73F931F6A27D730D";
+        }else{
+            formUUid ="FORM-1FF3117C37394668ABCA09CEE22BF8174XQW";
+        }
+        String formInstanceId = param.get("formInstanceId").toString();
+        try{
+            List<Map> paymentList = (List<Map>) ydClient.queryData(YDParam.builder()
+                    .formUuid(formUUid)
+                    .searchCondition(JSONObject.toJSONString(Arrays.asList(
+                            new YDSearch("textField_mcog8v86", formInstanceId, "textField_mcog8v86",
+                                    YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ) // 精准匹配
+                    )))
+                    .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+            String InstanceId = paymentList.get(0).get("formInstanceId").toString();
+            Map updateParam = new HashMap();
+            updateParam.put("textField_md78giwk","已审核已付款");
+            updateParam.put("dateField_md78giwl", Instant.now().toEpochMilli());
+            ydClient.operateData(YDParam.builder()
+                    .formUuid(formUUid)
+                    .formInstanceId(InstanceId)
+                    .updateFormDataJson(JSON.toJSONString(updateParam))
+                    .build(), YDConf.FORM_OPERATION.update);
+            return McR.success();
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+    }
+
+    /**
+     * 获取关联审批编号
+     */
+    @PostMapping("/getRecordCode")
+    public McR getApproval(@RequestBody Map param){
+        log.info("获取关联审批单:{}",param);
+        return McR.success(oaLinkcjtService.getRecordCode(param));
+    }
+
+    /**
+     * 获取对公/报销申请信息
+     * @param param
+     * @return
+     */
+    @PostMapping("/getApplyInfo")
+    public McR getApplyInfo(@RequestBody Map param){
+        try{
+            Map data =oaLinkcjtService.getApplyInfo(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 自动同意申请审批任务
+     * @param param
+     * @return
+     */
+    @PostMapping("/processApproval")
+    public McR processApproval(@RequestBody Map param){
+        log.info("自动同意审批任务:{}",param);
+        try{
+            Map data =oaLinkcjtService.processApproval(param);
+            return McR.success(data);
+        }catch (Exception e){
+            log.error("同步失败:{}",e.getMessage());
+            return McR.errorParam(e.getMessage());
+        }
+
+    }
+
+//    ================================新需求钉钉流程相关接口END===========================================
+
+
+
+}

+ 9 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/controller/tempStore.java

@@ -0,0 +1,9 @@
+package sanyangwl.pro.sanyang.controller;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/8/28 20:34
+ */
+public class tempStore {
+}

+ 9 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/ddMessageServer.java

@@ -0,0 +1,9 @@
+package sanyangwl.pro.sanyang.service;
+
+import com.malk.server.common.McR;
+
+import java.util.Map;
+
+public interface ddMessageServer {
+    McR autoPayment(Map param);
+}

+ 42 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/oaLinkcjtServer.java

@@ -0,0 +1,42 @@
+package sanyangwl.pro.sanyang.service;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.malk.server.common.McR;
+
+import java.util.List;
+import java.util.Map;
+
+public interface oaLinkcjtServer {
+    String processSupplier(Map param) throws Exception;
+
+    Map processVoucher(Map param) throws Exception;
+
+    Map processDailyVoucher(Map param) throws Exception;
+
+    Map processTravelVoucher(Map param) throws Exception;
+
+    Map processBusinessVoucher(Map param) throws Exception;
+
+    List getPaySubject();
+
+    Map processReimbursement(Map param) throws Exception;
+
+    Map changeSupplier(Map param) throws Exception;
+
+    Map syncSupplier(Map param) throws Exception;
+
+    List  getBankCode(Map param) throws Exception;
+
+    Map processPayment(Map param) throws Exception;
+
+    void getPayResult();
+    String getToken(String Type, String makeReport) throws Exception;
+    McR autoPayment(Map param) throws Exception;
+
+    Map getApplyInfo(Map param) throws Exception;
+
+    Map processApproval(Map param);
+
+    List getRecordCode(Map  param);
+
+    String getBankSerial(Map param) throws Exception;
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2156 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/serviceImpl/aoLinkserverImpl.java


+ 28 - 0
mjava-sanyang/src/main/java/sanyangwl/pro/sanyang/service/serviceImpl/ddMesserverImpl.java

@@ -0,0 +1,28 @@
+package sanyangwl.pro.sanyang.service.serviceImpl;
+
+import com.malk.server.common.McR;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import sanyangwl.pro.sanyang.service.ddMessageServer;
+import sanyangwl.pro.sanyang.service.oaLinkcjtServer;
+import java.util.Map;
+
+/**
+ * 功能:
+ * 作者:hanxue
+ * 日期:2025/10/23 17:49
+ */
+@Service
+@Component
+@Slf4j
+public class ddMesserverImpl implements ddMessageServer {
+    @Autowired
+    private oaLinkcjtServer oaLinkserver;
+    @Override
+    public McR autoPayment(Map param) {
+
+        return null;
+    }
+}

+ 193 - 0
mjava-sanyang/src/main/resources/application-dev.yml

@@ -0,0 +1,193 @@
+debug.profile: "dev-loaded"
+server:
+  port: 9002
+  servlet:
+    context-path: /api
+
+
+dingtalk:
+  agentId: 3891513586
+  appKey: ding5a3ukhxj9x1penqp
+  appSecret: DFJjzStg7gC8_r1Q9TI9Y81uJDRwjhQp8nSmtFsDSVhGmeFYlNJs-wUZDfM6QiLT
+  corpId: dingfeedcb2c2f541f22a1320dcb25e91351
+  aesKey:
+  token:
+  operator:
+
+  # aliwork
+aliwork:
+  appType: APP_X31KF64MMEBZJ44HK21I
+  systemToken: 70A66891S5SV57WB7SSI14UM6WOU2GJBSE6BMXN1
+
+
+sanyangwl:
+  AppKey: h2mqX7By
+  AppSecret: CB5150BA2FDB8E7935EFA3C4717F5B63
+
+
+# 类型配置
+reimburse:
+  types:
+    daily: # 日常报销配置
+      formKey: "TableField_JE4D1TS2WFS0"  # 表单子表字段key
+      accountSetKey: "DDSelectField_1NEU2WDO5E2O0"  # 所属账套字段key
+      paymentSubjectKey: "DDSelectField_1LRDDHULEH400"  # 付款科目字段key
+      pushVoucherKey: "DDSelectField_1IYE30NQUEXS0"  # 是否推送凭证字段key
+      makeReportKey: "DDDateField_Z3FHT3X5NB40" #   制单日期字段key
+      reportType: "日常报销"  # 报表类型
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_1XP50U98D3VK0"
+      note: "TextareaField_20H0C5FBG9Q80"
+      fromAccountCode: "DDSelectField_19I9AP93UBCW0"
+      fromAccountName: "DDSelectField_BA9D93W7HQ00"
+      paymentTypeKey: "DDSelectField_AHZ90EICI080"
+      paymentNote: "TextField_1CEDQ1M77MIO0"
+      summaryKey: "MoneyField_1GLNRLCDPOIO0" #付款总额字段
+
+      detailMapping: # 明细字段映射
+        categoryKey: "DDSelectField_199D3AAPYL0G0"  # 报销类别字段key
+        dateKey: "DDDateField_GPLRJ3QUI400"  # 费用发生日期字段key
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"  # 报销金额字段key
+        descriptionKey: "TextareaField_1YFBF6Q1KPZ40"  # 描述字段key
+        invoiceTypeKey: "DDSelectField_H7GMXTULAQW0"  # 发票类型字段key
+        taxAmountKey: "MoneyField_11G89S9X0ZS00"  # 税额字段key
+        nonTaxAmountKey: "MoneyField_171611UFL55S0"  # 不含税金额字段key
+        attachmentKey: "DDAttachment_1Z21NOF0UAXS0"  # 发票附件字段key
+        deptKey: null
+
+    travel:  # 差旅报销
+      formKey: "TableField_ZFIWGDB0J0G0"
+      accountSetKey: "DDSelectField_VCYPICMSC6O0"
+      paymentSubjectKey: "DDSelectField_XAINCF9L2FK0"
+      pushVoucherKey: "DDSelectField_UJML0RXJI1C0"
+      makeReportKey: "DDDateField_10SY5Q5HQAU8"
+      reportType: "差旅报销"
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_131DA7MRGJ9S0"
+      note: "TextareaField_MO5A4H2UNFK0"
+      fromAccountCode: "DDSelectField_FQGZUBW8VHS0"
+      fromAccountName: "DDSelectField_9B25IIT3V9C0"
+      paymentTypeKey: "DDSelectField_T17U8247HEO0"
+      paymentNote: "TextField_OT1ZP5TV68G0"
+      summaryKey: "MoneyField_1GLNRLCDPOIO0" #付款总额字段
+
+      detailMapping:
+        categoryKey: "DDSelectField_QF7XC72XIBK0"
+        dateKey: "DDDateField_5RIDQRQVFPC0"
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"
+        descriptionKey: "TextareaField_1O2FFHOCKDJ40"
+        invoiceTypeKey: "DDSelectField_1BZEFP3O01Z40"
+        taxAmountKey: "MoneyField_1UVYCHXPB4N40"
+        nonTaxAmountKey: "MoneyField_1W9HCGP29G8W"
+        attachmentKey: "DDAttachment_FSX7UZJUUYO0"
+        deptKey: null
+
+    business:  # 业务招待费
+      formKey: "TableField_JE4D1TS2WFS0"
+      accountSetKey: "DDSelectField_208XKNYUW8V40"
+      paymentSubjectKey: "DDSelectField_W6AMXBX605S0"
+      pushVoucherKey: "DDSelectField_201EI3R8ZA000"
+      makeReportKey: "DDDateField_7Y0HVLMX8X40"
+      reportType: "业务招待费"
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_1XP50U98D3VK0"
+      note: "TextareaField_20H0C5FBG9Q80"
+      fromAccountCode: "DDSelectField_DGBJ3XVXNUO0"
+      fromAccountName: "DDSelectField_14JLJ2XRKJ400"
+      paymentTypeKey: "DDSelectField_1UP11C7CYD340"
+      paymentNote: "TextField_16WFL663IM800"
+      summaryKey: "MoneyField_1GLNRLCDPOIO0" #付款总额字段
+
+      detailMapping:
+        categoryKey: "DDSelectField_199D3AAPYL0G0"
+        dateKey: "DDDateField_GPLRJ3QUI400"
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"
+        descriptionKey: "TextareaField_1YFBF6Q1KPZ40"
+        invoiceTypeKey: "DDSelectField_1YVFKMAJNXPC0"
+        taxAmountKey: "MoneyField_11G89S9X0ZS00"
+        nonTaxAmountKey: "MoneyField_1C0ATWKSVCLC0"
+        attachmentKey: "DDAttachment_1Z21NOF0UAXS0"
+        deptKey: null
+
+
+    #付款类型配置
+    payment:
+      formKey: "TableField_1BYZKFE43DNK0"  # 表单子表字段key
+      accountSetKey: "DDSelectField_VT0HTZS2JEO0"  # 所属账套字段key
+      paymentSubjectKey: "DDSelectField_1B4HZMO6QIRK0"  # 付款科目字段key
+      pushVoucherKey: "DDSelectField_10PW2BC2JKUO0"  # 是否推送凭证字段key
+      makeReportKey: "DDDateField_BZHSOWBQ4EO0" #   制单日期字段key
+      paymentDateKey: "DDDateField_20EK43G54K8W0" #   付款日期字段key
+      supplierKey: "DDSelectField_4FS6NMFBVX80" # 供应商字段key
+      reportType: "对公付款"  # 报表类型
+      accountKey: "DDSelectField_4FS6NMFBVX80"
+      note: "TextareaField_1XHPHV1CK90G0"
+      fromAccountCode: "DDSelectField_1KQLBUZNTCGW0"
+      fromAccountName: "DDSelectField_1ILJ09YL0YPS0"
+      paymentTypeKey: "DDSelectField_1Y3EBEHWERMO0"
+      paymentNote: "TextField_9JHWXEMGGES0"
+      summaryKey: "MoneyField_1GLNRLCDPOIO0" #付款总额字段
+
+      detailMapping: # 明细字段映射
+        categoryKey: "CascadeField_2338BOHLSCIO0"  # 报销类别字段key
+        deptKey: "DepartmentField_1DLCVYIO0GQO0"  # 归属部门字段key
+        amountKey: "MoneyField_21WACA1JA39C0"  # 报销金额字段key
+        descriptionKey: "TextareaField_19Y05JIEW0GW0"  # 描述字段key
+        invoiceTypeKey: "DDSelectField_1ZSTBQG4E8U80"
+        taxAmountKey: "MoneyField_OXZ11YSAGY80"
+        nonTaxAmountKey: "MoneyField_7AYU79MRZA40"
+        attachmentKey: null
+        dateKey: null
+
+supplier:
+  types:
+    create:
+      applier: "InnerContactField_1CI483VE4IE80"
+      applierDept: "DepartmentField_1KDDGAXFAB0G0"
+      applierDate: "DDDateField_1XN930GOF5A80"
+      supplierName: "TextField-K026DK45"
+      supplierCode: null
+      companyCode : "TextField_1HC0NXX30X1C0"
+      registAddress: "TextField_20X8X3EOB40W0"
+      represent: "TextField-K026DK48" # 法人代表
+      phone : "TextField_1DJA203PFHS00"
+      hangye: "TextField-K026DK4C"
+      bankName: "TextField-K026DK4E"
+      bank: "TextField_1DYNBP1CKO4G0"
+      account: "TextField_4IZVPVSH2C80"
+      happenTimes : "DDSelectField_1T0O8CNI1DCW0"
+      belongsTo: "DDSelectField_VJM68LX4ZE80"
+      note: "TextareaField-K026DK4J"
+      dengjibiao : "DDAttachment_74VGLL0UTFO0"
+      yiye : "DDAttachment_1TEUH0AKHCOW0"
+
+
+
+    change:
+      applier: "InnerContactField_1CI483VE4IE80"
+      applierDept: "DepartmentField_1KDDGAXFAB0G0"
+      applierDate: "DDDateField_1XN930GOF5A80"
+      supplierName: "DDSelectField_1EWW6XPZDHDS0"
+      supplierCode: "TextField_14LM7IJVV5SW"
+      companyCode: "TextField_1HC0NXX30X1C0"
+      registAddress: "TextField_20X8X3EOB40W0"
+      represent: "TextField-K026DK48" # 法人代表
+      phone: "TextField_1DJA203PFHS00"
+      hangye: "TextField-K026DK4C"
+      bankName: "TextField-K026DK4E"
+      bank: "TextField_1DYNBP1CKO4G0"
+      account: "TextField_4IZVPVSH2C80"
+      happenTimes: "DDSelectField_1T0O8CNI1DCW0"
+      belongsTo: "DDSelectField_VJM68LX4ZE80"
+      note: "TextareaField-K026DK4J"
+      dengjibiao: "DDAttachment_74VGLL0UTFO0"
+      yiye: "DDAttachment_1TEUH0AKHCOW0"
+
+
+
+
+
+

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

@@ -0,0 +1,187 @@
+server:
+  port: 9197
+  servlet:
+    context-path: /api
+
+dingtalk:
+  agentId: 3891513586
+  appKey: ding5a3ukhxj9x1penqp
+  appSecret: DFJjzStg7gC8_r1Q9TI9Y81uJDRwjhQp8nSmtFsDSVhGmeFYlNJs-wUZDfM6QiLT
+  corpId: dingfeedcb2c2f541f22a1320dcb25e91351
+  aesKey:
+  token:
+  operator:
+
+  # aliwork
+aliwork:
+  appType: APP_X31KF64MMEBZJ44HK21I
+  systemToken: 70A66891S5SV57WB7SSI14UM6WOU2GJBSE6BMXN1
+
+sanyangwl:
+  AppKey: h2mqX7By
+  AppSecret: CB5150BA2FDB8E7935EFA3C4717F5B63
+
+#
+
+# 类型配置
+reimburse:
+  types:
+    daily: # 日常报销配置
+      formKey: "TableField_JE4D1TS2WFS0"  # 表单子表字段key
+      accountSetKey: "DDSelectField_1NEU2WDO5E2O0"  # 所属账套字段key
+      paymentSubjectKey: "DDSelectField_1LRDDHULEH400"  # 付款科目字段key
+      pushVoucherKey: "DDSelectField_1IYE30NQUEXS0"  # 是否推送凭证字段key
+      makeReportKey: "DDDateField_Z3FHT3X5NB40" #   制单日期字段key
+      reportType: "日常报销"  # 报表类型
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_1XP50U98D3VK0"
+      note: "TextareaField_20H0C5FBG9Q80"
+      fromAccountCode: "DDSelectField_19I9AP93UBCW0"
+      fromAccountName: "DDSelectField_BA9D93W7HQ00"
+      paymentTypeKey: "DDSelectField_AHZ90EICI080"
+      paymentNote: "TextField_1CEDQ1M77MIO0"
+
+      detailMapping: # 明细字段映射
+        categoryKey: "DDSelectField_199D3AAPYL0G0"  # 报销类别字段key
+        dateKey: "DDDateField_GPLRJ3QUI400"  # 费用发生日期字段key
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"  # 报销金额字段key
+        descriptionKey: "TextareaField_1YFBF6Q1KPZ40"  # 描述字段key
+        invoiceTypeKey: "DDSelectField_H7GMXTULAQW0"  # 发票类型字段key
+        taxAmountKey: "MoneyField_11G89S9X0ZS00"  # 税额字段key
+        nonTaxAmountKey: "MoneyField_171611UFL55S0"  # 不含税金额字段key
+        attachmentKey: "DDAttachment_1Z21NOF0UAXS0"  # 发票附件字段key
+        deptKey: null
+
+    travel:  # 差旅报销
+      formKey: "TableField_ZFIWGDB0J0G0"
+      accountSetKey: "DDSelectField_VCYPICMSC6O0"
+      paymentSubjectKey: "DDSelectField_XAINCF9L2FK0"
+      pushVoucherKey: "DDSelectField_UJML0RXJI1C0"
+      makeReportKey: "DDDateField_10SY5Q5HQAU8"
+      reportType: "差旅报销"
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_131DA7MRGJ9S0"
+      note: "TextareaField_MO5A4H2UNFK0"
+      fromAccountCode: "DDSelectField_FQGZUBW8VHS0"
+      fromAccountName: "DDSelectField_9B25IIT3V9C0"
+      paymentTypeKey: "DDSelectField_T17U8247HEO0"
+      paymentNote: "TextField_OT1ZP5TV68G0"
+
+      detailMapping:
+        categoryKey: "DDSelectField_QF7XC72XIBK0"
+        dateKey: "DDDateField_5RIDQRQVFPC0"
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"
+        descriptionKey: "TextareaField_1O2FFHOCKDJ40"
+        invoiceTypeKey: "DDSelectField_1BZEFP3O01Z40"
+        taxAmountKey: "MoneyField_1UVYCHXPB4N40"
+        nonTaxAmountKey: "MoneyField_1W9HCGP29G8W"
+        attachmentKey: "DDAttachment_FSX7UZJUUYO0"
+        deptKey: null
+
+    business:  # 业务招待费
+      formKey: "TableField_JE4D1TS2WFS0"
+      accountSetKey: "DDSelectField_208XKNYUW8V40"
+      paymentSubjectKey: "DDSelectField_W6AMXBX605S0"
+      pushVoucherKey: "DDSelectField_201EI3R8ZA000"
+      makeReportKey: "DDDateField_7Y0HVLMX8X40"
+      reportType: "业务招待费"
+      paymentDateKey: null
+      supplierKey: null
+      accountKey: "RecipientAccountField_1XP50U98D3VK0"
+      note: "TextareaField_20H0C5FBG9Q80"
+      fromAccountCode: "DDSelectField_DGBJ3XVXNUO0"
+      fromAccountName: "DDSelectField_14JLJ2XRKJ400"
+      paymentTypeKey: "DDSelectField_1UP11C7CYD340"
+      paymentNote: "TextField_16WFL663IM800"
+
+      detailMapping:
+        categoryKey: "DDSelectField_199D3AAPYL0G0"
+        dateKey: "DDDateField_GPLRJ3QUI400"
+        amountKey: "MoneyField_1ZSMX9Y5B0CG0"
+        descriptionKey: "TextareaField_1YFBF6Q1KPZ40"
+        invoiceTypeKey: "DDSelectField_1YVFKMAJNXPC0"
+        taxAmountKey: "MoneyField_11G89S9X0ZS00"
+        nonTaxAmountKey: "MoneyField_1C0ATWKSVCLC0"
+        attachmentKey: "DDAttachment_1Z21NOF0UAXS0"
+        deptKey: null
+
+
+    #付款类型配置
+    payment:
+      formKey: "TableField_1BYZKFE43DNK0"  # 表单子表字段key
+      accountSetKey: "DDSelectField_VT0HTZS2JEO0"  # 所属账套字段key
+      paymentSubjectKey: "DDSelectField_1B4HZMO6QIRK0"  # 付款科目字段key
+      pushVoucherKey: "DDSelectField_10PW2BC2JKUO0"  # 是否推送凭证字段key
+      makeReportKey: "DDDateField_BZHSOWBQ4EO0" #   制单日期字段key
+      paymentDateKey: "DDDateField_20EK43G54K8W0" #   付款日期字段key
+      supplierKey: "DDSelectField_4FS6NMFBVX80" # 供应商字段key
+      reportType:   # 报表类型
+      accountKey: "DDSelectField_4FS6NMFBVX80"
+      note: "TextareaField_1XHPHV1CK90G0"
+      fromAccountCode: "DDSelectField_1KQLBUZNTCGW0"
+      fromAccountName: "DDSelectField_1ILJ09YL0YPS0"
+      paymentTypeKey: "DDSelectField_1Y3EBEHWERMO0"
+      paymentNote: "TextField_9JHWXEMGGES0"
+
+
+      detailMapping: # 明细字段映射
+        categoryKey: "CascadeField_2338BOHLSCIO0"  # 报销类别字段key
+        deptKey: "DepartmentField_1DLCVYIO0GQO0"  # 归属部门字段key
+        amountKey: "MoneyField_21WACA1JA39C0"  # 报销金额字段key
+        descriptionKey: "TextareaField_19Y05JIEW0GW0"  # 描述字段key
+        invoiceTypeKey: "DDSelectField_1ZSTBQG4E8U80"
+        taxAmountKey: "MoneyField_OXZ11YSAGY80"
+        nonTaxAmountKey: "MoneyField_7AYU79MRZA40"
+        attachmentKey: null
+        dateKey: null
+
+supplier:
+  types:
+    create:
+      applier: "InnerContactField_1CI483VE4IE80"
+      applierDept: "DepartmentField_1KDDGAXFAB0G0"
+      applierDate: "DDDateField_1XN930GOF5A80"
+      supplierName: "TextField-K026DK45"
+      supplierCode: null
+      companyCode : "TextField_1HC0NXX30X1C0"
+      registAddress: "TextField_20X8X3EOB40W0"
+      represent: "TextField-K026DK48" # 法人代表
+      phone : "TextField_1DJA203PFHS00"
+      hangye: "TextField-K026DK4C"
+      bankName: "TextField-K026DK4E"
+      bank: "TextField_1DYNBP1CKO4G0"
+      account: "TextField_4IZVPVSH2C80"
+      happenTimes : "DDSelectField_1T0O8CNI1DCW0"
+      belongsTo: "DDSelectField_VJM68LX4ZE80"
+      note: "TextareaField-K026DK4J"
+      dengjibiao : "DDAttachment_74VGLL0UTFO0"
+      yiye : "DDAttachment_1TEUH0AKHCOW0"
+
+
+
+    change:
+      applier: "InnerContactField_1CI483VE4IE80"
+      applierDept: "DepartmentField_1KDDGAXFAB0G0"
+      applierDate: "DDDateField_1XN930GOF5A80"
+      supplierName: "DDSelectField_1EWW6XPZDHDS0"
+      supplierCode: "TextField_14LM7IJVV5SW"
+      companyCode: "TextField_1HC0NXX30X1C0"
+      registAddress: "TextField_20X8X3EOB40W0"
+      represent: "TextField-K026DK48" # 法人代表
+      phone: "TextField_1DJA203PFHS00"
+      hangye: "TextField-K026DK4C"
+      bankName: "TextField-K026DK4E"
+      bank: "TextField_1DYNBP1CKO4G0"
+      account: "TextField_4IZVPVSH2C80"
+      happenTimes: "DDSelectField_1T0O8CNI1DCW0"
+      belongsTo: "DDSelectField_VJM68LX4ZE80"
+      note: "TextareaField-K026DK4J"
+      dengjibiao: "DDAttachment_74VGLL0UTFO0"
+      yiye: "DDAttachment_1TEUH0AKHCOW0"
+
+
+
+
+

+ 23 - 0
mjava-sanyang/src/main/resources/application.yml

@@ -0,0 +1,23 @@
+spring:
+  profiles:
+    active: prod
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+  http:
+    enabled: false
+mybatis-plus:
+  mappers-locations: mapper/*.xml
+  type-aliases-package: com.malk.mc.entity
+  #  configuration:
+  #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+
+
+
+  level:
+    com.malk.*: debug
+enable:
+  scheduling: true

+ 19 - 0
mjava-sanyang/src/test/java/sanyangwl/pro/sanyang/SanyangApplicationTests.java

@@ -0,0 +1,19 @@
+package sanyangwl.pro.sanyang;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import static java.lang.System.currentTimeMillis;
+
+@SpringBootTest
+class SanyangApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+
+
+
+}