Преглед изворни кода

久有私募后端程序初始化

fyz пре 1 недеља
комит
f91699f82d
34 измењених фајлова са 2155 додато и 0 уклоњено
  1. 61 0
      mjava-jiuyousimu/pom.xml
  2. 33 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/Boot.java
  3. 24 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/config/KDWebApiConf.java
  4. 29 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/config/KDWebApiConfig.java
  5. 22 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DDController.java
  6. 60 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DLController.java
  7. 62 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDelegate.java
  8. 53 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDeptDelegate.java
  9. 42 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDPersonDelegate.java
  10. 22 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/AccountsPayableEntity.java
  11. 27 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Audit.java
  12. 15 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/BillTypeID.java
  13. 16 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Delete.java
  14. 18 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Department.java
  15. 15 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/FNumber.java
  16. 42 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Model.java
  17. 29 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/OtherMeetEntity.java
  18. 25 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Save.java
  19. 23 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Submit.java
  20. 14 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/View.java
  21. 33 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/schedule/ScheduleTask.java
  22. 17 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DeptService.java
  23. 27 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DingTalkService.java
  24. 264 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DeptServiceImpl.java
  25. 32 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DingTalkServiceImpl.java
  26. 220 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/PersonServiceImpl.java
  27. 17 0
      mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/PersonService.java
  28. 70 0
      mjava-jiuyousimu/src/main/resources/application-dev.yml
  29. 39 0
      mjava-jiuyousimu/src/main/resources/application-prod.yml
  30. 107 0
      mjava-jiuyousimu/src/main/resources/static/json/form.json
  31. 107 0
      mjava-jiuyousimu/src/main/resources/static/json/formtest.json
  32. 103 0
      mjava-jiuyousimu/src/test/java/test.java
  33. 39 0
      mjava-jiuyousimu/src/test/resource/server.sh
  34. 448 0
      pom.xml

+ 61 - 0
mjava-jiuyousimu/pom.xml

@@ -0,0 +1,61 @@
+<?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">
+    <parent>
+        <artifactId>java-mcli</artifactId>
+        <groupId>com.malk</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>mjava-jiuyousimu</artifactId>
+    <description>上海航食</description>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.malk</groupId>
+            <artifactId>mjava</artifactId>
+            <version>${mjava.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.xerial</groupId>
+            <artifactId>sqlite-jdbc</artifactId>
+            <version>3.41.2.1</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                    <!-- 如果没有该配置,devtools不会生效: 打包时关闭 -->
+                    <fork>false</fork>
+                    <!-- 避免中文乱码 -->
+                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
+                </configuration>
+                <!-- 允许生成可运行jar -->
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+</project>

+ 33 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/Boot.java

@@ -0,0 +1,33 @@
+package com.malk.jiuyousimu;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+import javax.persistence.EntityManager;
+
+/**
+ * corp项目: 扫描公共模块
+ * -
+ * 若是无需数据库模块, 配置无效地址也可启动, 引入mjava不支持直接 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 配置
+ * 需要配置 jpa.hibernate.ddl-auto 为 none. 标识对表没有任何操作. 若不设置为 none, flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+ */
+@EnableJpaAuditing
+@SpringBootApplication(scanBasePackages = {"com.malk"},exclude={DataSourceAutoConfiguration.class})
+public class Boot {
+
+    public static void main(String... args) {
+        SpringApplication.run(Boot.class, args);
+    }
+
+    /**
+     * 让Spring管理JPAQueryFactory [不使用Qualifier详见mjava-Boot]
+     */
+    @Bean
+    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
+        return new JPAQueryFactory(entityManager);
+    }
+}

+ 24 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/config/KDWebApiConf.java

@@ -0,0 +1,24 @@
+package com.malk.jiuyousimu.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "kingdee")
+@Slf4j
+public class KDWebApiConf {
+
+    private String XKDApiAcctID;
+
+    private String XKDApiUserName;
+
+    private String XKDApiAppID;
+
+    private String XKDApiAppSec;
+
+    private String XKDApiServerUrl;
+
+}

+ 29 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/config/KDWebApiConfig.java

@@ -0,0 +1,29 @@
+package com.malk.jiuyousimu.config;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class KDWebApiConfig {
+    private Properties properties = new Properties();
+
+    public KDWebApiConfig(String filePath) throws IOException {
+        try (FileInputStream input = new FileInputStream(filePath)) {
+            properties.load(input);
+        }
+    }
+
+    public String getProperty(String key) {
+        return properties.getProperty(key);
+    }
+
+    public static void main(String[] args) {
+        try {
+            KDWebApiConfig config = new KDWebApiConfig("mjava-jianhui/src/main/resources/application-dev.yml");
+            System.out.println("AcctID: " + config.getProperty("X-KDApi-AcctID"));
+            // 打印其他属性...
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 22 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DDController.java

@@ -0,0 +1,22 @@
+package com.malk.jiuyousimu.controller;
+
+import com.malk.controller.DDCallbackController;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 钉钉事件回调 3_1
+ * -
+ * [子项目直接继承即可有调用, 无需实现]
+ * -
+ * 注解 @RequestMapping 路径不能重复 [主子项目属同一个项目];
+ * 获取项目回调请求地址, https://mc.cloudpure.cn/frp/xxx/dd/callback [调试代理: frp + nginx]
+ */
+@Slf4j
+@RestController
+@RequestMapping("/dd")
+public class DDController extends DDCallbackController {
+
+
+}

+ 60 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/controller/DLController.java

@@ -0,0 +1,60 @@
+package com.malk.jiuyousimu.controller;
+
+/**
+ * 错误抛出与拦截详见 CatchException
+ */
+
+import com.malk.jiuyousimu.service.DeptService;
+import com.malk.server.common.McException;
+import com.malk.server.common.McR;
+import com.malk.server.common.McREnum;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilServlet;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping
+public class DLController {
+
+    @Autowired
+    private YDService ydService;
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DeptService deptService;
+
+    @PostMapping(value = "testToken")
+    McR testToken() {
+        deptService.testToken();
+        return McR.success();
+    }
+
+    @PostMapping(value = "testGet")
+    McR testGet(@RequestBody Map data) {
+        deptService.deptCreate(data);
+        return McR.success();
+    }
+
+    /**
+     * 更新审批实例
+     */
+    @SneakyThrows
+    @PostMapping("process/update")
+    McR updateProcess(@RequestBody Map data, HttpServletRequest request, @RequestParam String code) {
+        log.info("开始执行流程更新操作");
+        Map header = UtilServlet.getHeaders(request);
+        log.info("流程发起, {}, {}", data, header);
+        McException.assertException(!"dingspvmfolrjzhak6ge".equals(header.get("authorization")), McREnum.NOT_AUTHORIZED);
+            return McR.success();
+    }
+
+}

+ 62 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDelegate.java

@@ -0,0 +1,62 @@
+package com.malk.jiuyousimu.delegate;
+
+import com.malk.delegate.DDEvent;
+import com.malk.jiuyousimu.service.DeptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+/**
+ * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+@Primary
+public class DDDelegate implements DDEvent {
+
+    @Autowired
+    DeptService deptService;
+    // 审批任务回调执行业务逻辑
+
+    private static final String DXCPXS = "PROC-3F7AC816-B41B-4A48-8CFD-CE9FF92B05AB";
+    private static final String NDKJXS = "PROC-A9F9C430-5947-4B4F-9D8A-2591207E6153";
+    private static final String YPSQ = "PROC-B6CCD0BE-E74D-4FCD-8B3A-B68F7827C5AC";
+    private static final String KS = "PROC-B5937B5F-7883-4BAD-932A-F54A5113576C";
+
+    @Async
+    @Override
+    public void executeEvent_Task_Finish(String processInstanceId, String processCode, boolean isAgree, String remark) {
+        log.info("executeEvent_Task_Finish");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Start");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Task_Redirect(String processInstanceId, String processCode) {
+        log.info("executeEvent_Task_Redirect");
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Instance_Start(String processInstanceId, String processCode) {
+        log.info("executeEvent_Instance_Start");
+    }
+
+
+    // 审批实例回调执行业务逻辑
+    @Async
+    @Override
+    public void executeEvent_Instance_Finish(String processInstanceId, String processCode, boolean isAgree, boolean isTerminate, String staffId) {
+
+    }
+}

+ 53 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDDeptDelegate.java

@@ -0,0 +1,53 @@
+package com.malk.jiuyousimu.delegate;
+
+import com.malk.delegate.DDDeptEvent;
+import com.malk.jiuyousimu.service.DeptService;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+@Primary
+public class DDDeptDelegate implements DDDeptEvent {
+
+    @Autowired
+    DeptService deptService;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+    @Override
+    public void executeEvent_Dept_Create(List deptIds) {
+        deptIds.forEach(e->{
+            Map deptInfo = ddClient_contacts.getDepartmentInfo(ddClient.getAccessToken(), Long.parseLong(e.toString()));
+            deptService.deptCreate(deptInfo);
+        });
+
+    }
+
+    @Override
+    public void executeEvent_Dept_Modify(List deptIds) {
+
+    }
+
+    @Override
+    public void executeEvent_Dept_Remove(List deptIds) {
+        deptService.deptDelete(deptIds);
+    }
+    // 审批任务回调执行业务逻辑
+
+}

+ 42 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/delegate/DDPersonDelegate.java

@@ -0,0 +1,42 @@
+package com.malk.jiuyousimu.delegate;
+
+import com.malk.delegate.DDPersonEvent;
+import com.malk.jiuyousimu.service.DeptService;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Contacts;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * OA审批事件 [主项目也有实现, 添加 @Primary 优先注入主项目实现]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+@Primary
+public class DDPersonDelegate implements DDPersonEvent {
+
+    @Autowired
+    DeptService deptService;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+
+    @Override
+    public void executeEvent_Person_Create(List list) {
+
+    }
+
+    @Override
+    public void executeEvent_person_Remove(List list) {
+
+    }
+}

+ 22 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/AccountsPayableEntity.java

@@ -0,0 +1,22 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AccountsPayableEntity {
+    //实体主键
+    private FNumber FEntryID;
+    //结算方式
+    private FNumber FSETTLETYPEID;
+    //付款用途
+    private FNumber FPURPOSEID;
+    //应付金额
+    private Double FPAYTOTALAMOUNTFOR;
+    //付款金额
+    private Double FPAYAMOUNTFOR_E;
+
+    //关联明细
+    private List<Object> FPaySubEntity;
+}

+ 27 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Audit.java

@@ -0,0 +1,27 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+//审核或反审核
+@Data
+public class Audit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private String InterationFlags;
+
+    private int UseOrgId;
+
+    private String NetworkCtrl;
+
+    private Boolean IsVerifyProcInst;
+
+    private String IgnoreInterationFlag;
+
+    private Boolean UseBatControlTimes;
+}

+ 15 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/BillTypeID.java

@@ -0,0 +1,15 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+@Data
+public class BillTypeID {
+    public BillTypeID(String FNUMBER) {
+        this.FNUMBER = FNUMBER;
+    }
+
+    public BillTypeID() {
+    }
+
+    private String FNUMBER;
+}

+ 16 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Delete.java

@@ -0,0 +1,16 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+//删除
+@Data
+public class Delete {
+        private Integer CreateOrgId;
+        private List<String> Numbers;
+        private String Ids;
+        private String NetworkCtrl;
+//        //保存实体
+//        private Object model;
+}

+ 18 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Department.java

@@ -0,0 +1,18 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Department {
+
+    //部门
+    private FNumber FCreateOrgId;//创建组织
+    private FNumber FUseOrgId;//使用组织
+    private String FName;//名称
+    private String FEffectDate;//生效日期
+    private String FLapseDate;//失效日期
+    private String FNumber;//部门编码
+
+}

+ 15 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/FNumber.java

@@ -0,0 +1,15 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+@Data
+public class FNumber {
+    public FNumber() {
+    }
+
+    public FNumber(String FNumber) {
+        this.FNumber = FNumber;
+    }
+
+    private String FNumber;
+}

+ 42 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Model.java

@@ -0,0 +1,42 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Model {
+    private int FID;
+    private BillTypeID FBillTypeID;//单据类型
+    private String FDATE;//业务日期
+    private String FENDDATE_H;//到期日
+    private String FCONTACTUNITTYPE;//往来单位类型
+    private FNumber FCONTACTUNIT;//往来单位
+    private FNumber FCURRENCYID ;//币别
+    private Double FTOTALAMOUNTFOR_H;//总金额
+    private Double FNOTSETTLEAMOUNTFOR;//未借款金额
+    private FNumber FDEPARTMENTID;//申请部门
+    private FNumber SettlementOrgan;//结算组织(暂无字段)
+    private FNumber PaymentOrgan;//付款组织(暂无字段)
+    private FNumber PurchasingOrgan;//采购组织(暂无字段)
+    private FNumber FPURCHASEDEPTID;//采购部门
+    private FNumber FPURCHASERGROUPID;//采购组
+    private FNumber FPURCHASERID;//采购员
+    private String FRemarks ;//备注
+    private String FREMARK ;//备注
+    private String FBUSINESSTYPE;//业务类型
+    private String FRECTUNITTYPE;//收款单位类型
+    private FNumber FRECTUNIT;//收款单位
+    private List<Object> FEntity;//明细
+    //部门
+    private FNumber FCreateOrgId;//创建组织
+    private FNumber FUseOrgId;//使用组织
+    private String FName;//名称
+    private Integer FDEPTID;//ID
+    private String FEffectDate;//生效日期
+    private String FLapseDate;//失效日期
+    private String FNumber;//失效日期
+
+    private List<OtherMeetEntity> otherMeetEntityList;//明细
+    private List<AccountsPayableEntity> FPAYBILLENTRY;//明细
+}

+ 29 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/OtherMeetEntity.java

@@ -0,0 +1,29 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OtherMeetEntity {
+    //实体主键
+    private FNumber FEntryID;
+    //费用项目编码
+    private FNumber FCOSTID;
+    //费用项目名称
+    private FNumber FCOSTNAME;
+    //费用承担部门
+    private FNumber FCOSTDEPARTMENTID;
+    //发票类型
+    private String FINVOICETYPE;
+    //税率
+    private Double FEntryTaxRate;
+    //不含税金额
+    private Double FNOTAXAMOUNTFOR;
+    //税额
+    private Double FTAXAMOUNTFOR;
+    //总金额
+    private Double FTOTALAMOUNTFOR;
+    //关联明细
+    private List<Object> FPaySubEntity;
+}

+ 25 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Save.java

@@ -0,0 +1,25 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+//保存
+@Data
+public class Save {
+        //默认为空 需要时选择性赋值
+/*        private List<String> NeedUpDateFields;
+        private List<String> NeedReturnFields;
+        private boolean IsDeleteEntry;
+        private String SubSystemId;
+        private boolean IsVerifyBaseDataField;
+        private boolean IsEntryBatchFill;
+        private boolean ValidateFlag;
+        private boolean NumberSearch;
+        private boolean IsAutoAdjustField;
+        private String InterationFlags;
+        private boolean IgnoreInterationFlag;
+        private boolean IsControlPrecision;
+        private boolean ValidateRepeatJson;*/
+
+        //保存实体
+        private Object model;
+}

+ 23 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/Submit.java

@@ -0,0 +1,23 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+//提交
+@Data
+public class Submit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private int SelectedPostId;
+
+    private int UseOrgId;
+
+    private Boolean NetworkCtrl;
+
+    private Boolean IgnoreInterationFlag;
+}

+ 14 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/entity/View.java

@@ -0,0 +1,14 @@
+package com.malk.jiuyousimu.entity;
+
+import lombok.Data;
+
+@Data
+public class View {
+    private int CreateOrgId;
+
+    private String Number;
+
+    private String Id;
+
+    private Boolean IsSortBySeq;
+}

+ 33 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/schedule/ScheduleTask.java

@@ -0,0 +1,33 @@
+package com.malk.jiuyousimu.schedule;
+
+import com.malk.jiuyousimu.service.DeptService;
+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;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"spel.scheduling"})
+public class ScheduleTask {
+
+
+    @Autowired
+    private DeptService deptService;
+
+//    /**
+//     * 每天15,16点尝试下发流程
+//     */
+//    @Scheduled(cron = "0 0 15-16 * * ?")
+//    void updateUseCar(){
+//        log.info("每天15,16点尝试下发流程");
+//        payService.getInvestmentCompany(false);
+//    }
+
+
+}

+ 17 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DeptService.java

@@ -0,0 +1,17 @@
+package com.malk.jiuyousimu.service;
+
+import com.malk.server.common.McR;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DeptService {
+
+    void testToken();
+
+    McR deptCreate(Map processData);
+
+
+    McR deptDelete(List deptIds);
+
+}

+ 27 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/DingTalkService.java

@@ -0,0 +1,27 @@
+package com.malk.jiuyousimu.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DingTalkService {
+
+
+    /**
+     * 获取在职人员
+     * @param access_token
+     * @param status_list
+     * @param offset
+     * @param size
+     * @return
+     */
+    Map getAllUserIdInfo(String access_token, String status_list, Number offset,Number size);
+
+    /**
+     * 获取员工花名册字段信息
+     * @param access_token
+     * @param userId
+     * @return
+     */
+    List<Map> getDDUserInfoById(String access_token, String userId, Number appAgentId);
+
+}

+ 264 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DeptServiceImpl.java

@@ -0,0 +1,264 @@
+package com.malk.jiuyousimu.service.Impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.jiuyousimu.config.KDWebApiConf;
+import com.malk.jiuyousimu.entity.*;
+import com.malk.jiuyousimu.service.DingTalkService;
+import com.malk.jiuyousimu.service.DeptService;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.service.dingtalk.*;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import static org.aspectj.bridge.MessageUtil.fail;
+
+@Service
+@Slf4j
+public class DeptServiceImpl implements DeptService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+    @Autowired
+    private DDClient_Meeting ddClientMeeting;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+    @Autowired
+    private DDClient_Personnel ddClientPersonnel;
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
+    @Value("${dingtalk.agentId}")
+    private Long agentId;
+
+    @Autowired
+    DingTalkService dingTalkService;
+    @Autowired
+    DDService ddService;
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDService ydService;
+
+    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    private static final String API_TOKEN = "/corpAccessToken/get/V2";
+    private static final String POST_GET_USER = "/user/getByMobile";
+    private static final String POST_DATA_UPDATE = "/crm/custom/v2/data/update";
+    private static final String TABLE_PRODUCT_FIELID = "TableField_BEUZFS0B8R40";
+    private static final String TABLE_CELLLINES_FIELID = "TableField_M04O3XGALA80";
+    private static  String CROPID = "";
+    private ConcurrentHashMap<String, LocalDateTime> formInstanceIdStore = new ConcurrentHashMap<>();
+
+    //所有的人员控件枚举
+    private static final Map<String, String> EMPLOYEE_ENUM = new HashMap<>();
+
+    static {
+        EMPLOYEE_ENUM.put("下属公司","employeeField_mji9tann");
+        EMPLOYEE_ENUM.put("一线部门","employeeField_mji9tany");
+        EMPLOYEE_ENUM.put("室","employeeField_mji9tao9");
+        EMPLOYEE_ENUM.put("班组","employeeField_mjiac7gr");
+    }
+    //运行控制子表枚举
+    private static final Map<String, String> OPERATION_CONTROL = new HashMap<>();
+
+    static {
+        OPERATION_CONTROL.put("投资公司","tableField_mjavj2r6");
+        OPERATION_CONTROL.put("下属公司","tableField_mji9tanq");
+        OPERATION_CONTROL.put("一线部门","tableField_mji9tao1");
+        OPERATION_CONTROL.put("室","tableField_mji9taoc");
+    }
+    //安全生产子表枚举
+    private static final Map<String, String> WORK_SAFETY = new HashMap<>();
+
+    static {
+        WORK_SAFETY.put("投资公司","tableField_mjgiipn0");
+//        WORK_SAFETY.put("下属公司","tableField_mji9tant");
+//        WORK_SAFETY.put("一线部门","tableField_mji9tao4");
+//        WORK_SAFETY.put("室","tableField_mji9taof");
+    }
+    //质量控制子表枚举
+    private static final Map<String, String> QUALITY_CONTROL = new HashMap<>();
+
+    static {
+        QUALITY_CONTROL.put("投资公司","tableField_mjgiipn4");
+//        QUALITY_CONTROL.put("下属公司","tableField_mji9tanw");
+//        QUALITY_CONTROL.put("一线部门","tableField_mji9tao7");
+//        QUALITY_CONTROL.put("室","tableField_mji9taoi");
+    }
+
+    @Override
+    public void testToken() {
+//        approveUpdateCRM(processInstanceId,"DXCPXS","审批拒绝", isAgree);
+    }
+    public String getNumberByUserId(String workingEmployeeIds) {
+//        log.info("根据钉钉人员id获取员工工号:{}",workingEmployeeIds);
+        List<String> filterList = new ArrayList<>();
+        filterList.add("sys00-jobNumber");
+        List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), Arrays.asList(workingEmployeeIds), agentId, filterList);
+        final String[] value = {""};
+        employeeInfos.forEach(e -> {
+            List<Map> mapList = (List<Map>) e.get("field_data_list");
+            mapList.forEach(m -> {
+                List<Map> valueList = (List<Map>) m.get("field_value_list");
+                value[0] = ObjectUtil.isNotNull(valueList.get(0).get("value")) ? valueList.get(0).get("value").toString() : null;
+            });
+        });
+        return value[0];
+    }
+    @Override
+    public McR deptCreate(Map deptInfo) {
+        log.info("开始创建金蝶部门,参数:{}",deptInfo);
+        LocalDate today = LocalDate.now();
+        String dateStr = today.format(formatter);
+        Save save = new Save();
+
+        Department dept = new Department();
+        dept.setFNumber(UtilMap.getString(deptInfo,"dept_id"));
+        dept.setFName(UtilMap.getString(deptInfo,"name"));
+        dept.setFCreateOrgId(new FNumber("100"));
+        dept.setFUseOrgId(new FNumber("100"));
+        dept.setFEffectDate(dateStr);
+        dept.setFEffectDate("2226-03-12");
+
+        save.setModel(dept);
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "BD_Department";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                isTrue(repoRet2);
+
+//                String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
+
+//                ydClient.operateData(YDParam.builder()
+////                        .formInstId(formInstId)
+//                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
+//                        .build(), YDConf.FORM_OPERATION.update);
+
+                if (isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR deptDelete(List deptIds) {
+        log.info("开始删除金蝶部门,参数:{}",deptIds);
+//        List<String> DelDeptIds = new ArrayList<>();
+//        deptIds.add("1064410173");
+        List<String> numberIds = (List<String>) deptIds.stream().map(num -> String.valueOf(num)).collect(Collectors.toList());
+
+
+        Audit audit = new Audit();
+        audit.setNumbers(numberIds);
+
+        Delete dept = new Delete();
+
+//        deptIds.add(UtilMap.getString(deptInfo,"dept_id"));
+        dept.setNumbers(numberIds);
+
+
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "BD_Department";
+            //调用接口
+            Gson gson = new Gson();
+            String resultUnAuditJson = client.unAudit(formId,JSONObject.toJSONString(dept));
+            RepoRet repoRetAudit = gson.fromJson(resultUnAuditJson, RepoRet.class);
+            if (isTrue(repoRetAudit)){
+                log.info("本次反审核成功部门id:{}",numberIds);
+            }else {
+                log.info("本次反审核出错部门id:{}",numberIds);
+            }
+            String resultDeleteJson = client.delete(formId,JSONObject.toJSONString(dept));
+            //用于记录结果
+            //对返回结果进行解析和校验
+            RepoRet repoRetDelete = gson.fromJson(resultDeleteJson, RepoRet.class);
+
+            if (isTrue(repoRetDelete)){
+                log.info("本次删除成功部门id:{}",numberIds);
+            }else {
+                log.info("本次删除出错部门id:{}",numberIds);
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    private boolean isTrue(RepoRet repoRet){
+        Gson gson = new Gson();
+
+        if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
+            System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
+            return true;
+        } else {
+            fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
+            return false;
+        }
+    }
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+}

+ 32 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/DingTalkServiceImpl.java

@@ -0,0 +1,32 @@
+package com.malk.jiuyousimu.service.Impl;
+
+
+import com.malk.jiuyousimu.service.DingTalkService;
+import com.malk.server.dingtalk.DDR;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class DingTalkServiceImpl implements DingTalkService {
+
+
+    @Override
+    public Map getAllUserIdInfo(String access_token, String status_list, Number offset, Number size) {
+        Map param = UtilMap.map("access_token", access_token);
+        Map body = UtilMap.map("status_list, offset, size", status_list, offset,size);
+        return (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob", null, param, body).getResult();
+    }
+
+    @Override
+    public List<Map> getDDUserInfoById(String access_token, String userId, Number appAgentId) {
+        Map param = UtilMap.map("access_token", access_token);
+        Map body = UtilMap.map("userid_list, agentid", userId, appAgentId);
+        return (List<Map>) DDR.doPost("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/v2/list", null, param, body).getResult();
+    }
+
+}

+ 220 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/Impl/PersonServiceImpl.java

@@ -0,0 +1,220 @@
+package com.malk.jiuyousimu.service.Impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+import com.malk.jiuyousimu.config.KDWebApiConf;
+import com.malk.jiuyousimu.entity.*;
+import com.malk.jiuyousimu.service.DeptService;
+import com.malk.jiuyousimu.service.DingTalkService;
+import com.malk.jiuyousimu.service.PersonService;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.service.dingtalk.*;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import static org.aspectj.bridge.MessageUtil.fail;
+
+@Service
+@Slf4j
+public class PersonServiceImpl implements PersonService {
+
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+    @Autowired
+    private DDClient_Meeting ddClientMeeting;
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+    @Autowired
+    private DDClient_Personnel ddClientPersonnel;
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
+    @Value("${dingtalk.agentId}")
+    private Long agentId;
+
+    @Autowired
+    DingTalkService dingTalkService;
+    @Autowired
+    DDService ddService;
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDService ydService;
+
+    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    @Override
+    public void testToken() {
+//        approveUpdateCRM(processInstanceId,"DXCPXS","审批拒绝", isAgree);
+    }
+    public String getNumberByUserId(String workingEmployeeIds) {
+//        log.info("根据钉钉人员id获取员工工号:{}",workingEmployeeIds);
+        List<String> filterList = new ArrayList<>();
+        filterList.add("sys00-jobNumber");
+        List<Map> employeeInfos = ddClientPersonnel.getEmployeeInfos(ddClient.getAccessToken(), Arrays.asList(workingEmployeeIds), agentId, filterList);
+        final String[] value = {""};
+        employeeInfos.forEach(e -> {
+            List<Map> mapList = (List<Map>) e.get("field_data_list");
+            mapList.forEach(m -> {
+                List<Map> valueList = (List<Map>) m.get("field_value_list");
+                value[0] = ObjectUtil.isNotNull(valueList.get(0).get("value")) ? valueList.get(0).get("value").toString() : null;
+            });
+        });
+        return value[0];
+    }
+    @Override
+    public McR deptCreate(Map deptInfo) {
+        log.info("开始创建金蝶部门,参数:{}",deptInfo);
+        LocalDate today = LocalDate.now();
+        String dateStr = today.format(formatter);
+        Save save = new Save();
+
+        Department dept = new Department();
+        dept.setFNumber(UtilMap.getString(deptInfo,"dept_id"));
+        dept.setFName(UtilMap.getString(deptInfo,"name"));
+        dept.setFCreateOrgId(new FNumber("100"));
+        dept.setFUseOrgId(new FNumber("100"));
+        dept.setFEffectDate(dateStr);
+        dept.setFEffectDate("2226-03-12");
+
+        save.setModel(dept);
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "BD_Department";
+            //调用接口
+            String resultJson = client.save(formId,JSONObject.toJSONString(save));
+            //用于记录结果
+            Gson gson = new Gson();
+            //对返回结果进行解析和校验
+            RepoRet repoRet = gson.fromJson(resultJson, RepoRet.class);
+
+            if (isTrue(repoRet)){
+                String id = repoRet.getResult().getId();
+
+                Submit submit = new Submit();
+                submit.setIds(id);
+                //提交
+                String resultJson2 = client.submit(formId, JSONObject.toJSONString(submit));
+                RepoRet repoRet2 = gson.fromJson(resultJson2, RepoRet.class);
+                isTrue(repoRet2);
+
+//                String orderCode = repoRet2.getResult().getResponseStatus().getSuccessEntitys().get(0).getNumber();
+
+//                ydClient.operateData(YDParam.builder()
+////                        .formInstId(formInstId)
+//                        .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_m6yntxmz",orderCode)))
+//                        .build(), YDConf.FORM_OPERATION.update);
+
+                if (isTrue(repoRet2)){
+                    Audit audit = new Audit();
+                    audit.setIds(id);
+                    //审核
+                    String resultJson3 = client.audit(formId,JSONObject.toJSONString(audit));
+                    RepoRet repoRet3 = gson.fromJson(resultJson3, RepoRet.class);
+                    isTrue(repoRet3);
+                }
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    @Override
+    public McR deptDelete(List deptIds) {
+        log.info("开始删除金蝶部门,参数:{}",deptIds);
+//        List<String> DelDeptIds = new ArrayList<>();
+//        deptIds.add("1064410173");
+        List<String> numberIds = (List<String>) deptIds.stream().map(num -> String.valueOf(num)).collect(Collectors.toList());
+
+
+        Audit audit = new Audit();
+        audit.setNumbers(numberIds);
+
+        Delete dept = new Delete();
+
+//        deptIds.add(UtilMap.getString(deptInfo,"dept_id"));
+        dept.setNumbers(numberIds);
+
+
+
+        try{
+            K3CloudApi client = new K3CloudApi(initIden());
+            //业务对象标识
+            String formId = "BD_Department";
+            //调用接口
+            Gson gson = new Gson();
+            String resultUnAuditJson = client.unAudit(formId,JSONObject.toJSONString(dept));
+            RepoRet repoRetAudit = gson.fromJson(resultUnAuditJson, RepoRet.class);
+            if (isTrue(repoRetAudit)){
+                log.info("本次反审核成功部门id:{}",numberIds);
+            }else {
+                log.info("本次反审核出错部门id:{}",numberIds);
+            }
+            String resultDeleteJson = client.delete(formId,JSONObject.toJSONString(dept));
+            //用于记录结果
+            //对返回结果进行解析和校验
+            RepoRet repoRetDelete = gson.fromJson(resultDeleteJson, RepoRet.class);
+
+            if (isTrue(repoRetDelete)){
+                log.info("本次删除成功部门id:{}",numberIds);
+            }else {
+                log.info("本次删除出错部门id:{}",numberIds);
+            }
+        } catch (Exception e) {
+            McR.errorUnknown(e.getMessage());
+        }
+
+        return McR.success();
+    }
+
+    private boolean isTrue(RepoRet repoRet){
+        Gson gson = new Gson();
+
+        if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
+            System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
+            return true;
+        } else {
+            fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
+            return false;
+        }
+    }
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+}

+ 17 - 0
mjava-jiuyousimu/src/main/java/com/malk/jiuyousimu/service/PersonService.java

@@ -0,0 +1,17 @@
+package com.malk.jiuyousimu.service;
+
+import com.malk.server.common.McR;
+
+import java.util.List;
+import java.util.Map;
+
+public interface PersonService {
+
+    void testToken();
+
+    McR deptCreate(Map processData);
+
+
+    McR deptDelete(List deptIds);
+
+}

+ 70 - 0
mjava-jiuyousimu/src/main/resources/application-dev.yml

@@ -0,0 +1,70 @@
+# 环境配置
+server:
+  port: 8108
+  servlet:
+    context-path: /api/jiuyousimu
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/dingtalk?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+#logging:
+#  file:
+#    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 4326533184
+  appKey: dingum9maa6vaeqi5jgv
+  appSecret: fxsacsd9MHKnaxkFxP3QOjMe9FrqMTTfZU7InN1DJoM1WUoK6S3usH1EzhSpzgGy
+  corpId:
+  aesKey: uLbNXSzj16uYK6nuA0mMuOJVtMSVOGBwfvwhbh2ugOf
+  token: zcJKprGXPkztJ7q3RK
+  operator: ""   # OA管理员账号
+
+#测试环境
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 69b14ada7a2acd
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: Administrator
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 403605_RYdBRaCt1rA56XToXd7r2ZVt7tW6WqKp
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 128a573265bd4e5d9fb03f1bb40caae0
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://win-dokf98lkhoo.jiuyoufund.com:8085/k3cloud
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120
+

+ 39 - 0
mjava-jiuyousimu/src/main/resources/application-prod.yml

@@ -0,0 +1,39 @@
+# 环境配置
+server:
+  port: 8108
+  servlet:
+    context-path: /api/jiuyousimu
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    hikari:
+      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+    driver-class-name: com.mysql.cj.jdbc.Driver
+#    username: root
+#    password: cp-root@2022++
+#    url: jdbc:mysql://127.0.0.1:3306/dingtalk?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/dingtalk?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    hibernate:
+#      ddl-auto: none      # JPA对表没有任何操作
+#    show-sql: true
+#    database: MYSQL
+#    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# dingtalk
+dingtalk:
+  agentId: 4326067175
+  appKey: dingc6t2cxxc6k6ulymx
+  appSecret: PtHQ53j6mzjbMMyVh0-0GgAqz2JGVGZt4ktRaSecCuYWB0QXNVfba6mlAf5QHuUJ
+  corpId:
+  aesKey: uLbNXSzj16uYK6nuA0mMuOJVtMSVOGBwfvwhbh2ugOf
+  token: zcJKprGXPkztJ7q3RK
+  operator: ""   # OA管理员账号

+ 107 - 0
mjava-jiuyousimu/src/main/resources/static/json/form.json

@@ -0,0 +1,107 @@
+{
+  "DXCPXS": {
+    "processCode": "PROC-3F7AC816-B41B-4A48-8CFD-CE9FF92B05AB",
+    "processCode1": "PROC-BA558102-6DA9-4F02-9E0A-BE4272362C06",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "合同描述": "contractContent",
+      "名称": "name",
+      "签署法人实体": "signingLegal",
+      "区域": "region",
+      "合同事宜": "contractIssue",
+      "合同编号": "contractCode",
+      "甲方信息": "partyAInfo",
+      "乙方信息": "partyBInfo",
+      "合同签订日期": "contractSignDate",
+      "是否涉及法人章": "involveCorporateSeal",
+      "是否涉密": "isConfidential",
+      "合同总价是否为固定金额": "isFixed",
+      "原币类型": "currencyType",
+      "原币金额": "currencyAmount",
+      "人民币金额(元)": "RMBAmount",
+      "关联审批单": "RelatedReceipt"
+    }
+  },
+  "NDKJXS": {
+    "processCode": "PROC-A9F9C430-5947-4B4F-9D8A-2591207E6153",
+    "processCode1": "PROC-452744BC-BDA4-4641-AA5B-B5D68A47242B",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "名称": "name",
+      "签署法人实体": "signingLegal",
+      "是否加盖公章": "isSealUsed",
+      "合同描述": "contractContent",
+      "合同编号": "contractCode",
+      "甲方信息": "partyAInfo",
+      "乙方信息": "partyBInfo",
+      "合同签订日期": "contractSignDate",
+      "合同事宜": "contractIssue",
+      "是否涉及法人章": "involveCorporateSeal",
+      "是否涉密": "isConfidential"
+    }
+  },
+  "YPSQ": {
+    "processCode": "PROC-B6CCD0BE-E74D-4FCD-8B3A-B68F7827C5AC",
+    "processCode1": "PROC-82FE4028-CA69-47A6-8D9C-16239BC4006F",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "products" : "样品信息",
+    "cellLines" : "细胞株信息",
+    "compIds": {
+      "crmId": "crmId",
+      "区域": "region",
+      "申请原因": "reason",
+      "申请类型": "type",
+      "客户名称": "customerName",
+      "收货人": "receiverName",
+      "收货地址": "address",
+      "收货人电话": "receiverPhone",
+      "产品数量": "productNum",
+      "实际发出数量": "actualNum",
+      "tableField_products": {
+        "产品名称": "productName",
+        "产品规格": "productSpecs",
+        "有效期": "validityPeriod",
+        "产品批号": "productLot",
+        "包装数量": "quantity"
+      },
+      "tableField_cellLines": {
+        "细胞株名称": "cellLineName",
+        "细胞株类型": "cellLineType",
+        "数量": "quantity",
+        "温度": "temperature",
+        "储存和运输条件": "condition"
+      }
+    }
+  },
+  "KS": {
+    "processCode": "PROC-B5937B5F-7883-4BAD-932A-F54A5113576C",
+    "processCode1": "PROC-89069560-F910-4048-9DC2-8F82DE724F4C",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "售后管理": "afterSales",
+      "详情": "issueDescription",
+      "投诉等级": "level",
+      "客户是否要求赔偿": "isNeedCompensation",
+      "赔偿金额(元)": "amount"
+    }
+  }
+}

+ 107 - 0
mjava-jiuyousimu/src/main/resources/static/json/formtest.json

@@ -0,0 +1,107 @@
+{
+  "DXCPXS": {
+    "processCode1": "PROC-3F7AC816-B41B-4A48-8CFD-CE9FF92B05AB",
+    "processCode": "PROC-BA558102-6DA9-4F02-9E0A-BE4272362C06",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "合同描述": "contractContent",
+      "名称": "name",
+      "签署法人实体": "signingLegal",
+      "区域": "region",
+      "合同事宜": "contractIssue",
+      "合同编号": "contractCode",
+      "甲方信息": "partyAInfo",
+      "乙方信息": "partyBInfo",
+      "合同签订日期": "contractSignDate",
+      "是否涉及法人章": "involveCorporateSeal",
+      "是否涉密": "isConfidential",
+      "合同总价是否为固定金额": "isFixed",
+      "原币类型": "currencyType",
+      "原币金额": "currencyAmount",
+      "人民币金额(元)": "RMBAmount",
+      "关联审批单": "RelatedReceipt"
+    }
+  },
+  "NDKJXS": {
+    "processCode1": "PROC-A9F9C430-5947-4B4F-9D8A-2591207E6153",
+    "processCode": "PROC-452744BC-BDA4-4641-AA5B-B5D68A47242B",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "名称": "name",
+      "签署法人实体": "signingLegal",
+      "是否加盖公章": "isSealUsed",
+      "合同描述": "contractContent",
+      "合同编号": "contractCode",
+      "甲方信息": "partyAInfo",
+      "乙方信息": "partyBInfo",
+      "合同签订日期": "contractSignDate",
+      "合同事宜": "contractIssue",
+      "是否涉及法人章": "involveCorporateSeal",
+      "是否涉密": "isConfidential"
+    }
+  },
+  "YPSQ": {
+    "processCode1": "PROC-B6CCD0BE-E74D-4FCD-8B3A-B68F7827C5AC",
+    "processCode": "PROC-82FE4028-CA69-47A6-8D9C-16239BC4006F",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "products" : "样品信息",
+    "cellLines" : "细胞株信息",
+    "compIds": {
+      "crmId": "crmId",
+      "区域": "region",
+      "申请原因": "reason",
+      "申请类型": "type",
+      "客户名称": "customerName",
+      "收货人": "receiverName",
+      "收货地址": "address",
+      "收货人电话": "receiverPhone",
+      "产品数量": "productNum",
+      "实际发出数量": "actualNum",
+      "tableField_products": {
+        "产品名称": "productName",
+        "产品规格": "productSpecs",
+        "有效期": "validityPeriod",
+        "产品批号": "productLot",
+        "包装数量": "quantity"
+      },
+      "tableField_cellLines": {
+        "细胞株名称": "cellLineName",
+        "细胞株类型": "cellLineType",
+        "数量": "quantity",
+        "温度": "temperature",
+        "储存和运输条件": "condition"
+      }
+    }
+  },
+  "KS": {
+    "processCode1": "PROC-B5937B5F-7883-4BAD-932A-F54A5113576C",
+    "processCode": "PROC-89069560-F910-4048-9DC2-8F82DE724F4C",
+    "creator": "proposerCode",
+    "attachmentUrl": {
+      "downloadUrl": "downloadUrl",
+      "name": "name"
+    },
+    "compIds": {
+      "crmId": "crmId",
+      "售后管理": "afterSales",
+      "详情": "issueDescription",
+      "投诉等级": "level",
+      "客户是否要求赔偿": "isNeedCompensation",
+      "赔偿金额(元)": "amount"
+    }
+  }
+}

+ 103 - 0
mjava-jiuyousimu/src/test/java/test.java

@@ -0,0 +1,103 @@
+import com.alibaba.fastjson.JSONObject;
+import com.malk.jiuyousimu.Boot;
+import com.malk.jiuyousimu.service.Impl.DeptServiceImpl;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.*;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.*;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Boot.class)
+public class test {
+
+    @Autowired
+    private DDConf ddConf;
+    @Autowired
+    private DDClient_Event ddClient_event;
+    @Autowired
+    private DDClient ddClient;
+    @Autowired
+    private DeptServiceImpl payService;
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+    @Value("${dingtalk.appKey}")
+    private String APP_EKY;
+    @Value("${dingtalk.appSecret}")
+    private String APP_SECRET;
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient_Contacts ddClient_contacts;
+
+    @Test
+    public void sonUpdateTest(){
+
+//        Map processData = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(APP_EKY, APP_SECRET), "Zd7HDIdGTkiGFFtsoHkg3A03891763390051");
+//
+//        System.out.println(processData);
+//        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+//        Map formData = ydClient.queryData(YDParam.builder()
+//                        .appType("APP_PG9VWQVT23CRFBOOOG6Y")
+//                        .systemToken("73D66971EQO1KI40NT9M96FHV3BK3CZNBQGJMWX1")
+//                        .formInstanceId("5f507775-7387-436e-ade7-78243d75c311")
+//                        .useLatestVersion(true)
+//                        .build(),
+//                YDConf.FORM_QUERY.retrieve_id).getFormData();
+////        syncDept(98604036,false);
+//        LocalDate today = LocalDate.now().plusDays(1);
+//        String dateStr = today.format(formatter);
+//        long timestamp = today.atStartOfDay(ZoneId.systemDefault())
+//                .toInstant()
+//                .toEpochMilli();
+//        System.out.println(timestamp);
+    }
+
+    public void syncDept(long deptId,boolean isNeedKS){
+        List<Map> list = ddClient_contacts.listSubDepartmentDetail(ddClient.getAccessToken(), deptId);
+        for (Map map : list) {
+            System.out.println(map.toString());
+            long subDeptId = UtilMap.getLong(map,"dept_id");
+            String subDeptName = UtilMap.getString(map,"name");
+            String selectField_mjgj9non = "班组";
+            Map formData=new HashMap();
+            if(isNeedKS){
+                syncDept(subDeptId,false);
+                selectField_mjgj9non = "室";
+            }else {
+                formData.put("radioField_mke10pcc",subDeptName.contains("外包")?"外包":"班组");
+            }
+            List<String> strings = ddClient_contacts.listDepartmentUserId(ddClient.getAccessToken(), subDeptId);
+            List<String> admins =new ArrayList<>();
+            for(String string : strings){
+                Map userInfo = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), string);
+                List<Map> leader_in_dept = UtilMap.getList(userInfo,"leader_in_dept");
+                for(Map leader : leader_in_dept){
+                    if(UtilMap.getString(leader,"dept_id").equals(String.valueOf(subDeptId))&&UtilMap.getBoolean(leader,"leader")){
+                        admins.add(string);
+                    }
+                }
+            }
+            formData.put("selectField_mjgj9non",selectField_mjgj9non);
+            formData.put("employeeField_mjgj9noh",admins);
+            formData.put("departmentSelectField_mjgj9noi", Arrays.asList(String.valueOf(subDeptId)));
+            formData.put("departmentSelectField_mjgqcjsw",Arrays.asList(String.valueOf(deptId)));
+            formData.put("radioField_mjgsdrat","开启");
+            System.out.println(formData.toString());
+            ydClient.operateData(YDParam.builder().appType("APP_PG9VWQVT23CRFBOOOG6Y")
+                    .systemToken("73D66971EQO1KI40NT9M96FHV3BK3CZNBQGJMWX1").formUuid("FORM-651D1713A25E423FB4EC1A5A06A7A741QWEY").formDataJson(JSONObject.toJSONString(formData)).build(), YDConf.FORM_OPERATION.create);
+        }
+    }
+}

+ 39 - 0
mjava-jiuyousimu/src/test/resource/server.sh

@@ -0,0 +1,39 @@
+#!/bin/bash
+
+appname='mjava-dongfangxinhua'
+
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+    tail -f log/info.log
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+      tail -f log/info.log
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 448 - 0
pom.xml

@@ -0,0 +1,448 @@
+<?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>
+
+    <groupId>com.malk</groupId>
+    <artifactId>java-mcli</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <modules>
+        <module>mjava-jiuyousimu</module>
+    </modules>
+    <packaging>pom</packaging>
+
+    <name>java-mcli</name>
+    <description>mjava framework</description>
+
+    <!-- 版本管理 Management -->
+    <properties>
+        <!-- mjava版本: 修改mjava pom配置 -->
+        <mjava.version>0.0.3</mjava.version>
+        <!-- 全局配置 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <!-- 公共依赖 -->
+        <spring-boot-dependencies.version>2.2.13.RELEASE</spring-boot-dependencies.version>
+        <junit.verson>4.12</junit.verson>
+        <lombok.version>1.18.8</lombok.version>
+        <validation-api.version>2.0.1.Final</validation-api.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <commons-lang3.version>3.10</commons-lang3.version>
+        <guava.version>30.1.1-jre</guava.version>
+        <hutool-all.version>5.6.0</hutool-all.version>
+        <spring-boot-starter-data-jpa.version>2.1.3.RELEASE</spring-boot-starter-data-jpa.version>
+        <querydsl-apt.version>4.2.1</querydsl-apt.version>
+        <querydsl-jpa.version>4.2.1</querydsl-jpa.version>
+        <spring-boot-starter-jdbc.version>2.2.13.RELEASE</spring-boot-starter-jdbc.version>
+        <easyexcel.version>2.2.7</easyexcel.version>
+        <!-- 数据库连接 [仅mysql为全局依赖] -->
+        <mysql-connector-java.version>8.0.22</mysql-connector-java.version>
+        <mssql-jdbc.version>6.4.0.jre8</mssql-jdbc.version>
+        <ojdbc6.version>11.2.0.4</ojdbc6.version>
+        <mongo-java-driver.version>3.12.7</mongo-java-driver.version>
+        <spring-boot-starter-data-mongodb.version>2.2.13.RELEASE</spring-boot-starter-data-mongodb.version>
+        <!-- jsp [非全局依赖] -->
+        <tomcat-embed-jasper.version>9.0.41</tomcat-embed-jasper.version>
+        <jstl.version>1.2</jstl.version>
+        <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
+        <javax.servlet.jsp-api.version>2.3.1</javax.servlet.jsp-api.version>
+        <!-- jwt [非全局依赖] -->
+        <java-jwt.version>3.4.0</java-jwt.version>
+        <!-- swagger3: todo -->
+        <springfox-boot-starter.version>3.0.0</springfox-boot-starter.version>
+        <!-- 网页转pdf [非全局依赖] -->
+        <flying-saucer-pdf-itext5.version>9.0.3</flying-saucer-pdf-itext5.version>
+        <!-- 腾讯云[发票识别] [非全局依赖] -->
+        <tencentcloud-sdk-java.version>3.1.778</tencentcloud-sdk-java.version>
+        <!-- 不执行单元测试,也不编译测试类 -->
+        <skipTests>true</skipTests>
+        <!-- 不执行单元测试,但会编译测试类,并在target/test-classes目录下生成相应的class -->
+        <maven.test.skip>true</maven.test.skip>
+        <mybatis-plus.version>3.5.1</mybatis-plus.version>
+        <durid.version>1.1.18</durid.version>
+    </properties>
+
+    <!-- 依赖声明 & 版本 -->
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot 依赖 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot-dependencies.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <!-- 单元测试 -->
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.verson}</version>
+                <scope>test</scope>
+            </dependency>
+
+            <!-- lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <!-- validation 参数校验 -->
+            <dependency>
+                <groupId>javax.validation</groupId>
+                <artifactId>validation-api</artifactId>
+                <version>${validation-api.version}</version>
+            </dependency>
+
+            <!-- 阿里巴巴 json -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!-- 通用的工具类集 -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+            <!-- ppExt: 23.10.26 钉钉新方式以Steam接入, HTTP形式commonsc-codec在升级之后,其内部做了一个validateCharacter校验. 使用 guava 替代-->
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <!-- 国产工具集 -->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool-all.version}</version>
+            </dependency>
+
+            <!-- data-jpa 数据库操作 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-jpa</artifactId>
+                <version>${spring-boot-starter-data-jpa.version}</version>
+            </dependency>
+
+            <!-- QueryDSL 4.x 支持-->
+            <dependency>
+                <groupId>com.querydsl</groupId>
+                <artifactId>querydsl-apt</artifactId>
+                <scope>provided</scope>
+                <version>${querydsl-apt.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.querydsl</groupId>
+                <artifactId>querydsl-jpa</artifactId>
+                <version>${querydsl-jpa.version}</version>
+            </dependency>
+
+            <!-- AOP多数据源切换 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-jdbc</artifactId>
+                <version>${spring-boot-starter-jdbc.version}</version>
+            </dependency>
+
+            <!-- easyExcel 优化 poi [不影响单独引入poi, 会冲突] -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+
+            <!-- mySql 驱动 -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql-connector-java.version}</version>
+            </dependency>
+
+            <!-- sqlserver依赖 -->
+            <dependency>
+                <groupId>com.microsoft.sqlserver</groupId>
+                <artifactId>mssql-jdbc</artifactId>
+                <scope>runtime</scope>
+                <version>${mssql-jdbc.version}</version>
+            </dependency>
+
+            <!-- Oracle 依赖 -->
+            <dependency>
+                <groupId>com.oracle.database.jdbc</groupId>
+                <artifactId>ojdbc6</artifactId>
+                <version>${ojdbc6.version}</version>
+            </dependency>
+
+            <!-- MongoDB 驱动 -->
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongo-java-driver</artifactId>
+                <version>${mongo-java-driver.version}</version>
+            </dependency>
+            <!-- MongoDB jpa 操作 -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-data-mongodb</artifactId>
+                <version>${spring-boot-starter-data-mongodb.version}</version>
+            </dependency>
+
+            <!-- url转pdf -->
+            <dependency>
+                <groupId>org.xhtmlrenderer</groupId>
+                <artifactId>flying-saucer-pdf-itext5</artifactId>
+                <version>${flying-saucer-pdf-itext5.version}</version>
+            </dependency>
+
+            <!-- jsp: tomcat-embed-jasper 需要添加到子项目内 -->
+            <dependency>
+                <groupId>org.apache.tomcat.embed</groupId>
+                <artifactId>tomcat-embed-jasper</artifactId>
+                <version>${tomcat-embed-jasper.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>jstl</artifactId>
+                <version>${jstl.version}</version>
+            </dependency>
+            <!-- servlet -->
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>javax.servlet-api</artifactId>
+                <version>${javax.servlet-api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet.jsp</groupId>
+                <artifactId>javax.servlet.jsp-api</artifactId>
+                <version>${javax.servlet.jsp-api.version}</version>
+            </dependency>
+
+            <!-- jwt -->
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${java-jwt.version}</version>
+            </dependency>
+
+            <!-- 腾讯云 -->
+            <dependency>
+                <groupId>com.tencentcloudapi</groupId>
+                <artifactId>tencentcloud-sdk-java</artifactId>
+                <version>${tencentcloud-sdk-java.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <!-- 子项目需要与 mjava 相同的依赖, 否则调试可运行, 打包后会运行报错. 为了避免重复引入 pom, 将 mjava 依赖直接在全局 pom 引入 -->
+    <dependencies>
+        <!-- spring boot -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-tomcat</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- spring-boot-devtools [热部署] -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+        <!-- 单元测试 -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- validation 参数校验 -->
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+
+        <!-- 阿里巴巴 json -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- 通用的工具类集 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <!-- 国产工具集 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <!-- data-jpa 数据库操作 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <!-- QueryDSL 4.x 支持-->
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-jpa</artifactId>
+        </dependency>
+
+        <!-- AOP多数据源切换 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <!-- easyExcel 优化 poi [不影响单独引入poi, 会冲突] -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+
+        <!-- mySql 驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <!--        引入mybatisPlus 包含了 jdbc -->
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-boot-starter</artifactId>-->
+<!--            <version>${mybatis-plus.version}</version>-->
+<!--        </dependency>-->
+
+        <!--        引入durid數據源-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${durid.version}</version>
+        </dependency>
+
+        <!-- Oracle 依赖 -->
+<!--                <dependency>-->
+<!--                    <groupId>com.oracle.database.jdbc</groupId>-->
+<!--                    <artifactId>ojdbc6</artifactId>-->
+<!--                </dependency>-->
+
+<!--         sqlserver 依赖 -->
+<!--                <dependency>-->
+<!--                    <groupId>com.microsoft.sqlserver</groupId>-->
+<!--                    <artifactId>mssql-jdbc</artifactId>-->
+<!--                    <scope>runtime</scope>-->
+<!--                </dependency>-->
+
+
+<!--         MongoDB 驱动 -->
+<!--                <dependency>-->
+<!--                    <groupId>org.mongodb</groupId>-->
+<!--                    <artifactId>mongo-java-driver</artifactId>-->
+<!--                </dependency>-->
+<!--         MongoDB jpa 操作 -->
+<!--                <dependency>-->
+<!--                    <groupId>org.springframework.boot</groupId>-->
+<!--                    <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
+<!--                    <version>${spring-boot-starter-data-mongodb.version}</version>-->
+<!--                </dependency>-->
+
+<!--         url转pdf -->
+<!--                <dependency>-->
+<!--                    <groupId>org.xhtmlrenderer</groupId>-->
+<!--                    <artifactId>flying-saucer-pdf-itext5</artifactId>-->
+<!--                </dependency>-->
+
+<!--         jsp: tomcat-embed-jasper 需要在子项目内引用才有效 -->
+<!--                <dependency>-->
+<!--                    <groupId>javax.servlet</groupId>-->
+<!--                    <artifactId>jstl</artifactId>-->
+<!--                </dependency>-->
+<!--         servlet -->
+                <dependency>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>javax.servlet.jsp</groupId>
+                    <artifactId>javax.servlet.jsp-api</artifactId>
+                </dependency>
+
+<!--         jwt -->
+                <dependency>
+                    <groupId>com.auth0</groupId>
+                    <artifactId>java-jwt</artifactId>
+                </dependency>
+
+<!--         腾讯云 [go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version.] -->
+<!--                <dependency>-->
+<!--                    <groupId>com.tencentcloudapi</groupId>-->
+<!--                    <artifactId>tencentcloud-sdk-java</artifactId>-->
+<!--                </dependency>-->
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <!-- jva使用了未经检查或不安全的操作,编译会有打印,通过插件显示具体报错警告位置, 如 T, Map, List 也会报警告 -->
+                    <compilerArgument>-Xlint:unchecked</compilerArgument>
+                </configuration>
+            </plugin>
+            <!-- QueryDSL 插件: 因为QueryDsl是类型安全的,所以还需要加上Maven APT plugin,使用 APT 自动生成Q类 -->
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>target/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>