wanghongzhi 1 рік тому
батько
коміт
dadfbaac9d
100 змінених файлів з 9543 додано та 0 видалено
  1. 60 0
      .gitignore
  2. 191 0
      LICENSE
  3. 96 0
      easydo-chengfa/pom.xml
  4. 27 0
      easydo-chengfa/src/main/java/easydo/technology/ChengfaApplication.java
  5. 35 0
      easydo-chengfa/src/main/java/easydo/technology/config/MapConfig.java
  6. 26 0
      easydo-chengfa/src/main/java/easydo/technology/config/WebMvcConfig.java
  7. 35 0
      easydo-chengfa/src/main/java/easydo/technology/config/exception/BizExceptionHandler.java
  8. 333 0
      easydo-chengfa/src/main/java/easydo/technology/controller/ApiController.java
  9. 74 0
      easydo-chengfa/src/main/java/easydo/technology/controller/CostController.java
  10. 87 0
      easydo-chengfa/src/main/java/easydo/technology/controller/FileController.java
  11. 64 0
      easydo-chengfa/src/main/java/easydo/technology/controller/FinanceController.java
  12. 46 0
      easydo-chengfa/src/main/java/easydo/technology/controller/GLDMasterController.java
  13. 121 0
      easydo-chengfa/src/main/java/easydo/technology/controller/JobController.java
  14. 41 0
      easydo-chengfa/src/main/java/easydo/technology/controller/MessageController.java
  15. 123 0
      easydo-chengfa/src/main/java/easydo/technology/controller/OaController.java
  16. 110 0
      easydo-chengfa/src/main/java/easydo/technology/controller/ProjectInfoController.java
  17. 150 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseAnswerSignController.java
  18. 246 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseApplyController.java
  19. 150 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseBidNoticeController.java
  20. 149 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseBidSignController.java
  21. 56 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseContractController.java
  22. 386 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseController.java
  23. 154 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseMatterController.java
  24. 265 0
      easydo-chengfa/src/main/java/easydo/technology/controller/PurchasePlanController.java
  25. 208 0
      easydo-chengfa/src/main/java/easydo/technology/controller/SupplierController.java
  26. 460 0
      easydo-chengfa/src/main/java/easydo/technology/controller/SupplierEvaluateController.java
  27. 165 0
      easydo-chengfa/src/main/java/easydo/technology/controller/SupplierTypeController.java
  28. 219 0
      easydo-chengfa/src/main/java/easydo/technology/controller/TestController.java
  29. 116 0
      easydo-chengfa/src/main/java/easydo/technology/enums/ChengfaEnum.java
  30. 35 0
      easydo-chengfa/src/main/java/easydo/technology/exception/BizException.java
  31. 16 0
      easydo-chengfa/src/main/java/easydo/technology/model/BusApprove.java
  32. 13 0
      easydo-chengfa/src/main/java/easydo/technology/model/BusFlowNo.java
  33. 15 0
      easydo-chengfa/src/main/java/easydo/technology/model/CftzBankInfo.java
  34. 18 0
      easydo-chengfa/src/main/java/easydo/technology/model/GldDept.java
  35. 26 0
      easydo-chengfa/src/main/java/easydo/technology/model/GldMember.java
  36. 21 0
      easydo-chengfa/src/main/java/easydo/technology/model/GldProject.java
  37. 19 0
      easydo-chengfa/src/main/java/easydo/technology/model/GldTenant.java
  38. 15 0
      easydo-chengfa/src/main/java/easydo/technology/model/Message.java
  39. 41 0
      easydo-chengfa/src/main/java/easydo/technology/model/OaPurchaseInfo.java
  40. 22 0
      easydo-chengfa/src/main/java/easydo/technology/model/ProjectInfo.java
  41. 70 0
      easydo-chengfa/src/main/java/easydo/technology/model/Purchase.java
  42. 37 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchaseAnswerSign.java
  43. 54 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchaseBidNotice.java
  44. 37 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchaseBidSign.java
  45. 33 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchaseContract.java
  46. 37 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchaseMatter.java
  47. 43 0
      easydo-chengfa/src/main/java/easydo/technology/model/PurchasePlan.java
  48. 56 0
      easydo-chengfa/src/main/java/easydo/technology/model/Supplier.java
  49. 19 0
      easydo-chengfa/src/main/java/easydo/technology/model/SupplierBank.java
  50. 12 0
      easydo-chengfa/src/main/java/easydo/technology/model/SupplierContractRef.java
  51. 32 0
      easydo-chengfa/src/main/java/easydo/technology/model/SupplierEvaluate.java
  52. 23 0
      easydo-chengfa/src/main/java/easydo/technology/model/SupplierEvaluateDetail.java
  53. 18 0
      easydo-chengfa/src/main/java/easydo/technology/model/SupplierType.java
  54. 28 0
      easydo-chengfa/src/main/java/easydo/technology/model/SysUser.java
  55. 24 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/ContractVo.java
  56. 11 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/DictVo.java
  57. 19 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/GLDApproveVo.java
  58. 17 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/GLDContract.java
  59. 16 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMDept.java
  60. 9 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMSupplier.java
  61. 17 0
      easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMUser.java
  62. 57 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/config/JobRunner.java
  63. 67 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/config/QuartzConfig.java
  64. 51 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/domain/QuartzLog.java
  65. 74 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/domain/SysQuartzJob.java
  66. 10 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/mapper/QuartzLogMapper.java
  67. 239 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/task/JobTask.java
  68. 70 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/thread/AsyncTaskExecutePool.java
  69. 39 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/thread/AsyncTaskProperties.java
  70. 63 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/thread/TheadFactoryName.java
  71. 42 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/thread/ThreadPoolExecutorUtil.java
  72. 88 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/utils/ExecutionJob.java
  73. 172 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/utils/QuartzManage.java
  74. 55 0
      easydo-chengfa/src/main/java/easydo/technology/quartz/utils/QuartzRunnable.java
  75. 61 0
      easydo-chengfa/src/main/java/easydo/technology/service/FlowNoService.java
  76. 95 0
      easydo-chengfa/src/main/java/easydo/technology/service/GLDApproveService.java
  77. 185 0
      easydo-chengfa/src/main/java/easydo/technology/service/GLDCostService.java
  78. 170 0
      easydo-chengfa/src/main/java/easydo/technology/service/GLDMasterService.java
  79. 252 0
      easydo-chengfa/src/main/java/easydo/technology/service/KafkaClient.java
  80. 77 0
      easydo-chengfa/src/main/java/easydo/technology/service/MDMService.java
  81. 158 0
      easydo-chengfa/src/main/java/easydo/technology/service/OAService.java
  82. 98 0
      easydo-chengfa/src/main/java/easydo/technology/service/RedisDictService.java
  83. 291 0
      easydo-chengfa/src/main/java/easydo/technology/util/DateUtils.java
  84. 430 0
      easydo-chengfa/src/main/java/easydo/technology/util/HttpClientUtil.java
  85. 370 0
      easydo-chengfa/src/main/java/easydo/technology/util/HttpsUtil.java
  86. 106 0
      easydo-chengfa/src/main/java/easydo/technology/util/OracleClient.java
  87. 226 0
      easydo-chengfa/src/main/java/easydo/technology/util/OracleResultSetUtil.java
  88. 8 0
      easydo-chengfa/src/main/resources/banner.txt
  89. 204 0
      easydo-chengfa/src/main/resources/config/application-dev.yml
  90. 202 0
      easydo-chengfa/src/main/resources/config/application-prod.yml
  91. 202 0
      easydo-chengfa/src/main/resources/config/application-test.yml
  92. 70 0
      easydo-chengfa/src/main/resources/config/application.yml
  93. 72 0
      easydo-chengfa/src/main/resources/config/param.properties
  94. BIN
      easydo-chengfa/src/main/resources/ip2region/ip2region.db
  95. 21 0
      easydo-chengfa/src/main/resources/log4j.properties
  96. 45 0
      easydo-chengfa/src/main/resources/logback.xml
  97. 50 0
      easydo-common/pom.xml
  98. 30 0
      easydo-common/src/main/java/easydo/technology/annotation/AnonymousAccess.java
  99. 47 0
      easydo-common/src/main/java/easydo/technology/annotation/DataPermission.java
  100. 0 0
      easydo-common/src/main/java/easydo/technology/annotation/NotTableField.java

+ 60 - 0
.gitignore

@@ -0,0 +1,60 @@
+
+######################################################################
+# custom 
+crm-admin.jar
+
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.zip
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
+
+dist
+node_modules
+.DS_Store
+.java-version
+package-lock.json
+logs
+
+.vscode/
+
+

+ 191 - 0
LICENSE

@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "{}" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+   Copyright 2019-2020 Zheng Jie
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 96 - 0
easydo-chengfa/pom.xml

@@ -0,0 +1,96 @@
+<?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>
+        <groupId>easydo.technology</groupId>
+        <artifactId>easydo</artifactId>
+        <version>v20220507</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>easydo-chengfa</artifactId>
+    <name>城发投资</name>
+    <packaging>jar</packaging>
+    <properties>
+        <jjwt.version>0.11.1</jjwt.version>
+        <jna.version>5.5.0</jna.version>
+        <shiro.version>1.2.4</shiro.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>easydo.technology</groupId>
+            <artifactId>easydo-system</artifactId>
+            <version>v20220507</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.5.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+            <version>19.3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+            <version>5.8.24</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+            <version>2.2.0.RELEASE</version>
+        </dependency>
+    </dependencies>
+
+    <!-- 打包 -->
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.yml</include>
+                    <include>**/*.properties</include>
+                    <include>**/*.xml</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.yml</include>
+                    <include>**/*.properties</include>
+                    <include>**/*.xml</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 27 - 0
easydo-chengfa/src/main/java/easydo/technology/ChengfaApplication.java

@@ -0,0 +1,27 @@
+package easydo.technology;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import easydo.technology.utils.SpringContextHolder;
+
+@Configuration
+@SpringBootApplication
+@ComponentScan({ "com", "easydo", "zmo" })
+@EnableTransactionManagement
+public class ChengfaApplication {
+
+    @Bean
+    public SpringContextHolder springContextHolder() {
+        return new SpringContextHolder();
+    }
+
+    public static void main(String[] args) {
+        SpringApplication.run(ChengfaApplication.class, args);
+    }
+    
+}

+ 35 - 0
easydo-chengfa/src/main/java/easydo/technology/config/MapConfig.java

@@ -0,0 +1,35 @@
+package easydo.technology.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+@ConfigurationProperties(prefix = "iot.device")
+@Getter
+@Setter
+public class MapConfig {
+
+    /**
+     * data.mapConfig
+     * 这里map名需要和application.properties中的参数一致
+     */
+    private Map<Integer, String> dust = new HashMap<>();
+    private Map<Integer, String> guardrail = new HashMap<>();
+    private Map<Integer, String> smokeMonitor = new HashMap<>();
+    private Map<Integer, String> towerCrane = new HashMap<>();
+    private Map<Integer, String> standardCuringRoom = new HashMap<>();
+    private Map<Integer, String> pmStandardCuringRoom = new HashMap<>();
+    private Map<Integer, String> nut = new HashMap<>();
+    private Map<Integer, String> pmWaterElectricBox = new HashMap<>();
+    private Map<Integer, String> pmDistributionBox = new HashMap<>();
+    private Map<Integer, String> pmCarRinse = new HashMap<>();
+    private Map<Integer, String> pmAIRecognition = new HashMap<>();
+    private Map<Integer, String> pmRoundGuard = new HashMap<>();
+    private Map<Integer, String> pmSmokeMonitor = new HashMap<>();
+
+}

+ 26 - 0
easydo-chengfa/src/main/java/easydo/technology/config/WebMvcConfig.java

@@ -0,0 +1,26 @@
+package easydo.technology.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.multipart.MultipartResolver;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import lombok.extern.slf4j.Slf4j;
+@Slf4j
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+    
+    @Bean(name = "multipartResolver")
+    public MultipartResolver multipartResolver() {
+        //log.info("Loading the multipart resolver");
+        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
+        resolver.setDefaultEncoding("UTF-8");
+        //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
+        resolver.setResolveLazily(true);
+        resolver.setMaxInMemorySize(40960);
+        //单个上传文件大小 50M 50*1024*1024
+        resolver.setMaxUploadSize(50 * 1024 * 1024);
+        return resolver;
+    }
+}

+ 35 - 0
easydo-chengfa/src/main/java/easydo/technology/config/exception/BizExceptionHandler.java

@@ -0,0 +1,35 @@
+package easydo.technology.config.exception;
+
+import lombok.extern.log4j.Log4j2;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 处理Controller抛出的异常*
+ * @author tianyf
+ */
+@RestControllerAdvice
+@Log4j2
+public class BizExceptionHandler {
+
+    /**
+     * 为 @NotNull / @NotEmpty / @NotBlank 提供异常后的消息抛出*
+     * @param bindException
+     * @return
+     */
+    @ExceptionHandler({BindException.class})
+    public ResponseEntity<Object> throwCustomException(BindException bindException){
+        log.error("[ @Vaild异常捕获 ] " + bindException.getMessage());
+        Map<String, Object> vo = new HashMap<>();
+        vo.put("message", bindException.getBindingResult().getFieldError().getDefaultMessage());
+        vo.put("code", HttpStatus.BAD_REQUEST.value());
+        return new ResponseEntity(vo, HttpStatus.OK);
+    }
+}

+ 333 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/ApiController.java

@@ -0,0 +1,333 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.*;
+import easydo.technology.model.vo.ContractVo;
+import easydo.technology.model.vo.MDMDept;
+import easydo.technology.model.vo.MDMSupplier;
+import easydo.technology.model.vo.MDMUser;
+import easydo.technology.system.domain.SysDept;
+import easydo.technology.utils.LocalDateUtil;
+import easydo.technology.utils.StringUtil;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/api")
+public class ApiController {
+    private final String TOKEN = "1253c4fa-e999-46b4-8c41-17645f997a6d";
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    PasswordEncoder passwordEncoder;
+
+    @RequestMapping(value = "/supplier/getList")
+    public Object getSupplierList(@RequestBody Map<String, Object> map) throws Exception {
+        String token = map.get("token").toString();
+        map.remove("token");
+        List<Supplier> list = new ArrayList<>();
+        if (!TOKEN.equals(token)) {
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        }
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            list = jdbcClient.getJdbcList(map, Supplier.class, connection);
+
+            for (Supplier model : list) {
+                SupplierBank supplierBank = new SupplierBank();
+                supplierBank.setSupplierId(model.getId());
+                List<SupplierBank> bankList = jdbcClient.getJdbcList(supplierBank, connection);
+                model.setBankList(bankList);
+            }
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/bidNotice/getList")
+    public Object getNoticeList(@RequestBody Map<String, Object> map) throws Exception {
+        String token = map.get("token").toString();
+        map.remove("token");
+        List<PurchaseBidNotice> list = new ArrayList<>();
+        if (!TOKEN.equals(token)) {
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        }
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            map.put("status", ChengfaEnum.PURCHASE_STATUS_DONE.getValue());
+            map.put("projectIdBegin", 0);
+            list = jdbcClient.getJdbcList(map, PurchaseBidNotice.class, connection);
+
+            for (PurchaseBidNotice model : list) {
+                Purchase purchase = new Purchase();
+                purchase.setId(model.getPurchaseId());
+                purchase = jdbcClient.getJdbcModelById(purchase, connection);
+                model.setPurchaseName(purchase.getName());
+                model.setPurchaseNo(purchase.getPurchaseNo());
+
+                PurchasePlan plan = new PurchasePlan();
+                plan.setId(purchase.getPlanId());
+                plan = jdbcClient.getJdbcModelById(plan, connection);
+                model.setContractPlanCode(plan.getContractPlanCode());
+                model.setContractPlanName(plan.getContractPlanName());
+            }
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/contract/push")
+    public Object pushContract(@RequestBody ContractVo vo) throws Exception {
+        String token = vo.getToken();
+        if (!TOKEN.equals(token)) {
+            return new ResponseEntity<>("no auth", HttpStatus.OK);
+        }
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            if (StringUtil.isEmpty(vo.getPurchaseId())) {
+
+                if (StringUtil.isEmpty(vo.getPurchaseNo())) {
+                    throw new BizException("采购编号purchaseNo无效");
+                }
+                Purchase purchase = new Purchase();
+                purchase.setPurchaseNo(vo.getPurchaseNo());
+                purchase = jdbcClient.getJdbcModel(purchase, connection);
+                if (StringUtil.isEmpty(purchase.getId())) {
+                    throw new BizException("采购编号purchaseNo无效");
+                }
+                vo.setPurchaseId(purchase.getId());
+            }
+
+            // PurchaseBidNotice bidNotice = new PurchaseBidNotice();
+            // if (StringUtil.isEmpty(vo.getSupplierName())) {
+            // bidNotice.setPurchaseId(vo.getPurchaseId());
+            // bidNotice = jdbcClient.getJdbcModel(bidNotice, connection);
+            // if (StringUtil.isEmpty(bidNotice.getBidCompanyIds())) {
+            // throw new BizException("采购数据没有中标单位");
+            // }
+            // vo.setSupplierId(bidNotice.getBidCompanyIds());
+            // vo.setSupplierName(bidNotice.getBidCompanyName());
+            // } else {
+            Supplier supplier = new Supplier();
+            supplier.setSupplierName(vo.getSupplierName());
+            supplier = jdbcClient.getJdbcModel(supplier, connection);
+            if (StringUtil.isEmpty(supplier.getId())) {
+                throw new BizException("供应商名称无效");
+            }
+            vo.setSupplierId(supplier.getId());
+            vo.setSupplierName(supplier.getSupplierName());
+            vo.setSupplierNo(supplier.getSupplierNo());
+            // }
+
+            PurchaseContract contract = new PurchaseContract();
+            contract.setContractNo(vo.getContractNo());
+            contract.setContractName(vo.getContractName());
+            contract.setCreateTime(vo.getContractCreateTime());
+            contract.setEndTime(vo.getContractEndTime());
+            contract.setProjectId(vo.getProjectId());
+            contract.setPurchaseId(vo.getPurchaseId());
+            contract.setSignAmount(vo.getContractAmount());
+            contract.setSupplierId(vo.getSupplierId());
+            contract.setSupplierName(vo.getSupplierName());
+            contract.setSupplierNo(vo.getSupplierNo());
+            jdbcClient.jdbcInsert(contract, connection);
+
+            return new ResponseEntity<>(contract, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/mdmdept/push")
+    public Object pushMdmDept(@RequestBody JSONObject object) throws Exception {
+        System.out.println("接收到MDM的组织数据======>" + object.toJSONString());
+        Map<String, Object> result = new HashMap<>();
+
+        JSONArray array = object.getJSONArray("Parameters");
+        String json = JSON.toJSONString(array);
+        List<MDMDept> mdmDeptList = JSON.parseArray(json, MDMDept.class);
+        mdmDeptList = mdmDeptList.stream().sorted(Comparator.comparing(MDMDept::getC_HR_MANAGEMENT_UNIT))
+                .collect(Collectors.toList());
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+            for (MDMDept model : mdmDeptList) {
+                SysDept dept = new SysDept();
+                dept.setDeptId(Long.valueOf(model.get_ID()));
+                dept.setCode(model.getC_INTERNAL_UNIT_CODE());
+                dept.setName(model.getC_FULLNAME());
+                dept.setFirmAddress(model.getC_ADDRESS());
+                dept.setFirmCredit(model.getC_UNIFIED_SOCIALCREDIT_CODE());
+                dept.setFirmOfficePhone(model.getC_PHONE());
+                if ("1".equals(model.get_STATUS())) {
+                    dept.setEnabled(true);
+                } else {
+                    dept.setEnabled(false);
+                }
+
+                SysDept pDept = new SysDept();
+                pDept.setCode(model.getC_HR_MANAGEMENT_UNIT());
+                pDept = jdbcClient.getJdbcModel(pDept, connection);
+                if (StringUtil.isNotEmpty(pDept.getDeptId())) {
+                    dept.setPid(pDept.getDeptId());
+                }
+                pDept.setSubCount(pDept.getSubCount() + 1);
+                jdbcClient.jdbcUpdateById(pDept, connection);
+
+                dept.setCreateTime(LocalDateTimeUtil.of(Long.valueOf(model.get_CREATE_TIME())));
+                dept.setUpdateTime(dept.getCreateTime());
+
+                SysDept exist = new SysDept();
+                exist.setDeptId(Long.valueOf(model.get_ID()));
+                int count = jdbcClient.getJdbcCount(exist, connection);
+                if (count == 0) {
+                    jdbcClient.jdbcInsert(dept, connection);
+                } else {
+                    jdbcClient.jdbcUpdateById(dept, connection);
+                }
+                connection.commit();
+            }
+            result.put("code", 200);
+            result.put("msg", "成功");
+            result.put("result", "S");
+            return result;
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/mdmuser/push")
+    public Object pushMdmUser(@RequestBody JSONObject object) throws Exception {
+        System.out.println("接收到MDM的用户数据======>" + object.toJSONString());
+        Map<String, Object> result = new HashMap<>();
+
+        JSONArray array = object.getJSONArray("Parameters");
+        String json = JSON.toJSONString(array);
+        List<MDMUser> mdmUserList = JSON.parseArray(json, MDMUser.class);
+        mdmUserList = mdmUserList.stream().sorted(Comparator.comparing(MDMUser::getC_INTERNAL_DEPARTMENT))
+                .collect(Collectors.toList());
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            for (MDMUser model : mdmUserList) {
+                SysUser user = new SysUser();
+                user.setCode(model.getC_USER_CODE());
+                user.setUserId(Long.valueOf(model.get_ID()));
+                user.setNickName(model.getC_USER_NAME());
+                user.setPhone(model.getC_MOBILEPHONE_NUMBER());
+                user.setCreateTime(LocalDateUtil
+                        .localDateTimeFormatyMdHms(LocalDateTimeUtil.of(Long.valueOf(model.get_CREATE_TIME()))));
+                user.setUpdateTime(user.getCreateTime());
+                user.setGender(model.getC_GENDER().substring(0, 1));
+                if ("1".equals(model.getSTATUS())) {
+                    user.setEnabled(true);
+                } else {
+                    user.setEnabled(false);
+                }
+                user.setIdCard(model.getC_IDENTITY_NUMBER());
+                user.setOriginPassword(model.getC_USER_CODE());
+                user.setPassword(passwordEncoder.encode(model.getC_USER_CODE()));
+
+                SysDept dept = new SysDept();
+                dept.setCode(model.getC_INTERNAL_DEPARTMENT().split("_")[0]);
+                dept = jdbcClient.getJdbcModel(dept, connection);
+                if (StringUtil.isNotEmpty(dept.getDeptId())) {
+                    user.setDeptId(dept.getDeptId());
+                }
+
+                SysUser exist = new SysUser();
+                exist.setUserId(Long.valueOf(model.get_ID()));
+                int count = jdbcClient.getJdbcCount(exist, connection);
+                if (count == 0) {
+                    jdbcClient.jdbcInsert(user, connection);
+                } else {
+                    jdbcClient.jdbcUpdateById(user, connection);
+                }
+            }
+            result.put("code", 200);
+            result.put("msg", "成功");
+            result.put("result", "S");
+            return result;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/mdmsupplier/push")
+    public Object pushMdmSupplier(@RequestBody JSONObject object) throws Exception {
+        System.out.println("接收到MDM的供应商数据======>" + object.toJSONString());
+        Map<String, Object> result = new HashMap<>();
+
+        JSONArray array = object.getJSONArray("Parameters");
+        String json = JSON.toJSONString(array);
+        List<MDMSupplier> mdmSupplierList = JSON.parseArray(json, MDMSupplier.class);
+
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            for (MDMSupplier model : mdmSupplierList) {
+
+                Supplier exist = new Supplier();
+                exist.setCreditCode(model.getC_UNISOCIALCREDIT_CODE());
+                exist = jdbcClient.getJdbcModel(exist, connection);
+                if (StringUtil.isEmpty(exist.getId())) {
+                    exist.setSupplierNo(model.getC_EXTERNAL_UNIT_CODE());
+                    jdbcClient.jdbcUpdateById(exist, connection);
+                }
+            }
+            result.put("code", 200);
+            result.put("msg", "成功");
+            result.put("result", "S");
+            return result;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+}

+ 74 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/CostController.java

@@ -0,0 +1,74 @@
+package easydo.technology.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.service.GLDCostService;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.exception.BizException;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@RestController
+@RequestMapping("/costServer")
+public class CostController {
+    @Resource
+    GLDCostService gldCostService;
+
+    @RequestMapping(value = "/getHYGHList/getHY")
+    public Object getHY(@RequestBody Map<String, Object> map) throws Exception {
+        List<String> projectCodeList = (List<String>) map.get("projectCodes");
+        if (projectCodeList.isEmpty()) {
+            throw new BizException("参数缺失");
+        }
+        JSONObject resObj = gldCostService.getHY(projectCodeList);
+        return new ResponseEntity<>(resObj, HttpStatus.OK);
+    }
+
+    @RequestMapping(value = "/getHYGHList/getKM")
+    public Object getKM(@RequestBody Map<String, Object> map) throws Exception {
+        List<String> projectCodeList = (List<String>) map.get("projectCodes");
+        JSONObject resObj = gldCostService.getKM(projectCodeList);
+        return new ResponseEntity<>(resObj, HttpStatus.OK);
+    }
+
+    // public static void main(String[] args) {
+    //     JSONObject object = new JSONObject();
+    //     List<String> codes = new ArrayList<>();
+    //     codes.add("ygxny01");
+    //     object.put("projectCodes", codes);
+    //     Map<String, String> map = new HashMap<>();
+    //     map.put("Authorization", "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4=");
+    //     map.put("X-CORAL-TENANT", "865509948108800");
+    //     long time1 = new Date().getTime();
+    //     JSONObject res = HttpClientUtil.sendPOSTWithHeader("http://jsf-int.glodon.com/cost-management/openapi/contractPlanItems/list",
+    //             object.toJSONString(), map);
+    //     long time2 = new Date().getTime();
+    //     System.out.println(res);
+    //     System.out.println(time2-time1);
+    // }
+
+//    public static void main(String[] args) {
+//
+//        JSONObject data = new JSONObject();
+//        List<Long> contractPlanIds = new ArrayList<>();
+//        contractPlanIds.add((long)5600079);
+//        data.put("contractPlanItemIds", contractPlanIds);
+//        data.put("useState", "In_Use");
+//        String url = "http://jsf-int.glodon.com" + "/cost-management/openapi/contractPlanItems/replace";
+//        Map<String, String> header = new HashMap<>();
+//        header.put("Authorization", "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4=");
+//        header.put("X-CORAL-TENANT", "865509948108800");
+//        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, data.toJSONString(), header);
+//        System.out.println("修改合约规划状态req========>" + data.toJSONString() + "res========>" + resObj.toJSONString());
+//        if (!"success".equals(resObj.getString("code"))) {
+//            throw new BizException("修改合约规划状态异常");
+//        }
+//    }
+}

+ 87 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/FileController.java

@@ -0,0 +1,87 @@
+package easydo.technology.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import zmo.technology.lite.core.ZeroException;
+import zmo.technology.lite.core.ZeroFolders;
+import zmo.technology.lite.core.ZeroRequestGuider;
+import zmo.technology.lite.processors.ZeroFolderProcessor;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletException;
+import javax.servlet.http.Part;
+import javax.sql.DataSource;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.util.Collection;
+
+@RestController
+@RequestMapping("/file")
+public class FileController {
+    @Resource
+    DataSource dataSource;
+    @Resource
+    JdbcClient jdbcClient;
+
+    @PostMapping("/upload")
+    public Object handleFileUpload(MultipartHttpServletRequest request) throws Exception {
+        Connection connection = null;
+        InputStream inputStream = null;
+        ByteArrayOutputStream outputStream = null;
+        try {
+            connection = dataSource.getConnection();
+            ZeroRequestGuider guider = ZeroRequestGuider.build();
+            guider.setConnection(connection);
+
+            Collection<Part> parts = request.getParts();
+
+            JSONObject res = new JSONObject();
+            JSONObject expands = new JSONObject();
+            if (parts.isEmpty()) {
+                throw new ZeroException("it is empty");
+            }
+
+            ZeroFolderProcessor processor = ZeroFolderProcessor.build(guider);
+            for (Part part : parts) {
+                inputStream = part.getInputStream();
+                outputStream = new ByteArrayOutputStream();
+
+                int len = -1;
+                byte[] buffer = new byte[1024];
+                while ((len = inputStream.read(buffer)) != -1)
+                    outputStream.write(buffer, 0, len);
+
+                ZeroFolders.ZeroFolderEntity entity = new ZeroFolders.ZeroFolderEntity();
+                entity.getFeatures().put("size", part.getSize());
+                entity.setName(part.getSubmittedFileName());
+                entity.setMineType(part.getContentType());
+                entity.setDatas(outputStream.toByteArray());
+                processor.addFolder(entity);
+                expands.put(part.getName(), entity.uuIDString());
+            }
+            res.put("code", 200);
+            res.put("expands", expands);
+            res.put("message", "success");
+            return new ResponseEntity<>(res, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new ZeroException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+            outputStream.close();
+            inputStream.close();
+        }
+    }
+
+
+}

+ 64 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/FinanceController.java

@@ -0,0 +1,64 @@
+package easydo.technology.controller;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.CftzBankInfo;
+import easydo.technology.model.SupplierBank;
+import easydo.technology.util.OracleClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/finance")
+@DS("oa")
+public class FinanceController {
+    @Resource
+    DataSource dataSource;
+    @Resource
+    OracleClient oracleClient;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            Map<String, Object> page = oracleClient.getJdbcPage(map, CftzBankInfo.class, connection);
+            return page;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            oracleClient.finallyExecute(connection);
+        }
+    }
+
+    public static void main(String[] args) {
+        // Oracle数据库的JDBC URL格式:jdbc:oracle:thin:@<hostname>:<port>:<dbname>
+        String jdbcUrl = "jdbc:oracle:thin:@172.16.1.20:1521:orcl";
+        String username = "CFTZOA";
+        String password = "CFTZOAVIEW";
+        OracleClient oracleClient = new OracleClient();
+        Connection connection = null;
+        try {
+            // 加载Oracle JDBC驱动
+            Class.forName("oracle.jdbc.driver.OracleDriver");
+            // 建立连接
+            connection = DriverManager.getConnection(jdbcUrl, username, password);
+
+            Map<String, Object> map = new HashMap<>();
+            map.put("current", 1);
+            map.put("size", 10);
+            Map<String, Object> page = oracleClient.getJdbcPage(map, CftzBankInfo.class, connection);
+            System.out.println(page);
+        } catch (Exception e) {
+            oracleClient.finallyExecute(connection);
+        }
+    }
+}

+ 46 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/GLDMasterController.java

@@ -0,0 +1,46 @@
+package easydo.technology.controller;
+
+import easydo.technology.service.GLDMasterService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/gldMaster")
+public class GLDMasterController {
+    @Resource
+    GLDMasterService gldMasterService;
+    @Value("${GLD.APPROVE.mgtGroupId}")
+    String mgtGroupId;
+    @Value("${GLD.APPROVE.formId}")
+    String formId;
+    @Value("${tenantId_gld_master}")
+    String tenantId;
+    @Value("${GLD.host}")
+    String host;
+
+    @RequestMapping("/getToken")
+    public Object getToken() throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        String token = gldMasterService.getGetToken();
+        result.put("mgtGroupId", mgtGroupId);
+        result.put("formId", formId);
+        result.put("tenantId", tenantId);
+        result.put("token", token);
+        result.put("host", host);
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+
+    @GetMapping("/removeToken")
+    public Object removeToken() throws Exception {
+        gldMasterService.removeToken();
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+}

+ 121 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/JobController.java

@@ -0,0 +1,121 @@
+package easydo.technology.controller;
+
+import java.sql.Connection;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.system.domain.SysJob;
+import easydo.technology.system.domain.SysUsersJobs;
+
+@RestController
+@RequestMapping("/job")
+public class JobController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, SysJob.class, connection);
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<SysJob> list = jdbcClient.getJdbcList(map, SysJob.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody SysJob model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcInsert(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody SysJob model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcUpdateById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody SysJob model) throws Exception {
+
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+            SysUsersJobs usersJobs = new SysUsersJobs();
+            usersJobs.setJobId(model.getId());
+            int count = jdbcClient.getJdbcCount(usersJobs, connection);
+            if (count > 0) {
+                throw new BizException("此岗位已被引用,请勿删除");
+            }
+
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+}

+ 41 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/MessageController.java

@@ -0,0 +1,41 @@
+package easydo.technology.controller;
+
+import java.sql.Connection;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.Message;
+
+@RestController
+@RequestMapping("/message")
+public class MessageController {
+      @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Message.class, connection);
+           
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 123 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/OaController.java

@@ -0,0 +1,123 @@
+package easydo.technology.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.service.OAService;
+import easydo.technology.system.security.config.bean.SecurityProperties;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.components.JdbcClient;
+import easydo.technology.config.RsaProperties;
+import easydo.technology.model.OaPurchaseInfo;
+import easydo.technology.model.SysUser;
+import easydo.technology.system.security.security.TokenProvider;
+import easydo.technology.system.security.service.OnlineUserService;
+import easydo.technology.system.security.service.dto.JwtUserDto;
+import easydo.technology.utils.RsaUtils;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/oa")
+public class OaController {
+    @Value("${OA.host}")
+    String oaHost;
+    @Value("${OA.getUsernamePath}")
+    String oaUsernamePath;
+    @Value("${OA.getUserInfoPath}")
+    String oaUserInfoPath;
+    @Resource
+    SecurityProperties properties;
+
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    AuthenticationManagerBuilder authenticationManagerBuilder;
+    @Resource
+    TokenProvider tokenProvider;
+    @Resource
+    OnlineUserService onlineUserService;
+    @Resource
+    OAService oaService;
+    @Value("${PURCHASE.redirectUrl}")
+    String redirectUrl;
+
+    /**
+     * 提供给OA登陆地址
+     * 接收一个ticket参数
+     */
+    @GetMapping("/ssoLogin")
+    public ModelAndView login(@RequestParam String ticket) {
+        System.out.println("ticket==============>" + ticket);
+        if (null != ticket) {
+            try {
+                String username = oaService.getUsername(ticket);
+                if (StringUtil.isNotEmpty(username)) {
+                    String telnumber = oaService.getTelNumber(username);
+                    SysUser sysUser = new SysUser();
+                    sysUser.setPhone(telnumber);
+                    sysUser = jdbcClient.getJdbcModel(sysUser);
+                    if (StringUtil.isNotEmpty(sysUser.getUserId())) {
+                        ModelAndView modelAndView = new ModelAndView();
+                        modelAndView.setViewName("redirect:" + redirectUrl + "?userId=" + sysUser.getUserId());
+                        System.out.println("redirect=========>" + modelAndView.toString());
+                        return modelAndView;
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        // 登录失败 直接跳转到登录页面
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView.setViewName("redirect:" + redirectUrl);
+        return modelAndView;
+    }
+
+    @RequestMapping("/getUserToken")
+    public Object getUserToken(@RequestBody SysUser sysUser, HttpServletRequest request) throws Exception {
+        sysUser = jdbcClient.getJdbcModel(sysUser);
+        String password = sysUser.getOriginPassword();
+        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
+                sysUser.getUsername(), password);
+        Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+        // 生成令牌
+        String token = tokenProvider.createToken(authentication);
+        final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
+        // 保存在线信息
+        onlineUserService.save(jwtUserDto, token, request);
+        // 返回 token 与 用户信息
+        Map<String, Object> authInfo = new HashMap<String, Object>(2) {
+            {
+                put("token", properties.getTokenStartWith() + token);
+                put("user", jwtUserDto);
+            }
+        };
+        return new ResponseEntity<>(authInfo, HttpStatus.OK);
+    }
+
+    @RequestMapping("/updateStatus")
+    public Object updateStatus(@RequestBody OaPurchaseInfo OaPurchaseInfo) throws Exception {
+        jdbcClient.jdbcUpdateById(OaPurchaseInfo);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+}

+ 110 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/ProjectInfoController.java

@@ -0,0 +1,110 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.ProjectInfo;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/projectInfo")
+public class ProjectInfoController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, ProjectInfo.class, connection);
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<ProjectInfo> list = jdbcClient.getJdbcList(map, ProjectInfo.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody ProjectInfo model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model.setId((long)0);
+            jdbcClient.jdbcInsert(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody ProjectInfo model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcUpdateById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody ProjectInfo model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcRemoveById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 150 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseAnswerSignController.java

@@ -0,0 +1,150 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusApprove;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseAnswerSign;
+import easydo.technology.model.PurchaseBidSign;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/purchaseAnswerSign")
+public class PurchaseAnswerSignController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDApproveService gldApproveService;
+    @Resource
+    FlowNoService flowNoService;
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody PurchaseAnswerSign model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_ANSWER_SIGN.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody PurchaseAnswerSign model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_ANSWER_SIGN.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+            Purchase purchase = new Purchase();
+            purchase.setId(model.getPurchaseId());
+            purchase = jdbcClient.getJdbcModelById(purchase, connection);
+
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_ANSWER_SIGN.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            purchase.setStep(ChengfaEnum.PURCHASE_STEP_PURCHASE_ANSWER_SIGN.getValue());
+            purchase.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(purchase, connection);
+
+            model.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody PurchaseAnswerSign model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            result.put("model", model);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public Purchase checkData(PurchaseAnswerSign model, Connection connection) throws Exception {
+        Purchase purchase = new Purchase();
+        purchase.setId(model.getPurchaseId());
+        purchase = jdbcClient.getJdbcModelById(purchase, connection);
+        if (ChengfaEnum.PURCHASE_STEP_PURCHASE_ANSWER_SIGN.getValue().equals(purchase.getStep())) {
+            throw new BizException("此采购申请已经发起答疑会签审批,请勿操作");
+        }
+
+        BusApprove busApprove = new BusApprove();
+        busApprove.setBusId(model.getId());
+        busApprove.setBusType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_ANSWER_SIGN.getValue());
+        busApprove.setApproveStatus(ChengfaEnum.BUS_APPROVE_APPROVE_STATUS_DONE.getValue());
+        busApprove.setApproveResult(ChengfaEnum.BUS_APPROVE_APPROVE_RESULT_Y.getValue());
+        int count = jdbcClient.getJdbcCount(busApprove, connection);
+        if (count > 0) {
+            throw new BizException("此采购申请已经发起答疑会签审批,请勿重复操作");
+        }
+        return purchase;
+    }
+}

+ 246 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseApplyController.java

@@ -0,0 +1,246 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusApprove;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseAnswerSign;
+import easydo.technology.model.PurchaseBidNotice;
+import easydo.technology.model.PurchaseBidSign;
+import easydo.technology.model.PurchaseMatter;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/purchaseApply")
+public class PurchaseApplyController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    FlowNoService flownoService;
+    @Resource
+    GLDApproveService gldApproveService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Purchase.class, connection);
+            // List<Purchase> list = (List<Purchase>) page.get("records");
+            // for (Purchase model : list) {
+            // ZeroSpringFolderComponent.build(dataSource).fetch(model);
+            // }
+
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<Purchase> list = jdbcClient.getJdbcList(map, Purchase.class, connection);
+            // for (Purchase model : list) {
+            // ZeroSpringFolderComponent.build(dataSource).fetch(model);
+            // }
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody Purchase model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model.setPurchaseNo(flownoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE.getValue(), connection));
+            jdbcClient.jdbcInsert(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody Purchase model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setPurchaseNo(flownoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            model.setStep(ChengfaEnum.PURCHASE_STEP_PURCHASE_APPLY.getValue());
+            model.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody Purchase model) throws Exception {
+
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+            checkData(model, connection);
+
+            jdbcClient.jdbcUpdateById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public void checkData(Purchase model, Connection connection) throws Exception {
+        Purchase purchase = new Purchase();
+        purchase.setId(model.getId());
+        purchase = jdbcClient.getJdbcModelById(purchase, connection);
+        if (ChengfaEnum.PURCHASE_STEP_PURCHASE_APPLY.getValue().equals(purchase.getStep())) {
+            throw new BizException("此采购申请已经发起采购申请审批,请勿操作");
+        }
+
+        BusApprove busApprove = new BusApprove();
+        busApprove.setBusId(model.getId());
+        busApprove.setBusType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE.getValue());
+        busApprove.setApproveStatus(ChengfaEnum.BUS_APPROVE_APPROVE_STATUS_DONE.getValue());
+        busApprove.setApproveResult(ChengfaEnum.BUS_APPROVE_APPROVE_RESULT_Y.getValue());
+        int count = jdbcClient.getJdbcCount(busApprove, connection);
+        if (count > 0) {
+            throw new BizException("此采购申请已经发起采购申请审批,请勿重复操作");
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody Purchase model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            PurchaseMatter matter = new PurchaseMatter();
+            matter.setPurchaseId(model.getId());
+            matter = jdbcClient.getJdbcModel(matter, connection);
+
+            PurchaseBidSign bidSign = new PurchaseBidSign();
+            bidSign.setPurchaseId(model.getId());
+            bidSign = jdbcClient.getJdbcModel(bidSign, connection);
+            if (StringUtil.isNotEmpty(bidSign.getId())) {
+                ZeroSpringFolderComponent.build(dataSource).fetch(bidSign);
+            }
+
+            PurchaseAnswerSign answerSign = new PurchaseAnswerSign();
+            answerSign.setPurchaseId(model.getId());
+            answerSign = jdbcClient.getJdbcModel(answerSign, connection);
+
+            PurchaseBidNotice bidNotice = new PurchaseBidNotice();
+            bidNotice.setPurchaseId(model.getId());
+            bidNotice = jdbcClient.getJdbcModel(bidNotice, connection);
+
+            result.put("purchase", model);
+            result.put("matter", matter);
+            result.put("bidSign", bidSign);
+            result.put("answerSign", answerSign);
+            result.put("bidNotice", bidNotice);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody Purchase model) throws Exception {
+
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            if (StringUtil.isNotEmpty(model.getStatus())
+                    || StringUtil.isNotEmpty(model.getStep())) {
+                throw new BizException("此采购申请已经发起申请审批,请勿删除");
+            }
+
+            jdbcClient.jdbcRemoveById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 150 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseBidNoticeController.java

@@ -0,0 +1,150 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusApprove;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseBidNotice;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/purchaseBidNotice")
+public class PurchaseBidNoticeController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDApproveService gldApproveService;
+    @Resource
+    FlowNoService flowNoService;
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody PurchaseBidNotice model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_BID_NOTICE.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody PurchaseBidNotice model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_BID_NOTICE.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+            Purchase purchase = new Purchase();
+            purchase.setId(model.getPurchaseId());
+            purchase = jdbcClient.getJdbcModelById(purchase, connection);
+
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_BID_NOTICE.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            purchase.setStep(ChengfaEnum.PURCHASE_STEP_PURCHASE_BID_NOTICE.getValue());
+            purchase.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(purchase, connection);
+
+            model.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody PurchaseBidNotice model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            result.put("model", model);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public Purchase checkData(PurchaseBidNotice model, Connection connection) throws Exception {
+        Purchase purchase = new Purchase();
+        purchase.setId(model.getPurchaseId());
+        purchase = jdbcClient.getJdbcModelById(purchase, connection);
+        if (ChengfaEnum.PURCHASE_STEP_PURCHASE_BID_NOTICE.getValue().equals(purchase.getStep())) {
+            throw new BizException("此采购申请已经发起招标结果通知审批,请勿操作");
+        }
+
+        BusApprove busApprove = new BusApprove();
+        busApprove.setBusId(model.getId());
+        busApprove.setBusType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_BID_NOTICE.getValue());
+        busApprove.setApproveStatus(ChengfaEnum.BUS_APPROVE_APPROVE_STATUS_DONE.getValue());
+        busApprove.setApproveResult(ChengfaEnum.BUS_APPROVE_APPROVE_RESULT_Y.getValue());
+        int count = jdbcClient.getJdbcCount(busApprove, connection);
+        if (count > 0) {
+            throw new BizException("此采购申请已经发起招标结果通知审批,请勿重复操作");
+        }
+        return purchase;
+    }
+}

+ 149 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseBidSignController.java

@@ -0,0 +1,149 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusApprove;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseBidSign;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/purchaseBidSign")
+public class PurchaseBidSignController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDApproveService gldApproveService;
+    @Resource
+    FlowNoService flowNoService;
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody PurchaseBidSign model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_BID_SIGN.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody PurchaseBidSign model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_BID_SIGN.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+            Purchase purchase = new Purchase();
+            purchase.setId(model.getPurchaseId());
+            purchase = jdbcClient.getJdbcModelById(purchase, connection);
+
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_BID_SIGN.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            purchase.setStep(ChengfaEnum.PURCHASE_STEP_PURCHASE_BID_SIGN.getValue());
+            purchase.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(purchase, connection);
+
+            model.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody PurchaseBidSign model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            result.put("model", model);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public Purchase checkData(PurchaseBidSign model, Connection connection) throws Exception {
+        Purchase purchase = new Purchase();
+        purchase.setId(model.getPurchaseId());
+        purchase = jdbcClient.getJdbcModelById(purchase, connection);
+        if (ChengfaEnum.PURCHASE_STEP_PURCHASE_BID_SIGN.getValue().equals(purchase.getStep())) {
+            throw new BizException("此采购申请已经发起招标会签审批,请勿操作");
+        }
+
+        BusApprove busApprove = new BusApprove();
+        busApprove.setBusId(model.getId());
+        busApprove.setBusType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_BID_NOTICE.getValue());
+        busApprove.setApproveStatus(ChengfaEnum.BUS_APPROVE_APPROVE_STATUS_DONE.getValue());
+        busApprove.setApproveResult(ChengfaEnum.BUS_APPROVE_APPROVE_RESULT_Y.getValue());
+        int count = jdbcClient.getJdbcCount(busApprove, connection);
+        if (count > 0) {
+            throw new BizException("此采购申请已经发起招标会签审批,请勿重复操作");
+        }
+        return purchase;
+    }
+}

+ 56 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseContractController.java

@@ -0,0 +1,56 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.PurchaseContract;
+import easydo.technology.service.GLDCostService;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.StringUtil;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/supplierContract")
+public class PurchaseContractController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDCostService gldCostService;
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<PurchaseContract> list = jdbcClient.getJdbcList(map, PurchaseContract.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @GetMapping(value = "/download")
+    public void test(HttpServletResponse response, @RequestParam String objectId,
+            @RequestParam(required = false) String fileName) throws Exception {
+        gldCostService.getContractFile(objectId, fileName, response);
+    }
+}

+ 386 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseController.java

@@ -0,0 +1,386 @@
+package easydo.technology.controller;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.ModelAndView;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.OaPurchaseInfo;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseAnswerSign;
+import easydo.technology.model.PurchaseBidNotice;
+import easydo.technology.model.PurchaseBidSign;
+import easydo.technology.model.PurchaseContract;
+import easydo.technology.model.PurchaseMatter;
+import easydo.technology.model.PurchasePlan;
+import easydo.technology.model.SysUser;
+import easydo.technology.service.OAService;
+import easydo.technology.utils.StringUtil;
+
+@RestController
+@RequestMapping("/purchase")
+public class PurchaseController {
+
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Value("${PURCHASE.redirectUrl}")
+    String redirectUrl;
+    @Resource
+    OAService oaService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        Map<String, Object> paramMap = new HashMap<>();
+        try {
+            connection = dataSource.getConnection();
+            List<Purchase> filter = jdbcClient.getJdbcList(paramMap, Purchase.class, connection);
+            List<String> purchaseIdList = filter.stream().map(Purchase::getId).collect(Collectors.toList());
+
+            boolean isNeedIdFilter = false;
+            if (map.containsKey("contractNo") && StringUtil.isNotEmpty(map.get("contractNo"))) {
+                String contractNo = map.get("contractNo").toString();
+                map.remove("contractNo");
+                paramMap.put("contractNoLike", contractNo);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("contractName") && StringUtil.isNotEmpty(map.get("contractName"))) {
+                String contractName = map.get("contractName").toString();
+                map.remove("contractName");
+                paramMap.put("contractNameLike", contractName);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("signAmountBegin") && StringUtil.isNotEmpty(map.get("signAmountBegin"))) {
+                BigDecimal signAmountBegin = new BigDecimal(map.get("signAmountBegin").toString());
+                map.remove("signAmountBegin");
+                paramMap.put("signAmountBegin", signAmountBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("signAmountEnd") && StringUtil.isNotEmpty(map.get("signAmountEnd"))) {
+                BigDecimal signAmountEnd = new BigDecimal(map.get("signAmountEnd").toString());
+                map.remove("signAmountEnd");
+                paramMap.put("signAmountEnd", signAmountEnd);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("contractCreateTimeBegin")
+                    && StringUtil.isNotEmpty(map.get("contractCreateTimeBegin"))) {
+                String contractCreateTimeBegin = map.get("contractCreateTimeBegin").toString();
+                map.remove("contractCreateTimeBegin");
+                paramMap.put("createTimeBegin", contractCreateTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("contractCreateTimeEnd") && StringUtil.isNotEmpty(map.get("contractCreateTimeEnd"))) {
+                String contractCreateTimeEnd = map.get("contractCreateTimeEnd").toString();
+                map.remove("contractCreateTimeEnd");
+                paramMap.put("createTimeEnd", contractCreateTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("contractEndTimeBegin") && StringUtil.isNotEmpty(map.get("contractEndTimeBegin"))) {
+                String contractEndTimeBegin = map.get("contractEndTimeBegin").toString();
+                map.remove("contractEndTimeBegin");
+                paramMap.put("endTimeBegin", contractEndTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("contractEndTimeEnd") && StringUtil.isNotEmpty(map.get("contractEndTimeEnd"))) {
+                String contractEndTimeEnd = map.get("contractEndTimeEnd").toString();
+                map.remove("contractEndTimeEnd");
+                paramMap.put("endTimeEnd", contractEndTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (paramMap.size() > 0) {
+                List<PurchaseContract> list = jdbcClient.getJdbcList(paramMap, PurchaseContract.class, connection);
+                List<String> purchaseIds = list.stream().map(PurchaseContract::getPurchaseId)
+                        .collect(Collectors.toList());
+                purchaseIdList = purchaseIdList.stream()
+                        .filter(purchaseIds::contains)
+                        .collect(Collectors.toList());
+            }
+
+            paramMap.clear();
+            if (map.containsKey("bidSignCreateTimeBegin") && StringUtil.isNotEmpty(map.get("bidSignCreateTimeBegin"))) {
+                String bidSignCreateTimeBegin = map.get("bidSignCreateTimeBegin").toString();
+                map.remove("bidSignCreateTimeBegin");
+                paramMap.put("createTimeBegin", bidSignCreateTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("bidSignCreateTimeEnd") && StringUtil.isNotEmpty(map.get("bidSignCreateTimeEnd"))) {
+                String bidSignCreateTimeEnd = map.get("bidSignCreateTimeEnd").toString();
+                map.remove("bidSignCreateTimeEnd");
+                paramMap.put("createTimeEnd", bidSignCreateTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("bidSignEndTimeBegin") && StringUtil.isNotEmpty(map.get("bidSignEndTimeBegin"))) {
+                String bidSignEndTimeBegin = map.get("bidSignEndTimeBegin").toString();
+                map.remove("bidSignEndTimeBegin");
+                paramMap.put("endTimeBegin", bidSignEndTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("bidSignEndTimeEnd") && StringUtil.isNotEmpty(map.get("bidSignEndTimeEnd"))) {
+                String bidSignEndTimeEnd = map.get("bidSignEndTimeEnd").toString();
+                map.remove("bidSignEndTimeEnd");
+                paramMap.put("endTimeEnd", bidSignEndTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (paramMap.size() > 0) {
+                List<PurchaseBidSign> list = jdbcClient.getJdbcList(paramMap, PurchaseBidSign.class, connection);
+                List<String> purchaseIds = list.stream().map(PurchaseBidSign::getPurchaseId)
+                        .collect(Collectors.toList());
+                purchaseIdList = purchaseIdList.stream()
+                        .filter(purchaseIds::contains)
+                        .collect(Collectors.toList());
+            }
+
+            paramMap.clear();
+            if (map.containsKey("bidNoticeEndTimeBegin") && StringUtil.isNotEmpty(map.get("bidNoticeEndTimeBegin"))) {
+                String bidNoticeEndTimeBegin = map.get("bidNoticeEndTimeBegin").toString();
+                map.remove("bidNoticeEndTimeBegin");
+                paramMap.put("endTimeBegin", bidNoticeEndTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("bidNoticeEndTimeEnd") && StringUtil.isNotEmpty(map.get("bidNoticeEndTimeEnd"))) {
+                String bidNoticeEndTimeEnd = map.get("bidNoticeEndTimeEnd").toString();
+                map.remove("bidNoticeEndTimeEnd");
+                paramMap.put("endTimeEnd", bidNoticeEndTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (paramMap.size() > 0) {
+                List<PurchaseBidNotice> list = jdbcClient.getJdbcList(paramMap, PurchaseBidNotice.class, connection);
+                List<String> purchaseIds = list.stream().map(PurchaseBidNotice::getPurchaseId)
+                        .collect(Collectors.toList());
+                purchaseIdList = purchaseIdList.stream()
+                        .filter(purchaseIds::contains)
+                        .collect(Collectors.toList());
+            }
+
+            paramMap.clear();
+            if (map.containsKey("matterCreateTimeBegin") && StringUtil.isNotEmpty(map.get("matterCreateTimeBegin"))) {
+                String matterCreateTimeBegin = map.get("matterCreateTimeBegin").toString();
+                map.remove("matterCreateTimeBegin");
+                paramMap.put("createTimeBegin", matterCreateTimeBegin);
+                isNeedIdFilter = true;
+            }
+            if (map.containsKey("matterCreateTimeEnd") && StringUtil.isNotEmpty(map.get("matterCreateTimeEnd"))) {
+                String matterCreateTimeEnd = map.get("matterCreateTimeEnd").toString();
+                map.remove("matterCreateTimeEnd");
+                paramMap.put("createTimeEnd", matterCreateTimeEnd);
+                isNeedIdFilter = true;
+            }
+            if (paramMap.size() > 0) {
+                List<PurchaseMatter> list = jdbcClient.getJdbcList(paramMap, PurchaseMatter.class, connection);
+                List<String> purchaseIds = list.stream().map(PurchaseMatter::getPurchaseId)
+                        .collect(Collectors.toList());
+                purchaseIdList = purchaseIdList.stream()
+                        .filter(purchaseIds::contains)
+                        .collect(Collectors.toList());
+            }
+
+            if (isNeedIdFilter) {
+                if (!purchaseIdList.isEmpty()) {
+                    map.put("idIn", purchaseIdList);
+                } else {
+                    purchaseIdList.add("0");
+                    map.put("idIn", purchaseIdList);
+                }
+            }
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Purchase.class, connection);
+            List<Purchase> list = (List<Purchase>) page.get("records");
+            for (Purchase model : list) {
+                OaPurchaseInfo purchaseInfo = new OaPurchaseInfo();
+                purchaseInfo.setId(model.getId());
+                purchaseInfo = jdbcClient.getJdbcModelById(purchaseInfo, connection);
+
+                PurchasePlan plan = new PurchasePlan();
+                plan.setId(model.getPlanId());
+                plan = jdbcClient.getJdbcModelById(plan, connection);
+
+                PurchaseMatter matter = new PurchaseMatter();
+                matter.setPurchaseId(model.getId());
+                matter = jdbcClient.getJdbcModel(matter, connection);
+
+                PurchaseAnswerSign answerSign = new PurchaseAnswerSign();
+                answerSign.setPurchaseId(model.getId());
+                answerSign = jdbcClient.getJdbcModel(answerSign, connection);
+
+                PurchaseBidSign bidSign = new PurchaseBidSign();
+                bidSign.setPurchaseId(model.getId());
+                bidSign = jdbcClient.getJdbcModel(bidSign, connection);
+
+                PurchaseBidNotice bidNotice = new PurchaseBidNotice();
+                bidNotice.setPurchaseId(model.getId());
+                bidNotice = jdbcClient.getJdbcModel(bidNotice, connection);
+
+                PurchaseContract contract = new PurchaseContract();
+                contract.setPurchaseId(model.getId());
+                List<PurchaseContract> contractList = jdbcClient.getJdbcList(contract, connection);
+
+                model.setOaStatus(purchaseInfo.getStatus());
+                model.setPlan(plan);
+                model.setMatter(matter);
+                model.setAnswerSign(answerSign);
+                model.setBidSign(bidSign);
+                model.setBidNotice(bidNotice);
+                model.setContractList(contractList);
+            }
+
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @GetMapping("/getDetail")
+    public ModelAndView getDetail(@RequestParam String type, @RequestParam(required = false) String businessId,
+            @RequestParam(required = false) String taskId, @RequestParam String path,
+            @RequestParam(required = false) String ticket, @RequestParam(required = false) String v5ticket)
+            throws Exception {
+        if (StringUtil.isEmpty(businessId) && StringUtil.isEmpty(taskId)) {
+            throw new BizException("关键参数缺失");
+        }
+        if (StringUtil.isEmpty(businessId) && StringUtil.isNotEmpty(taskId)) {
+            if (ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_PLAN.getValue().equals(type)) {
+                PurchasePlan plan = new PurchasePlan();
+                plan.setProcessTaskId(taskId);
+                plan = jdbcClient.getJdbcModel(plan);
+                businessId = plan.getId();
+            } else if (ChengfaEnum.BUS_APPROVE_TYPE_SUPPLIER_EVALUATE.getValue().equals(type)) {
+
+            } else {
+                // Purchase purchase = new Purchase();
+                // purchase.setProcessTaskId(taskId);
+                // purchase = jdbcClient.getJdbcModel(purchase);
+                // businessId = purchase.getId();
+            }
+        }
+        int userId = 1;
+        if (StringUtil.isNotEmpty(ticket)) {
+            String username = oaService.getUsername(ticket);
+            if (StringUtil.isNotEmpty(username)) {
+                String telnumber = oaService.getTelNumber(username);
+                SysUser sysUser = new SysUser();
+                sysUser.setPhone(telnumber);
+                sysUser = jdbcClient.getJdbcModel(sysUser);
+                if (StringUtil.isNotEmpty(sysUser.getUserId())) {
+                    userId = sysUser.getUserId().intValue();
+                } else {
+                    userId = 0;
+                }
+
+            }
+        } else if (StringUtil.isNotEmpty(v5ticket)) {
+            String username = oaService.getUsername(v5ticket);
+            if (StringUtil.isNotEmpty(username)) {
+                String telnumber = oaService.getTelNumber(username);
+                SysUser sysUser = new SysUser();
+                sysUser.setPhone(telnumber);
+                sysUser = jdbcClient.getJdbcModel(sysUser);
+                if (StringUtil.isNotEmpty(sysUser.getUserId())) {
+                    userId = sysUser.getUserId().intValue();
+                } else {
+                    userId = 0;
+                }
+            }
+        }
+        ModelAndView modelAndView = new ModelAndView();
+        modelAndView
+                .setViewName(
+                        "redirect:" + redirectUrl + "?userId=" + userId + "&type=" + type + "&businessId=" + businessId
+                                + "&path=" + path);
+        return modelAndView;
+    }
+
+    @RequestMapping(value = "/getBusinessId")
+    public Object getBusinessId(@RequestBody Map<String, Object> map) {
+        String type = map.get("type").toString();
+        String instanceId = map.get("instanceId").toString();
+        Connection connection = null;
+        String businessId = "";
+        ResultSet resultSet = null;
+        try {
+            connection = dataSource.getConnection();
+            Statement statement = connection.createStatement();
+            if (type.equals(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_PLAN.getValue())
+                    || type.equals(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE.getValue())) {
+                String sql = "select id from " + type + " where process_instance_id = '" + instanceId + "' limit 1";
+                resultSet = statement.executeQuery(sql);
+
+            } else {
+                String sql = "select purchase_id from " + type + " where process_instance_id = '" + instanceId
+                        + "' limit 1";
+                resultSet = statement.executeQuery(sql);
+            }
+            while (resultSet.next()) {
+                businessId = resultSet.getString(1);
+            }
+
+            return new ResponseEntity<>(businessId, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public static void main(String[] args) {
+        String viewSql = "SELECT\n" +
+                "`sir`.`id` AS `id`,\n" +
+                "`sir`.`project_id` AS `project_id`,\n" +
+                "`sir`.`type` AS `type`,\n" +
+                "`sir`.`point_id` AS `point_id`,\n" +
+                "`sir`.`level` AS `level`,\n" +
+                "`sir`.`part_engineering` AS `part_engineering`,\n" +
+                "`sir`.`risk_num` AS `risk_num`,\n" +
+                "`sir`.`risk_name` AS `risk_name`,\n" +
+                "`sir`.`danger_des` AS `danger_des`,\n" +
+                "`sir`.`accident_type` AS `accident_type`,\n" +
+                "`sir`.`control_level` AS `control_level`,\n" +
+                "`sir`.`duty_person` AS `duty_person`,\n" +
+                "`sir`.`engineering_measure` AS `engineering_measure`,\n" +
+                "`sir`.`control_measures` AS `control_measures`,\n" +
+                "`sir`.`train_content` AS `train_content`,\n" +
+                "`sir`.`individual_protection` AS `individual_protection`,\n" +
+                "`sir`.`emergency_measures` AS `emergency_measures`,\n" +
+                "`sir`.`relieve_status` AS `relieve_status`,\n" +
+                "`sir`.`content` AS `content`,\n" +
+                "`sir`.`standard_require` AS `standard_require`,\n" +
+                "`sir`.`create_id` AS `create_id`,\n" +
+                "`sir`.`create_time` AS `create_time`,\n" +
+                "`sir`.`update_time` AS `update_time`,\n" +
+                "`sir`.`ref_type` AS `ref_type`,\n" +
+                "`sir`.`deleted` AS `deleted`,\n" +
+                "`sir`.`is_push` AS `is_push`,\n" +
+                "`su`.`nick_name` AS `create_name`,\n" +
+                "`ip`.`id` AS `push_id`,\n" +
+                "`ip`.`environment_type` AS `environment_type` \n" +
+                "from `safe_inspect_risk` `sir`\n" +
+                "LEFT JOIN `sys_user` `su` ON `sir`.`create_id` = `su`.`user_id`\n" +
+                "LEFT JOIN `interface_push_v2` `ip` ON ( `sir`.`id` = `ip`.`data_id` AND `ip`.`data_type` = 'safe_inspect_risk' AND `ip`.`environment_type` = '#{environmentType}' )";
+
+        System.out.println(viewSql);
+    }
+}

+ 154 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchaseMatterController.java

@@ -0,0 +1,154 @@
+package easydo.technology.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusApprove;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchaseMatter;
+import easydo.technology.model.Supplier;
+import easydo.technology.model.SupplierBank;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/purchaseMatter")
+public class PurchaseMatterController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDApproveService gldApproveService;
+    @Resource
+    FlowNoService flowNoService;
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody PurchaseMatter model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_MATTER.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody PurchaseMatter model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            if (StringUtil.isEmpty(model.getId())) {
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_MATTER.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                checkData(model, connection);
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+
+            Purchase purchase = new Purchase();
+            purchase.setId(model.getPurchaseId());
+            purchase = jdbcClient.getJdbcModelById(purchase, connection);
+
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_MATTER.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            purchase.setStep(ChengfaEnum.PURCHASE_STEP_PURCHASE_MATTER.getValue());
+            purchase.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(purchase, connection);
+
+            model.setStatus(ChengfaEnum.PURCHASE_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody PurchaseMatter model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            result.put("model", model);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    public Purchase checkData(PurchaseMatter model, Connection connection) throws Exception {
+        Purchase purchase = new Purchase();
+        purchase.setId(model.getPurchaseId());
+        purchase = jdbcClient.getJdbcModelById(purchase, connection);
+        if (ChengfaEnum.PURCHASE_STEP_PURCHASE_MATTER.getValue().equals(purchase.getStep())) {
+            throw new BizException("此事项已经发起事项审批,请勿操作");
+        }
+
+        BusApprove busApprove = new BusApprove();
+        busApprove.setBusId(model.getId());
+        busApprove.setBusType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_MATTER.getValue());
+        busApprove.setApproveStatus(ChengfaEnum.BUS_APPROVE_APPROVE_STATUS_DONE.getValue());
+        busApprove.setApproveResult(ChengfaEnum.BUS_APPROVE_APPROVE_RESULT_Y.getValue());
+        int count = jdbcClient.getJdbcCount(busApprove, connection);
+        if (count > 0) {
+            throw new BizException("此事项已经发起事项审批,请勿重复操作");
+        }
+        return purchase;
+    }
+}

+ 265 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/PurchasePlanController.java

@@ -0,0 +1,265 @@
+package easydo.technology.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.service.FlowNoService;
+import easydo.technology.service.GLDApproveService;
+import easydo.technology.service.GLDCostService;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.components.JdbcClient;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.Purchase;
+import easydo.technology.model.PurchasePlan;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/purchasePlan")
+public class PurchasePlanController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    GLDApproveService gldApproveService;
+    @Resource
+    GLDCostService gldCostService;
+    @Resource
+    FlowNoService flowNoService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, PurchasePlan.class, connection);
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getSelectPage")
+    public Object getSelectPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            int current = (int) map.get("current");
+            int size = (int) map.get("size");
+            map.remove("current");
+            map.remove("size");
+            List<PurchasePlan> planList = jdbcClient.getJdbcList(map, PurchasePlan.class, connection);
+
+            List<Purchase> purchaseList = jdbcClient.getJdbcList(new HashMap<>(), Purchase.class, connection);
+            List<String> planIdList = purchaseList.stream().map(Purchase::getPlanId).collect(Collectors.toList());
+
+            planList = planList.stream().filter(model -> !planIdList.contains(model.getId()))
+                    .collect(Collectors.toList());
+            long total = planList.size();
+            planList = planList.stream().skip((current - 1) * size).limit(size).collect(Collectors.toList());
+
+            Page<PurchasePlan> planPage = new Page<>();
+            planPage.setRecords(planList);
+            planPage.setTotal(total);
+
+            return new ResponseEntity<>(planPage, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getTongji")
+    public Object getTongji(@RequestBody Map<String, Object> map) {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            String sql = "select sum(budget_amount) as budget_amount from purchase_plan";
+
+            Map<String, Object> paramMap = new HashMap<>();
+            paramMap.put("createTimeBegin", map.get("yearCreateTimeBegin"));
+            paramMap.put("createTimeEnd", map.get("yearCreateTimeEnd"));
+            PurchasePlan purchasePlan = jdbcClient.getJdbcModelByMap(paramMap, sql, PurchasePlan.class, connection);
+            result.put("yearBudgetAmount", purchasePlan.getBudgetAmount());
+
+            paramMap.clear();
+            paramMap.put("createTimeBegin", map.get("monthCreateTimeBegin"));
+            paramMap.put("createTimeEnd", map.get("monthCreateTimeEnd"));
+            purchasePlan = jdbcClient.getJdbcModelByMap(paramMap, sql, PurchasePlan.class, connection);
+            result.put("monthBudgetAmount", purchasePlan.getBudgetAmount());
+
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<PurchasePlan> list = jdbcClient.getJdbcList(map, PurchasePlan.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody PurchasePlan model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_PLAN.getValue(), connection));
+            jdbcClient.jdbcInsert(model, connection);
+
+            if (StringUtil.isNotEmpty(model.getContractPlanId())) {
+                gldCostService.updateState(model.getContractPlanId(), ChengfaEnum.CONTRACT_PLAN_USE_STATE_PRE_USE.getValue());
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/saveApprove")
+    public Object saveApprove(@RequestBody PurchasePlan model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+            if (StringUtil.isEmpty(model.getId())) {
+                if (StringUtil.isNotEmpty(model.getContractPlanId())) {
+                    gldCostService.updateState(model.getContractPlanId(), ChengfaEnum.CONTRACT_PLAN_USE_STATE_PRE_USE.getValue());
+                }
+                model.setBusinessNo(flowNoService.getFlowNo(ChengfaEnum.FLOWNO_TYPE_PURCHASE_PLAN.getValue(), connection));
+                jdbcClient.jdbcInsert(model, connection);
+            } else {
+                jdbcClient.jdbcUpdateById(model, connection);
+            }
+            GLDApproveVo vo = new GLDApproveVo();
+            vo.setTargetId(0);
+            vo.setTargetType(ChengfaEnum.BUS_APPROVE_TYPE_PURCHASE_PLAN.getValue());
+            vo.setTemplateId(model.getTemplateId());
+            String taskId = gldApproveService.startApprove(vo);
+            vo.setTaskId(taskId);
+            vo = gldApproveService.getApproveInfo(vo);
+
+            model.setProcessInstanceId(vo.getInstanceId());
+            model.setProcessState(vo.getState());
+            model.setProcessTaskId(vo.getTaskId());
+            model.setProcessTemplateId(vo.getTemplateId());
+
+            model.setStatus(ChengfaEnum.PURCHASE_PALN_STATUS_APPROVE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody PurchasePlan model) throws Exception {
+        if (!ChengfaEnum.PURCHASE_PALN_STATUS_ACTIVE.getValue().equals(model.getStatus()) &&
+                StringUtil.isNotEmpty(model.getStatus())) {
+            throw new BizException("此采购计划已经发起审批,请勿变更");
+        }
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcUpdateById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody PurchasePlan model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            result.put("plan", model);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody PurchasePlan model) throws Exception {
+
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            if (StringUtil.isNotEmpty(model.getStatus())) {
+                throw new BizException("此采购计划已经发起审批,请勿删除");
+            }
+            jdbcClient.jdbcRemoveById(model, connection);
+            if (StringUtil.isNotEmpty(model.getContractPlanId())) {
+                gldCostService.updateState(model.getContractPlanId(), ChengfaEnum.CONTRACT_PLAN_USE_STATE_NO_USE.getValue());
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+}

+ 208 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/SupplierController.java

@@ -0,0 +1,208 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.components.ZeroSpringFolderComponent;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.PurchaseContract;
+import easydo.technology.model.Supplier;
+import easydo.technology.model.SupplierBank;
+import easydo.technology.service.MDMService;
+import easydo.technology.utils.LocalDateUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/supplier")
+public class SupplierController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    MDMService mdmService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            String sql = "select sum(sign_amount) as sign_amount from purchase_contract";
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, Supplier.class, connection);
+            List<Supplier> supplierList = (List<Supplier>) page.get("records");
+            for (Supplier model : supplierList) {
+                PurchaseContract contract = new PurchaseContract();
+                contract.setSupplierId(model.getId());
+                int bidCount = jdbcClient.getJdbcCount(contract, connection);
+                model.setBidCount(bidCount);
+
+                Map<String, Object> paramMap = new HashMap<>();
+                paramMap.put("supplierId", model.getId());
+                PurchaseContract purchaseContract = jdbcClient.getJdbcModelByMap(paramMap, sql, PurchaseContract.class,
+                        connection);
+                model.setTotalAmount(purchaseContract.getSignAmount());
+            }
+
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<Supplier> list = jdbcClient.getJdbcList(map, Supplier.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody Supplier model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcInsert(model, connection);
+
+            SupplierBank existBank = new SupplierBank();
+            existBank.setSupplierId(model.getId());
+            List<SupplierBank> existBankList = jdbcClient.getJdbcList(existBank, connection);
+            for (SupplierBank bank : existBankList) {
+                jdbcClient.jdbcRemoveById(bank, connection);
+            }
+            List<SupplierBank> bankList = model.getBankList();
+            for (SupplierBank bank : bankList) {
+                bank.setId(UUID.randomUUID().toString());
+                bank.setSupplierId(model.getId());
+                jdbcClient.jdbcInsert(bank, connection);
+            }
+            try {
+                mdmService.sendSupplier(model, false);
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody Supplier model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model.setUpdateTime(LocalDateUtil.localDateTimeFormatyMdHms(LocalDateTime.now()));
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            SupplierBank existBank = new SupplierBank();
+            existBank.setSupplierId(model.getId());
+            List<SupplierBank> existBankList = jdbcClient.getJdbcList(existBank, connection);
+            for (SupplierBank bank : existBankList) {
+                jdbcClient.jdbcRemoveById(bank, connection);
+            }
+            List<SupplierBank> bankList = model.getBankList();
+            for (SupplierBank bank : bankList) {
+                bank.setId(UUID.randomUUID().toString());
+                bank.setSupplierId(model.getId());
+                jdbcClient.jdbcInsert(bank, connection);
+            }
+            try {
+                mdmService.sendSupplier(model, false);
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody Supplier model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            SupplierBank existBank = new SupplierBank();
+            existBank.setSupplierId(model.getId());
+            List<SupplierBank> existBankList = jdbcClient.getJdbcList(existBank, connection);
+            for (SupplierBank bank : existBankList) {
+                jdbcClient.jdbcRemoveById(bank, connection);
+            }
+            try {
+                mdmService.sendSupplier(model, true);
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody Supplier model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            ZeroSpringFolderComponent.build(dataSource).fetch(model);
+
+            SupplierBank supplierBank = new SupplierBank();
+            supplierBank.setSupplierId(model.getId());
+            List<SupplierBank> bankList = jdbcClient.getJdbcList(supplierBank, connection);
+
+            result.put("supplier", model);
+            result.put("bankList", bankList);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 460 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/SupplierEvaluateController.java

@@ -0,0 +1,460 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.*;
+import easydo.technology.model.vo.DictVo;
+import easydo.technology.service.OAService;
+import easydo.technology.service.RedisDictService;
+import easydo.technology.utils.LocalDateUtil;
+import easydo.technology.utils.StringUtil;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSONObject;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.sql.Connection;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@RestController
+@RequestMapping("/supplierEvaluate")
+public class SupplierEvaluateController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+    @Resource
+    RedisDictService redisDictService;
+    @Resource
+    OAService oaService;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, SupplierEvaluate.class, connection);
+            List<SupplierEvaluate> list = (List<SupplierEvaluate>) page.get("records");
+            for (SupplierEvaluate model : list) {
+                Supplier supplier = new Supplier();
+                supplier.setId(model.getSupplierId());
+                supplier = jdbcClient.getJdbcModelById(supplier, connection);
+                model.setSupplier(supplier);
+
+                PurchaseContract contract = new PurchaseContract();
+                contract.setId(model.getContractId());
+                contract = jdbcClient.getJdbcModelById(contract, connection);
+                model.setContract(contract);
+            }
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<SupplierEvaluate> list = jdbcClient.getJdbcList(map, SupplierEvaluate.class, connection);
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody SupplierEvaluate model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_STATUS_ACTIVE.getValue());
+            jdbcClient.jdbcInsert(model, connection);
+
+            List<SupplierEvaluateDetail> detailList = model.getEvaluateDetailList();
+            for (SupplierEvaluateDetail detail : detailList) {
+                detail.setEvaluateId(model.getId());
+                detail.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_ACTIVE.getValue());
+                jdbcClient.jdbcInsert(detail, connection);
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/evaluate")
+    public Object evaluate(@RequestBody SupplierEvaluateDetail model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierEvaluate evaluate = new SupplierEvaluate();
+            evaluate.setId(model.getEvaluateId());
+            evaluate = jdbcClient.getJdbcModelById(evaluate, connection);
+            if (ChengfaEnum.SUPPLIER_EVALUATE_STATUS_ACTIVE.getValue().equals(evaluate.getStatus())) {
+                throw new BizException("此供应商评价尚未发起评价,请勿评价");
+            }
+            if (ChengfaEnum.SUPPLIER_EVALUATE_STATUS_DONE.getValue().equals(evaluate.getStatus())) {
+                throw new BizException("此供应商评价已完成评价,请勿重复评价");
+            }
+
+            model.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_DONE.getValue());
+            model.setEvaluateTime(LocalDateUtil.localDateTimeFormatyMdHms(LocalDateTime.now()));
+
+            DictVo dictVo = redisDictService.getGradeScore(model.getScore());
+            model.setGrade(dictVo.getGrade());
+            model.setScore(dictVo.getScore().doubleValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            SupplierEvaluateDetail detailParam = new SupplierEvaluateDetail();
+            detailParam.setEvaluateId(model.getEvaluateId());
+            detailParam.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_EVALUATE.getValue());
+            int count = jdbcClient.getJdbcCount(detailParam, connection);
+            if (count == 0) {
+                evaluate.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_STATUS_DONE.getValue());
+
+                detailParam = new SupplierEvaluateDetail();
+                detailParam.setEvaluateId(model.getEvaluateId());
+                detailParam.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_DONE.getValue());
+                List<SupplierEvaluateDetail> detailList = jdbcClient.getJdbcList(detailParam, connection);
+                OptionalDouble average = detailList.stream().mapToDouble(SupplierEvaluateDetail::getScore).average();
+                if (average.isPresent()) {
+                    double score = average.getAsDouble();
+                    dictVo = redisDictService.getGradeScore(score);
+                    evaluate.setGrade(dictVo.getGrade());
+                    evaluate.setScore(dictVo.getScore());
+                    evaluate.setEvaluateFinishTime(model.getEvaluateTime());
+                }
+                jdbcClient.jdbcUpdateById(evaluate, connection);
+
+                Supplier supplier = new Supplier();
+                supplier.setId(evaluate.getSupplierId());
+                supplier = jdbcClient.getJdbcModelById(supplier, connection);
+                SysUser sysUser = new SysUser();
+                sysUser.setUserId(evaluate.getCreateId());
+                sysUser = jdbcClient.getJdbcModel(sysUser);
+                String title = "[招采系统-供应商评价-]" + supplier.getSupplierName() + "]已评价完成,请知悉";
+                Message message = new Message();
+                message.setReceiveUserId(evaluate.getCreateId());
+                message.setReceiveUserName(sysUser.getNickName());
+                message.setRefType(ChengfaEnum.MESSAGE_TYPE_SUPPLIER_EVALUATE.getValue());
+                message.setRefId(evaluate.getId());
+                message.setContent(title);
+                jdbcClient.jdbcInsert(message, connection);
+
+                try {
+                    oaService.sendMessage(message.getId(), evaluate.getCreateId().toString(),
+                            evaluate.getCreateId().toString(), title, "");
+                } catch (Exception ee) {
+                    ee.printStackTrace();
+                }
+            }
+
+            try {
+                oaService.updateSupplierTodo(model.getId(), 1, 0);
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/revert")
+    public Object revert(@RequestBody SupplierEvaluateDetail model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            model.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_EVALUATE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            SupplierEvaluate evaluate = new SupplierEvaluate();
+            evaluate.setId(model.getEvaluateId());
+            evaluate = jdbcClient.getJdbcModelById(evaluate, connection);
+            evaluate.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_EVALUATE.getValue());
+            jdbcClient.jdbcUpdateById(evaluate, connection);
+
+            Supplier supplier = new Supplier();
+            supplier.setId(evaluate.getSupplierId());
+            supplier = jdbcClient.getJdbcModelById(supplier, connection);
+
+            String title = "您有一条[招采系统-供应商评价-" + supplier.getSupplierName() + "]被退回,请重新评价";
+            String url = "";
+            try {
+                oaService.updateSupplierTodo(model.getId(), 1, 2);
+                JSONObject resObj = oaService.sendSupplierTodo(model.getId(), model.getEvaluatorId().toString(),
+                        model.getEvaluateId(), title);
+                url = resObj.getString("url");
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+            SysUser sysUser = new SysUser();
+            sysUser.setUserId(model.getEvaluatorId());
+            sysUser = jdbcClient.getJdbcModel(sysUser);
+            Message message = new Message();
+            message.setReceiveUserId(model.getEvaluatorId());
+            message.setReceiveUserName(sysUser.getNickName());
+            message.setRefType(ChengfaEnum.MESSAGE_TYPE_SUPPLIER_EVALUATE.getValue());
+            message.setRefId(model.getId());
+            message.setContent(title);
+            jdbcClient.jdbcInsert(message, connection);
+
+            try {
+                oaService.sendMessage(message.getId(), model.getEvaluatorId().toString(),
+                        model.getEvaluatorId().toString(), title, url);
+            } catch (Exception ee) {
+                ee.printStackTrace();
+            }
+
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/active")
+    public Object active(@RequestBody SupplierEvaluate model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            model = jdbcClient.getJdbcModelById(model);
+            model.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_STATUS_EVALUATE.getValue());
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            Supplier supplier = new Supplier();
+            supplier.setId(model.getSupplierId());
+            supplier = jdbcClient.getJdbcModelById(supplier, connection);
+
+            SupplierEvaluateDetail detail = new SupplierEvaluateDetail();
+            detail.setEvaluateId(model.getId());
+            List<SupplierEvaluateDetail> detailList = jdbcClient.getJdbcList(detail, connection);
+            for (SupplierEvaluateDetail detailModel : detailList) {
+                detailModel.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_EVALUATE.getValue());
+                jdbcClient.jdbcUpdateById(detailModel, connection);
+
+                String title = "您有一条[招采系统-供应商评价-" + supplier.getSupplierName() + "]需要评价,请及时处理";
+                String url = "";
+                try {
+                    JSONObject resObj = oaService.sendSupplierTodo(detailModel.getId(),
+                            detailModel.getEvaluatorId().toString(),
+                            detailModel.getEvaluateId(), title);
+                    url = resObj.getString("url");
+                } catch (Exception ee) {
+                    ee.printStackTrace();
+                }
+
+                SysUser sysUser = new SysUser();
+                sysUser.setUserId(detailModel.getEvaluatorId());
+                sysUser = jdbcClient.getJdbcModel(sysUser);
+                Message message = new Message();
+                message.setReceiveUserId(detailModel.getEvaluatorId());
+                message.setReceiveUserName(sysUser.getNickName());
+                message.setRefType(ChengfaEnum.MESSAGE_TYPE_SUPPLIER_EVALUATE.getValue());
+                message.setRefId(detailModel.getId());
+                message.setContent(title);
+                jdbcClient.jdbcInsert(message, connection);
+
+                try {
+                    oaService.sendMessage(message.getId(), detailModel.getEvaluatorId().toString(),
+                            detailModel.getEvaluatorId().toString(), title, url);
+                } catch (Exception ee) {
+                    ee.printStackTrace();
+                }
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody SupplierEvaluate model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierEvaluate exist = jdbcClient.getJdbcModelById(model, connection);
+            if (!ChengfaEnum.SUPPLIER_EVALUATE_STATUS_ACTIVE.getValue().equals(exist.getStatus())) {
+                throw new BizException("此供应商评价已经发起评价,请勿编辑");
+            }
+            jdbcClient.jdbcUpdateById(model, connection);
+
+            SupplierEvaluateDetail detail = new SupplierEvaluateDetail();
+            detail.setEvaluateId(model.getId());
+            List<SupplierEvaluateDetail> existList = jdbcClient.getJdbcList(detail, connection);
+            for (SupplierEvaluateDetail detailModel : existList) {
+                if (!ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_ACTIVE.getValue().equals(detailModel.getStatus())) {
+                    throw new BizException("此供应商评价已经发起评价,请勿编辑");
+                }
+                jdbcClient.jdbcRemoveById(detailModel, connection);
+            }
+            List<SupplierEvaluateDetail> detailList = model.getEvaluateDetailList();
+            for (SupplierEvaluateDetail detailModel : detailList) {
+                detailModel.setEvaluateId(model.getId());
+                detailModel.setStatus(ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_ACTIVE.getValue());
+                jdbcClient.jdbcInsert(detailModel, connection);
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getById")
+    public Object getById(@RequestBody SupplierEvaluate model) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            model = jdbcClient.getJdbcModelById(model, connection);
+            SupplierEvaluateDetail detail = new SupplierEvaluateDetail();
+            detail.setEvaluateId(model.getId());
+            List<SupplierEvaluateDetail> detailList = jdbcClient.getJdbcList(detail, connection);
+
+            Supplier supplier = new Supplier();
+            supplier.setId(model.getSupplierId());
+            supplier = jdbcClient.getJdbcModelById(supplier, connection);
+
+            PurchaseContract contract = new PurchaseContract();
+            contract.setId(model.getContractId());
+            contract = jdbcClient.getJdbcModelById(contract, connection);
+
+            result.put("supplier", supplier);
+            result.put("detailList", detailList);
+            result.put("evaluate", model);
+            result.put("contract", contract);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody SupplierEvaluate model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierEvaluate exist = jdbcClient.getJdbcModelById(model, connection);
+            if (!ChengfaEnum.SUPPLIER_EVALUATE_STATUS_ACTIVE.getValue().equals(exist.getStatus())) {
+                throw new BizException("此供应商评价已经发起评价,请勿删除");
+            }
+            jdbcClient.jdbcRemoveById(model, connection);
+
+            SupplierEvaluateDetail detail = new SupplierEvaluateDetail();
+            detail.setEvaluateId(model.getId());
+            List<SupplierEvaluateDetail> existList = jdbcClient.getJdbcList(detail, connection);
+            for (SupplierEvaluateDetail detailModel : existList) {
+                if (!ChengfaEnum.SUPPLIER_EVALUATE_DETAIL_STATUS_ACTIVE.getValue().equals(detailModel.getStatus())) {
+                    throw new BizException("此供应商评价已经发起评价,请勿删除");
+                }
+                jdbcClient.jdbcRemoveById(detailModel, connection);
+            }
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getTongJi")
+    public Object getTongJi() throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        String sql;
+        try {
+            connection = dataSource.getConnection();
+            sql = "select count(1) commonCount,supplier_type_id from supplier_evaluate group by supplier_type_id";
+            List<SupplierEvaluate> supplierTypeCountList = jdbcClient.getJdbcList(new HashMap<>(), sql,
+                    SupplierEvaluate.class, connection);
+
+            sql = "select count(1) commonCount,status from supplier_evaluate where status != 'active' group by status";
+            List<SupplierEvaluate> supplierStatusCountList = jdbcClient.getJdbcList(new HashMap<>(), sql,
+                    SupplierEvaluate.class, connection);
+
+            sql = "select count(1) commonCount,grade from supplier_evaluate where status = 'done' group by grade";
+            List<SupplierEvaluate> supplierGradeCountList = jdbcClient.getJdbcList(new HashMap<>(), sql,
+                    SupplierEvaluate.class, connection);
+
+            result.put("supplierTypeCountList", supplierTypeCountList);
+            result.put("supplierStatusCountList", supplierStatusCountList);
+            result.put("supplierGradeCountList", supplierGradeCountList);
+            return new ResponseEntity<>(result, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/calculate")
+    public Object calculate(@RequestBody List<Map<String, BigDecimal>> list) throws Exception {
+        List<BigDecimal> result = new ArrayList<>();
+        BigDecimal total = BigDecimal.ZERO;
+        for (Map<String, BigDecimal> map : list) {
+            BigDecimal n1 = StringUtil.isEmpty(map.get("n1")) ? BigDecimal.ZERO : map.get("n1");
+            BigDecimal n2 = StringUtil.isEmpty(map.get("n2")) ? BigDecimal.ZERO : map.get("n2");
+            BigDecimal number = n1.multiply(n2).setScale(2, RoundingMode.HALF_UP);
+            result.add(number);
+            total = total.add(number);
+        }
+        total = total.setScale(2, RoundingMode.HALF_UP);
+        result.add(total);
+        return new ResponseEntity<>(result, HttpStatus.OK);
+    }
+}

+ 165 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/SupplierTypeController.java

@@ -0,0 +1,165 @@
+package easydo.technology.controller;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.SupplierType;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/supplierType")
+public class SupplierTypeController {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage(@RequestBody Map<String, Object> map) {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            Map<String, Object> page = jdbcClient.getJdbcPage(map, SupplierType.class, connection);
+            List<SupplierType> list = (List<SupplierType>) page.get("records");
+            for (SupplierType model : list) {
+                SupplierType supplierTypeParm = new SupplierType();
+                supplierTypeParm.setPid(model.getId());
+                int count = jdbcClient.getJdbcCount(supplierTypeParm, connection);
+                if (count > 0) {
+                    model.setHasChildren(true);
+                } else {
+                    model.setHasChildren(false);
+                }
+            }
+            return new ResponseEntity<>(page, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/getList")
+    public Object getList(@RequestBody Map<String, Object> map) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+
+            List<SupplierType> list = jdbcClient.getJdbcList(map, SupplierType.class, connection);
+            for (SupplierType model : list) {
+                SupplierType supplierTypeParm = new SupplierType();
+                supplierTypeParm.setPid(model.getId());
+                int count = jdbcClient.getJdbcCount(supplierTypeParm, connection);
+                if (count > 0) {
+                    model.setHasChildren(true);
+                } else {
+                    model.setHasChildren(false);
+                }
+            }
+            return new ResponseEntity<>(list, HttpStatus.OK);
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/save")
+    public Object save(@RequestBody SupplierType model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierType param = new SupplierType();
+            param.setName(model.getName());
+            int count = jdbcClient.getJdbcCount(param, connection);
+            if (count > 0) {
+                throw new BizException("供应商类别名称不能重复");
+            }
+            param = new SupplierType();
+            param.setNumber(model.getNumber());
+            count = jdbcClient.getJdbcCount(param, connection);
+            if (count > 0) {
+                throw new BizException("供应商类别编号不能重复");
+            }
+            jdbcClient.jdbcInsert(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/update")
+    public Object update(@RequestBody SupplierType model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierType oldModel = jdbcClient.getJdbcModelById(model);
+            if (!oldModel.getName().equals(model.getName())) {
+                SupplierType param = new SupplierType();
+                param.setName(model.getName());
+                int count = jdbcClient.getJdbcCount(param, connection);
+                if (count > 0) {
+                    throw new BizException("供应商类别名称不能重复");
+                }
+            }
+            if (!oldModel.getNumber().equals(model.getNumber())) {
+                SupplierType param = new SupplierType();
+                param.setNumber(model.getNumber());
+                int count = jdbcClient.getJdbcCount(param, connection);
+                if (count > 0) {
+                    throw new BizException("供应商类别编号不能重复");
+                }
+            }
+            jdbcClient.jdbcUpdateById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    @RequestMapping(value = "/remove")
+    public Object remove(@RequestBody SupplierType model) throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            SupplierType param = new SupplierType();
+            param.setPid(model.getId());
+            int count = jdbcClient.getJdbcCount(param, connection);
+            if (count > 0) {
+                throw new BizException("供应商类别有子集,请勿删除");
+            }
+            jdbcClient.jdbcRemoveById(model, connection);
+            connection.commit();
+            return new ResponseEntity<>(model, HttpStatus.OK);
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 219 - 0
easydo-chengfa/src/main/java/easydo/technology/controller/TestController.java

@@ -0,0 +1,219 @@
+package easydo.technology.controller;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.sql.Connection;
+import java.text.MessageFormat;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.sql.DataSource;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSONObject;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.GldProject;
+import easydo.technology.model.ProjectInfo;
+import easydo.technology.service.GLDMasterService;
+import easydo.technology.system.domain.SysDept;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.LocalDateUtil;
+import easydo.technology.utils.StringUtil;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+    @Resource
+    DataSource dataSource;
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    GLDMasterService gldMasterService;
+    @Resource
+    private PasswordEncoder passwordEncoder;
+
+    /*
+     * public static void main(String[] args) {
+     * String url = "http://218.201.101.181:14780/tenant/v2/tenants?size=20000";
+     * String auth =
+     * "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+     * ;
+     * String token = "cn-b3c73fac-2629-4337-94fb-e79c289d1979";
+     * String tenantId = "5600001";
+     * 
+     * JSONObject object = HttpClientUtil.sendGLDGET_getTenantId(url, token);
+     * System.out.println(object.toJSONString());
+     * //{"access_token":"cn-b3c73fac-2629-4337-94fb-e79c289d1979","scope":
+     * "paas-clouddoc,paas-gdoc_tenant,paas-new-storage-service_admin,paas-organization_admin,paas-gws_tenant,paas-organization_tenant,paas-comment-service_tenant,paas-databag_tenant,paas-new-storage-service_tenant,paas-databag_admin,paas_databag_tenant,paas-raw-storage-service_tenant"
+     * ,"token_type":"bearer","exp":1723342092,"expires_in":74670}
+     * }
+     */
+
+    // public static void main(String[] args) {
+    // String url =
+    // "http://218.201.101.181:14780/flow-app-local/v4/flow-definitions/query-for-start?formId=flow/STD_Dcm_PROCUREMENT_SYSTEM&mgtGroupId=11200297";
+    // Map<String, String> header = new HashMap<>();
+    // header.put("Authorization",
+    // "Basic
+    // YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w=");
+    // header.put("x-tenant-id", "5600003");
+
+    // JSONArray resObject = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+    // System.out.println(resObject.toJSONString());
+    // }
+
+    /*
+     * public static void main(String[] args) {
+     * // String url =
+     * "http://218.201.101.181:8180/seeyon/thirdpartyController.do?ticket=-5127817351537210703";
+     * // String username = HttpClientUtil.sendOaGET_USERNAME(url);
+     * // System.out.println(username);
+     * 
+     * String url = "http://218.201.101.181:8180/seeyon/rest/token";
+     * JSONObject object = new JSONObject();
+     * object.put("userName", "zcxt");
+     * object.put("password", "2679fc6b-df18-4563-9b8e-773b59bdcb62");
+     * JSONObject resObject = HttpClientUtil.sendPOST(url, object.toJSONString());
+     * String accessToken = resObject.getString("id");
+     * System.out.println(accessToken);
+     * 
+     * String getUserInfoUrl =
+     * "http://218.201.101.181:8180/seeyon/rest/orgMember?loginName=guanglianda";
+     * Map<String, String> header = new HashMap<>();
+     * header.put("token", accessToken);
+     * // header.put("Authorization", "Bearer " + accessToken);
+     * JSONObject resObj = HttpClientUtil.sendGETWithHeader_Obj(getUserInfoUrl,
+     * header);
+     * System.out.println(resObj);
+     * }
+     */
+
+    @RequestMapping(value = "/getPage")
+    public Object getPage() throws Exception {
+
+        return "success";
+    }
+
+    @GetMapping(value = "/test")
+    public void test(HttpServletResponse response, @RequestParam String objectId,
+            @RequestParam(required = false) String fileName) throws Exception {
+        String url = "http://jsf-int.glodon.com/cost-management/openapi/attachments/" + objectId;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization",
+                "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4=");
+        header.put("X-CORAL-TENANT", "865509948108800");
+        if (StringUtil.isEmpty(fileName)) {
+            fileName = "contract.pdf";
+        }
+        HttpClientUtil.sendGETWithHeader_OutputStream(url, header, response, fileName);
+
+    }
+
+    public static void main(String[] args) {
+        String creationDate = LocalDateUtil.localDateTimeFormat(LocalDateTime.now(), "yyyy-MM-dd HH:mm");
+        String creationDate2 = LocalDateUtil.localDateTimeFormat(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
+
+        String url = "http://218.201.101.181:8180" + "/seeyon/rest/token";
+        JSONObject object = new JSONObject();
+        object.put("userName", "zcxt");
+        object.put("password", "2679fc6b-df18-4563-9b8e-773b59bdcb62");
+        JSONObject resObject = HttpClientUtil.sendPOST(url, object.toJSONString());
+        System.out.println("查询OAtoken的res======>" + resObject.toJSONString());
+        String token = resObject.getString("id");
+
+        Map<String, String> header = new HashMap<>();
+        header.put("token", token);
+
+        // String sendTodoUrl = "http://218.201.101.181:8180" +
+        // "/seeyon/rest/thirdpartyPending/receive?token=" + token;
+        // object = new JSONObject();
+        // object.put("registerCode", "3007");
+        // object.put("taskId", "4e12f28b-8e15-4f82-afbf-59dd0b083394");
+        // object.put("title", "供应商评价");
+        // object.put("senderName", "guanglianda");
+        // object.put("classify", "招采系统");
+        // object.put("contentType", "招采系统");
+        // object.put("state", 0);
+        // object.put("thirdSenderId", "");
+        // object.put("thirdReceiverId", "");
+        // object.put("creationDate", creationDate);
+        // object.put("content", "");
+        // object.put("h5url", "");
+        // object.put("url", "http://172.16.1.150:8810/purchase/getDetail?"
+        // +
+        // "type=supplier_evaluate&path=supplier-evaluation-detail&businessId=d0ff0a8b-54bf-4351-ad8d-e7cd26fc181e");
+        // object.put("noneBindingSender", "guanglianda");
+        // object.put("noneBindingReceiver", "guanglianda");
+
+        // JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(sendTodoUrl,
+        // object.toJSONString(), header);
+        // System.out.println("生成OA待办req======>" + object.toJSONString() + ",res======>"
+        // + resObj.toJSONString());
+
+        // String updateTodoUrl = "http://218.201.101.181:8180" +
+        // "/seeyon/rest/thirdpartyPending/updatePendingState?token=" + token;
+        // object = new JSONObject();
+        // object.put("registerCode", "3007");
+        // object.put("taskId","4e12f28b-8e15-4f82-afbf-59dd0b083394" );
+        // object.put("state",1 );
+        // object.put("subState",2 );
+        // JSONObject resObj =
+        // HttpClientUtil.sendPOSTWithHeader(updateTodoUrl,object.toJSONString(),
+        // header);
+        // System.out.println("更新OA待办req======>" + object.toJSONString() + ",res======>"
+        // + resObj.toJSONString());
+
+        String sendMessageUrl = "http://218.201.101.181:8180" +
+                "/seeyon/rest/thirdpartyMessage/receive/singleMessage?token=" + token;
+        object = new JSONObject();
+        object.put("thirdpartyRegisterCode", "3007");
+        object.put("thirdpartyMessageId", "1");
+        object.put("messageContent", "您有一条待测试的消息。");
+        object.put("thirdpartyReceiverId", 0);
+        object.put("creation_date", creationDate2);
+
+        object.put("noneBindingSender", "guanglianda");
+        object.put("noneBindingReceiver", "guanglianda");
+
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(sendMessageUrl, object.toJSONString(), header);
+        System.out.println("推送OA消息req======>" + object.toJSONString() + ",res======>" + resObj.toJSONString());
+    }
+
+    // ScheduledExecutorService executorService =
+    // Executors.newScheduledThreadPool(2);
+    // executorService.scheduleWithFixedDelay(() -> {
+    // try {
+    // pushFinance_W01001();
+    // pushFinance_W01002();
+    // pushFinance_W01004("202401");
+    // pushFinance_W01004("202402");
+    // pushFinance_W01004("202403");
+    // pushFinance_W01004("202404");
+    // pushFinance_W01004("202405");
+    // pushFinance_W01004("202406");
+    // pushFinance_W01004("202407");
+    // pushFinance_W01004("202408");
+    // pushFinance_W01003();
+    // } catch (Exception e) {
+    // e.printStackTrace();
+    // }
+    // }, 0, 20, TimeUnit.SECONDS);
+}

+ 116 - 0
easydo-chengfa/src/main/java/easydo/technology/enums/ChengfaEnum.java

@@ -0,0 +1,116 @@
+package easydo.technology.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ChengfaEnum {
+    // 审批流类型
+    BUS_APPROVE_TYPE_PURCHASE_PLAN("purchase_plan", "采购计划"),
+    BUS_APPROVE_TYPE_PURCHASE("purchase", "采购申请"),
+    BUS_APPROVE_TYPE_PURCHASE_MATTER("purchase_matter", "事项审批"),
+    BUS_APPROVE_TYPE_PURCHASE_BID_SIGN("purchase_bid_sign", "招标会签"),
+    BUS_APPROVE_TYPE_PURCHASE_ANSWER_SIGN("purchase_answer_sign", "答疑会签"),
+    BUS_APPROVE_TYPE_PURCHASE_BID_NOTICE("purchase_bid_notice", "招标通知"),
+    BUS_APPROVE_TYPE_SUPPLIER_EVALUATE("supplier_evaluate", "供应商评价"),
+    // 审批流结束标识
+
+    BUS_APPROVE_APPROVE_STATUS_APPROVE("approve", "发起审批流,待审批"),
+    BUS_APPROVE_APPROVE_STATUS_DONE("done", "审批流结束标识"),
+    // 审批结果
+    BUS_APPROVE_APPROVE_RESULT_Y("y", "审批通过"),
+    BUS_APPROVE_APPROVE_RESULT_N("n", "审批驳回"),
+    // 招采计划的状态
+    PURCHASE_PALN_STATUS_ACTIVE("active", "已保存,待发起审批"),
+    PURCHASE_PALN_STATUS_APPROVE("approve", "待审批"),
+    PURCHASE_PALN_STATUS_DONE("done", "已审批"),
+    // 招采过程中的类型
+    PURCHASE_TYOE_MATTER("matter", "事项"),
+    PURCHASE_TYOE_PURCHASE("purchase", "采购"),
+
+    // 招采过程的状态
+    PURCHASE_STATUS_ACTIVE("active", "已保存,待发起审批"),
+    PURCHASE_STATUS_APPROVE("approve", "待审批"),
+    PURCHASE_STATUS_DONE("done", "已审批"),
+    // 招采过程的操作步骤
+    PURCHASE_STEP_PURCHASE_APPLY("purchase_apply", "采购申请"),
+    PURCHASE_STEP_PURCHASE_MATTER("purchase_matter", "事项审批"),
+    PURCHASE_STEP_PURCHASE_BID_SIGN("purchase_bid_sign", "招标会签"),
+    PURCHASE_STEP_PURCHASE_ANSWER_SIGN("purchase_answer_sign", "答疑会签"),
+    PURCHASE_STEP_PURCHASE_BID_NOTICE("purchase_bid_notice", "招标通知"),
+    // 供应商评价主表的状态
+    SUPPLIER_EVALUATE_STATUS_ACTIVE("active", "待评价"),
+    SUPPLIER_EVALUATE_STATUS_EVALUATE("evaluate", "待评价"),
+    SUPPLIER_EVALUATE_STATUS_DONE("done", "已评价"),
+    // 供应商评价子表的状态
+    SUPPLIER_EVALUATE_DETAIL_STATUS_ACTIVE("active", "待激活"),
+    SUPPLIER_EVALUATE_DETAIL_STATUS_EVALUATE("evaluate", "待评价"),
+    SUPPLIER_EVALUATE_DETAIL_STATUS_DONE("done", "已审批"),
+    // 自动生成编号的类型
+    FLOWNO_TYPE_PURCHASE("purchase", "采购编号"),
+    FLOWNO_TYPE_PURCHASE_PLAN("purchase_plan", "采购计划编号"),
+    FLOWNO_TYPE_PURCHASE_ANSWER_SIGN("purchase_answer_sign", "答疑会签编号"),
+    FLOWNO_TYPE_PURCHASE_BID_NOTICE("purchase_bid_notice", "招标结果通知编号"),
+    FLOWNO_TYPE_PURCHASE_BID_SIGN("purchase_bid_sign", "招标会签编号"),
+    FLOWNO_TYPE_PURCHASE_MATTER("purchase_matter", "事项审批编号"),
+    //消息所属业务
+    MESSAGE_TYPE_SUPPLIER_EVALUATE("supplier_evaluate", "供应商评价消息"),
+    MESSAGE_TYPE_PURCHASE("purchase", "采购消息"),
+    MESSAGE_TYPE_PURCHASE_PLAN("purchase_plan", "采购计划消息"),
+    MESSAGE_TYPE_PURCHASE_ANSWER_SIGN("purchase_answer_sign", "答疑会签消息"),
+    MESSAGE_TYPE_PURCHASE_BID_NOTICE("purchase_bid_notice", "招标结果通知消息"),
+    MESSAGE_TYPE_PURCHASE_BID_SIGN("purchase_bid_sign", "招标会签消息"),
+    MESSAGE_TYPE_PURCHASE_MATTER("purchase_matter", "事项审批消息"),
+
+
+    REDIS_KEY_SUPPLIER_EVALUATE_RULE("supplier_evaluate_rule", "供应商评价规则"),
+
+    CONTRACT_PLAN_USE_STATE_NO_USE("No_Use", "未占用"),
+    CONTRACT_PLAN_USE_STATE_PRE_USE("Pre_Use", "未占用"),
+    CONTRACT_PLAN_USE_STATE_IN_USE("In_Use", "未占用"),
+
+    APPROVE_STATE_UNSTARTED("UNSTARTED","未开始"),
+    APPROVE_STATE_PROCESSING("PROCESSING","处理中"),
+    APPROVE_STATE_REJECTED("REJECTED","驳回"),
+    APPROVE_STATE_STOP("STOP","终止"),
+    APPROVE_STATE_ENDED("ENDED","结束"),
+
+    APPROVE_TOPIC_STARTED("STARTED","开始"),
+    APPROVE_TOPIC_COMPLETED("COMPLETED","处理/通过"),
+    APPROVE_TOPIC_STOPPED("STOPPED","终止"),
+    APPROVE_TOPIC_REJECTED("REJECTED","拒绝"),
+    APPROVE_TOPIC_ENDED("ENDED","完成/结束"),
+    ;
+
+    ChengfaEnum(String value, String comment) {
+        this.value = value;
+        this.comment = comment;
+    }
+
+    private static Map<String, ChengfaEnum> typelookup = new HashMap<>();
+
+    static {
+        for (ChengfaEnum mspEnum : ChengfaEnum.values()) {
+            typelookup.put(mspEnum.value, mspEnum);
+        }
+    }
+
+    public static boolean isContainsValue(String type) {
+        return typelookup.containsKey(type);
+    }
+
+    public static ChengfaEnum forType(String type) {
+        return typelookup.get(type);
+    }
+
+    private String value;
+    private String comment;
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+}

+ 35 - 0
easydo-chengfa/src/main/java/easydo/technology/exception/BizException.java

@@ -0,0 +1,35 @@
+package easydo.technology.exception;
+
+import lombok.Getter;
+
+/**
+ * 自定义业务异常类
+ * @author qiguliuxing
+ * @since 1.0.0
+ */
+public class BizException extends RuntimeException {
+
+    @Getter
+    private int code;
+
+    @Getter
+    private String message;
+
+    public BizException(String message) {
+        super(message);
+        this.code = -999;
+        this.message = message;
+    }
+
+    public BizException(int code, String message) {
+        super(message);
+        this.code = code;
+        this.message = message;
+    }
+
+    public BizException(int code, String message, Throwable cause) {
+        super(message, cause);
+        this.code = code;
+        this.message = message;
+    }
+}

+ 16 - 0
easydo-chengfa/src/main/java/easydo/technology/model/BusApprove.java

@@ -0,0 +1,16 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class BusApprove {
+    private String id;
+    private String busId;
+    private String busType;
+    private String taskId;
+    private String approveStatus;
+    private String approveResult;
+    private String remark;
+    private String createTime;
+
+}

+ 13 - 0
easydo-chengfa/src/main/java/easydo/technology/model/BusFlowNo.java

@@ -0,0 +1,13 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class BusFlowNo {
+    private String type;
+    private String prefix;
+    private String currDate;
+    private String currNo;
+    private Integer currSeq;
+
+}

+ 15 - 0
easydo-chengfa/src/main/java/easydo/technology/model/CftzBankInfo.java

@@ -0,0 +1,15 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class CftzBankInfo {
+    private String id;
+    private String sysBankCode;
+    private String bankName;
+    private String bankName2;
+    private String bankPrefix;
+    private String provInputName;
+    private String bankCityCode;
+    private String name;
+}

+ 18 - 0
easydo-chengfa/src/main/java/easydo/technology/model/GldDept.java

@@ -0,0 +1,18 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class GldDept {
+    private Long id;
+    private String name;
+    private Boolean deleted;
+    private String type;
+    private String createTime;
+    private String updateTime;
+    private String displayName;
+    private Long tenantId;
+    private String treePath;
+    private Boolean hasDeptRight;
+    private String code;
+}

+ 26 - 0
easydo-chengfa/src/main/java/easydo/technology/model/GldMember.java

@@ -0,0 +1,26 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class GldMember {
+    private Long id;
+    private String deptName;
+    private Boolean admin;
+    private Boolean enabled;
+    private String loginName;
+    private String email;
+    private String sex;
+    private Long deptId;
+    private Boolean active;
+    private String updateTime;
+    private String createTime;
+    private Boolean isAdmin;
+    private Long userId;
+    private Long accountId;
+    private String phone;
+    private String name;
+    private Long tenantId;
+    private String gldAccountId;
+
+}

+ 21 - 0
easydo-chengfa/src/main/java/easydo/technology/model/GldProject.java

@@ -0,0 +1,21 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class GldProject {
+    private Long id;
+    private String code;
+    private String projectTypeCode;
+    private String parentDeptName;
+    private String address;
+    private Long deptId;
+    private String fullName;
+    private Boolean active;
+    private String simpleName;
+    private String createTime;
+    private String name;
+    private String projectName;
+    private Long parentDeptId;
+
+}

+ 19 - 0
easydo-chengfa/src/main/java/easydo/technology/model/GldTenant.java

@@ -0,0 +1,19 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class GldTenant {
+    private Long id;
+    private String product;
+    private String code;
+    private String purpose;
+    private String contactName;
+    private String sex;
+    private Boolean active;
+    private String createTime;
+    private String updateTime;
+    private String type;
+    private String loginName;
+    private String contactPhone;
+}

+ 15 - 0
easydo-chengfa/src/main/java/easydo/technology/model/Message.java

@@ -0,0 +1,15 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class Message {
+    private String id;
+    private String refType;
+    private String refId;
+    private Long receiveUserId;
+    private String receiveUserName;
+    private String content;
+    private String createTime;
+
+}

+ 41 - 0
easydo-chengfa/src/main/java/easydo/technology/model/OaPurchaseInfo.java

@@ -0,0 +1,41 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class OaPurchaseInfo {
+    private String id;
+    private String createUserCode;
+    private String bidCreateUserCode;
+    private String companyUnitCode;
+    private String companyName;
+    private String purchaseName;
+    private String bidSupplierName;
+    private String purchaseNo;
+    private String purchaseCreateTime;
+    private String purchaseEndTime;
+    private String purchaseUrl;
+    private String bidSignNo;
+    private String bidSignCreateTime;
+    private String bidSignEndTime;
+    private String bidSignUrl;
+    private String bidAnswerNo;
+    private String bidAnswerCreateTime;
+    private String bidAnswerEndTime;
+    private String bidAnswerUrl;
+    private String matterNo;
+    private String matterCreateTime;
+    private String matterEndTime;
+    private String matterUrl;
+    private String bidNoticeNo;
+    private String bidNoticeCreateTime;
+    private String bidNoticeEndTime;
+    private String bidNoticeUrl;
+    private Integer status;
+    private Integer dataSource;
+    private String projectCode;
+    private String projectName;
+    private String purchaseType;
+    private Integer isShare;
+
+}

+ 22 - 0
easydo-chengfa/src/main/java/easydo/technology/model/ProjectInfo.java

@@ -0,0 +1,22 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class ProjectInfo {
+    private Long id;
+    private String projectNo;
+    private String projectName;
+    private Long deptId;
+    private String projectAddr;
+    private String resPersonName;
+    private String contractBeginDate;
+    private String contractEndDate;
+    private String licenceSgNo;
+    private String licenceAuthority;
+    private String projectStatus;
+    private String projectScale;
+    private Integer projectMoney;
+    private String remark;
+    private Long gldDeptId;
+}

+ 70 - 0
easydo-chengfa/src/main/java/easydo/technology/model/Purchase.java

@@ -0,0 +1,70 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/apply", maxLimit = 10)
+})
+public class Purchase extends ZeroSpringFolder<Purchase> {
+    @ZSFLinkField
+    private String id;
+    private String planId;
+    private String planName;
+    private String name;
+    private Long deptId;
+    private String type;
+    private Boolean isInPlan;
+    private BigDecimal budgetAmount;
+    private String fundSource;
+    private String projectNo;
+    private Long projectId;
+    private String suggestion;
+    private String purchaseNo;
+    private String director;
+    private String method;
+    private String approveResult;
+    private String createTime;
+    private String createName;
+    private Long createId;
+    private String status;
+    private String step;
+    private String purchaseType;
+    private Long belongDeptId;
+    private Integer isShare;
+    private String endTime;
+    private Boolean isHaveContract;
+
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+
+    @NotTableField
+    private List<PurchaseContract> contractList;
+    @NotTableField
+    private PurchaseBidNotice bidNotice;
+    @NotTableField
+    private PurchaseBidSign bidSign;
+    @NotTableField
+    private PurchaseMatter matter;
+    @NotTableField
+    private PurchaseAnswerSign answerSign;
+    @NotTableField
+    private PurchasePlan plan;
+    @NotTableField
+    private String templateId;
+    @NotTableField
+    private Integer oaStatus;
+}

+ 37 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchaseAnswerSign.java

@@ -0,0 +1,37 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/answersign")
+})
+public class PurchaseAnswerSign extends ZeroSpringFolder<PurchaseAnswerSign> {
+    @ZSFLinkField
+    private String id;
+    private String purchaseId;
+    private String approveTitle;
+    private String signName;
+    private String remark;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    private String status;
+    private String endTime;
+    private String businessNo;
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+
+    @NotTableField
+    private String templateId;
+}

+ 54 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchaseBidNotice.java

@@ -0,0 +1,54 @@
+package easydo.technology.model;
+
+import java.math.BigDecimal;
+
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/bidnotice")
+})
+public class PurchaseBidNotice extends ZeroSpringFolder<PurchaseBidNotice> {
+    @ZSFLinkField
+    private String id;
+    private String purchaseId;
+    private String approveTitle;
+    private String bidCompanyIds;
+    private String remark;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    private String status;
+    private BigDecimal bidAmount;
+    private String bidCompanyName;
+    private String endTime;
+    private String businessNo;
+    private BigDecimal controlAmount;
+    private Long projectId;
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+    private String bidAgency;
+    private String bidPlatform;
+
+    @NotTableField
+    private String templateId;
+
+    @NotTableField
+    private String purchaseName;
+    @NotTableField
+    private String purchaseNo;
+    @NotTableField
+    private String contractPlanCode;
+    @NotTableField
+    private String contractPlanName;
+}

+ 37 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchaseBidSign.java

@@ -0,0 +1,37 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/bidsign")
+})
+public class PurchaseBidSign extends ZeroSpringFolder<PurchaseBidSign> {
+    @ZSFLinkField
+    private String id;
+    private String purchaseId;
+    private String approveTitle;
+    private String signName;
+    private String remark;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    private String status;
+    private String endTime;
+    private String businessNo;
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+
+    @NotTableField
+    private String templateId;
+}

+ 33 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchaseContract.java

@@ -0,0 +1,33 @@
+package easydo.technology.model;
+
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/contract")
+})
+public class PurchaseContract extends ZeroSpringFolder<PurchaseContract> {
+    @ZSFLinkField
+    private String id;
+    private String purchaseId;
+    private String contractNo;
+    private String contractName;
+    private String createTime;
+    private String supplierId;
+    private String supplierNo;
+    private String supplierName;
+    private Long projectId;
+    private BigDecimal signAmount;
+    private String endTime;
+    private String objectId;
+    private String fileName;
+
+}

+ 37 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchaseMatter.java

@@ -0,0 +1,37 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "purchase/matter")
+})
+public class PurchaseMatter extends ZeroSpringFolder<PurchaseMatter> {
+    @ZSFLinkField
+    private String id;
+    private String purchaseId;
+    private String approveTitle;
+    private String matterName;
+    private String remark;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    private String status;
+    private String endTime;
+    private String businessNo;
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+
+    @NotTableField
+    private String templateId;
+}

+ 43 - 0
easydo-chengfa/src/main/java/easydo/technology/model/PurchasePlan.java

@@ -0,0 +1,43 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class PurchasePlan {
+    private String id;
+    private String planName;
+    private String type;
+    private Boolean isInPlan;
+    private Long contractPlanId;
+    private String contractPlanCode;
+    private String contractPlanName;
+    private BigDecimal budgetAmount;
+    private String beginDate;
+    private String endDate;
+    private Long deptId;
+    private String deptName;
+    private String status;
+    private String enterDate;
+    private String createTime;
+    private String createId;
+    private String createName;
+    private String approveStatus;
+    private Long projectId;
+    private String projectNo;
+    private Long belongDeptId;
+    private String endTime;
+    private String businessNo;
+
+
+    private String processState;
+    private String processTaskId;
+    private String processInstanceId;
+    private String processTemplateId;
+
+
+    @NotTableField
+    private String templateId;
+}

+ 56 - 0
easydo-chengfa/src/main/java/easydo/technology/model/Supplier.java

@@ -0,0 +1,56 @@
+package easydo.technology.model;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import easydo.technology.annotation.NotTableField;
+import easydo.technology.annotations.ZSFContainer;
+import easydo.technology.annotations.ZSFContainers;
+import easydo.technology.annotations.ZSFLinkField;
+import easydo.technology.core.ZeroSpringFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ZSFContainers({
+        @ZSFContainer(directory = "supplier/attach", maxLimit = 10)
+})
+public class Supplier extends ZeroSpringFolder<Supplier> {
+    @ZSFLinkField
+    private String id;
+    private String supplierName;
+    private String supplierNo;
+    private String createTime;
+    private String updateTime;
+    private String supplierTypeId;
+    private String creditCode;
+    private String contactName;
+    private String establishDate;
+    private Long deptId;
+    private BigDecimal registerAmount;
+    private String companyType;
+    private String contactPhone;
+    private String businessScope;
+    private String address;
+    private String remark;
+
+    private String contactIdCard;
+    private String licenceDate;
+    private String region;
+    private String city;
+    private String province;
+    private String postcode;
+    private String telephone;
+    private String provinceCode;
+    private String cityCode;
+    private String regionCode;
+
+    @NotTableField
+    private Integer bidCount;
+    @NotTableField
+    private BigDecimal totalAmount;
+    @NotTableField
+    private List<SupplierBank> bankList;
+}

+ 19 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SupplierBank.java

@@ -0,0 +1,19 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class SupplierBank {
+    private String id;
+    private String supplierId;
+    private String bankId;
+    private String sysBankCode;
+    private String bankName;
+    private String bankName2;
+    private String bankPrefix;
+    private String provInputName;
+    private String bankCityCode;
+    private String name;
+    private String accountName;
+    private String accountCode;
+}

+ 12 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SupplierContractRef.java

@@ -0,0 +1,12 @@
+package easydo.technology.model;
+
+import lombok.Data;
+
+@Data
+public class SupplierContractRef {
+    private String id;
+    private String contractId;
+    private String supplierId;
+    private String createTime;
+
+}

+ 32 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SupplierEvaluate.java

@@ -0,0 +1,32 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class SupplierEvaluate {
+    private String id;
+    private String contractId;
+    private String evaluateType;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    private BigDecimal score;
+    private String grade;
+    private String evaluateFinishTime;
+    private String status;
+    private String supplierId;
+    private String supplierTypeId;
+
+    @NotTableField
+    private List<SupplierEvaluateDetail> evaluateDetailList;
+    @NotTableField
+    private Supplier supplier;
+    @NotTableField
+    private PurchaseContract contract;
+    @NotTableField
+    private Integer commonCount;
+}

+ 23 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SupplierEvaluateDetail.java

@@ -0,0 +1,23 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SupplierEvaluateDetail {
+    private String id;
+    private String evaluateId;
+    private Long evaluatorId;
+    private String evaluatorName;
+    private Double score;
+    private String grade;
+    private String evaluateTime;
+    private String createTime;
+    private String status;
+    private Integer zlScore;
+    private Integer zsScore;
+    private Integer fwScore;
+    private Integer qtScore;
+}

+ 18 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SupplierType.java

@@ -0,0 +1,18 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.NotTableField;
+import lombok.Data;
+
+@Data
+public class SupplierType {
+    private String id;
+    private String name;
+    private String number;
+    private String pid;
+    private String createTime;
+    private Long createId;
+    private String createName;
+    @NotTableField
+    private Boolean hasChildren;
+
+}

+ 28 - 0
easydo-chengfa/src/main/java/easydo/technology/model/SysUser.java

@@ -0,0 +1,28 @@
+package easydo.technology.model;
+
+import easydo.technology.annotation.TableKey;
+import lombok.Data;
+
+@Data
+public class SysUser {
+    @TableKey
+    private Long userId;
+    private Long deptId;
+    private String username;
+    private String nickName;
+    private String gender;
+    private String phone;
+    private String email;
+    private String avatarName;
+    private String avatarPath;
+    private String password;
+    private String isAdmin;
+    private Boolean enabled;
+    private String createBy;
+    private String updateBy;
+    private String createTime;
+    private String updateTime;
+    private String originPassword;
+    private String code;
+    private String idCard;
+}

+ 24 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/ContractVo.java

@@ -0,0 +1,24 @@
+package easydo.technology.model.vo;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+
+@Data
+public class ContractVo {
+    private String purchaseName;
+    private String purchaseNo;
+    private String purchaseId;
+    private BigDecimal contractAmount;
+    private String contractNo;
+    private String contractName;
+    private String contractCreateTime;
+    private String contractEndTime;
+    private String contractSignDate;
+    private Long projectId;
+    private String projectName;
+    private String token;
+    private String supplierName;
+    private String supplierId;
+    private String supplierNo;
+}

+ 11 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/DictVo.java

@@ -0,0 +1,11 @@
+package easydo.technology.model.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class DictVo {
+    private String grade;
+    private BigDecimal score;
+}

+ 19 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/GLDApproveVo.java

@@ -0,0 +1,19 @@
+package easydo.technology.model.vo;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+@Data
+public class GLDApproveVo {
+    private String subject;
+    private String startPos;
+    private String startPosName;
+    private String templateId;
+    private Integer targetId;
+    private String targetType;
+    private Boolean hiddenResubmit;
+    private JSONObject extData;
+    private String taskId;
+    private String instanceId;
+    private String state;
+}

+ 17 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/GLDContract.java

@@ -0,0 +1,17 @@
+package easydo.technology.model.vo;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+
+@Data
+public class GLDContract {
+    private String name;
+    private String code;
+    private BigDecimal taxAmount;
+    private String createTime;
+    private String approvedEndTime;
+    private String secondPartyCompany;
+    private String objectId;
+    private String fileName;
+}

+ 16 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMDept.java

@@ -0,0 +1,16 @@
+package easydo.technology.model.vo;
+
+import lombok.Data;
+
+@Data
+public class MDMDept {
+    private String _ID;
+    private String C_INTERNAL_UNIT_CODE;
+    private String C_FULLNAME;
+    private String C_ADDRESS;
+    private String C_UNIFIED_SOCIALCREDIT_CODE;
+    private String C_PHONE;
+    private String _STATUS;
+    private String _CREATE_TIME;
+    private String C_HR_MANAGEMENT_UNIT;
+}

+ 9 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMSupplier.java

@@ -0,0 +1,9 @@
+package easydo.technology.model.vo;
+
+import lombok.Data;
+
+@Data
+public class MDMSupplier {
+    private String C_UNISOCIALCREDIT_CODE;
+    private String C_EXTERNAL_UNIT_CODE;
+}

+ 17 - 0
easydo-chengfa/src/main/java/easydo/technology/model/vo/MDMUser.java

@@ -0,0 +1,17 @@
+package easydo.technology.model.vo;
+
+import lombok.Data;
+
+@Data
+public class MDMUser {
+    private String _ID;
+    // private String C_SYSTEM_CODE;
+    private String C_MOBILEPHONE_NUMBER ;
+    private String _CREATE_TIME;
+    private String C_GENDER;
+    private String C_USER_CODE;
+    private String STATUS;
+    private String C_USER_NAME;
+    private String C_IDENTITY_NUMBER;
+    private String C_INTERNAL_DEPARTMENT;
+}

+ 57 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/config/JobRunner.java

@@ -0,0 +1,57 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.config;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.quartz.domain.SysQuartzJob;
+import easydo.technology.quartz.utils.QuartzManage;
+import lombok.RequiredArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@RequiredArgsConstructor
+@Profile({"prod", "test"})
+public class JobRunner implements ApplicationRunner {
+    private static final Logger log = LoggerFactory.getLogger(JobRunner.class);
+    private final JdbcClient jdbcClient;
+    private final QuartzManage quartzManage;
+
+    /**
+     * 项目启动时重新激活启用的定时任务
+     *
+     * @param applicationArguments /
+     */
+    @Override
+    public void run(ApplicationArguments applicationArguments) throws Exception {
+
+        log.info("--------------------注入定时任务---------------------");
+        Map<String, Object> map = new HashMap<>();
+        map.put("is_pause", 0);
+        List<SysQuartzJob> quartzJobs = jdbcClient.getJdbcList(map, SysQuartzJob.class);
+
+        quartzJobs.forEach(quartzManage::addJob);
+        log.info("--------------------定时任务注入完成---------------------");
+    }
+}

+ 67 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/config/QuartzConfig.java

@@ -0,0 +1,67 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.config;
+
+import org.quartz.Scheduler;
+import org.quartz.spi.TriggerFiredBundle;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.quartz.AdaptableJobFactory;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.stereotype.Component;
+
+@Configuration
+public class QuartzConfig {
+
+	/**
+	 * 解决Job中注入Spring Bean为null的问题
+	 */
+	@Component("quartzJobFactory")
+	public static class QuartzJobFactory extends AdaptableJobFactory {
+
+		private final AutowireCapableBeanFactory capableBeanFactory;
+
+		public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
+			this.capableBeanFactory = capableBeanFactory;
+		}
+
+		@Override
+		protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
+
+			//调用父类的方法
+			Object jobInstance = super.createJobInstance(bundle);
+			capableBeanFactory.autowireBean(jobInstance);
+			return jobInstance;
+		}
+	}
+
+	/**
+	 * 注入scheduler到spring
+	 * @param quartzJobFactory /
+	 * @return Scheduler
+	 * @throws Exception /
+	 */
+	@Bean(name = "scheduler")
+	public Scheduler scheduler(QuartzJobFactory quartzJobFactory) throws Exception {
+		SchedulerFactoryBean factoryBean=new SchedulerFactoryBean();
+		factoryBean.setJobFactory(quartzJobFactory);
+		factoryBean.afterPropertiesSet();
+		Scheduler scheduler=factoryBean.getScheduler();
+		scheduler.start();
+		return scheduler;
+	}
+}

+ 51 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/domain/QuartzLog.java

@@ -0,0 +1,51 @@
+package easydo.technology.quartz.domain;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@TableName("sys_quartz_log")
+public class QuartzLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    @TableId(value = "log_id")
+    private String id;
+
+    private String beanName;
+
+    @TableField(fill= FieldFill.INSERT)
+    private Date createTime;
+
+    private String cronExpression;
+
+    private String exceptionDetail;
+
+    private Boolean isSuccess;
+
+    private String jobName;
+
+    private String methodName;
+
+    private String params;
+
+    private Long time;
+
+    public void copyFrom(QuartzLog source){
+        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
+    }
+}

+ 74 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/domain/SysQuartzJob.java

@@ -0,0 +1,74 @@
+package easydo.technology.quartz.domain;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = false)
+@TableName("sys_quartz_job")
+public class SysQuartzJob implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String JOB_KEY = "JOB_KEY";
+
+    @TableId(value = "job_id", type= IdType.AUTO)
+    private Long id;
+
+    @TableField(exist = false)
+    private String uuid;
+
+    private String beanName;
+
+    private String cronExpression;
+
+    private Boolean isPause;
+
+    private String jobName;
+
+    private String methodName;
+
+    private String params;
+
+    private String description;
+
+    private String personInCharge;
+
+    private String email;
+
+    private String subTask;
+
+    private Boolean pauseAfterFailure;
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    public void copyFrom(SysQuartzJob source){
+        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
+    }
+
+    /* 分组校验 */
+    public @interface Create {
+    }
+
+    /* 分组校验 */
+    public @interface Update {
+    }
+}

+ 10 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/mapper/QuartzLogMapper.java

@@ -0,0 +1,10 @@
+package easydo.technology.quartz.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import easydo.technology.quartz.domain.QuartzLog;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface QuartzLogMapper extends BaseMapper<QuartzLog> {
+
+}

+ 239 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/task/JobTask.java

@@ -0,0 +1,239 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.task;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.*;
+import easydo.technology.model.vo.GLDContract;
+import easydo.technology.service.GLDCostService;
+import easydo.technology.service.GLDMasterService;
+import easydo.technology.system.domain.SysDept;
+import easydo.technology.utils.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 定时任务
+ */
+@Slf4j
+@Component
+public class JobTask {
+    @Resource
+    DataSource dataSource;
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    GLDMasterService gldMasterService;
+    @Resource
+    GLDCostService gldCostService;
+
+    protected void pullDeptFromGldMaster() throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            List<GldDept> existList = jdbcClient.getJdbcList(new HashMap<>(), GldDept.class, connection);
+            List<GldDept> list = gldMasterService.getGetDept();
+            for (GldDept model : list) {
+                List<GldDept> filterList = existList.stream().filter(exist -> model.getId().equals(exist.getId()))
+                        .collect(Collectors.toList());
+                if (filterList.size() > 0) {
+                    jdbcClient.jdbcUpdateById(model, connection);
+                } else {
+                    jdbcClient.jdbcInsert(model, connection);
+                }
+            }
+            connection.commit();
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    protected void pullMemberFromGldMaster() throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            List<GldMember> existList = jdbcClient.getJdbcList(new HashMap<>(), GldMember.class, connection);
+            List<GldMember> list = gldMasterService.getGetMember();
+            for (GldMember model : list) {
+                List<GldMember> filterList = existList.stream().filter(exist -> model.getId().equals(exist.getId()))
+                        .collect(Collectors.toList());
+                if (filterList.size() > 0) {
+                    jdbcClient.jdbcUpdateById(model, connection);
+                } else {
+                    jdbcClient.jdbcInsert(model, connection);
+                }
+            }
+            connection.commit();
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    protected void pullProjectFromGldMaster() throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            List<GldProject> existGLDList = jdbcClient.getJdbcList(new HashMap<>(), GldProject.class, connection);
+            List<ProjectInfo> existProjList = jdbcClient.getJdbcList(new HashMap<>(), ProjectInfo.class, connection);
+            List<GldProject> list = gldMasterService.getGetProject();
+            for (GldProject model : list) {
+                List<GldProject> filterList = existGLDList.stream().filter(exist -> model.getId().equals(exist.getId()))
+                        .collect(Collectors.toList());
+                if (filterList.size() > 0) {
+                    jdbcClient.jdbcUpdateById(model, connection);
+                } else {
+                    jdbcClient.jdbcInsert(model, connection);
+                }
+                List<ProjectInfo> filterProjList = existProjList.stream()
+                        .filter(exist -> model.getId().equals(exist.getId())).collect(Collectors.toList());
+                ProjectInfo info = new ProjectInfo();
+                info.setId(model.getId());
+                info.setProjectAddr(model.getAddress());
+                info.setProjectName(model.getProjectName());
+                info.setProjectNo(model.getCode());
+                if (model.getActive()) {
+                    info.setProjectStatus("active");
+                } else {
+                    info.setProjectStatus("inactive");
+                }
+                info.setGldDeptId(model.getDeptId());
+                GldDept gldDept = new GldDept();
+                gldDept.setId(model.getDeptId());
+                gldDept = jdbcClient.getJdbcModel(gldDept, connection);
+                if (StringUtil.isEmpty(gldDept.getCode())) {
+                    continue;
+                }
+                SysDept dept = new SysDept();
+                dept.setCode(gldDept.getCode());
+                dept = jdbcClient.getJdbcModel(dept, connection);
+                if (StringUtil.isEmpty(dept.getDeptId())) {
+                    info.setDeptId((long) 1);
+                } else {
+                    info.setDeptId(dept.getDeptId());
+                }
+
+                if (filterProjList.size() > 0) {
+                    jdbcClient.jdbcUpdateById(info, connection);
+                } else {
+                    jdbcClient.jdbcInsert(info, connection);
+                }
+            }
+            connection.commit();
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    protected void pullTenantFromGldMaster() throws Exception {
+        Connection connection = null;
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+
+            List<GldTenant> existList = jdbcClient.getJdbcList(new HashMap<>(), GldTenant.class, connection);
+            List<GldTenant> list = gldMasterService.getGetTenant();
+            for (GldTenant model : list) {
+                List<GldTenant> filterList = existList.stream().filter(exist -> model.getId().equals(exist.getId()))
+                        .collect(Collectors.toList());
+                if (filterList.size() > 0) {
+                    jdbcClient.jdbcUpdateById(model, connection);
+                } else {
+                    jdbcClient.jdbcInsert(model, connection);
+                }
+            }
+            connection.commit();
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+
+    protected void pullContractFromGld() throws Exception {
+        Connection connection = null;
+        Map<String, Object> map = new HashMap<>();
+        try {
+            connection = dataSource.getConnection();
+            connection.setAutoCommit(false);
+            map.put("isHaveContract", 0);
+            map.put("projectIdBegin", 1);
+            List<Purchase> list = jdbcClient.getJdbcList(map, Purchase.class, connection);
+            for (Purchase model : list) {
+                List<GLDContract> contractList = gldCostService.getContractList(model.getProjectId(),
+                        model.getPurchaseNo());
+                if (!contractList.isEmpty()) {
+                    PurchaseBidNotice bidNotice = new PurchaseBidNotice();
+                    bidNotice.setPurchaseId(model.getId());
+                    bidNotice = jdbcClient.getJdbcModel(bidNotice, connection);
+                    Supplier supplier = new Supplier();
+                    supplier.setId(bidNotice.getBidCompanyIds());
+                    supplier = jdbcClient.getJdbcModel(supplier, connection);
+                
+                    for (GLDContract contract : contractList) {
+                        PurchaseContract purchaseContract = new PurchaseContract();
+                        purchaseContract.setPurchaseId(model.getId());
+                        purchaseContract.setProjectId(model.getProjectId());
+                        purchaseContract.setContractName(contract.getName());
+                        purchaseContract.setContractNo(contract.getCode());
+                        purchaseContract.setSignAmount(contract.getTaxAmount());
+                        purchaseContract.setCreateTime(contract.getCreateTime());
+                        purchaseContract.setEndTime(contract.getApprovedEndTime());
+                        purchaseContract.setObjectId(contract.getObjectId());
+                        purchaseContract.setFileName(contract.getFileName());
+                        purchaseContract.setSupplierId(supplier.getId());
+                        purchaseContract.setSupplierName(supplier.getSupplierName());
+                        purchaseContract.setSupplierNo(supplier.getSupplierNo());
+                        jdbcClient.jdbcInsert(purchaseContract, connection);
+                    }
+                    model.setIsHaveContract(true);
+                    jdbcClient.jdbcUpdateById(model, connection);
+                }
+            }
+
+            connection.commit();
+        } catch (Exception e) {
+            connection.rollback();
+            throw new BizException(e.getMessage());
+        } finally {
+            jdbcClient.finallyExecute(connection);
+        }
+    }
+}

+ 70 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/thread/AsyncTaskExecutePool.java

@@ -0,0 +1,70 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.thread;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 异步任务线程池装配类
+ * @author https://juejin.im/entry/5abb8f6951882555677e9da2
+ * @date 2019年10月31日15:06:18
+ */
+@Slf4j
+@Configuration
+public class AsyncTaskExecutePool implements AsyncConfigurer {
+
+    /** 注入配置类 */
+    private final AsyncTaskProperties config;
+
+    public AsyncTaskExecutePool(AsyncTaskProperties config) {
+        this.config = config;
+    }
+
+    @Override
+    public Executor getAsyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //核心线程池大小
+        executor.setCorePoolSize(config.getCorePoolSize());
+        //最大线程数
+        executor.setMaxPoolSize(config.getMaxPoolSize());
+        //队列容量
+        executor.setQueueCapacity(config.getQueueCapacity());
+        //活跃时间
+        executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
+        //线程名字前缀
+        executor.setThreadNamePrefix("el-async-");
+        // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
+        // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        executor.initialize();
+        return executor;
+    }
+
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return (throwable, method, objects) -> {
+            log.error("===="+throwable.getMessage()+"====", throwable);
+            log.error("exception method:"+method.getName());
+        };
+    }
+}

+ 39 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/thread/AsyncTaskProperties.java

@@ -0,0 +1,39 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.thread;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 线程池配置属性类
+ * @author https://juejin.im/entry/5abb8f6951882555677e9da2
+ * @date 2019年10月31日14:58:18
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "task.pool")
+public class AsyncTaskProperties {
+
+    private int corePoolSize;
+
+    private int maxPoolSize;
+
+    private int keepAliveSeconds;
+
+    private int queueCapacity;
+}

+ 63 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/thread/TheadFactoryName.java

@@ -0,0 +1,63 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.thread;
+
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 自定义线程名称
+ * @author Zheng Jie
+ * @date 2019年10月31日17:49:55
+ */
+@Component
+public class TheadFactoryName implements ThreadFactory {
+
+    private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
+    private final ThreadGroup group;
+    private final AtomicInteger threadNumber = new AtomicInteger(1);
+    private final String namePrefix;
+
+    public TheadFactoryName() {
+        this("el-pool");
+    }
+
+    private TheadFactoryName(String name){
+        SecurityManager s = System.getSecurityManager();
+        group = (s != null) ? s.getThreadGroup() :
+                Thread.currentThread().getThreadGroup();
+        //此时namePrefix就是 name + 第几个用这个工厂创建线程池的
+        this.namePrefix = name +
+                POOL_NUMBER.getAndIncrement();
+    }
+
+    @Override
+    public Thread newThread(Runnable r) {
+        //此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
+        Thread t = new Thread(group, r,
+                namePrefix + "-thread-"+threadNumber.getAndIncrement(),
+                0);
+        if (t.isDaemon()) {
+            t.setDaemon(false);
+        }
+        if (t.getPriority() != Thread.NORM_PRIORITY) {
+            t.setPriority(Thread.NORM_PRIORITY);
+        }
+        return t;
+    }
+}

+ 42 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/thread/ThreadPoolExecutorUtil.java

@@ -0,0 +1,42 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.thread;
+
+import easydo.technology.utils.SpringContextHolder;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 用于获取自定义线程池
+ * @author Zheng Jie
+ * @date 2019年10月31日18:16:47
+ */
+public class ThreadPoolExecutorUtil {
+
+    public static ThreadPoolExecutor getPoll(){
+        AsyncTaskProperties properties = SpringContextHolder.getBean(AsyncTaskProperties.class);
+        return new ThreadPoolExecutor(
+                properties.getCorePoolSize(),
+                properties.getMaxPoolSize(),
+                properties.getKeepAliveSeconds(),
+                TimeUnit.SECONDS,
+                new ArrayBlockingQueue<>(properties.getQueueCapacity()),
+                new TheadFactoryName()
+        );
+    }
+}

+ 88 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/utils/ExecutionJob.java

@@ -0,0 +1,88 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.utils;
+
+import easydo.technology.quartz.domain.SysQuartzJob;
+import easydo.technology.quartz.domain.QuartzLog;
+import easydo.technology.quartz.mapper.QuartzLogMapper;
+import easydo.technology.quartz.thread.ThreadPoolExecutorUtil;
+import easydo.technology.utils.RedisUtils;
+import easydo.technology.utils.SpringContextHolder;
+import easydo.technology.utils.StringUtil;
+import easydo.technology.utils.ThrowableUtil;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.util.UUID;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 参考人人开源,https://gitee.com/renrenio/renren-security
+ * @author /
+ * @date 2019-01-07
+ */
+@Async
+@SuppressWarnings({"unchecked","all"})
+public class ExecutionJob extends QuartzJobBean {
+
+    /** 该处仅供参考 */
+    private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll();
+
+    @Override
+    public void executeInternal(JobExecutionContext context) {
+        SysQuartzJob quartzJob = (SysQuartzJob) context.getMergedJobDataMap().get(SysQuartzJob.JOB_KEY);
+        // 获取spring bean
+        QuartzLogMapper quartzLogRepository = SpringContextHolder.getBean(QuartzLogMapper.class);
+        RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
+        
+        String uuid = quartzJob.getUuid();
+
+        QuartzLog log = new QuartzLog();
+        log.setId(UUID.randomUUID().toString());
+        log.setJobName(quartzJob.getJobName());
+        log.setBeanName(quartzJob.getBeanName());
+        log.setMethodName(quartzJob.getMethodName());
+        log.setParams(quartzJob.getParams());
+        long startTime = System.currentTimeMillis();
+        log.setCronExpression(quartzJob.getCronExpression());
+        try {
+            QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(),
+                    quartzJob.getParams());
+            Future<?> future = EXECUTOR.submit(task);
+            future.get();
+            long times = System.currentTimeMillis() - startTime;
+            log.setTime(times);
+            if(StringUtil.isNotEmpty(uuid)) {
+                redisUtils.set(uuid, true);
+            }
+            // 任务状态
+            log.setIsSuccess(true);
+        } catch (Exception e) {
+            if(StringUtil.isNotEmpty(uuid)) {
+                redisUtils.set(uuid, false);
+            }
+            long times = System.currentTimeMillis() - startTime;
+            log.setTime(times);
+            // 任务状态 0:成功 1:失败
+            log.setIsSuccess(false);
+            log.setExceptionDetail(ThrowableUtil.getStackTrace(e));
+        } finally {
+            quartzLogRepository.insert(log);
+        }
+    }
+}

+ 172 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/utils/QuartzManage.java

@@ -0,0 +1,172 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.utils;
+
+import easydo.technology.exception.BadRequestException;
+import easydo.technology.quartz.domain.SysQuartzJob;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.quartz.impl.triggers.CronTriggerImpl;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+import static org.quartz.TriggerBuilder.newTrigger;
+
+@Slf4j
+@Component
+public class QuartzManage {
+
+    private static final String JOB_NAME = "TASK_";
+
+    @Resource(name = "scheduler")
+    private Scheduler scheduler;
+
+    public void addJob(SysQuartzJob quartzJob){
+        try {
+            // 构建job信息
+            JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class).
+                    withIdentity(JOB_NAME + quartzJob.getId()).build();
+
+            //通过触发器名和cron 表达式创建 Trigger
+            Trigger cronTrigger = newTrigger()
+                    .withIdentity(JOB_NAME + quartzJob.getId())
+                    .startNow()
+                    .withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression()))
+                    .build();
+
+            cronTrigger.getJobDataMap().put(SysQuartzJob.JOB_KEY, quartzJob);
+
+            //重置启动时间
+            ((CronTriggerImpl)cronTrigger).setStartTime(new Date());
+
+            //执行定时任务
+            scheduler.scheduleJob(jobDetail,cronTrigger);
+
+            // 暂停任务
+            if (quartzJob.getIsPause()) {
+                pauseJob(quartzJob);
+                log.info(quartzJob.getJobName() + "定时任务已暂停");
+            }
+        } catch (Exception e){
+            log.error("创建定时任务失败", e);
+            throw new BadRequestException("创建定时任务失败");
+        }
+    }
+
+    /**
+     * 更新job cron表达式
+     * @param quartzJob /
+     */
+    public void updateJobCron(SysQuartzJob quartzJob){
+        try {
+            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
+            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            // 如果不存在则创建一个定时任务
+            if(trigger == null){
+                addJob(quartzJob);
+                trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            }
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression());
+            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
+            //重置启动时间
+            ((CronTriggerImpl)trigger).setStartTime(new Date());
+            trigger.getJobDataMap().put(SysQuartzJob.JOB_KEY,quartzJob);
+
+            scheduler.rescheduleJob(triggerKey, trigger);
+            // 暂停任务
+            if (quartzJob.getIsPause()) {
+                pauseJob(quartzJob);
+            }
+        } catch (Exception e){
+            log.error("更新定时任务失败", e);
+            throw new BadRequestException("更新定时任务失败");
+        }
+
+    }
+
+    /**
+     * 删除一个job
+     * @param quartzJob /
+     */
+    public void deleteJob(SysQuartzJob quartzJob){
+        try {
+            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());
+            scheduler.pauseJob(jobKey);
+            scheduler.deleteJob(jobKey);
+        } catch (Exception e){
+            log.error("删除定时任务失败", e);
+            throw new BadRequestException("删除定时任务失败");
+        }
+    }
+
+    /**
+     * 恢复一个job
+     * @param quartzJob /
+     */
+    public void resumeJob(SysQuartzJob quartzJob){
+        try {
+            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
+            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            // 如果不存在则创建一个定时任务
+            if(trigger == null) {
+                addJob(quartzJob);
+            }
+            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());
+            scheduler.resumeJob(jobKey);
+        } catch (Exception e){
+            log.error("恢复定时任务失败", e);
+            throw new BadRequestException("恢复定时任务失败");
+        }
+    }
+
+    /**
+     * 立即执行job
+     * @param quartzJob /
+     */
+    public void runJobNow(SysQuartzJob quartzJob){
+        try {
+            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
+            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
+            // 如果不存在则创建一个定时任务
+            if(trigger == null) {
+                addJob(quartzJob);
+            }
+            JobDataMap dataMap = new JobDataMap();
+            dataMap.put(SysQuartzJob.JOB_KEY, quartzJob);
+            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());
+            scheduler.triggerJob(jobKey,dataMap);
+        } catch (Exception e){
+            log.error("定时任务执行失败", e);
+            throw new BadRequestException("定时任务执行失败");
+        }
+    }
+
+    /**
+     * 暂停一个job
+     * @param quartzJob /
+     */
+    public void pauseJob(SysQuartzJob quartzJob){
+        try {
+            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());
+            scheduler.pauseJob(jobKey);
+        } catch (Exception e){
+            log.error("定时任务暂停失败", e);
+            throw new BadRequestException("定时任务暂停失败");
+        }
+    }
+}

+ 55 - 0
easydo-chengfa/src/main/java/easydo/technology/quartz/utils/QuartzRunnable.java

@@ -0,0 +1,55 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.quartz.utils;
+
+import easydo.technology.utils.SpringContextHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+
+@Slf4j
+public class QuartzRunnable implements Callable {
+
+	private final Object target;
+	private final Method method;
+	private final String params;
+
+	QuartzRunnable(String beanName, String methodName, String params)
+			throws NoSuchMethodException, SecurityException {
+		this.target = SpringContextHolder.getBean(beanName);
+		this.params = params;
+
+		if (StringUtils.isNotBlank(params)) {
+			this.method = target.getClass().getDeclaredMethod(methodName, String.class);
+		} else {
+			this.method = target.getClass().getDeclaredMethod(methodName);
+		}
+	}
+
+	@Override
+	public Object call() throws Exception {
+		ReflectionUtils.makeAccessible(method);
+		if (StringUtils.isNotBlank(params)) {
+			method.invoke(target, params);
+		} else {
+			method.invoke(target);
+		}
+		return null;
+	}
+}

+ 61 - 0
easydo-chengfa/src/main/java/easydo/technology/service/FlowNoService.java

@@ -0,0 +1,61 @@
+package easydo.technology.service;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.BusFlowNo;
+import easydo.technology.utils.LocalDateUtil;
+import easydo.technology.utils.StringUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class FlowNoService {
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+
+    public String getFlowNo(String type, Connection... connections) {
+        Connection connection = null;
+        try {
+            if (connections.length > 0) {
+                connection = connections[0];
+            } else {
+                connection = dataSource.getConnection();
+            }
+
+            BusFlowNo flowno = new BusFlowNo();
+            flowno.setType(type);
+            flowno = jdbcClient.getJdbcModel(flowno, connection);
+            String currDate = LocalDateUtil.localDateTimeFormatyMd(LocalDateTime.now());
+            String currDate2 = LocalDateUtil.localDateTimeFormatyMd2(LocalDateTime.now());
+            if (flowno.getCurrDate() == null || !flowno.getCurrDate().equals(currDate)) {
+                flowno.setCurrDate(currDate);
+                flowno.setCurrSeq(1);
+            } else {
+                flowno.setCurrSeq(flowno.getCurrSeq() + 1);
+            }
+            String currSeq = String.format("%05d", flowno.getCurrSeq());
+            String no = flowno.getPrefix() + currDate2 + currSeq;
+            flowno.setCurrNo(no);
+            Map<String, Object> whereMap = new HashMap<>();
+            whereMap.put("type", type);
+            jdbcClient.jdbcUpdate(flowno, whereMap, connection);
+            return no;
+        } catch (Exception e) {
+            throw new BizException(e.getMessage());
+        } finally {
+            if (connections.length == 0) {
+                jdbcClient.finallyExecute(connection);
+            }
+        }
+    }
+}

+ 95 - 0
easydo-chengfa/src/main/java/easydo/technology/service/GLDApproveService.java

@@ -0,0 +1,95 @@
+package easydo.technology.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.components.JdbcClient;
+import easydo.technology.model.GldMember;
+import easydo.technology.model.SysUser;
+import easydo.technology.model.vo.GLDApproveVo;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.SecurityUtils;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class GLDApproveService {
+    @Value("${tenantId_gld_master}")
+    String tenantId;
+    @Value("${GLD.APPROVE.mgtGroupId}")
+    String mgtGroupId;
+    @Value("${GLD.APPROVE.authorization}")
+    String authorization;
+    @Value("${GLD.APPROVE.formCode}")
+    String formCode;
+    @Value("${GLD.APPROVE.formName}")
+    String formName;
+    @Value("${GLD.host}")
+    String host;
+    @Value("${GLD.APPROVE.startApprove}")
+    String startApprove;
+    @Value("${GLD.APPROVE.getApproveInfo}")
+    String getApproveInfo;
+    @Resource
+    JdbcClient jdbcClient;
+
+    public String startApprove(GLDApproveVo vo) throws Exception {
+        Long userId = SecurityUtils.getCurrentUserId();
+        SysUser user = new SysUser();
+        user.setUserId(userId);
+        user = jdbcClient.getJdbcModel(user);
+        GldMember member = new GldMember();
+        member.setPhone(user.getPhone());
+        member = jdbcClient.getJdbcModel(member);
+
+        String url = (host + startApprove).replace("{deptId}", mgtGroupId);
+        Map<String, String> header = new HashMap<>();
+        header.put("X-CORAL-TENANT", tenantId);
+        header.put("Authorization", authorization);
+        JSONObject object = new JSONObject();
+        object.put("subject", "startPosName");
+        object.put("startPos", formCode);
+        object.put("startPosName", formName);
+        object.put("templateId", vo.getTemplateId());
+        object.put("targetType", vo.getTargetType());
+        object.put("targetId", vo.getTargetId());
+        object.put("taskType", "APPROVAL");
+        object.put("hiddenResubmit", true);
+        object.put("startorId", member.getId());
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, object.toJSONString(), header);
+        System.out.println("发起审批流req========>" + object.toJSONString() + "res========>" + resObj.toJSONString());
+        return resObj.getString("id");
+    }
+
+    public GLDApproveVo getApproveInfo(GLDApproveVo vo) {
+        String url = host + getApproveInfo.replace("{deptId}", mgtGroupId)
+                .replace("{ids}", vo.getTaskId());
+        Map<String, String> header = new HashMap<>();
+        header.put("X-CORAL-TENANT", tenantId);
+        header.put("Authorization", authorization);
+        JSONArray resArray = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+        System.out.println("查询审批流res========>" + resArray.toJSONString());
+        if (resArray.size() > 0) {
+            String instanceId = ((JSONObject) resArray.get(0)).getString("xmglInstanceId");
+            String state = ((JSONObject) resArray.get(0)).getString("state");
+            vo.setInstanceId(instanceId);
+            vo.setState(state);
+        }
+        return vo;
+    }
+
+    public static void main(String[] args) {
+//        String url = "http://218.201.101.181:14780/task/tasks?targetId=89bfac89-7fd5-4c1f-a386-f2f36efafb1d&targetType=purchase_plan";
+        String url = "http://218.201.101.181:14780/task/11200297/tasks?ids=11200743&taskType=APPROVAL";
+        Map<String, String> header = new HashMap<>();
+        header.put("X-CORAL-TENANT", "5600003");
+        header.put("Authorization", "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w=");
+        JSONArray resArray = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+        System.out.println("查询审批流res========>" + resArray.toJSONString());
+    }
+}

+ 185 - 0
easydo-chengfa/src/main/java/easydo/technology/service/GLDCostService.java

@@ -0,0 +1,185 @@
+package easydo.technology.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.GldTenant;
+import easydo.technology.model.vo.GLDContract;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class GLDCostService {
+    @Value("${tenantId_gld_cost}")
+    String tenantId;
+    @Value("${GLD.host}")
+    String costHost;
+    @Value("${GLD.COST.getPath}")
+    String costGetPath;
+    @Value("${GLD.COST.authorization}")
+    String costAuthorization;
+    @Value("${GLD.COST.updatePath}")
+    String costUpdatePath;
+    @Value("${GLD.COST.getContractPath}")
+    String costContractPath;
+    @Value("${GLD.COST.contractFile}")
+    String costContractFile;
+
+    public JSONObject getHY(List<String> projectCodeList) {
+        JSONObject data = new JSONObject();
+        if (projectCodeList.isEmpty()) {
+            throw new BizException("参数缺失");
+        }
+        data.put("projectCodes", projectCodeList);
+        String url = costHost + costGetPath;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", costAuthorization);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, data.toJSONString(), header);
+        System.out.println("查询合约规划合约视角req========>" + data.toJSONString() + "res========>" + resObj.toJSONString());
+        return resObj;
+    }
+
+    public JSONObject getKM(List<String> projectCodeList) {
+        JSONObject data = new JSONObject();
+
+        if (StringUtil.isEmpty(tenantId) || projectCodeList.isEmpty()) {
+            throw new BizException("参数缺失");
+        }
+        data.put("projectCodes", projectCodeList);
+        data.put("contractPlanMode", "Index");
+        String url = costHost + costGetPath;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", costAuthorization);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, data.toJSONString(), header);
+        System.out.println("查询合约规划科目视角req========>" + data.toJSONString() + "res========>" + resObj.toJSONString());
+        return resObj;
+    }
+
+    public void updateState(Long contractPlanId, String useState) {
+        JSONObject data = new JSONObject();
+        List<Long> contractPlanIds = new ArrayList<>();
+        contractPlanIds.add(contractPlanId);
+        data.put("contractPlanItemIds", contractPlanIds);
+        data.put("useState", useState);
+        String url = costHost + costUpdatePath;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", costAuthorization);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, data.toJSONString(), header);
+        System.out.println("修改合约规划状态req========>" + data.toJSONString() + "res========>" + resObj.toJSONString());
+        if (!"success".equals(resObj.getString("code"))) {
+            throw new BizException("修改合约规划状态异常");
+        }
+    }
+
+    public List<GLDContract> getContractList(Long projectId, String purchaseNo) {
+        JSONObject data = new JSONObject();
+        data.put("projectId", projectId);
+        // data.put("projectCode", projectCode);
+        data.put("procurementApprovalCode", purchaseNo);
+        data.put("queryDetail", true);
+        String url = costHost + costContractPath;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", costAuthorization);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url, data.toJSONString(), header);
+        System.out.println("查询合同信息req========>" + data.toJSONString() + "res========>" + resObj.toJSONString());
+        JSONArray array = resObj.getJSONArray("data");
+        List<GLDContract> list = new ArrayList<>();
+        for (Object obj : array) {
+            JSONObject object = (JSONObject) obj;
+
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            if (object.containsKey("createTime")) {
+                long createTimeSeconds = object.getLongValue("createTime");
+                Date date = new Date(createTimeSeconds);
+                String createTime = sdf.format(date);
+                object.put("createTime", createTime);
+            }
+            if (object.containsKey("approvedEndTime")) {
+                long approvedEndTimeSeconds = object.getLongValue("approvedEndTime");
+                Date date = new Date(approvedEndTimeSeconds);
+                String approvedEndTime = sdf.format(date);
+                object.put("approvedEndTime", approvedEndTime);
+            }
+            JSONObject contractObj = (JSONObject) object.getJSONArray("contractDetailedList").get(0);
+            GLDContract contract = JSONObject.parseObject(object.toJSONString(), GLDContract.class);
+            contract.setObjectId(contractObj.getString("objectId"));
+            contract.setFileName(contractObj.getString("name"));
+            list.add(contract);
+        }
+        return list;
+    }
+
+    public void getContractFile(String objectId, String fileName,HttpServletResponse response) {
+        String url = costHost + costContractFile + objectId;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", costAuthorization);
+        header.put("X-CORAL-TENANT", tenantId);
+        if (StringUtil.isEmpty(fileName)) {
+            fileName = "contract.pdf";
+        }
+        HttpClientUtil.sendGETWithHeader_OutputStream(url, header, response, fileName);
+    }
+
+    // public static void main(String[] args) {
+    // JSONObject data = new JSONObject();
+    // data.put("projectId", "840608311945216");
+    // data.put("procurementApprovalCode", "ZCCP-20240129191729593");
+    // data.put("queryDetail", true);
+    // String url =
+    // "http://jsf-int.glodon.com/cost-management/openapi/contracts/list";
+    // Map<String, String> header = new HashMap<>();
+    // header.put("Authorization",
+    // "Basic
+    // a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4=");
+    // header.put("X-CORAL-TENANT", "865509948108800");
+    // JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(url,
+    // data.toJSONString(), header);
+    // // System.out.println("查询合同信息req========>" + data.toJSONString() +
+    // "res========>" + resObj.toJSONString());
+
+    // JSONArray array = resObj.getJSONArray("data");
+    // List<GLDContract> list = new ArrayList<>();
+    // for (Object obj : array) {
+    // JSONObject object = (JSONObject) obj;
+
+    // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    // if (object.containsKey("createTime")) {
+    // long createTimeSeconds = object.getLongValue("createTime");
+    // Date date = new Date(createTimeSeconds);
+    // String createTime = sdf.format(date);
+    // object.put("createTime", createTime);
+    // }
+    // if (object.containsKey("approvedEndTime")) {
+    // long approvedEndTimeSeconds = object.getLongValue("approvedEndTime");
+    // Date date = new Date(approvedEndTimeSeconds);
+    // String approvedEndTime = sdf.format(date);
+    // object.put("approvedEndTime", approvedEndTime);
+    // }
+    // JSONObject contractObj =
+    // (JSONObject)object.getJSONArray("contractDetailedList").get(0);
+
+    // GLDContract contract = JSONObject.parseObject(object.toJSONString(),
+    // GLDContract.class);
+    // contract.setObjectId(contractObj.getString("objectId"));
+    // list.add(contract);
+    // }
+    // System.out.println(JSONArray.toJSONString(list));
+    // }
+
+}

+ 170 - 0
easydo-chengfa/src/main/java/easydo/technology/service/GLDMasterService.java

@@ -0,0 +1,170 @@
+package easydo.technology.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.enums.RedisKeyEnum;
+import easydo.technology.exception.BizException;
+import easydo.technology.model.GldDept;
+import easydo.technology.model.GldMember;
+import easydo.technology.model.GldProject;
+import easydo.technology.model.GldTenant;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.RedisUtils;
+import easydo.technology.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class GLDMasterService {
+    @Value("${GLD.host}")
+    private String masterHost;
+    @Value("${GLD.MASTER.getToken}")
+    private String masterGetToken;
+    @Value("${GLD.MASTER.getDept}")
+    private String masterGetDept;
+    @Value("${GLD.MASTER.getMember}")
+    private String masterGetMember;
+    @Value("${GLD.MASTER.getProject}")
+    private String masterGetProject;
+    @Value("${GLD.MASTER.getTenant}")
+    private String masterGetTenant;
+    @Value("${GLD.MASTER.authorization}")
+    private String masterAuthorization;
+    @Value("${tenantId_gld_master}")
+    private String tenantId;
+    @Resource
+    RedisUtils redisUtils;
+
+    public String getGetToken() {
+        if (redisUtils.hasKey(RedisKeyEnum.KEY_CF_GLD_MASTER_GET_TOKEN.getValue())) {
+            return redisUtils.get(RedisKeyEnum.KEY_CF_GLD_MASTER_GET_TOKEN.getValue()).toString();
+        } else {
+            String url = masterHost + masterGetToken;
+            Map<String, String> header = new HashMap<>();
+            header.put("Authorization", masterAuthorization);
+            JSONObject object = HttpClientUtil.sendPOSTWithHeader(url, new JSONObject().toJSONString(), header);
+            System.out.println("查询广联达主数据token的res======>" + object.toJSONString());
+            String accessToken = object.getString("access_token");
+            Integer expiresIn = object.getInteger("expires_in");
+            if (StringUtil.isNotEmpty(accessToken) && StringUtil.isNotEmpty(expiresIn)) {
+                redisUtils.set(RedisKeyEnum.KEY_CF_GLD_MASTER_GET_TOKEN.getValue(), accessToken, expiresIn - 600, TimeUnit.SECONDS);
+                return accessToken;
+            }
+        }
+        return null;
+    }
+
+    public void removeToken() {
+        redisUtils.del(RedisKeyEnum.KEY_CF_GLD_MASTER_GET_TOKEN.getValue());
+    }
+
+    public List<GldDept> getGetDept() throws Exception {
+        String token = getGetToken();
+        if (StringUtil.isEmpty(token)) {
+            throw new BizException("获取gld_token异常");
+        }
+        String url = masterHost + masterGetDept;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", "Bearer " + token);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONArray array = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+        System.out.println("查询广联达主数据组织的res======>" + array.toJSONString());
+        List<GldDept> list = new ArrayList<>();
+        for (Object obj : array) {
+            JSONObject object = (JSONObject) obj;
+            formatTime(object);
+
+            GldDept dept = JSONObject.parseObject(object.toJSONString(), GldDept.class);
+            list.add(dept);
+        }
+        return list;
+    }
+
+    public List<GldMember> getGetMember() throws Exception {
+        String token = getGetToken();
+        if (StringUtil.isEmpty(token)) {
+            throw new BizException("获取gld_token异常");
+        }
+        String url = masterHost + masterGetMember;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", "Bearer " + token);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONArray array = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+        System.out.println("查询广联达主数据用户的res======>" + array.toJSONString());
+        List<GldMember> list = new ArrayList<>();
+        for (Object obj : array) {
+            JSONObject object = (JSONObject) obj;
+            formatTime(object);
+
+            GldMember member = JSONObject.parseObject(object.toJSONString(), GldMember.class);
+            list.add(member);
+        }
+        return list;
+    }
+
+    public List<GldProject> getGetProject() throws Exception {
+        String token = getGetToken();
+        if (StringUtil.isEmpty(token)) {
+            throw new BizException("获取gld_token异常");
+        }
+        String url = masterHost + masterGetProject;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", "Bearer " + token);
+        header.put("X-CORAL-TENANT", tenantId);
+        JSONArray array = HttpClientUtil.sendGETWithHeader_Arr(url, header);
+        System.out.println("查询广联达主数据项目的res======>" + array.toJSONString());
+        List<GldProject> list = new ArrayList<>();
+        for (Object obj : array) {
+            JSONObject object = (JSONObject) obj;
+            formatTime(object);
+
+            GldProject project = JSONObject.parseObject(object.toJSONString(), GldProject.class);
+            list.add(project);
+        }
+        return list;
+    }
+
+    public List<GldTenant> getGetTenant() throws Exception {
+        String token = getGetToken();
+        if (StringUtil.isEmpty(token)) {
+            throw new BizException("获取gld_token异常");
+        }
+        String url = masterHost + masterGetTenant;
+        Map<String, String> header = new HashMap<>();
+        header.put("Authorization", "Bearer " + token);
+        JSONObject resObject = HttpClientUtil.sendGETWithHeader_Obj(url, header);
+        System.out.println("查询广联达主数据租户的res======>" + resObject.toJSONString());
+        JSONArray array = resObject.getJSONArray("content");
+        List<GldTenant> list = new ArrayList<>();
+        for (Object obj : array) {
+            JSONObject object = (JSONObject) obj;
+            formatTime(object);
+
+            GldTenant project = JSONObject.parseObject(object.toJSONString(), GldTenant.class);
+            list.add(project);
+        }
+        return list;
+    }
+
+
+    private void formatTime(JSONObject object) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (object.containsKey("createTime")) {
+            long createTimeSeconds = object.getLongValue("createTime");
+            Date date = new Date(createTimeSeconds);
+            String createTime = sdf.format(date);
+            object.put("createTime", createTime);
+        }
+        if (object.containsKey("updateTime")) {
+            long updateTimeSeconds = object.getLongValue("updateTime");
+            Date date = new Date(updateTimeSeconds);
+            String updateTime = sdf.format(date);
+            object.put("updateTime", updateTime);
+        }
+    }
+}

Різницю між файлами не показано, бо вона завелика
+ 252 - 0
easydo-chengfa/src/main/java/easydo/technology/service/KafkaClient.java


+ 77 - 0
easydo-chengfa/src/main/java/easydo/technology/service/MDMService.java

@@ -0,0 +1,77 @@
+package easydo.technology.service;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.model.Supplier;
+import easydo.technology.model.SupplierBank;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.StringUtil;
+
+@Component
+public class MDMService {
+    @Value("${MDM.host}")
+    String mdmHost;
+    @Value("${MDM.supplierPush}")
+    String supplierPath;
+    @Resource
+    JdbcClient jdbcClient;
+    @Resource
+    DataSource dataSource;
+
+    public Boolean sendSupplier(Supplier supplier, boolean isDeleted) throws Exception {
+        String url = mdmHost + supplierPath;
+        JSONObject object = new JSONObject();
+
+        JSONArray parameters = new JSONArray();
+        JSONObject supplierObj = new JSONObject();
+        if (isDeleted) {
+            supplierObj.put("STATUS", 0);
+        } else {
+            supplierObj.put("STATUS", 1);
+        }
+        supplierObj.put("C_SORCE_SYSTEM", "04");
+        supplierObj.put("C_FULLNAME", supplier.getSupplierName());
+        supplierObj.put("C_NATURE", "01");
+        supplierObj.put("C_WHETHER_CUSTOMER", 0);
+        supplierObj.put("C_WHETHER_SUPPLIER", 1);
+        supplierObj.put("C_UNISOCIALCREDIT_CODE", supplier.getCreditCode());
+        supplierObj.put("C_COUNTRY", "CHN");
+        supplierObj.put("C_PROVINCE", supplier.getProvinceCode());
+        supplierObj.put("C_CITY", supplier.getCityCode());
+        if (StringUtil.isEmpty(supplier.getRemark())) {
+            supplierObj.put("C_REMARKS", "无");
+        } else {
+            supplierObj.put("C_REMARKS", supplier.getRemark());
+        }
+
+        JSONArray bankArray = new JSONArray();
+        List<SupplierBank> bankList = supplier.getBankList();
+        for (SupplierBank bank : bankList) {
+            JSONObject bankObj = new JSONObject();
+            bankObj.put("C_ACCOUNTNAME", bank.getAccountName());
+            bankObj.put("C_BANKNAME", bank.getBankName());
+            bankObj.put("C_BANKCODE", bank.getSysBankCode());
+            bankObj.put("C_ACCOUNTCODE", bank.getAccountCode());
+            bankArray.add(bankObj);
+        }
+        supplierObj.put("C_YHST", bankArray);
+        parameters.add(supplierObj);
+        object.put("Parameters", parameters);
+
+        JSONObject resObj = HttpClientUtil.sendPOST(url, object.toJSONString());
+        System.out
+                .println("推送MSM供应商数据req======>" + object.toJSONString() + "res======>" + resObj.toJSONString());
+        return null;
+    }
+}

+ 158 - 0
easydo-chengfa/src/main/java/easydo/technology/service/OAService.java

@@ -0,0 +1,158 @@
+package easydo.technology.service;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+
+import easydo.technology.components.JdbcClient;
+import easydo.technology.model.SysUser;
+import easydo.technology.util.HttpClientUtil;
+import easydo.technology.utils.LocalDateUtil;
+import easydo.technology.utils.RedisUtils;
+
+@Component
+public class OAService {
+    @Value("${OA.host}")
+    private String host;
+    @Value("${OA.getTokenPath}")
+    private String getTokenPath;
+    @Value("${OA.username}")
+    private String username;
+    @Value("${OA.password}")
+    private String password;
+    @Value("${OA.getUsernamePath}")
+    String oaUsernamePath;
+    @Value("${OA.getUserInfoPath}")
+    String oaUserInfoPath;
+    @Value("${OA.sendTodoPath}")
+    String oaSendTodoPath;
+    @Value("${OA.updateTodoPath}")
+    String oaUpdateTodoPath;
+    @Value("${OA.registerCode}")
+    String registerCode;
+    @Value("${PURCHASE.requestUrl}")
+    String requestUrl;
+    @Value("${OA.sendMessagePath}")
+    String oaSendMessagePath;
+    @Resource
+    RedisUtils redisUtils;
+    @Resource
+    JdbcClient jdbcClient;
+
+    public String getGetToken() {
+        String url = host + getTokenPath;
+        JSONObject object = new JSONObject();
+        object.put("userName", username);
+        object.put("password", password);
+        JSONObject resObject = HttpClientUtil.sendPOST(url, object.toJSONString());
+        System.out.println("查询OAtoken的res======>" + resObject.toJSONString());
+        return resObject.getString("id");
+    }
+
+    public String getUsername(String ticket) {
+        String getLoginNameUrl = host + oaUsernamePath + ticket;
+        String username = HttpClientUtil.sendOaGET_USERNAME(getLoginNameUrl);
+        System.out.println("查询OA username的ticket====>" + ticket + ",res======>" + username);
+        return HttpClientUtil.sendOaGET_USERNAME(getLoginNameUrl);
+    }
+
+    public String getTelNumber(String username) {
+        String token = getGetToken();
+        String getLoginNameUrl = host + oaUserInfoPath + token;
+        Map<String, String> header = new HashMap<>();
+        header.put("token", token);
+        JSONObject resObj = HttpClientUtil.sendGETWithHeader_Obj(getLoginNameUrl, header);
+        System.out.println("查询OA telNumber的username======>" + username + ",res======>" + resObj.toJSONString());
+        return resObj.getString("telNumber");
+    }
+
+    public JSONObject sendSupplierTodo(String taskId, String sysUserId, String businessId, String title)
+            throws Exception {
+        SysUser sysUser = new SysUser();
+        sysUser.setUserId(Long.valueOf(sysUserId));
+        sysUser = jdbcClient.getJdbcModel(sysUser);
+        String creationDate = LocalDateUtil.localDateTimeFormat(LocalDateTime.now(), "yyyy-MM-dd HH:mm");
+
+        String token = getGetToken();
+        String sendTodoUrl = host + oaSendTodoPath + token;
+        Map<String, String> header = new HashMap<>();
+        header.put("token", token);
+        JSONObject object = new JSONObject();
+        object.put("registerCode", registerCode);
+        object.put("taskId", taskId);
+        object.put("title", title);
+        object.put("senderName", sysUser.getNickName());
+        object.put("classify", "招采系统");
+        object.put("contentType", "招采系统");
+        object.put("state", 0);
+        object.put("thirdSenderId", "");
+        object.put("thirdReceiverId", "");
+        object.put("creationDate", creationDate);
+        object.put("content", "");
+        object.put("h5url", "");
+        object.put("url",
+                requestUrl + "type=supplier_evaluate&path=supplier-evaluation-detail&businessId=" + businessId);
+        object.put("noneBindingSender", sysUser.getUsername());
+        object.put("noneBindingReceiver", sysUser.getUsername());
+
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(sendTodoUrl, object.toJSONString(), header);
+        System.out.println("生成OA待办req======>" + object.toJSONString() + ",res======>" + resObj.toJSONString());
+
+        resObj.put("url", object.getString("url"));
+        return resObj;
+    }
+
+    public Boolean updateSupplierTodo(String taskId, Integer state, Integer subState)
+            throws Exception {
+        String token = getGetToken();
+        String updateTodoUrl = host + oaUpdateTodoPath + token;
+        Map<String, String> header = new HashMap<>();
+        header.put("token", token);
+        JSONObject object = new JSONObject();
+        object = new JSONObject();
+        object.put("registerCode", registerCode);
+        object.put("taskId", taskId);
+        object.put("state", state);
+        object.put("subState", subState);
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(updateTodoUrl, object.toJSONString(), header);
+        System.out.println("更新OA待办req======>" + object.toJSONString() + ",res======>" + resObj.toJSONString());
+        return resObj.getBoolean("success");
+    }
+
+    public Boolean sendMessage(String messageId, String sendUserId, String receiveUserId, String message,String url)
+            throws Exception {
+        SysUser sendUser = new SysUser();
+        sendUser.setUserId(Long.valueOf(sendUserId));
+        sendUser = jdbcClient.getJdbcModel(sendUser);
+        SysUser receiveUser = new SysUser();
+        receiveUser.setUserId(Long.valueOf(receiveUserId));
+        receiveUser = jdbcClient.getJdbcModel(receiveUser);
+        String creationDate = LocalDateUtil.localDateTimeFormat(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
+
+        String token = getGetToken();
+        String sendMessageUrl = host + oaSendMessagePath + token;
+        Map<String, String> header = new HashMap<>();
+        header.put("token", token);
+        JSONObject object = new JSONObject();
+        object.put("thirdpartyRegisterCode", registerCode);
+        object.put("thirdpartyMessageId", messageId);
+        object.put("messageContent", message);
+        object.put("thirdpartyReceiverId", receiveUser.getUserId());
+        object.put("creation_date", creationDate);
+        object.put("messageURL", url);
+
+        object.put("noneBindingSender", sendUser.getUsername());
+        object.put("noneBindingReceiver", receiveUser.getUsername());
+
+        JSONObject resObj = HttpClientUtil.sendPOSTWithHeader(sendMessageUrl, object.toJSONString(), header);
+        System.out.println("推送OA消息req======>" + object.toJSONString() + ",res======>" + resObj.toJSONString());
+        return resObj.getBoolean("success");
+    }
+}

+ 98 - 0
easydo-chengfa/src/main/java/easydo/technology/service/RedisDictService.java

@@ -0,0 +1,98 @@
+package easydo.technology.service;
+
+import easydo.technology.enums.ChengfaEnum;
+import easydo.technology.model.SupplierEvaluateDetail;
+import easydo.technology.model.vo.DictVo;
+import easydo.technology.system.dto.DictDetailDto;
+import easydo.technology.system.mapper.DictDetailMapper;
+import easydo.technology.utils.RedisUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class RedisDictService {
+    @Resource
+    DictDetailMapper dictDetailMapper;
+
+    public DictVo getGradeScore(double score) {
+        DictDetailDto detailDto = new DictDetailDto();
+        detailDto.setDictName(ChengfaEnum.REDIS_KEY_SUPPLIER_EVALUATE_RULE.getValue());
+        List<DictDetailDto> detailList = dictDetailMapper.getDictDetailsByDictName(detailDto);
+
+        DictVo vo = new DictVo();
+        List<DictDetailDto> bMimList = detailList.stream().filter(m -> "b_min".equals(m.getLabel())).collect(Collectors.toList());
+        List<DictDetailDto> aMimList = detailList.stream().filter(m -> "a_min".equals(m.getLabel())).collect(Collectors.toList());
+        int bMim = 0;
+        int aMim = 0;
+        if (!bMimList.isEmpty()) {
+            bMim = Integer.valueOf(bMimList.get(0).getValue());
+        }
+        if (!aMimList.isEmpty()) {
+            aMim = Integer.valueOf(aMimList.get(0).getValue());
+        }
+        if (score < bMim) {
+            vo.setGrade("C");
+        } else if (bMim <= score && score <= aMim) {
+            vo.setGrade("B");
+        } else if (score > bMim) {
+            vo.setGrade("A");
+        }
+
+        vo.setScore(new BigDecimal(score).setScale(2, RoundingMode.HALF_UP));
+        return vo;
+    }
+
+    public DictVo getGradeScore(SupplierEvaluateDetail detail) {
+        DictDetailDto detailDto = new DictDetailDto();
+        detailDto.setDictName(ChengfaEnum.REDIS_KEY_SUPPLIER_EVALUATE_RULE.getValue());
+        List<DictDetailDto> detailList = dictDetailMapper.getDictDetailsByDictName(detailDto);
+
+        DictVo vo = new DictVo();
+        List<DictDetailDto> bMimList = detailList.stream().filter(m -> 3 == m.getDictSort()).collect(Collectors.toList());
+        List<DictDetailDto> aMimList = detailList.stream().filter(m -> 1 == m.getDictSort()).collect(Collectors.toList());
+        List<DictDetailDto> zlList = detailList.stream().filter(m -> 6 == m.getDictSort()).collect(Collectors.toList());
+        List<DictDetailDto> zsList = detailList.stream().filter(m -> 7 == m.getDictSort()).collect(Collectors.toList());
+        List<DictDetailDto> fwList = detailList.stream().filter(m -> 8 == m.getDictSort()).collect(Collectors.toList());
+        List<DictDetailDto> qtList = detailList.stream().filter(m -> 9 == m.getDictSort()).collect(Collectors.toList());
+        int bMim = 0;
+        int aMim = 0;
+        BigDecimal zl = BigDecimal.ZERO;
+        BigDecimal zs = BigDecimal.ZERO;
+        BigDecimal fw = BigDecimal.ZERO;
+        BigDecimal qt = BigDecimal.ZERO;
+        if (!bMimList.isEmpty()) {
+            bMim = Integer.valueOf(bMimList.get(0).getValue());
+        }
+        if (!aMimList.isEmpty()) {
+            aMim = Integer.valueOf(aMimList.get(0).getValue());
+        }
+        if (!zlList.isEmpty()) {
+            zl = BigDecimal.valueOf(Double.valueOf(zlList.get(0).getValue())).multiply(BigDecimal.valueOf(detail.getZlScore()));
+        }
+        if (!zsList.isEmpty()) {
+            zs = BigDecimal.valueOf(Double.valueOf(zsList.get(0).getValue())).multiply(BigDecimal.valueOf(detail.getZsScore()));
+        }
+        if (!fwList.isEmpty()) {
+            fw = BigDecimal.valueOf(Double.valueOf(fwList.get(0).getValue())).multiply(BigDecimal.valueOf(detail.getFwScore()));
+        }
+        if (!qtList.isEmpty()) {
+            qt = BigDecimal.valueOf(Double.valueOf(qtList.get(0).getValue())).multiply(BigDecimal.valueOf(detail.getQtScore()));
+        }
+        double score = zl.add(zs).add(fw).add(qt).doubleValue();
+        if (score < bMim) {
+            vo.setGrade("C");
+        } else if (bMim <= score && score <= aMim) {
+            vo.setGrade("B");
+        } else if (score > bMim) {
+            vo.setGrade("A");
+        }
+
+        vo.setScore(new BigDecimal(score).setScale(2, RoundingMode.HALF_UP));
+        return vo;
+    }
+}

+ 291 - 0
easydo-chengfa/src/main/java/easydo/technology/util/DateUtils.java

@@ -0,0 +1,291 @@
+package easydo.technology.util;
+
+
+import easydo.technology.utils.StringUtil;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAmount;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * @author liy
+ * @since 2022-04-01
+ **/
+public class DateUtils {
+    private static final ThreadLocal<Map<Integer, Boolean>> DATE_THREAD_LOCAL = new ThreadLocal();
+    private static final ThreadLocal<Map<String, SimpleDateFormat>> DATE_FORMAT_THREAD_LOCAL = new ThreadLocal();
+    private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]");
+    private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z]+\\]");
+    private static final Pattern date_ptrn3a = Pattern.compile("[yYmMdDhHsS]");
+    private static final Pattern date_ptrn3b = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-T/年月日,. :\"\\\\]+0*[ampAMP/]*$");
+    private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]");
+    private static final Pattern date_ptrn5 = Pattern.compile("^\\[DBNum(1|2|3)\\]");
+    private static final Pattern date_ptrn6 = Pattern.compile("(年|月|日|时|分|秒)+");
+    public static final String DATE_FORMAT_10 = "yyyy-MM-dd";
+    public static final String DATE_FORMAT_14 = "yyyyMMddHHmmss";
+    public static final String DATE_FORMAT_17 = "yyyyMMdd HH:mm:ss";
+    public static final String DATE_FORMAT_19 = "yyyy-MM-dd HH:mm:ss";
+    public static final String DATE_FORMAT_19_FORWARD_SLASH = "yyyy/MM/dd HH:mm:ss";
+    private static final String MINUS = "-";
+
+    private DateUtils() {
+    }
+
+    public static Date plusDays(Date date, long daysToAdd) {
+        return plus(date, Duration.ofDays(daysToAdd));
+    }
+
+    public static Date plus(Date date, TemporalAmount amount) {
+        Instant instant = date.toInstant();
+        return Date.from(instant.plus(amount));
+    }
+
+    public static Date parseDate(String dateString, String dateFormat) throws ParseException {
+        if (StringUtil.isEmpty(dateFormat)) {
+            dateFormat = switchDateFormat(dateString);
+        }
+
+        return getCacheDateFormat(dateFormat).parse(dateString);
+    }
+
+    public static Date parseDate(String dateString) throws ParseException {
+        return parseDate(dateString, switchDateFormat(dateString));
+    }
+
+    private static String switchDateFormat(String dateString) {
+        int length = dateString.length();
+        switch (length) {
+            case 10:
+                return "yyyy-MM-dd";
+            case 11:
+            case 12:
+            case 13:
+            case 15:
+            case 16:
+            case 18:
+            default:
+                throw new IllegalArgumentException("can not find date format for:" + dateString);
+            case 14:
+                return "yyyyMMddHHmmss";
+            case 17:
+                return "yyyyMMdd HH:mm:ss";
+            case 19:
+                return dateString.contains("-") ? "yyyy-MM-dd HH:mm:ss" : "yyyy/MM/dd HH:mm:ss";
+        }
+    }
+
+    public static String format(Date date) {
+        return format(date, (String) null);
+    }
+
+    public static String format(Date date, String dateFormat) {
+        if (date == null) {
+            return "";
+        } else {
+            if (StringUtil.isEmpty(dateFormat)) {
+                dateFormat = "yyyy-MM-dd HH:mm:ss";
+            }
+
+            return getCacheDateFormat(dateFormat).format(date);
+        }
+    }
+
+    private static DateFormat getCacheDateFormat(String dateFormat) {
+        Map<String, SimpleDateFormat> dateFormatMap = (Map) DATE_FORMAT_THREAD_LOCAL.get();
+        SimpleDateFormat dateFormatCached;
+        if (dateFormatMap == null) {
+            dateFormatMap = new HashMap();
+            DATE_FORMAT_THREAD_LOCAL.set(dateFormatMap);
+        } else {
+            dateFormatCached = (SimpleDateFormat) ((Map) dateFormatMap).get(dateFormat);
+            if (dateFormatCached != null) {
+                return dateFormatCached;
+            }
+        }
+
+        dateFormatCached = new SimpleDateFormat(dateFormat);
+        ((Map) dateFormatMap).put(dateFormat, dateFormatCached);
+        return dateFormatCached;
+    }
+
+    public static boolean isADateFormat(Integer formatIndex, String formatString) {
+        if (formatIndex == null) {
+            return false;
+        } else {
+            Map<Integer, Boolean> isDateCache = (Map) DATE_THREAD_LOCAL.get();
+            if (isDateCache == null) {
+                isDateCache = new HashMap();
+                DATE_THREAD_LOCAL.set(isDateCache);
+            } else {
+                Boolean isDateCachedData = (Boolean) ((Map) isDateCache).get(formatIndex);
+                if (isDateCachedData != null) {
+                    return isDateCachedData;
+                }
+            }
+
+            boolean isDate = isADateFormatUncached(formatIndex, formatString);
+            ((Map) isDateCache).put(formatIndex, isDate);
+            return isDate;
+        }
+    }
+
+    public static boolean isADateFormatUncached(Integer formatIndex, String formatString) {
+        if (isInternalDateFormat(formatIndex)) {
+            return true;
+        } else if (StringUtil.isEmpty(formatString)) {
+            return false;
+        } else {
+            String fs = formatString;
+            int length = formatString.length();
+            StringBuilder sb = new StringBuilder(length);
+
+            int separatorIndex;
+            for (separatorIndex = 0; separatorIndex < length; ++separatorIndex) {
+                char c = fs.charAt(separatorIndex);
+                if (separatorIndex < length - 1) {
+                    char nc = fs.charAt(separatorIndex + 1);
+                    if (c == '\\') {
+                        switch (nc) {
+                            case ' ':
+                            case ',':
+                            case '-':
+                            case '.':
+                            case '\\':
+                                continue;
+                        }
+                    } else if (c == ';' && nc == '@') {
+                        ++separatorIndex;
+                        continue;
+                    }
+                }
+
+                sb.append(c);
+            }
+
+            fs = sb.toString();
+            if (date_ptrn4.matcher(fs).matches()) {
+                return true;
+            } else {
+                fs = date_ptrn5.matcher(fs).replaceAll("");
+                fs = date_ptrn1.matcher(fs).replaceAll("");
+                fs = date_ptrn2.matcher(fs).replaceAll("");
+                separatorIndex = fs.indexOf(59);
+                if (0 < separatorIndex && separatorIndex < fs.length() - 1) {
+                    fs = fs.substring(0, separatorIndex);
+                }
+
+                if (!date_ptrn3a.matcher(fs).find()) {
+                    return false;
+                } else {
+                    boolean result = date_ptrn3b.matcher(fs).matches();
+                    if (result) {
+                        return true;
+                    } else {
+                        result = date_ptrn6.matcher(fs).find();
+                        return result;
+                    }
+                }
+            }
+        }
+    }
+
+    public static boolean isInternalDateFormat(int format) {
+        switch (format) {
+            case 14:
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+            case 19:
+            case 20:
+            case 21:
+            case 22:
+            case 27:
+            case 28:
+            case 29:
+            case 30:
+            case 31:
+            case 32:
+            case 33:
+            case 34:
+            case 35:
+            case 36:
+            case 45:
+            case 46:
+            case 47:
+            case 50:
+            case 51:
+            case 52:
+            case 53:
+            case 54:
+            case 55:
+            case 56:
+            case 57:
+            case 58:
+                return true;
+            case 23:
+            case 24:
+            case 25:
+            case 26:
+            case 37:
+            case 38:
+            case 39:
+            case 40:
+            case 41:
+            case 42:
+            case 43:
+            case 44:
+            case 48:
+            case 49:
+            default:
+                return false;
+        }
+    }
+
+    public static void removeThreadLocalCache() {
+        DATE_THREAD_LOCAL.remove();
+        DATE_FORMAT_THREAD_LOCAL.remove();
+    }
+
+    /**
+     * date2比date1多的天数
+     *
+     * @param date1
+     * @param date2
+     * @return
+     */
+    public static int differentDays(Date date1, Date date2) {
+        Calendar cal1 = Calendar.getInstance();
+        cal1.setTime(date1);
+
+        Calendar cal2 = Calendar.getInstance();
+        cal2.setTime(date2);
+        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
+        int day2 = cal2.get(Calendar.DAY_OF_YEAR);
+
+        int year1 = cal1.get(Calendar.YEAR);
+        int year2 = cal2.get(Calendar.YEAR);
+        if (year1 != year2) {//不同年
+            int timeDistance = 0;
+            for (int i = year1; i < year2; i++) {
+                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {    //闰年
+                    timeDistance += 366;
+                } else {  //不是闰年
+                    timeDistance += 365;
+                }
+            }
+
+            return timeDistance + (day2 - day1);
+        } else {// 同一年
+            System.out.println("判断day2 - day1 : " + (day2 - day1));
+            return day2 - day1;
+        }
+    }
+}
+  

+ 430 - 0
easydo-chengfa/src/main/java/easydo/technology/util/HttpClientUtil.java

@@ -0,0 +1,430 @@
+package easydo.technology.util;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+public class HttpClientUtil {
+    /***
+     * 向指定URL发送POST方法的请求
+     *
+     * @param apiUrl
+     * @param data
+     * @return
+     */
+    public static JSONObject sendPOST(String apiUrl, String data) {
+        StringBuffer strBuffer = null;
+        JSONObject obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("POST");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+            // 连接会话
+            httpURLConnection.connect();
+            // 建立输入流,向指向的URL传入参数
+            DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
+            // 设置请求参数
+            dos.write(data.getBytes("UTF-8"));
+            dos.flush();
+            dos.close();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+            obj = new JSONObject();
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONObject.parseObject(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("POST请求失败,失败原因: Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static JSONObject sendPOST(String apiUrl) {
+        StringBuffer strBuffer = null;
+        JSONObject obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("POST");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+            obj = new JSONObject();
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONObject.parseObject(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("POST请求失败,失败原因: Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static JSONObject sendPOSTWithHeader(String apiUrl, String data, Map<String, String> map) {
+        StringBuffer strBuffer = null;
+        JSONObject obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("POST");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+            map.forEach(httpURLConnection::setRequestProperty);
+            // 连接会话
+            httpURLConnection.connect();
+            // 建立输入流,向指向的URL传入参数
+            DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
+            // 设置请求参数
+            dos.write(data.getBytes("UTF-8"));
+            dos.flush();
+            dos.close();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+            obj = new JSONObject();
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONObject.parseObject(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("POST请求失败,失败原因: Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static String sendOaGET_USERNAME(String apiUrl) {
+        StringBuffer strBuffer = null;
+        String obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+
+            httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
+            httpURLConnection.setRequestProperty("contentType", "utf-8");
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = strBuffer.toString();
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("GET请求失败,失败信息:Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static JSONArray sendGETWithHeader_Arr(String apiUrl, Map<String, String> map) {
+        StringBuffer strBuffer = null;
+        JSONArray obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+
+            httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
+            httpURLConnection.setRequestProperty("contentType", "utf-8");
+            map.forEach(httpURLConnection::setRequestProperty);
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONArray.parseArray(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("GET请求失败,失败信息:Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static JSONObject sendGETWithHeader_Obj(String apiUrl, Map<String, String> map) {
+        StringBuffer strBuffer = null;
+        JSONObject obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+
+            httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
+            httpURLConnection.setRequestProperty("contentType", "utf-8");
+            map.forEach(httpURLConnection::setRequestProperty);
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONObject.parseObject(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("GET请求失败,失败信息:Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+
+    public static void sendGETWithHeader_OutputStream(String apiUrl, Map<String, String> map,
+            HttpServletResponse response,String fileName) {
+        int byteread = 0;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/octet-stream");
+            httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
+            httpURLConnection.setRequestProperty("contentType", "utf-8");
+            map.forEach(httpURLConnection::setRequestProperty);
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+
+                InputStream inStream = httpURLConnection.getInputStream();
+                System.out.println(inStream.toString());
+                response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
+                response.setContentType("application/octet-stream");
+
+                byte[] buffer = new byte[1204];
+                while ((byteread = inStream.read(buffer)) != -1) {
+                    response.getOutputStream().write(buffer, 0, byteread);
+                }
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("GET请求失败,失败信息:Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /***
+     * 向指定URL发送GET方法的请求
+     *
+     * @return
+     */
+    public static JSONObject sendGET(String apiUrl) {
+        StringBuffer strBuffer = null;
+        JSONObject obj = null;
+        try {
+            // 建立连接
+            URL url = new URL(apiUrl);
+            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
+            // 需要输出
+            httpURLConnection.setDoOutput(true);
+            // 需要输入
+            httpURLConnection.setDoInput(true);
+            // 不允许缓存
+            httpURLConnection.setUseCaches(false);
+
+            httpURLConnection.setRequestMethod("GET");
+            // 设置Headers
+            httpURLConnection.setRequestProperty("Content-Type", "application/json");
+
+            httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
+            httpURLConnection.setRequestProperty("contentType", "utf-8");
+            // 连接会话
+            httpURLConnection.connect();
+            // 获得响应状态
+            int http_StatusCode = httpURLConnection.getResponseCode();
+            String http_ResponseMessage = httpURLConnection.getResponseMessage();
+
+            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
+                strBuffer = new StringBuffer();
+                String readLine = new String();
+                BufferedReader responseReader = new BufferedReader(
+                        new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
+                while ((readLine = responseReader.readLine()) != null) {
+                    strBuffer.append(readLine);
+                }
+                responseReader.close();
+                obj = JSONObject.parseObject(strBuffer.toString());
+            } else {
+                throw new RuntimeException(
+                        MessageFormat.format("GET请求失败,失败信息:Http状态码 = {0} , {1}", http_StatusCode,
+                                http_ResponseMessage));
+            }
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return obj;
+    }
+}

+ 370 - 0
easydo-chengfa/src/main/java/easydo/technology/util/HttpsUtil.java

@@ -0,0 +1,370 @@
+/**
+ *
+ */
+package easydo.technology.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Component;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * 发送https请求的工具类
+ */
+@Component
+public class HttpsUtil {
+
+    public static final String charset = "UTF-8";
+
+    public static final String CONTENTTYPE_APPLICATION_JSON = "application/json;charset=UTF-8";
+    public static final String CONTENTTYPE_APPLICATION_XML = "application/xml;charset=UTF-8";
+    public static final String CONTENTTYPE_MULTIPART_FORM = "multipart/form-data;charset=UTF-8";
+    public static final String TEXTPLAIN = "text/plain;charset=UTF-8";
+    public static final String TEXTHTML = "text/html;charset=UTF-8";
+    /**
+     * 忽视证书HostName
+     */
+    private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
+        public boolean verify(String s, SSLSession sslsession) {
+            return true;
+        }
+    };
+
+    /**
+     * Ignore Certification
+     */
+    private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() {
+        private X509Certificate[] certificates;
+
+        public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException {
+            if (this.certificates == null) {
+                this.certificates = certificates;
+            }
+        }
+
+        public void checkServerTrusted(X509Certificate[] ax509certificate, String s) throws CertificateException {
+            if (this.certificates == null) {
+                this.certificates = ax509certificate;
+            }
+        }
+
+        public X509Certificate[] getAcceptedIssuers() {
+            return new X509Certificate[0];
+        }
+    };
+
+    public static byte[] getByteFromUrl(String filePath) {
+
+        byte[] data = null;
+        InputStream is = null;
+        HttpURLConnection conn = null;
+        HttpsURLConnection conns = null;
+        try {
+
+            URL url = new URL(filePath);
+            if (filePath.startsWith("https")) {
+                HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
+                conns = (HttpsURLConnection) url.openConnection();
+                // Prepare SSL Context
+                TrustManager[] tm = {ignoreCertificationTrustManger};
+                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+                sslContext.init(null, tm, new java.security.SecureRandom());
+
+                // 从上述SSLContext对象中得到SSLSocketFactory对象
+                SSLSocketFactory ssf = sslContext.getSocketFactory();
+                conns.setSSLSocketFactory(ssf);
+                if (conns.getResponseCode() != 200) {
+                    return null;
+                }
+                is = conns.getInputStream();
+                if (conns.getResponseCode() == 200) {
+                    data = readInputStream(is);
+                } else {
+                    data = null;
+                }
+            } else {
+                conn = (HttpURLConnection) url.openConnection();
+                conn.setDoInput(true);
+                conn.setConnectTimeout(6000);
+                is = conn.getInputStream();
+                if (conn.getResponseCode() == 200) {
+                    data = readInputStream(is);
+                } else {
+                    data = null;
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (is != null) {
+                    is.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            if (conn != null) {
+                conn.disconnect();
+            }
+        }
+        return data;
+    }
+
+    public static byte[] readInputStream(InputStream is) {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int length = -1;
+        try {
+            while ((length = is.read(buffer)) != -1) {
+                baos.write(buffer, 0, length);
+            }
+            baos.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        byte[] data = baos.toByteArray();
+        try {
+            is.close();
+            baos.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return data;
+    }
+
+    /**
+     * 发送Get请求
+     */
+    public static JSONObject sendSSLGetMethod(String urlString) throws Exception {
+        JSONObject jsonObject = null;
+        StringBuffer buffer = null;
+        InputStream is = null;
+        InputStreamReader isr = null;
+        BufferedReader bufferedReader = null;
+        HttpsURLConnection connection = null;
+        try {
+
+            URL url = new URL(urlString);
+            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
+            connection = (HttpsURLConnection) url.openConnection();
+
+            // Prepare SSL Context
+            TrustManager[] tm = {ignoreCertificationTrustManger};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            connection.setSSLSocketFactory(ssf);
+            if (connection.getResponseCode() != 200) {
+                return null;
+            }
+
+            is = connection.getInputStream();
+            isr = new InputStreamReader(is, "UTF-8");
+            bufferedReader = new BufferedReader(isr);
+
+            String str = null;
+            while ((str = bufferedReader.readLine()) != null) {
+                if (buffer == null) {
+                    buffer = new StringBuffer();
+                }
+                buffer.append(str);
+            }
+
+            jsonObject = JSONObject.parseObject(buffer.toString());
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            if (bufferedReader != null) {
+                bufferedReader.close();
+                bufferedReader = null;
+            }
+            if (isr != null) {
+                isr.close();
+                isr = null;
+            }
+            if (is != null) {
+                is.close();
+                is = null;
+            }
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 发送Post请求
+     */
+    public static JSONObject sendSSLPostMethod(String urlString, String postData) throws Exception {
+        JSONObject jsonObject = null;
+        StringBuffer buffer = null;
+        InputStream is = null;
+        InputStreamReader isr = null;
+        BufferedReader bufferedReader = null;
+        HttpsURLConnection connection = null;
+        try {
+
+            URL url = new URL(urlString);
+            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
+            connection = (HttpsURLConnection) url.openConnection();
+            connection.setDoInput(true);
+            connection.setDoOutput(true);
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("content-type", "text/json");
+            connection.setRequestProperty("content-length", String.valueOf(postData.getBytes().length));
+            connection.getOutputStream().write(postData.getBytes("utf-8"));
+            connection.getOutputStream().flush();
+            connection.getOutputStream().close();
+
+            // Prepare SSL Context
+            TrustManager[] tm = {ignoreCertificationTrustManger};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            connection.setSSLSocketFactory(ssf);
+            if (connection.getResponseCode() != 200) {
+                return null;
+            }
+
+            is = connection.getInputStream();
+            isr = new InputStreamReader(is, "UTF-8");
+            bufferedReader = new BufferedReader(isr);
+
+            String str = null;
+            while ((str = bufferedReader.readLine()) != null) {
+                if (buffer == null) {
+                    buffer = new StringBuffer();
+                }
+                buffer.append(str);
+            }
+
+            jsonObject = JSONObject.parseObject(buffer.toString());
+        } finally {
+            if (null != is) {
+                is.close();
+                is = null;
+            }
+            if (null != connection) {
+                connection.disconnect();
+            }
+        }
+        return jsonObject;
+    }
+
+    /**
+     * 发送Post请求
+     */
+/*    public static String postForm(String urlString, byte[] postData) throws Exception {
+        String buffer = "";
+        InputStream is = null;
+        InputStreamReader isr = null;
+        BufferedReader bufferedReader = null;
+        HttpsURLConnection connection = null;
+        try {
+
+            URL url = new URL(urlString);
+            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
+            connection = (HttpsURLConnection) url.openConnection();
+            connection.setDoInput(true);
+            connection.setDoOutput(true);
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+            // Prepare SSL Context
+            TrustManager[] tm = {ignoreCertificationTrustManger};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            connection.setSSLSocketFactory(ssf);
+            OutputStream outStrm = connection.getOutputStream();
+            outStrm.write(postData);
+            outStrm.flush();
+            outStrm.close();
+
+            if (connection.getResponseCode() != 200) {
+                return null;
+            }
+            is = connection.getInputStream();
+            buffer = IOUtils.toString(is, "utf-8");
+        } finally {
+            if (null != is) {
+                is.close();
+                is = null;
+            }
+            if (null != connection) {
+                connection.disconnect();
+            }
+        }
+        return buffer;
+    }*/
+    public static String downloadFile(String localFile, String fileUrl) throws Exception {
+        InputStream is = null;
+        HttpsURLConnection connection = null;
+        File file = new File(localFile);
+        FileOutputStream fos = new FileOutputStream(file);
+        try {
+            URL url = new URL(fileUrl);
+            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
+            connection = (HttpsURLConnection) url.openConnection();
+            connection.setDoInput(true);
+            connection.setDoOutput(true);
+            connection.setRequestMethod("GET");
+//            connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+            // Prepare SSL Context
+            TrustManager[] tm = {ignoreCertificationTrustManger};
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            sslContext.init(null, tm, new java.security.SecureRandom());
+
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            connection.setSSLSocketFactory(ssf);
+
+            if (connection.getResponseCode() != 200) {
+                return null;
+            }
+            is = connection.getInputStream();
+            int bytesum = 0;
+            int byteread = 0;
+
+            byte[] buffer = new byte[1204];
+            while ((byteread = is.read(buffer)) != -1) {
+                bytesum += byteread;
+                System.out.println(bytesum);
+                fos.write(buffer, 0, byteread);
+            }
+            fos.close();
+            is.close();
+            connection.disconnect();
+            return localFile;
+        } finally {
+            if (null != is) {
+                fos.close();
+                fos = null;
+            }
+            if (null != is) {
+                is.close();
+                is = null;
+            }
+            if (null != connection) {
+                connection.disconnect();
+            }
+        }
+    }
+
+//    public static void main(String[] args) {
+//        byte[] byteFromUrl = getByteFromUrl("https://pmbimcloud-company.oss-cn-hangzhou.aliyuncs.com/af560077-7ead-2c94-b2dc-02170a833273.jpg?Expires=1672812245&OSSAccessKeyId=LTAI8PPrIEVEAQCK&Signature=9oy9s8HS%2FvIczLQJQUeWBqL7MII%3D");
+//        System.out.println(byteFromUrl.length);
+//    }
+}

+ 106 - 0
easydo-chengfa/src/main/java/easydo/technology/util/OracleClient.java

@@ -0,0 +1,106 @@
+package easydo.technology.util;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import easydo.technology.utils.ResultSetUtil;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class OracleClient {
+    @Resource
+    DataSource dataSource;
+
+    /**
+     * 处理连接
+     *
+     * @param connection
+     * @param statements
+     */
+    public void finallyExecute(Connection connection, Statement... statements) {
+        if (connection != null) {
+            try {
+                connection.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (statements.length > 0) {
+            for (Statement statement : statements) {
+                try {
+                    statement.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    private void finallyExecute(Statement statement) {
+        if (statement != null) {
+            try {
+                statement.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 单表分页查询,含实体类
+     *
+     * @param map
+     * @param clazz
+     * @param <T>
+     * @return
+     * @throws Exception
+     */
+    public <T> Map<String, Object> getJdbcPage(Map<String, Object> map, Class<T> clazz, Connection... connections) throws Exception {
+        String tableName = OracleResultSetUtil.humpToLine(clazz.getSimpleName());
+        Map<String, Object> result = new HashMap<>();
+        Connection connection = null;
+        Statement statement = null;
+        String sql;
+        try {
+            if (connections.length > 0) {
+                connection = connections[0];
+            } else {
+                connection = dataSource.getConnection();
+            }
+            statement = connection.createStatement();
+
+            sql = OracleResultSetUtil.formatPageSqlCondition(map, tableName);
+            ResultSet resultSet = statement.executeQuery(sql);
+            List<T> resultList = OracleResultSetUtil.formatResultSetToList(resultSet, clazz);
+
+            String condition = OracleResultSetUtil.formatSqlCondition(map, false);
+            sql = "select count(1) from " + tableName + condition;
+            resultSet = statement.executeQuery(sql);
+            if (resultSet.next()) {
+                result.put("total", resultSet.getInt(1));
+            }
+            result.put("records", resultList);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        } finally {
+            if (connections.length == 0) {
+                finallyExecute(connection, statement);
+            } else {
+                finallyExecute(statement);
+            }
+        }
+    }
+
+
+
+
+}

+ 226 - 0
easydo-chengfa/src/main/java/easydo/technology/util/OracleResultSetUtil.java

@@ -0,0 +1,226 @@
+package easydo.technology.util;
+
+import com.alibaba.fastjson.JSONObject;
+import easydo.technology.utils.StringUtil;
+
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class OracleResultSetUtil {
+    private static Pattern linePattern = Pattern.compile("_(\\w)");
+    private static String suffixBegin = "_BEGIN";
+    private static String suffixEnd = "_END";
+    private static String suffixLike = "_LIKE";
+    private static String suffixNot = "_NOT";
+    private static String suffixIn = "_IN";
+    private static String suffixNotIn = "_NOTIN";
+    private static String suffixNull = "_NULL";
+    private static String suffixNotNull = "_NOTNULL";
+    private static String suffixApplySql = "APPLY_SQL";
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
+
+    /**
+     * 驼峰转下划线,再转大写
+     */
+    public static String humpToLine(String str) {
+        Matcher matcher = humpPattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        if (sb.toString().startsWith("_")) {
+            sb.deleteCharAt(0);
+        }
+        return sb.toString().toUpperCase();
+    }
+
+    public static String lineToHump(String str) {
+        str = str.toLowerCase();
+        Matcher matcher = linePattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    public static String formatSqlCondition(Map<String, Object> map, boolean isPage) throws RuntimeException {
+
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append(" where 1=1 ");
+        if (isPage) {
+            stringBuilder.append("{replace_page_sql} ");
+        }
+        map.entrySet().stream()
+                .filter(entry -> StringUtil.isNotEmpty(entry.getKey()) && StringUtil.isNotEmpty(entry.getValue()))
+                .forEach(entry -> {
+                    String key = entry.getKey();
+                    Object value = entry.getValue();
+                    if (containsSqlInjection(value) && !"apply_sql".equals(key)) {
+                        throw new RuntimeException("非法参数");
+                    }
+                    String column = humpToLine(key);
+                    if (column.endsWith(suffixBegin)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixBegin, "");
+                        stringBuilder.append(column);
+                        stringBuilder.append(" >=").append("'").append(value).append("'");
+                    } else if (column.endsWith(suffixEnd)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixEnd, "");
+                        stringBuilder.append(column);
+                        stringBuilder.append(" <=").append("'").append(value).append("'");
+                    } else if (column.endsWith(suffixLike)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixLike, "");
+                        stringBuilder.append(column);
+                        stringBuilder.append(" like '%").append(value).append("%'");
+                    } else if (column.endsWith(suffixNot)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixNot, "");
+                        stringBuilder.append(column).append(" !=");
+                        if ("true".equals(value.toString()) || "false".equals(value.toString())) {
+                            stringBuilder.append(value);
+                        } else {
+                            stringBuilder.append("'").append(value).append("'");
+                        }
+                    } else if (column.endsWith(suffixIn)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixIn, "");
+                        List<Object> list = (List<Object>) value;
+                        stringBuilder.append(column);
+                        stringBuilder.append(" in (");
+                        if (!list.isEmpty()) {
+                            list.forEach(str -> {
+                                stringBuilder.append("'").append(str).append("',");
+                            });
+                        } else {
+                            stringBuilder.append("'null',");
+                        }
+                        stringBuilder.deleteCharAt(stringBuilder.toString().length() - 1);
+                        stringBuilder.append(")");
+                    } else if (column.endsWith(suffixNotIn)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixNotIn, "");
+                        List<String> list = (List<String>) value;
+                        stringBuilder.append(column);
+                        stringBuilder.append(" not in (");
+                        if (!list.isEmpty()) {
+                            list.forEach(str -> {
+                                stringBuilder.append("'").append(str).append("',");
+                            });
+                        } else {
+                            stringBuilder.append("'null',");
+                        }
+                        stringBuilder.deleteCharAt(stringBuilder.toString().length() - 1);
+                        stringBuilder.append(")");
+                    } else if (column.endsWith(suffixNull)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixNull, "");
+                        stringBuilder.append(column).append(" is null");
+                    } else if (column.endsWith(suffixNotNull)) {
+                        stringBuilder.append(" and ");
+                        column = column.replace(suffixNotNull, "");
+                        stringBuilder.append(column).append(" is not null");
+                    } else if (column.equals(suffixApplySql)) {
+                        stringBuilder.append(" and ");
+                        stringBuilder.append("(").append(value).append(")");
+                    } else if (column.startsWith("(") && column.endsWith(")")) {
+                        stringBuilder.append(" and ");
+                        column = key.substring(0, key.length() - 1);
+                        stringBuilder.append(column).append(" =").append("'").append(value).append("')");
+                    } else {
+                        stringBuilder.append(" and ");
+                        stringBuilder.append(column).append(" =");
+                        if ("true".equals(value.toString()) || "false".equals(value.toString())) {
+                            stringBuilder.append(value);
+                        } else {
+                            stringBuilder.append("'").append(value).append("'");
+                        }
+                    }
+                });
+        return stringBuilder.toString();
+    }
+
+    public static <T> String formatPageSqlCondition(Map<String, Object> map, String tableName) {
+        int current = (int) map.get("current");
+        int size = (int) map.get("size");
+        String orderBy = null;
+        if (map.containsKey("orderBy")) {
+            orderBy = map.get("orderBy").toString();
+        }
+        map.remove("current");
+        map.remove("size");
+        map.remove("orderBy");
+
+        String condition = formatSqlCondition(map, true);
+        if (StringUtil.isNotEmpty(orderBy)) {
+            String[] orderByArr = orderBy.split("_");
+            String orderBySql = " order by `" + humpToLine(orderByArr[0]) + "` " + orderByArr[1];
+            condition += orderBySql;
+        }
+        condition = condition.replace("{replace_page_sql}", "and ROWNUM <=" + current * size);
+
+        String sql = "select * from (select t.*,ROWNUM r from " + tableName + " t" + condition + ") WHERE r >" + (current - 1) * size;
+
+        return sql;
+    }
+
+    public static <T> List<T> formatResultSetToList(ResultSet resultSet, Class<T> clazz) throws SQLException {
+        List<T> resultList = new ArrayList<>();
+        while (resultSet.next()) {
+            ResultSetMetaData metaData = resultSet.getMetaData();
+            int columnCount = metaData.getColumnCount();
+            JSONObject jsonObject = new JSONObject();
+            for (int i = 1; i <= columnCount; i++) {
+                String key = lineToHump(metaData.getColumnName(i));
+                if (key.endsWith("Time") || key.endsWith("Date")) {
+                    jsonObject.put(key, formatDateAndTime(key, resultSet.getObject(i)));
+                } else {
+                    jsonObject.put(key, resultSet.getObject(i));
+                }
+
+            }
+            T t = jsonObject.toJavaObject(clazz);
+            resultList.add(t);
+        }
+        return resultList;
+    }
+
+    private static Object formatDateAndTime(String key, Object object) {
+        if (key.endsWith("Time")) {
+            try {
+                String timeStr = object.toString();
+                timeStr = timeStr.replace("T", "").substring(0, 19);
+                return timeStr;
+            } catch (Exception e) {
+                return object;
+            }
+        } else if (key.endsWith("Date")) {
+            try {
+                String timeStr = object.toString();
+                timeStr = timeStr.substring(0, 10);
+                return timeStr;
+            } catch (Exception e) {
+                return object;
+            }
+        } else {
+            return object;
+        }
+    }
+
+    private static boolean containsSqlInjection(Object obj) {
+        String objStr = obj.toString().toLowerCase();
+        // 使用正则表达式匹配独立的SQL关键字,注意正则表达式需要根据实际需求调整
+        String pattern = "\\b(and|exec|insert|select|drop|grant|alter|delete|update|count|chr|mid|master|truncate|char|declare|or|;)\\b";
+        return objStr.matches(pattern);
+    }
+}

+ 8 - 0
easydo-chengfa/src/main/resources/banner.txt

@@ -0,0 +1,8 @@
+       _                 _           _
+      | |               | |         (_)
+   ___| |______ __ _  __| |_ __ ___  _ _ __
+  / _ | |______/ _` |/ _` | '_ ` _ \| | '_ \
+ |  __| |     | (_| | (_| | | | | | | | | | |
+  \___|_|      \__,_|\__,_|_| |_| |_|_|_| |_|
+
+ :: Spring Boot ::       (v2.1.0.RELEASE)

+ 204 - 0
easydo-chengfa/src/main/resources/config/application-dev.yml

@@ -0,0 +1,204 @@
+server:
+  port: 8810
+#配置数据源
+spring:
+  datasource:
+    dynamic:
+      primary: master
+      strict: false
+      datasource:
+        master:
+          db-type: com.alibaba.druid.pool.DruidDataSource
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://172.16.1.141:3306/purchase?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8
+          username: root
+          password: Jsf@Customize.2023
+          # 配置监控统计
+          webStatFilter:
+            enabled: true
+          stat-view-servlet:
+            enabled: true
+            url-pattern: /druid/*
+            reset-enable: false
+          filter:
+            stat:
+              enabled: true
+              # 记录慢SQL
+              log-slow-sql: true
+              slow-sql-millis: 1000
+              merge-sql: false
+            wall:
+              config:
+                multi-statement-allow: true
+          druid:
+            # 初始连接数
+            initial-size: 5
+            # 最小连接数
+            min-idle: 10
+            # 最大连接数
+            max-active: 20
+            # 获取连接超时时间
+            max-wait: 5000
+            # 连接有效性检测时间
+            time-between-eviction-runs-millis: 60000
+            # 连接在池中最小生存的时间
+            min-evictable-idle-time-millis: 300000
+            # 连接在池中最大生存的时间
+            max-evictable-idle-time-millis: 900000
+            test-while-idle: true
+            test-on-borrow: false
+            test-on-return: false
+            # 检测连接是否有效
+            validation-query: select 1
+        oa:
+            db-type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: oracle.jdbc.OracleDriver
+            url: jdbc:oracle:thin:@172.16.1.20:1521:orcl
+            username: CFTZOA
+            password: CFTZOAVIEW
+            druid:
+              # 初始连接数
+              initial-size: 5
+              # 最小连接数
+              min-idle: 10
+              # 最大连接数
+              max-active: 20
+              # 获取连接超时时间
+              max-wait: 5000
+              # 连接有效性检测时间
+              time-between-eviction-runs-millis: 60000
+              # 连接在池中最小生存的时间
+              min-evictable-idle-time-millis: 300000
+              # 连接在池中最大生存的时间
+              max-evictable-idle-time-millis: 900000
+              test-while-idle: true
+              test-on-borrow: false
+              test-on-return: false
+              # 检测连接是否有效
+              validation-query: select 1 FROM DUAL
+
+
+  redis:
+    #数据库索引
+    database: ${REDIS_DB:0}
+    host: ${REDIS_HOST:172.16.1.141}
+    port: ${REDIS_PORT:6379}
+    password: Jsf@Customize.2023
+    #连接超时时间
+    timeout: 5000
+
+  kafka:
+    consumer:
+      bootstrap-servers: 172.16.1.141:9092
+      group-id: task.zcxt
+      enable-auto-commit: true
+      auto-commit-interval: 1000
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+
+iot:
+  facerec:
+    pictureUri: https://www.qdeasydo.com/api/folder/
+# 登录相关配置
+login:
+  # 登录缓存
+  cache-enable: false
+  #  是否限制单用户登录
+  single: false
+  #  验证码
+  login-code:
+    #  验证码类型配置 查看 LoginProperties 类
+    code-type: arithmetic
+    #  登录图形验证码有效时间/分钟
+    expiration: 2
+    #  验证码高度
+    width: 111
+    #  验证码宽度
+    heigth: 36
+    # 内容长度
+    length: 2
+    # 字体名称,为空则使用默认字体
+    font-name:
+    # 字体大小
+    font-size: 25
+
+#jwt
+jwt:
+  header: Authorization
+  # 令牌前缀
+  token-start-with: Bearer
+  # 必须使用最少88位的Base64对该令牌进行编码
+  base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
+  # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
+  token-validity-in-seconds: 14400000
+  # 在线用户key
+  online-key: online-token-
+  # 验证码
+  code-key: code-key-
+  # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
+  detect: 1800000
+  # 续期时间范围,默认1小时,单位毫秒
+  renew: 3600000
+
+#是否允许生成代码,生产环境设置为false
+generator:
+  enabled: true
+
+#是否开启 swagger-ui
+swagger:
+  enabled: true
+
+# IP 本地解析
+ip:
+  local-parsing: true
+
+# tenantId_gld_cost: "865509948108800"
+tenantId_gld_cost: "5600003"
+tenantId_gld_master: "5600003"
+
+OA:
+  host: "http://218.201.101.181:8180"
+  getTokenPath: "/seeyon/rest/token"
+  username: "zcxt"
+  password: "2679fc6b-df18-4563-9b8e-773b59bdcb62"
+  getUsernamePath: "/seeyon/thirdpartyController.do?ticket="
+  getUserInfoPath: "/seeyon/rest/orgMember?loginName="
+  sendTodoPath: "/seeyon/rest/thirdpartyPending/receive?token="
+  updateTodoPath: "/seeyon/rest/thirdpartyPending/updatePendingState?token="
+  sendMessagePath: "/seeyon/rest/thirdpartyMessage/receive/singleMessage?token="
+  registerCode: "3007"
+
+
+GLD:
+  host: "http://218.201.101.181:14780"
+  COST:
+    getPath: "/cost-management/openapi/contractPlanItems/list"
+    updatePath: "/cost-management/openapi/contractPlanItems/replace"
+    authorization: "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4="
+    getContractPath: "/cost-management/openapi/contracts/list"
+    contractFile: "/cost-management/openapi/attachments/"
+  MASTER:
+    getToken: "/account/oauth2/token?grant_type=client_credentials"
+    getDept: "/admin/depts"
+    getMember: "/admin/depts/memberslist?allTreePath=true&includeExternal=true"
+    getProject: "/pmbasic/projects/list"
+    getTenant: "/tenant/v2/tenants?size=20000"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+  APPROVE:
+    mgtGroupId: "11200297"
+    formId: "flow/STD_Dcm_PROCUREMENT_SYSTEM"
+    formCode: "STD_Dcm_PROCUREMENT_SYSTEM"
+    formName: "第三方招采系统"
+    startApprove: "/task/{deptId}/tasks/submit"
+    getApproveInfo: "/task/{deptId}/tasks?ids={ids}&taskType=APPROVAL"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+
+PURCHASE:
+  redirectUrl: "http://localhost:7800/#/redirect"
+  purchasePath: "process-form-infor"
+  supplierPath: "supplier-evaluation-detail"
+  requestUrl: "http://192.168.101.93:8810/purchase/getDetail?"
+
+MDM:
+  host: "http://172.16.1.184:8088"
+  supplierPush: "/intfc/mdm/receive?serviceCode=08&sysCode=04"

+ 202 - 0
easydo-chengfa/src/main/resources/config/application-prod.yml

@@ -0,0 +1,202 @@
+server:
+  port: 8810
+#配置数据源
+spring:
+  datasource:
+    dynamic:
+      primary: master
+      strict: false
+      datasource:
+        master:
+          db-type: com.alibaba.druid.pool.DruidDataSource
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://172.16.1.121:3306/purchase?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8
+          username: root
+          password: Jsf@Customize.2023
+          # 配置监控统计
+          webStatFilter:
+            enabled: true
+          stat-view-servlet:
+            enabled: true
+            url-pattern: /druid/*
+            reset-enable: false
+          filter:
+            stat:
+              enabled: true
+              # 记录慢SQL
+              log-slow-sql: true
+              slow-sql-millis: 1000
+              merge-sql: false
+            wall:
+              config:
+                multi-statement-allow: true
+          druid:
+            # 初始连接数
+            initial-size: 5
+            # 最小连接数
+            min-idle: 10
+            # 最大连接数
+            max-active: 20
+            # 获取连接超时时间
+            max-wait: 5000
+            # 连接有效性检测时间
+            time-between-eviction-runs-millis: 60000
+            # 连接在池中最小生存的时间
+            min-evictable-idle-time-millis: 300000
+            # 连接在池中最大生存的时间
+            max-evictable-idle-time-millis: 900000
+            test-while-idle: true
+            test-on-borrow: false
+            test-on-return: false
+            # 检测连接是否有效
+            validation-query: select 1
+        oa:
+          db-type: com.alibaba.druid.pool.DruidDataSource
+          driverClassName: oracle.jdbc.OracleDriver
+          url: jdbc:oracle:thin:@172.16.1.20:1521:orcl
+          username: CFTZOA
+          password: CFTZOAVIEW
+          druid:
+            # 初始连接数
+            initial-size: 5
+            # 最小连接数
+            min-idle: 10
+            # 最大连接数
+            max-active: 20
+            # 获取连接超时时间
+            max-wait: 5000
+            # 连接有效性检测时间
+            time-between-eviction-runs-millis: 60000
+            # 连接在池中最小生存的时间
+            min-evictable-idle-time-millis: 300000
+            # 连接在池中最大生存的时间
+            max-evictable-idle-time-millis: 900000
+            test-while-idle: true
+            test-on-borrow: false
+            test-on-return: false
+            # 检测连接是否有效
+            validation-query: select 1 FROM DUAL
+
+
+  redis:
+    #数据库索引
+    database: ${REDIS_DB:0}
+    host: ${REDIS_HOST:172.16.1.121}
+    port: ${REDIS_PORT:6379}
+    password: Jsf@Customize.2023
+    #连接超时时间
+    timeout: 5000
+
+  kafka:
+    consumer:
+      bootstrap-servers: 172.16.1.141:9092
+      group-id: task.zcxt_prod
+      enable-auto-commit: true
+      auto-commit-interval: 1000
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+
+iot:
+  facerec:
+    pictureUri: https://www.qdeasydo.com/api/folder/
+# 登录相关配置
+login:
+  # 登录缓存
+  cache-enable: false
+  #  是否限制单用户登录
+  single: false
+  #  验证码
+  login-code:
+    #  验证码类型配置 查看 LoginProperties 类
+    code-type: arithmetic
+    #  登录图形验证码有效时间/分钟
+    expiration: 2
+    #  验证码高度
+    width: 111
+    #  验证码宽度
+    heigth: 36
+    # 内容长度
+    length: 2
+    # 字体名称,为空则使用默认字体
+    font-name:
+    # 字体大小
+    font-size: 25
+
+#jwt
+jwt:
+  header: Authorization
+  # 令牌前缀
+  token-start-with: Bearer
+  # 必须使用最少88位的Base64对该令牌进行编码
+  base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
+  # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
+  token-validity-in-seconds: 14400000
+  # 在线用户key
+  online-key: online-token-
+  # 验证码
+  code-key: code-key-
+  # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
+  detect: 1800000
+  # 续期时间范围,默认1小时,单位毫秒
+  renew: 3600000
+
+#是否允许生成代码,生产环境设置为false
+generator:
+  enabled: true
+
+#是否开启 swagger-ui
+swagger:
+  enabled: true
+
+# IP 本地解析
+ip:
+  local-parsing: true
+
+tenantId_gld_cost: "5600003"
+tenantId_gld_master: "5600003"
+
+OA:
+  host: "http://218.201.101.181:8180"
+  getTokenPath: "/seeyon/rest/token"
+  username: "zcxt"
+  password: "2679fc6b-df18-4563-9b8e-773b59bdcb62"
+  getUsernamePath: "/seeyon/thirdpartyController.do?ticket="
+  getUserInfoPath: "/seeyon/rest/orgMember?loginName="
+  sendTodoPath: "/seeyon/rest/thirdpartyPending/receive?token="
+  updateTodoPath: "/seeyon/rest/thirdpartyPending/updatePendingState?token="
+  sendMessagePath: "/seeyon/rest/thirdpartyMessage/receive/singleMessage?token="
+  registerCode: "3007"
+
+GLD:
+  host: "http://218.201.101.181:14780"
+  COST:
+    getPath: "/cost-management/openapi/contractPlanItems/list"
+    updatePath: "/cost-management/openapi/contractPlanItems/replace"
+    authorization: "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4="
+    getContractPath: "/cost-management/openapi/contracts/list"
+    contractFile: "/cost-management/openapi/attachments/"
+  MASTER:
+    getToken: "/account/oauth2/token?grant_type=client_credentials"
+    getDept: "/admin/depts"
+    getMember: "/admin/depts/memberslist?allTreePath=true&includeExternal=true"
+    getProject: "/pmbasic/projects/list"
+    getTenant: "/tenant/v2/tenants?size=20000"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+  APPROVE:
+    mgtGroupId: "11200297"
+    formId: "flow/STD_Dcm_PROCUREMENT_SYSTEM"
+    formCode: "STD_Dcm_PROCUREMENT_SYSTEM"
+    formName: "第三方招采系统"
+    startApprove: "/task/{deptId}/tasks/submit"
+    getApproveInfo: "/task/{deptId}/tasks?ids={ids}&taskType=APPROVAL"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+
+PURCHASE:
+  redirectUrl: "http://172.16.1.132:8800/#/redirect"
+  purchasePath: "process-form-infor"
+  supplierPath: "supplier-evaluation-detail"
+  requestUrl: "http://172.16.1.132:8810/purchase/getDetail?"
+
+MDM:
+  host: "http://172.16.1.184:8088"
+  supplierPush: "/intfc/mdm/receive?serviceCode=08&sysCode=04"

+ 202 - 0
easydo-chengfa/src/main/resources/config/application-test.yml

@@ -0,0 +1,202 @@
+server:
+  port: 8810
+#配置数据源
+spring:
+  datasource:
+    dynamic:
+      primary: master
+      strict: false
+      datasource:
+        master:
+          db-type: com.alibaba.druid.pool.DruidDataSource
+          driverClassName: com.mysql.cj.jdbc.Driver
+          url: jdbc:mysql://172.16.1.141:3306/purchase?useSSL=false&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8
+          username: root
+          password: Jsf@Customize.2023
+          # 配置监控统计
+          webStatFilter:
+            enabled: true
+          stat-view-servlet:
+            enabled: true
+            url-pattern: /druid/*
+            reset-enable: false
+          filter:
+            stat:
+              enabled: true
+              # 记录慢SQL
+              log-slow-sql: true
+              slow-sql-millis: 1000
+              merge-sql: false
+            wall:
+              config:
+                multi-statement-allow: true
+          druid:
+            # 初始连接数
+            initial-size: 5
+            # 最小连接数
+            min-idle: 10
+            # 最大连接数
+            max-active: 20
+            # 获取连接超时时间
+            max-wait: 5000
+            # 连接有效性检测时间
+            time-between-eviction-runs-millis: 60000
+            # 连接在池中最小生存的时间
+            min-evictable-idle-time-millis: 300000
+            # 连接在池中最大生存的时间
+            max-evictable-idle-time-millis: 900000
+            test-while-idle: true
+            test-on-borrow: false
+            test-on-return: false
+            # 检测连接是否有效
+            validation-query: select 1
+        oa:
+            db-type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: oracle.jdbc.OracleDriver
+            url: jdbc:oracle:thin:@172.16.1.20:1521:orcl
+            username: CFTZOA
+            password: CFTZOAVIEW
+            druid:
+              # 初始连接数
+              initial-size: 5
+              # 最小连接数
+              min-idle: 10
+              # 最大连接数
+              max-active: 20
+              # 获取连接超时时间
+              max-wait: 5000
+              # 连接有效性检测时间
+              time-between-eviction-runs-millis: 60000
+              # 连接在池中最小生存的时间
+              min-evictable-idle-time-millis: 300000
+              # 连接在池中最大生存的时间
+              max-evictable-idle-time-millis: 900000
+              test-while-idle: true
+              test-on-borrow: false
+              test-on-return: false
+              # 检测连接是否有效
+              validation-query: select 1 FROM DUAL
+
+
+  redis:
+    #数据库索引
+    database: ${REDIS_DB:0}
+    host: ${REDIS_HOST:172.16.1.141}
+    port: ${REDIS_PORT:6379}
+    password: Jsf@Customize.2023
+    #连接超时时间
+    timeout: 5000
+
+  kafka:
+    consumer:
+      bootstrap-servers: 172.16.1.141:9092
+      group-id: task.zcxt_test
+      enable-auto-commit: true
+      auto-commit-interval: 1000
+      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
+
+iot:
+  facerec:
+    pictureUri: https://www.qdeasydo.com/api/folder/
+# 登录相关配置
+login:
+  # 登录缓存
+  cache-enable: false
+  #  是否限制单用户登录
+  single: false
+  #  验证码
+  login-code:
+    #  验证码类型配置 查看 LoginProperties 类
+    code-type: arithmetic
+    #  登录图形验证码有效时间/分钟
+    expiration: 2
+    #  验证码高度
+    width: 111
+    #  验证码宽度
+    heigth: 36
+    # 内容长度
+    length: 2
+    # 字体名称,为空则使用默认字体
+    font-name:
+    # 字体大小
+    font-size: 25
+
+#jwt
+jwt:
+  header: Authorization
+  # 令牌前缀
+  token-start-with: Bearer
+  # 必须使用最少88位的Base64对该令牌进行编码
+  base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
+  # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
+  token-validity-in-seconds: 14400000
+  # 在线用户key
+  online-key: online-token-
+  # 验证码
+  code-key: code-key-
+  # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
+  detect: 1800000
+  # 续期时间范围,默认1小时,单位毫秒
+  renew: 3600000
+
+#是否允许生成代码,生产环境设置为false
+generator:
+  enabled: true
+
+#是否开启 swagger-ui
+swagger:
+  enabled: true
+
+# IP 本地解析
+ip:
+  local-parsing: true
+
+tenantId_gld_cost: "5600003"
+tenantId_gld_master: "5600003"
+
+OA:
+  host: "http://218.201.101.181:8180"
+  getTokenPath: "/seeyon/rest/token"
+  username: "zcxt"
+  password: "2679fc6b-df18-4563-9b8e-773b59bdcb62"
+  getUsernamePath: "/seeyon/thirdpartyController.do?ticket="
+  getUserInfoPath: "/seeyon/rest/orgMember?loginName="
+  sendTodoPath: "/seeyon/rest/thirdpartyPending/receive?token="
+  updateTodoPath: "/seeyon/rest/thirdpartyPending/updatePendingState?token="
+  sendMessagePath: "/seeyon/rest/thirdpartyMessage/receive/singleMessage?token="
+  registerCode: "3007"
+
+GLD:
+  host: "http://218.201.101.181:14780"
+  COST:
+    getPath: "/cost-management/openapi/contractPlanItems/list"
+    updatePath: "/cost-management/openapi/contractPlanItems/replace"
+    authorization: "Basic a0ZkMkE4UkhSM1l1ZlplQ1lVUGNjVWFMblJWQW5ZZ1c6VTJNakoycVZiaGNVYlI5VlVyUUdYeVFQekp1WkdoNm4="
+    getContractPath: "/cost-management/openapi/contracts/list"
+    contractFile: "/cost-management/openapi/attachments/"
+  MASTER:
+    getToken: "/account/oauth2/token?grant_type=client_credentials"
+    getDept: "/admin/depts"
+    getMember: "/admin/depts/memberslist?allTreePath=true&includeExternal=true"
+    getProject: "/pmbasic/projects/list"
+    getTenant: "/tenant/v2/tenants?size=20000"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+  APPROVE:
+    mgtGroupId: "11200297"
+    formId: "flow/STD_Dcm_PROCUREMENT_SYSTEM"
+    formCode: "STD_Dcm_PROCUREMENT_SYSTEM"
+    formName: "第三方招采系统"
+    startApprove: "/task/{deptId}/tasks/submit"
+    getApproveInfo: "/task/{deptId}/tasks?ids={ids}&taskType=APPROVAL"
+    authorization: "Basic YlFvc0tIeWJkSlZUZGtMcXA0U1VIMlE0ejNZQjc5eVA6b1ZmaU5zR1c1NVZzSW5ITTlDOVI3c2g0SHlpVGMxY2w="
+
+PURCHASE:
+  redirectUrl: "http://172.16.1.150:8800/#/redirect"
+  purchasePath: "process-form-infor"
+  supplierPath: "supplier-evaluation-detail"
+  requestUrl: "http://172.16.1.150:8810/purchase/getDetail?"
+
+MDM:
+  host: "http://172.16.1.184:8088"
+  supplierPush: "/intfc/mdm/receive?serviceCode=08&sysCode=04"

+ 70 - 0
easydo-chengfa/src/main/resources/config/application.yml

@@ -0,0 +1,70 @@
+
+spring:
+  freemarker:
+    check-template-location: false
+  profiles:
+    active: dev
+  jackson:
+    time-zone: GMT+8
+  data:
+    redis:
+      repositories:
+        enabled: false
+
+  #配置 Jpa
+  jpa:
+    properties:
+      hibernate:
+        ddl-auto: none
+        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+  servlet:
+    multipart:
+      max-file-size: 20MB
+
+task:
+  pool:
+    # 核心线程池大小
+    core-pool-size: 10
+    # 最大线程数
+    max-pool-size: 30
+    # 活跃时间
+    keep-alive-seconds: 60
+    # 队列容量
+    queue-capacity: 50
+
+
+#密码加密传输,前端公钥加密,后端私钥解密
+rsa:
+  private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
+
+mybatis-plus:
+  configuration:
+    map-underscore-to-camel-case: true
+    auto-mapping-behavior: full
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  mapper-locations: classpath*:/mapper/*Mapper.xml
+  global-config:
+    db-config:
+      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+#MyBatis配置
+mybatis:
+  type-aliases-package: com.pjb.entity #别名定义
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定 MyBatis 所用日志的具体实现,未指定时将自动查找
+    map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射
+    lazy-loading-enabled: true #开启延时加载开关
+    aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是false
+    lazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载
+    cache-enabled: true #打开全局缓存开关(二级环境),默认值就是true
+
+#MyBatis使用pageHelper分页
+pagehelper:
+  helper-dialect: mysql
+  reasonable: true
+  support-methods-arguments: true
+
+#邮箱验证码有效时间/秒
+code:
+  expiration: 300

+ 72 - 0
easydo-chengfa/src/main/resources/config/param.properties

@@ -0,0 +1,72 @@
+# Ftp配置  #
+ftp.serverHost=10.5.7.21
+ftp.serverPort=21
+ftp.username=ftptest
+ftp.password=123456
+ftp.bufferSize=1024
+ftp.encoding=utf-8
+# OSS配置 #
+#外网访问
+oss.endPoint=oss-cn-hangzhou.aliyuncs.com
+#  oss-cn-hangzhou.aliyuncs.com
+#内网访问
+#测试站
+#oss.endPoint-internal=oss-cn-hangzhou.aliyuncs.com
+#生产
+oss.endPoint-internal=oss-cn-hangzhou-internal.aliyuncs.com
+#bucketname
+oss.bucket=gyljr-product
+# 本地存放文件的目录 #
+directory.file=/u01/data/gxjr/
+# 文件显示配置 #
+file.server=
+# 下载路径 #
+download.server=
+#印章服务器#
+seal.server=
+#ra服务器#
+seal.raserver=
+#kt服务器#
+seal.ktip=
+#验证证书服务器服务器#
+verify.server=
+#证书校验--通信证书存放路径#
+keyStore.path=
+#证书校验--通信证书密码#
+keyStore.pwd=
+#证书校验--信任证书存放路径#
+trustStore.path=
+#证书校验--通信证书密码#
+trustStore.pwd=
+#平台手机号
+oms.phones=
+# 是否发送短信
+sms.isSend=y
+# 是否隐藏验证码、密码等关键信息
+sms.isHidden=n
+ukey.isDebug=y
+# 签章方式
+signType=
+# 核心系统api地址
+core.host=http://10.5.1.61:9080
+# token获取地址
+core.defaultManager=$hanbing$;
+core.getToken=/finance-console/admin/fanWeiLogin/getToken?userName=
+# 业务经理获取地址
+core.findEmployee=/finance-console/v1/supplychain/findEmployee
+core.findClientOwner=/finance-console/v1/supplychain/findClientOwner
+# 还款计划地址
+core.getRepayPlan=/finance-console/v1/supplychain/ticketLoan/repayPlan
+# 业务编号地址
+core.getTradeCode=/finance-console/v1/supplychain/ticketLoan/busiCd
+# 业务申请
+core.applyTrade=/finance-console/v1/supplychain/ticketLoan
+# 上传文件
+core.uploadAttachment=/finance-console/v1/supplychain/uploadAttachment
+#检验开户银行名称
+core.checkBank=/finance-console/v1/supplychain/checkBank
+#电票保相应接口
+core.guarantee.getTradeCode=/finance-console/v1/supplychain/ticketGuarantee/busiCd
+core.guarantee.applyTrade=/finance-console/v1/supplychain/ticketGuarantee
+core.guarantee.uploadAttachment=/finance-console/v1/supplychain/ticketGuarantee/uploadAttachment
+regist.protocolFile.url=https://gyljr-product.oss-cn-hangzhou.aliyuncs.com/protocol.pdf

BIN
easydo-chengfa/src/main/resources/ip2region/ip2region.db


+ 21 - 0
easydo-chengfa/src/main/resources/log4j.properties

@@ -0,0 +1,21 @@
+#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
+log4j.rootLogger=DEBUG,console,file
+#控制台输出的相关设置
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Target=System.out
+log4j.appender.console.Threshold=DEBUG
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
+#文件输出的相关设置
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=./log/kuang.log
+log4j.appender.file.MaxFileSize=10mb
+log4j.appender.file.Threshold=DEBUG
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
+#日志输出级别
+log4j.logger.org.mybatis=DEBUG
+log4j.logger.java.sql=DEBUG
+log4j.logger.java.sql.Statement=DEBUG
+log4j.logger.java.sql.ResultSet=DEBUG
+log4j.logger.java.sql.PreparedStatement=DEBUG

+ 45 - 0
easydo-chengfa/src/main/resources/logback.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="30 seconds" debug="false">
+    <contextName>elAdmin</contextName>
+    <property name="log.charset" value="UTF-8" />
+    <property name="log.pattern" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)" />
+
+    <!--输出到控制台-->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>${log.charset}</charset>
+        </encoder>
+    </appender>
+
+    <!--普通日志输出到控制台-->
+    <root level="INFO">
+        <appender-ref ref="console" />
+    </root>
+
+    <!--监控sql日志输出 -->
+    <logger name="jdbc.sqlonly" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+
+    <logger name="jdbc.resultset" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+
+    <!--  如想看到表格数据,将OFF改为INFO  -->
+    <logger name="jdbc.resultsettable" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+
+    <logger name="jdbc.connection" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+
+    <logger name="jdbc.sqltiming" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+
+    <logger name="jdbc.audit" level="OFF" additivity="false">
+        <appender-ref ref="console" />
+    </logger>
+</configuration>

+ 50 - 0
easydo-common/pom.xml

@@ -0,0 +1,50 @@
+<?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>
+        <groupId>easydo.technology</groupId>
+        <artifactId>easydo</artifactId>
+        <version>v20220507</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <properties>
+        <hutool.version>5.3.4</hutool.version>
+    </properties>
+
+    <artifactId>easydo-common</artifactId>
+    <name>公共模块</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+        </dependency>
+
+        <!--为HttpUtil使用-->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.10</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.lionsoul</groupId>
+            <artifactId>ip2region</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+        </dependency>
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.72</version>
+        </dependency>
+    </dependencies>
+</project>

+ 30 - 0
easydo-common/src/main/java/easydo/technology/annotation/AnonymousAccess.java

@@ -0,0 +1,30 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author jacky
+ *  用于标记匿名访问方法
+ */
+@Inherited
+@Documented
+@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AnonymousAccess {
+
+}

+ 47 - 0
easydo-common/src/main/java/easydo/technology/annotation/DataPermission.java

@@ -0,0 +1,47 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package easydo.technology.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <p>
+ *   用于判断是否过滤数据权限
+ *   1、如果没有用到 @OneToOne 这种关联关系,只需要填写 fieldName [参考:DeptQueryCriteria.class]
+ *   2、如果用到了 @OneToOne ,fieldName 和 joinName 都需要填写,拿UserQueryCriteria.class举例:
+ *   应该是 @DataPermission(joinName = "dept", fieldName = "id")
+ * </p>
+ * @author Zheng Jie
+ * @website https://el-admin.vip
+ * @date 2020-05-07
+ **/
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DataPermission {
+
+    /**
+     * Entity 中的字段名称
+     */
+    String fieldName() default "";
+
+    /**
+     * Entity 中与部门关联的字段名称
+     */
+    String joinName() default "";
+}

+ 0 - 0
easydo-common/src/main/java/easydo/technology/annotation/NotTableField.java


Деякі файли не було показано, через те що забагато файлів було змінено