Explorar o código

Initial commit

wangrs %!s(int64=4) %!d(string=hai) anos
achega
fc851631e3
Modificáronse 100 ficheiros con 6480 adicións e 0 borrados
  1. 7 0
      Dockerfile
  2. 14 0
      README.md
  3. 196 0
      approve-api/approve-api.iml
  4. 48 0
      approve-api/pom.xml
  5. 48 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowOprationEnum.java
  6. 47 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowTaskStateEnum.java
  7. 62 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/OperateOptionEnum.java
  8. 46 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/YesNoEnum.java
  9. 39 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApiApproveFacade.java
  10. 99 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveFacade.java
  11. 29 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IReferenceFacade.java
  12. 29 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/ITest.java
  13. 45 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/AgentDTO.java
  14. 297 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoDTO.java
  15. 275 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoUpdateDTO.java
  16. 66 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveOperateDTO.java
  17. 62 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ResourceInfoDTO.java
  18. 132 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ActivityNodeInfoVo.java
  19. 280 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoVo.java
  20. 90 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveCommentVo.java
  21. 29 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveWorkflowProcessTypeVo.java
  22. 51 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/PersonDataVo.java
  23. 63 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessInstanceVo.java
  24. 81 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusDetailVo.java
  25. 81 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusVo.java
  26. 52 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ResourceInfoVo.java
  27. 46 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/TaskOperateVo.java
  28. 132 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/TaskVo.java
  29. BIN=BIN
      approve-api/target/approve-api-1.0.0-SNAPSHOT.jar
  30. BIN=BIN
      approve-api/target/classes/META-INF/approve-api.kotlin_module
  31. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowOprationEnum.class
  32. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowTaskStateEnum.class
  33. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/OperateOptionEnum.class
  34. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/YesNoEnum.class
  35. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IApiApproveFacade.class
  36. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IApproveFacade.class
  37. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IReferenceFacade.class
  38. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/ITest.class
  39. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/AgentDTO.class
  40. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoDTO.class
  41. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoUpdateDTO.class
  42. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApproveOperateDTO.class
  43. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ResourceInfoDTO.class
  44. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ActivityNodeInfoVo.class
  45. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoVo.class
  46. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApproveCommentVo.class
  47. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApproveWorkflowProcessTypeVo.class
  48. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/PersonDataVo.class
  49. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessInstanceVo.class
  50. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusDetailVo.class
  51. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusVo.class
  52. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ResourceInfoVo.class
  53. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/TaskOperateVo.class
  54. BIN=BIN
      approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/TaskVo.class
  55. 5 0
      approve-api/target/maven-archiver/pom.properties
  56. 14 0
      approve-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
  57. 14 0
      approve-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
  58. 318 0
      approve-core-service/approve-core-service.iml
  59. BIN=BIN
      approve-core-service/lib/nosql-kafka-1.1.0-SNAPSHOT.jar
  60. 270 0
      approve-core-service/pom.xml
  61. 43 0
      approve-core-service/src/main/assembly/assembly.xml
  62. 97 0
      approve-core-service/src/main/assembly/conf/application.yml
  63. 60 0
      approve-core-service/src/main/assembly/conf/approve-core-nosql.properties
  64. 37 0
      approve-core-service/src/main/assembly/conf/logback.xml
  65. 26 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/ApproveApplication.java
  66. 115 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/componet/DcucHelper.java
  67. 19 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/ApproveConfig.java
  68. 30 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/KafkaConfig.java
  69. 78 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/NosqlConfig.java
  70. 13 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/OutterApisInfo.java
  71. 35 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/controller/ApproveController.java
  72. 48 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/controller/ReferenceController1.java
  73. 17 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEvent.java
  74. 17 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEventListener.java
  75. 32 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEventPublish.java
  76. 49 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApiApproveFacade.java
  77. 218 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApproveFacade.java
  78. 41 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ReferenceFacade.java
  79. 23 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/Test.java
  80. 14 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/ApprovalInfoMapper.java
  81. 12 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/ApprovalResourceInfoMapper.java
  82. 215 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalInfo.java
  83. 69 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalResourceInfo.java
  84. 153 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveTaskRequestVo.java
  85. 24 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/IdEntity.java
  86. 35 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/PoliceResultVo.java
  87. 51 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/WorkflowConditionDto.java
  88. 13 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IApplyInfoService.java
  89. 147 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IApproveService.java
  90. 16 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IKafkaService.java
  91. 21 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApplyInfoService.java
  92. 1227 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApproveService.java
  93. 91 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/KafkaService.java
  94. 39 0
      approve-core-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json
  95. 99 0
      approve-core-service/src/main/resources/application.yml
  96. 62 0
      approve-core-service/src/main/resources/approve-core-nosql.properties
  97. 40 0
      approve-core-service/src/main/resources/config/mysql/V1_1_0001__INITIAL.sql
  98. 75 0
      approve-core-service/src/main/resources/config/oracle/V1_1_0001__INITIAL.sql
  99. 6 0
      approve-core-service/src/main/resources/mapping/ApprovalInfoMapper.xml
  100. 6 0
      approve-core-service/src/main/resources/mapping/ApprovalResourceInfoMapper.xml

+ 7 - 0
Dockerfile

@@ -0,0 +1,7 @@
+# 基础镜像为Jenkins构建时选择的镜像
+FROM bus.ga/base/dragon-java:jdk8-alpine-arm64
+# ${pomVersion}对应pom里的数字version,如:1.0.0
+ADD approve-core-service/target/approve-core-service-${pomVersion}-SNAPSHOT.tar.gz /opt/docker/
+RUN mv /opt/docker/approve-core-service-${pomVersion}-SNAPSHOT /opt/docker/approve-core-service
+ENTRYPOINT ["/opt/docker/approve-core-service/bin/start.sh"];
+

+ 14 - 0
README.md

@@ -0,0 +1,14 @@
+# 服务组件
+## 注意事项
+- **service** 执行`maven clean package` 时会把**service**下所有的包进行打包处理
+- 当修改**service**的**pom**文件的内容时,需要重新执行**maven deploy**,否则会打包出错
+
+
+## 对接消息中心
+- **KAFKA地址**: 192.168.10.20:9093
+- **API 地址** :192.168.10.20:9981/dcms-manager
+- **API-KEY**:dcuc69000787
+- **SECRET-KEY**: dcuc01494668
+### 消息主题
+| 消息类型 | KAFKA主题
+| --- | ---

+ 196 - 0
approve-api/approve-api.iml

@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-openfeign:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.64" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-archaius:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-core:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-hystrix:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.archaius:archaius-core:0.7.6" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: commons-configuration:commons-configuration:1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-core:1.5.18" level="project" />
+    <orderEntry type="library" name="Maven: io.reactivex:rxjava:1.3.8" level="project" />
+    <orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.3.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-security-jwt:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:transmittable-thread-local:2.11.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-base:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt-api:0.10.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.jsonwebtoken:jjwt-impl:0.10.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.jsonwebtoken:jjwt-jackson:0.10.5" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-commons:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.24.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.4.5" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.56" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:2.2" level="project" />
+    <orderEntry type="library" name="Maven: asm:asm:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.1.5.Final" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: org.jsoup:jsoup:1.12.2" level="project" />
+    <orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-autoconfigure:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-support-licenseignore:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.57" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.trove4j:core:3.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-restclient:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:guava:2.8.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.4" level="project" />
+    <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.3.4" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-web:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-web:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-service:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.josql:josql:2.1" level="project" />
+    <orderEntry type="library" name="Maven: com.gentlyweb.utils:gentlyWEB-utils:1.1.GA" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.2.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-repository-jpa:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.transaction:jakarta.transaction-api:1.3.3" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.4.17.Final" level="project" />
+    <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss:jandex:2.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.11" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-repository:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.36" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.36" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-swagger:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.11" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.1.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.4.2" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-workflow:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-workflow:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-duwf-api:2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" />
+    <orderEntry type="library" name="Maven: com.dragoninfo:dcuc-app-model:2.0.0-SNAPSHOT" level="project" />
+    <orderEntry type="module" module-name="approve-common" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-starter-config-apollo:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-config-apollo:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-client:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.google.inject:guice:4.1.0" level="project" />
+    <orderEntry type="library" name="Maven: javax.inject:javax.inject:1" level="project" />
+    <orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
+    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
+    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.0.b2" level="project" />
+    <orderEntry type="library" name="Maven: jaxen:jaxen:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-support-license:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:author-dragon:3.0.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: org.json:json:20131018" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk13:2.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-openapi:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-core:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" />
+  </component>
+</module>

+ 48 - 0
approve-api/pom.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>approve-core</artifactId>
+        <groupId>com.dragoninfo.dcuc</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>approve-api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-cloud-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.12</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-annotation</artifactId>
+            <version>3.4.2</version>
+        </dependency>
+        <!--工作流-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-workflow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.dragoninfo</groupId>
+            <artifactId>dcuc-app-model</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>

+ 48 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowOprationEnum.java

@@ -0,0 +1,48 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/5 8:59
+ */
+public enum ApproveWorkFlowOprationEnum implements ICodeEnum {
+    COMPLETE_AGREE("complete-agree", "完成(同意)"),
+    COMPLETE_DISAGREE("complete-disagree", "完成(不同意)"),
+    BACK("back", "退回"),
+    RECALL("recall", "撤回"),
+    ;
+
+    public final String desc;
+    public final String code;
+
+    private ApproveWorkFlowOprationEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getValue() {
+        return this.code;
+    }
+
+    public String getLabel() {
+        return this.desc;
+    }
+
+    public static ApproveWorkFlowOprationEnum getValue(String code) {
+        ApproveWorkFlowOprationEnum[] var1 = values();
+        int var2 = var1.length;
+
+        for(int var3 = 0; var3 < var2; ++var3) {
+            ApproveWorkFlowOprationEnum opEnum = var1[var3];
+            if (opEnum.getValue().equals(code)) {
+                return opEnum;
+            }
+        }
+
+        return null;
+    }
+}

+ 47 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowTaskStateEnum.java

@@ -0,0 +1,47 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * 任务状态描述
+ *
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+public enum ApproveWorkFlowTaskStateEnum implements ICodeEnum {
+    FINISH("finish", "已办"),
+    UN_FINISH("unfinish", "待办"),
+    END("end", "结束")
+    ;
+
+    public final String desc;
+    public final String code;
+
+    private ApproveWorkFlowTaskStateEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getValue() {
+        return this.code;
+    }
+
+    public String getLabel() {
+        return this.desc;
+    }
+
+    public static ApproveWorkFlowTaskStateEnum getValue(String code) {
+        ApproveWorkFlowTaskStateEnum[] var1 = values();
+        int var2 = var1.length;
+
+        for(int var3 = 0; var3 < var2; ++var3) {
+            ApproveWorkFlowTaskStateEnum opEnum = var1[var3];
+            if (opEnum.getValue().equals(code)) {
+                return opEnum;
+            }
+        }
+
+        return null;
+    }
+}

+ 62 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/OperateOptionEnum.java

@@ -0,0 +1,62 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * @author wangrs
+ * @date 2021-02-23
+ * @description 节点可操作类型枚举
+ */
+public enum OperateOptionEnum implements ICodeEnum {
+    _COMMIT("_Commit", "提交"),
+    _BTN_BACK_COMMIT_MSG("_btnBackCommit_msg", "退回(意见)"),
+    _BTN_BACK_COMMIT("_btnBackCommit", "退回"),
+    _AGREE_COMMIT("_AgreeCommit", "同意"),
+    _BTN_AGREE_COMMIT_MSG("_btnAgreeCommit_msg", "同意(意见)"),
+    _BTN_AGREE_COMMIT_MSG_PATH("_btnAgreeCommit_msg_path", "同意(意见、执行方式)"),
+    _BTN_APPLY("_btnApply", "申请"),
+    _BTN_APPLY_PATH("_btnApply_path", "申请(执行方式)"),
+    _BTN_APPLY_COMMIT("_btnApplyCommit", "申请(申请并提交任务)"),
+    _BTN_DISAGREE_COMMIT("_btnDisagreeCommit", "不同意"),
+    _SUSPEND_COMMIT("_SuspendCommit", "挂起"),
+    _WITH_DRAW_COMMIT("_WithdrawCommit", "撤回"),
+    _BTN_WITH_DRAW_COMMIT("_btnWithdraw", "撤回"),
+    _BTN_REDO_COMMIT("_btnRedo", "撤销"),
+    _REDO_COMMIT("_RedoCommit", "撤销"),
+    _CLAIM_COMMIT("_ClaimCommit", "签收"),
+    _ASSIGN_COMMIT("_AssignCommit", "指派"),
+    _HISTORY_COMMIT("_HistoryCommit", "审批历史"),
+    _BTN_DIAGRAM("_btnDiagram", "查看流程图"),
+    _BTN_RECOVER("_btnRecover", "恢复")
+    ;
+
+    public final String desc;
+    public final String code;
+
+    private OperateOptionEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getValue() {
+        return this.code;
+    }
+
+    public String getLabel() {
+        return this.desc;
+    }
+
+    public static OperateOptionEnum getValue(String code) {
+        OperateOptionEnum[] var1 = values();
+        int var2 = var1.length;
+
+        for(int var3 = 0; var3 < var2; ++var3) {
+            OperateOptionEnum opEnum = var1[var3];
+            if (opEnum.getValue().equals(code)) {
+                return opEnum;
+            }
+        }
+
+        return null;
+    }
+}

+ 46 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/YesNoEnum.java

@@ -0,0 +1,46 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5 8:59
+ */
+public enum YesNoEnum implements ICodeEnum {
+    YES("1", "是"),
+    NO("0", "否")
+    ;
+
+    public final String desc;
+    public final String code;
+
+    private YesNoEnum(String code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    public String getValue() {
+        return this.code;
+    }
+
+    public String getLabel() {
+        return this.desc;
+    }
+
+    public static YesNoEnum getValue(String code) {
+        YesNoEnum[] var1 = values();
+        int var2 = var1.length;
+
+        for(int var3 = 0; var3 < var2; ++var3) {
+            YesNoEnum opEnum = var1[var3];
+            if (opEnum.getValue().equals(code)) {
+                return opEnum;
+            }
+        }
+
+        return null;
+    }
+}

+ 39 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApiApproveFacade.java

@@ -0,0 +1,39 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApproveOperateDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * @Author: wang.rs
+ * @Date: 2020-12-15
+ * @Description:
+ */
+@Api(description = "审批服务")
+@FeignClient(name = "approve")
+public interface IApiApproveFacade {
+    @ApiOperation(value = "保存或保存并提交", notes = "保存或保存并提交")
+    @RequestMapping(value = "api/v1/apply", method = RequestMethod.POST)
+    ResponseStatus save(@Validated @RequestBody ApprovalInfoDTO approvalInfoDTO);
+
+    @ApiOperation(value = "获取流程类型列表", notes = "获取流程类型列表")
+    @RequestMapping(value = "api/v1/process-types", method = RequestMethod.GET)
+    ResponseStatus queryProcessTypeList();
+
+    @ApiOperation(value = "获取流程类型详情", notes = "获取流程类型详情")
+    @RequestMapping(value = "api/v1/process-type/{processTypeCode}", method = RequestMethod.GET)
+    ResponseStatus queryProcessType(@PathVariable(value = "processTypeCode") String processTypeCode);
+
+    @ApiOperation(value = "同步应用,服务资源", notes = "同步应用,服务资源")
+    @RequestMapping(value = "api/v1/sync-resource", method = RequestMethod.GET)
+    ResponseStatus syncResource();
+
+}

+ 99 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveFacade.java

@@ -0,0 +1,99 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApproveOperateDTO;
+import com.dragonsoft.dcuc.approve.model.resp.ApprovalInfoVo;
+import com.dragonsoft.dcuc.approve.model.resp.TaskVo;
+import com.dragonsoft.duceap.base.annotations.parameter.QueryObject;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.data.domain.Page;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author: wang.rs
+ * @Date: 2020-12-15
+ * @Description:
+ */
+@Api(description = "审批服务")
+@FeignClient(name = "approve")
+public interface IApproveFacade {
+
+    @ApiOperation(value = "申请统计", notes = "申请统计")
+    @RequestMapping(value = "v1/apply-statistics/search", method = RequestMethod.POST)
+    ResponseStatus applyStatistics(@QueryObject Searchable searchable);
+
+    @ApiOperation(value = "我的请求列表", notes = "我的请求列表")
+    @RequestMapping(value = "v1/user-apply-list/search", method = RequestMethod.POST)
+    Page<ApprovalInfoVo> queryUserApplyList(@QueryObject Searchable searchable);
+
+    @ApiOperation(value = "查询已办或待办列表", notes = "查询已办或代办列表")
+    @RequestMapping(value = "v1/approve-list/search", method = RequestMethod.POST)
+    Page<TaskVo> queryApproveList(@QueryObject Searchable searchable);
+
+    @ApiOperation(value = "我的请求列表-删除", notes = "我的请求列表-删除")
+    @RequestMapping(value = "v1/delApply/{id}", method = RequestMethod.DELETE)
+    ResponseStatus delApply(@PathVariable(value = "id") String id);
+
+    @ApiOperation(value = "审批操作", notes = "审批操作")
+    @RequestMapping(value = "v1/approve-operate", method = RequestMethod.PUT)
+    ResponseStatus approveOperate(@Validated @RequestBody ApproveOperateDTO approveOperateDTO);
+
+    @ApiOperation(value = "申请详情", notes = "申请详情")
+    @RequestMapping(value = "v1/apply/{id}", method = RequestMethod.GET)
+    ResponseStatus applyDetail(@PathVariable(value = "id") String id);
+
+    @ApiOperation(value = "保存或保存并提交", notes = "保存或保存并提交")
+    @RequestMapping(value = "v1/apply", method = RequestMethod.POST)
+    ResponseStatus save(@Validated  @RequestBody ApprovalInfoDTO approvalInfoDTO);
+
+    @ApiOperation(value = "修改", notes = "修改")
+    @RequestMapping(value = "v1/apply", method = RequestMethod.PUT)
+    ResponseStatus update(@Validated  @RequestBody ApprovalInfoUpdateDTO approvalInfoDTO);
+
+    @ApiOperation(value = "转办", notes = "转办")
+    @RequestMapping(value = "v1/apply/agent", method = RequestMethod.PUT)
+    ResponseStatus agent(@Validated @RequestBody AgentDTO agentDTO);
+
+    @ApiOperation(value = "审批意见", notes = "审批意见")
+    @RequestMapping(value = "v1/apply-info/{processInstanceId}/approve-comments", method = RequestMethod.GET)
+    ResponseStatus approveComments(@PathVariable(value = "processInstanceId") String processInstanceId);
+
+    @ApiOperation(value = "获取流程图", notes = "获取流程图")
+    @RequestMapping(value = "v1/apply-info/{proInsId}/process-pic", method = RequestMethod.GET)
+    ResponseStatus processPic(@PathVariable(value = "proInsId") String proInsId);
+
+    @ApiOperation(value = "获取流程图节点详情", notes = "获取流程图节点详情")
+    @RequestMapping(value = "v1/process-pic-detail", method = RequestMethod.GET)
+    ResponseStatus processPicDetail(@RequestParam(value = "processInstanceId") String proInsId,
+                                        @RequestParam(value = "statusType") String statusType,
+                                        @RequestParam(value = "taskDefinitionId") String taskDefinitionId);
+
+    @ApiOperation(value = "获取流程类型列表", notes = "获取流程类型列表")
+    @RequestMapping(value = "v1/process-types", method = RequestMethod.GET)
+    ResponseStatus queryProcessTypeList();
+
+    @ApiOperation(value = "获取流程类型详情", notes = "获取流程类型详情")
+    @RequestMapping(value = "v1/process-type/{processTypeCode}", method = RequestMethod.GET)
+    ResponseStatus queryProcessType(@PathVariable(value = "processTypeCode") String processTypeCode);
+
+    @ApiOperation(value = "获取警员列表", notes = "获取警员列表")
+    @RequestMapping(value = "v1/police-list/search", method = RequestMethod.GET)
+    ResponseStatus queryPoliceList(@RequestParam(value = "userToken") String userToken,
+                                   @RequestParam(value = "appToken") String appToken,
+                                   @RequestParam(value = "page") int page,
+                                   @RequestParam(value = "size") int size
+                                   );
+
+
+
+    @ApiOperation(value = "流程图状态", notes = "流程图状态")
+    @RequestMapping(value = "v1/apply-info/{processInstanceId}/processStatus", method = RequestMethod.GET)
+    ResponseStatus processStatus(@PathVariable(value = "processInstanceId") String processInstanceId);
+}

+ 29 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IReferenceFacade.java

@@ -0,0 +1,29 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragoninfo.dcuc.app.dto.ServiceResourceDTO;
+import com.dragonsoft.duceap.base.annotations.parameter.QueryObject;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+@Api(description = "引用接口")
+@FeignClient(name = "reference")
+public interface IReferenceFacade {
+    @ApiOperation(value = "应用数据", notes = "应用数据")
+    @RequestMapping(value = "v1/application/search", method = RequestMethod.POST)
+    ResponseStatus queryApplicationList();
+
+    @ApiOperation(value = "服务资源", notes = "服务资源")
+    @RequestMapping(value = "v1/service-resource/search", method = RequestMethod.POST)
+    Page<ServiceResourceDTO> queryServiceResourceList(@QueryObject Searchable searchable);
+}

+ 29 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/ITest.java

@@ -0,0 +1,29 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApproveOperateDTO;
+import com.dragonsoft.dcuc.approve.model.resp.ApprovalInfoVo;
+import com.dragonsoft.dcuc.approve.model.resp.TaskVo;
+import com.dragonsoft.duceap.base.annotations.parameter.QueryObject;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.data.domain.Page;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author: wang.rs
+ * @Date: 2020-12-15
+ * @Description:
+ */
+@Api(description = "审批服务")
+@FeignClient(name = "approve")
+public interface ITest {
+    @ApiOperation(value = "流程图状态", notes = "流程图状态")
+    @RequestMapping(value = "v1/test", method = RequestMethod.GET)
+    ResponseStatus processStatus();
+}

+ 45 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/AgentDTO.java

@@ -0,0 +1,45 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Created by lidr on 2021/2/4
+ */
+@ApiModel(description = "转办信息")
+public class AgentDTO {
+    @ApiModelProperty(value = "流程ID")
+    private String processId;
+    @ApiModelProperty(value = "转办接收人")
+    @NotBlank
+    private String assigneeUser;
+    @ApiModelProperty(value = "任务ID")
+    @NotBlank
+    private String taskId;
+
+    public String getProcessId() {
+        return processId;
+    }
+
+    public void setProcessId(String processId) {
+        this.processId = processId;
+    }
+
+    public String getAssigneeUser() {
+        return assigneeUser;
+    }
+
+    public void setAssigneeUser(String assigneeUser) {
+        this.assigneeUser = assigneeUser;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+}

+ 297 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoDTO.java

@@ -0,0 +1,297 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * Created by lidr on 2021/2/3
+ */
+@ApiModel(description = "申请信息")
+public class ApprovalInfoDTO {
+    /**
+     * 申请并提交类型
+     */
+    public static final String applyAndCommitStr = "2";
+    /**
+     * 保存类型
+     */
+    public static final String applyStr = "1";
+
+    @ApiModelProperty(value = "表单ID")
+    private String id;
+
+    @ApiModelProperty(value = "流程标题")
+    private String processTitle;
+
+    @ApiModelProperty(value = "流程类型")
+    @NotBlank
+    private String processType;
+
+
+    @ApiModelProperty(value = "流程类型名称")
+    private String processTypeName;
+
+
+    @ApiModelProperty(value = "流程名称")
+    private String processName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @ApiModelProperty(value = "流程标识码")
+    @NotBlank
+    private String businessCode;
+
+    @ApiModelProperty(value = "申请内容")
+    private String applyContent;
+
+    @ApiModelProperty(value = "申请理由")
+    @NotBlank
+    private String applyReason;
+
+    @ApiModelProperty(value = "申请人身份证号")
+    @NotBlank
+    @Length( max = 18, message = "请输入正确的身份证号")
+    private String applicantIdcard;
+
+    @ApiModelProperty(value = "申请人id")
+    private String applicantId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    @NotBlank
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请人单位编码")
+    @NotBlank
+    private String applicantOrgCode;
+
+    @ApiModelProperty(value = "申请人单位名称")
+    @NotBlank
+    private String applicantOrgName;
+
+    @ApiModelProperty(value = "申请人联系方式")
+    @NotBlank
+    private String applicantPhoneNo;
+
+    @ApiModelProperty(value = "流程实例ID")
+    private String processInstanceId;
+
+    @ApiModelProperty(value = "审批任务标识")
+    private String approveTaskIdentifier;
+
+    @ApiModelProperty(value = "有效时间类别")
+    private String permissionValidType;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")
+    private Date endTime;
+
+    @ApiModelProperty(value = "业务创建时间")
+    private Date bizCreateTime;
+
+    @ApiModelProperty(value = "操作类型(1-保存|2-保存并提交)")
+    @NotBlank
+    private String operateType;
+
+    @ApiModelProperty(value = "第三方消息ID")
+    private String messageId;
+
+    @ApiModelProperty(value = "访问资源信息")
+    @Valid
+    @NotNull
+    private ResourceInfoDTO resourceInfoDTO;
+
+    public String getProcessTitle() {
+        return processTitle;
+    }
+
+    public void setProcessTitle(String processTitle) {
+        this.processTitle = processTitle;
+    }
+
+    public String getProcessType() {
+        return processType;
+    }
+
+    public void setProcessType(String processType) {
+        this.processType = processType;
+    }
+
+    public String getProcessTypeName() {
+        return processTypeName;
+    }
+
+    public void setProcessTypeName(String processTypeName) {
+        this.processTypeName = processTypeName;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getApplicantId() {
+        return applicantId;
+    }
+
+    public void setApplicantId(String applicantId) {
+        this.applicantId = applicantId;
+    }
+
+    public ResourceInfoDTO getResourceInfoDTO() {
+        return resourceInfoDTO;
+    }
+
+    public void setResourceInfoDTO(ResourceInfoDTO resourceInfoDTO) {
+        this.resourceInfoDTO = resourceInfoDTO;
+    }
+
+    public String getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(String businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public String getApplyContent() {
+        return applyContent;
+    }
+
+    public void setApplyContent(String applyContent) {
+        this.applyContent = applyContent;
+    }
+
+    public String getApplicantIdcard() {
+        return applicantIdcard;
+    }
+
+    public void setApplicantIdcard(String applicantIdcard) {
+        this.applicantIdcard = applicantIdcard;
+    }
+
+    public String getApplicantName() {
+        return applicantName;
+    }
+
+    public void setApplicantName(String applicantName) {
+        this.applicantName = applicantName;
+    }
+
+    public String getApplicantOrgCode() {
+        return applicantOrgCode;
+    }
+
+    public void setApplicantOrgCode(String applicantOrgCode) {
+        this.applicantOrgCode = applicantOrgCode;
+    }
+
+    public String getApplicantOrgName() {
+        return applicantOrgName;
+    }
+
+    public void setApplicantOrgName(String applicantOrgName) {
+        this.applicantOrgName = applicantOrgName;
+    }
+
+    public String getApplicantPhoneNo() {
+        return applicantPhoneNo;
+    }
+
+    public void setApplicantPhoneNo(String applicantPhoneNo) {
+        this.applicantPhoneNo = applicantPhoneNo;
+    }
+
+    public String getApplyReason() {
+        return applyReason;
+    }
+
+    public void setApplyReason(String applyReason) {
+        this.applyReason = applyReason;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public String getApproveTaskIdentifier() {
+        return approveTaskIdentifier;
+    }
+
+    public void setApproveTaskIdentifier(String approveTaskIdentifier) {
+        this.approveTaskIdentifier = approveTaskIdentifier;
+    }
+
+    public Date getBizCreateTime() {
+        return bizCreateTime;
+    }
+
+    public void setBizCreateTime(Date bizCreateTime) {
+        this.bizCreateTime = bizCreateTime;
+    }
+
+    public String getOperateType() {
+        return operateType;
+    }
+
+    public void setOperateType(String operateType) {
+        this.operateType = operateType;
+    }
+
+    public String getPermissionValidType() {
+        return permissionValidType;
+    }
+
+    public void setPermissionValidType(String permissionValidType) {
+        this.permissionValidType = permissionValidType;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+}

+ 275 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoUpdateDTO.java

@@ -0,0 +1,275 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * Created by lidr on 2021/2/3
+ */
+@ApiModel(description = "申请信息")
+public class ApprovalInfoUpdateDTO {
+    /**
+     * 申请并提交类型
+     */
+    public static final String applyAndCommitStr = "2";
+    /**
+     * 保存类型
+     */
+    public static final String applyStr = "1";
+
+    @ApiModelProperty(value = "表单ID")
+    private String id;
+
+    @ApiModelProperty(value = "流程标题")
+    private String processTitle;
+
+    @ApiModelProperty(value = "流程类型")
+    private String processType;
+
+
+    @ApiModelProperty(value = "流程类型名称")
+    private String processTypeName;
+
+
+    @ApiModelProperty(value = "流程名称")
+    private String processName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @ApiModelProperty(value = "流程标识码")
+    private String businessCode;
+
+    @ApiModelProperty(value = "申请内容")
+    private String applyContent;
+
+    @ApiModelProperty(value = "申请理由")
+    @NotBlank
+    private String applyReason;
+
+    @ApiModelProperty(value = "申请人身份证号")
+    private String applicantIdcard;
+
+    @ApiModelProperty(value = "申请人id")
+    private String applicantId;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请人单位编码")
+    private String applicantOrgCode;
+
+    @ApiModelProperty(value = "申请人单位名称")
+    private String applicantOrgName;
+
+    @ApiModelProperty(value = "申请人联系方式")
+    private String applicantPhoneNo;
+
+    @ApiModelProperty(value = "流程实例ID")
+    private String processInstanceId;
+
+    @ApiModelProperty(value = "审批任务标识")
+    private String approveTaskIdentifier;
+
+    @ApiModelProperty(value = "有效时间类别")
+    private String permissionValidType;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")
+    private Date endTime;
+
+    @ApiModelProperty(value = "业务创建时间")
+    private Date bizCreateTime;
+
+    @ApiModelProperty(value = "操作类型(1-保存|2-保存并提交)")
+    @NotBlank
+    private String operateType;
+
+    @ApiModelProperty(value = "访问资源信息")
+    @Valid
+    @NotNull
+    private ResourceInfoDTO resourceInfoDTO;
+
+    public String getProcessTitle() {
+        return processTitle;
+    }
+
+    public void setProcessTitle(String processTitle) {
+        this.processTitle = processTitle;
+    }
+
+    public String getProcessType() {
+        return processType;
+    }
+
+    public void setProcessType(String processType) {
+        this.processType = processType;
+    }
+
+    public String getProcessTypeName() {
+        return processTypeName;
+    }
+
+    public void setProcessTypeName(String processTypeName) {
+        this.processTypeName = processTypeName;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getApplicantId() {
+        return applicantId;
+    }
+
+    public void setApplicantId(String applicantId) {
+        this.applicantId = applicantId;
+    }
+
+    public ResourceInfoDTO getResourceInfoDTO() {
+        return resourceInfoDTO;
+    }
+
+    public void setResourceInfoDTO(ResourceInfoDTO resourceInfoDTO) {
+        this.resourceInfoDTO = resourceInfoDTO;
+    }
+
+    public String getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(String businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public String getApplyContent() {
+        return applyContent;
+    }
+
+    public void setApplyContent(String applyContent) {
+        this.applyContent = applyContent;
+    }
+
+    public String getApplicantIdcard() {
+        return applicantIdcard;
+    }
+
+    public void setApplicantIdcard(String applicantIdcard) {
+        this.applicantIdcard = applicantIdcard;
+    }
+
+    public String getApplicantName() {
+        return applicantName;
+    }
+
+    public void setApplicantName(String applicantName) {
+        this.applicantName = applicantName;
+    }
+
+    public String getApplicantOrgCode() {
+        return applicantOrgCode;
+    }
+
+    public void setApplicantOrgCode(String applicantOrgCode) {
+        this.applicantOrgCode = applicantOrgCode;
+    }
+
+    public String getApplicantOrgName() {
+        return applicantOrgName;
+    }
+
+    public void setApplicantOrgName(String applicantOrgName) {
+        this.applicantOrgName = applicantOrgName;
+    }
+
+    public String getApplicantPhoneNo() {
+        return applicantPhoneNo;
+    }
+
+    public void setApplicantPhoneNo(String applicantPhoneNo) {
+        this.applicantPhoneNo = applicantPhoneNo;
+    }
+
+    public String getApplyReason() {
+        return applyReason;
+    }
+
+    public void setApplyReason(String applyReason) {
+        this.applyReason = applyReason;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public String getApproveTaskIdentifier() {
+        return approveTaskIdentifier;
+    }
+
+    public void setApproveTaskIdentifier(String approveTaskIdentifier) {
+        this.approveTaskIdentifier = approveTaskIdentifier;
+    }
+
+    public Date getBizCreateTime() {
+        return bizCreateTime;
+    }
+
+    public void setBizCreateTime(Date bizCreateTime) {
+        this.bizCreateTime = bizCreateTime;
+    }
+
+    public String getOperateType() {
+        return operateType;
+    }
+
+    public void setOperateType(String operateType) {
+        this.operateType = operateType;
+    }
+
+    public String getPermissionValidType() {
+        return permissionValidType;
+    }
+
+    public void setPermissionValidType(String permissionValidType) {
+        this.permissionValidType = permissionValidType;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 66 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveOperateDTO.java

@@ -0,0 +1,66 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import com.dragonsoft.duceap.duwf.api.model.ApproveMessage;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/20 14:25
+ */
+public class ApproveOperateDTO {
+    /**
+     * 操作类型,详见ApproveWorkFlowOprationEnum
+     */
+    @NotBlank
+    private String operateType;
+    /**
+     * 任务id
+     */
+    @NotBlank
+    private String taskId;
+    /**
+     * 审批信息
+     */
+    private String message;
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    /**
+     * 流程实例ID
+     */
+    private String processInstanceId;
+
+    public String getOperateType() {
+        return operateType;
+    }
+
+    public void setOperateType(String operateType) {
+        this.operateType = operateType;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 62 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ResourceInfoDTO.java

@@ -0,0 +1,62 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * Created by lidr on 2021/2/4
+ */
+@ApiModel(description = "资源信息")
+public class ResourceInfoDTO {
+
+    @ApiModelProperty(value = "申请方编码")
+    @NotBlank
+    private String visitorCode;
+
+    @ApiModelProperty(value = "申请方名称")
+    @NotBlank
+    private String visitorName;
+
+    @ApiModelProperty(value = "访问资源编码")
+    @NotBlank
+    private String visitResourceCode;
+
+    @ApiModelProperty(value = "访问资源名称")
+    @NotBlank
+    private String visitResourceName;
+
+    public String getVisitorCode() {
+        return visitorCode;
+    }
+
+    public void setVisitorCode(String visitorCode) {
+        this.visitorCode = visitorCode;
+    }
+
+    public String getVisitorName() {
+        return visitorName;
+    }
+
+    public void setVisitorName(String visitorName) {
+        this.visitorName = visitorName;
+    }
+
+    public String getVisitResourceCode() {
+        return visitResourceCode;
+    }
+
+    public void setVisitResourceCode(String visitResourceCode) {
+        this.visitResourceCode = visitResourceCode;
+    }
+
+    public String getVisitResourceName() {
+        return visitResourceName;
+    }
+
+    public void setVisitResourceName(String visitResourceName) {
+        this.visitResourceName = visitResourceName;
+    }
+}

+ 132 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ActivityNodeInfoVo.java

@@ -0,0 +1,132 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/18 13:45
+ */
+public class ActivityNodeInfoVo implements Serializable {
+    private static final long serialVersionUID = 396248261307268158L;
+
+    @ApiModelProperty(value = "转入时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm",timezone="GMT+8")
+    private Date actStartTime;
+
+    @ApiModelProperty(value = "转出时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm",timezone="GMT+8")
+    private Date actEndTime;
+
+    @ApiModelProperty(value = "节点名称")
+    private String name;
+
+    @ApiModelProperty(value = "处理人")
+    private List<String> assigneeList;
+
+    @ApiModelProperty(value = "状态")
+    private String statusStr;
+
+    @ApiModelProperty(value = "办理期限日期")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date dueDate;
+
+    @ApiModelProperty(value = "办理期限")
+    private String dueDateNum;
+
+    @ApiModelProperty(value = "催办期限")
+    private String beforeDueLimit;
+
+
+    @ApiModelProperty(value = "审批信息")
+    private String approveMessage;
+
+    @ApiModelProperty(value = "任务描述")
+    private String description;
+
+
+    public Date getActStartTime() {
+        return actStartTime;
+    }
+
+    public void setActStartTime(Date actStartTime) {
+        this.actStartTime = actStartTime;
+    }
+
+    public Date getActEndTime() {
+        return actEndTime;
+    }
+
+    public void setActEndTime(Date actEndTime) {
+        this.actEndTime = actEndTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<String> getAssigneeList() {
+        return assigneeList;
+    }
+
+    public void setAssigneeList(List<String> assigneeList) {
+        this.assigneeList = assigneeList;
+    }
+
+    public String getStatusStr() {
+        return statusStr;
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+
+    public Date getDueDate() {
+        return dueDate;
+    }
+
+    public void setDueDate(Date dueDate) {
+        this.dueDate = dueDate;
+    }
+
+    public String getDueDateNum() {
+        return dueDateNum;
+    }
+
+    public void setDueDateNum(String dueDateNum) {
+        this.dueDateNum = dueDateNum;
+    }
+
+    public String getBeforeDueLimit() {
+        return beforeDueLimit;
+    }
+
+    public void setBeforeDueLimit(String beforeDueLimit) {
+        this.beforeDueLimit = beforeDueLimit;
+    }
+
+    public String getApproveMessage() {
+        return approveMessage;
+    }
+
+    public void setApproveMessage(String approveMessage) {
+        this.approveMessage = approveMessage;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}

+ 280 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoVo.java

@@ -0,0 +1,280 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Created by lidr on 2021/2/4
+ */
+@ApiModel(description = "申请表单返回信息")
+public class ApprovalInfoVo {
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    @ApiModelProperty(value = "流程标识码")
+    private String businessCode;
+
+    @ApiModelProperty(value = "流程标题")
+    private String processTitle;
+
+    @ApiModelProperty(value = "流程类型")
+    private String processType;
+
+    @ApiModelProperty(value = "流程类型名称")
+    private String processTypeName;
+
+    @ApiModelProperty(value = "流程名称")
+    private String processName;
+
+    @ApiModelProperty(value = "申请内容")
+    private String applyContent;
+
+    @ApiModelProperty(value = "申请理由")
+    private String applyReason;
+
+    @ApiModelProperty(value = "申请人身份证号")
+    private String applicantIdcard;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "申请人单位编码")
+    private String applicantOrgCode;
+
+    @ApiModelProperty(value = "申请人单位名称")
+    private String applicantOrgName;
+
+    @ApiModelProperty(value = "申请人联系方式")
+    private String applicantPhoneNo;
+
+    @ApiModelProperty(value = "流程实例ID")
+    private String processInstanceId;
+
+    @ApiModelProperty(value = "审批任务标识")
+    private String approveTaskIdentifier;
+
+    @ApiModelProperty(value = "有效时间类别")
+    private String permissionValidType;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @ApiModelProperty(value = "开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @ApiModelProperty(value = "结束时间")
+    private Date endTime;
+
+    @ApiModelProperty(value = "业务创建时间")
+    private Date bizCreateTime;
+
+    @ApiModelProperty(value = "访问资源信息")
+    private ResourceInfoVo resourceInfoVo;
+
+    @ApiModelProperty(value = "节点名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "任务id")
+    private String taskId;
+
+    @ApiModelProperty(value = "未操作者")
+    private String unOperateUsers;
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getProcessTypeName() {
+        return processTypeName;
+    }
+
+    public void setProcessTypeName(String processTypeName) {
+        this.processTypeName = processTypeName;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+    public String getUnOperateUsers() {
+        return unOperateUsers;
+    }
+
+    public void setUnOperateUsers(String unOperateUsers) {
+        this.unOperateUsers = unOperateUsers;
+    }
+
+    public ResourceInfoVo getResourceInfoVo() {
+        return resourceInfoVo;
+    }
+
+    public void setResourceInfoVo(ResourceInfoVo resourceInfoVo) {
+        this.resourceInfoVo = resourceInfoVo;
+    }
+
+    public String getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(String businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public String getProcessTitle() {
+        return processTitle;
+    }
+
+    public void setProcessTitle(String processTitle) {
+        this.processTitle = processTitle;
+    }
+
+    public String getProcessType() {
+        return processType;
+    }
+
+    public void setProcessType(String processType) {
+        this.processType = processType;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getApplyContent() {
+        return applyContent;
+    }
+
+    public void setApplyContent(String applyContent) {
+        this.applyContent = applyContent;
+    }
+
+    public String getApplicantIdcard() {
+        return applicantIdcard;
+    }
+
+    public void setApplicantIdcard(String applicantIdcard) {
+        this.applicantIdcard = applicantIdcard;
+    }
+
+    public String getApplicantName() {
+        return applicantName;
+    }
+
+    public void setApplicantName(String applicantName) {
+        this.applicantName = applicantName;
+    }
+
+    public String getApplicantOrgCode() {
+        return applicantOrgCode;
+    }
+
+    public void setApplicantOrgCode(String applicantOrgCode) {
+        this.applicantOrgCode = applicantOrgCode;
+    }
+
+    public String getApplicantOrgName() {
+        return applicantOrgName;
+    }
+
+    public void setApplicantOrgName(String applicantOrgName) {
+        this.applicantOrgName = applicantOrgName;
+    }
+
+    public String getApplicantPhoneNo() {
+        return applicantPhoneNo;
+    }
+
+    public void setApplicantPhoneNo(String applicantPhoneNo) {
+        this.applicantPhoneNo = applicantPhoneNo;
+    }
+
+    public String getApplyReason() {
+        return applyReason;
+    }
+
+    public void setApplyReason(String applyReason) {
+        this.applyReason = applyReason;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public String getApproveTaskIdentifier() {
+        return approveTaskIdentifier;
+    }
+
+    public void setApproveTaskIdentifier(String approveTaskIdentifier) {
+        this.approveTaskIdentifier = approveTaskIdentifier;
+    }
+
+    public Date getBizCreateTime() {
+        return bizCreateTime;
+    }
+
+    public void setBizCreateTime(Date bizCreateTime) {
+        this.bizCreateTime = bizCreateTime;
+    }
+
+    public String getPermissionValidType() {
+        return permissionValidType;
+    }
+
+    public void setPermissionValidType(String permissionValidType) {
+        this.permissionValidType = permissionValidType;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}

+ 90 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveCommentVo.java

@@ -0,0 +1,90 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by wangrs on 2021/2/4
+ */
+@ApiModel(description = "审批意见数据")
+public class ApproveCommentVo implements Serializable {
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "审批意见")
+    private String approveMessage;
+
+    @ApiModelProperty(value = "审批时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm",timezone="GMT+8")
+    private Date approveTime;
+
+    @ApiModelProperty(value = "审批人")
+    private String assignee;
+    @ApiModelProperty(value = "审批动作")
+    private String approveState;
+    @ApiModelProperty(value = "节点定义ID")
+    private String id;
+
+    @ApiModelProperty(value = "排序字段")
+    private int sort;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getApproveState() {
+        return approveState;
+    }
+
+    public void setApproveState(String approveState) {
+        this.approveState = approveState;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public Date getApproveTime() {
+        return approveTime;
+    }
+
+    public void setApproveTime(Date approveTime) {
+        this.approveTime = approveTime;
+    }
+
+    public String getAssignee() {
+        return assignee;
+    }
+
+    public void setAssignee(String assignee) {
+        this.assignee = assignee;
+    }
+
+    public String getApproveMessage() {
+        return approveMessage;
+    }
+
+    public void setApproveMessage(String approveMessage) {
+        this.approveMessage = approveMessage;
+    }
+
+    public int getSort() {
+        return sort;
+    }
+
+    public void setSort(int sort) {
+        this.sort = sort;
+    }
+}

+ 29 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveWorkflowProcessTypeVo.java

@@ -0,0 +1,29 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.dragonsoft.duceap.duwf.api.model.WorkflowProcessVo;
+import com.dragonsoft.duceap.duwf.api.model.WorkflowProcesstypeVo;
+
+import java.util.List;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/20 8:47
+ */
+public class ApproveWorkflowProcessTypeVo extends WorkflowProcesstypeVo {
+
+    /**
+     * 流程数组
+     */
+    private List<WorkflowProcessVo> workflowProcessVoList;
+
+    public List<WorkflowProcessVo> getWorkflowProcessVoList() {
+        return workflowProcessVoList;
+    }
+
+    public void setWorkflowProcessVoList(List<WorkflowProcessVo> workflowProcessVoList) {
+        this.workflowProcessVoList = workflowProcessVoList;
+    }
+}

+ 51 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/PersonDataVo.java

@@ -0,0 +1,51 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import java.io.Serializable;
+
+/**
+ * @author wangrs
+ * @date 2021/2/7
+ * 个人数据展示
+ */
+public class PersonDataVo implements Serializable {
+    private static final long serialVersionUID = 3312323948659364272L;
+
+    /**
+     * 代办数量
+     */
+    private String unfinishQty;
+
+    public String getUnfinishQty() {
+        return unfinishQty;
+    }
+
+    public void setUnfinishQty(String unfinishQty) {
+        this.unfinishQty = unfinishQty;
+    }
+
+    public String getFinishQty() {
+        return finishQty;
+    }
+
+    public void setFinishQty(String finishQty) {
+        this.finishQty = finishQty;
+    }
+
+    public String getMyRequestQty() {
+        return myRequestQty;
+    }
+
+    public void setMyRequestQty(String myRequestQty) {
+        this.myRequestQty = myRequestQty;
+    }
+
+    /**
+     * 已办事宜
+     */
+    private String finishQty;
+
+    /**
+     * 我的请求
+     */
+    private String myRequestQty;
+}

+ 63 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessInstanceVo.java

@@ -0,0 +1,63 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.dragonsoft.duceap.duwf.api.model.HistoricProcessInstanceVo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/3 19:56
+ */
+public class ProcessInstanceVo extends HistoricProcessInstanceVo implements Serializable {
+
+    @ApiModelProperty(value = "流程类型名称")
+    private String flowTypeName;
+
+
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "当前节点名称")
+    private String currentNodeName;
+
+
+    @ApiModelProperty(value = "当前节点操作者,多个以逗号相隔")
+    private String currentNodeOperation;
+
+
+    public String getFlowTypeName() {
+        return flowTypeName;
+    }
+
+    public void setFlowTypeName(String flowTypeName) {
+        this.flowTypeName = flowTypeName;
+    }
+
+    public String getCurrentNodeName() {
+        return currentNodeName;
+    }
+
+    public void setCurrentNodeName(String currentNodeName) {
+        this.currentNodeName = currentNodeName;
+    }
+
+    public String getCurrentNodeOperation() {
+        return currentNodeOperation;
+    }
+
+    public void setCurrentNodeOperation(String currentNodeOperation) {
+        this.currentNodeOperation = currentNodeOperation;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+}

+ 81 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusDetailVo.java

@@ -0,0 +1,81 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class ProcessStatusDetailVo implements Serializable {
+    private static final long serialVersionUID = 396897261305645158L;
+
+    @ApiModelProperty(value = "操作人")
+    private String assignee;
+
+    @ApiModelProperty(value = "操作人姓名")
+    private String assigneeName;
+
+    public String getAssigneeName() {
+        return assigneeName;
+    }
+
+    public void setAssigneeName(String assigneeName) {
+        this.assigneeName = assigneeName;
+    }
+
+    @ApiModelProperty(value = "操作状态")
+    private String operateState;
+
+    @ApiModelProperty(value = "接收时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date receiveTime;
+
+    @ApiModelProperty(value = "处理时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date handleTime;
+
+    @ApiModelProperty(value = "处理耗时")
+    private String costTime;
+
+    public String getAssignee() {
+        return assignee;
+    }
+
+    public void setAssignee(String assignee) {
+        this.assignee = assignee;
+    }
+
+    public String getOperateState() {
+        return operateState;
+    }
+
+    public void setOperateState(String operateState) {
+        this.operateState = operateState;
+    }
+
+    public Date getReceiveTime() {
+        return receiveTime;
+    }
+
+    public void setReceiveTime(Date receiveTime) {
+        this.receiveTime = receiveTime;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public String getCostTime() {
+        return costTime;
+    }
+
+    public void setCostTime(String costTime) {
+        this.costTime = costTime;
+    }
+
+
+}

+ 81 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusVo.java

@@ -0,0 +1,81 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * @author wangrs
+ * @date 2021/02/23
+ * 流程图状态包装类
+ */
+public class ProcessStatusVo implements Serializable {
+    private static final long serialVersionUID = 396897261307268158L;
+
+    @ApiModelProperty(value = "节点ID")
+    private String nodeId;
+
+    @ApiModelProperty(value = "节点名称")
+    private String nodeName;
+
+    @ApiModelProperty(value = "操作者总计")
+    private int operatorSummary;
+
+    @ApiModelProperty(value = "已办")
+    private int finishOperatorSummary;
+
+    @ApiModelProperty(value = "列表详情")
+    private Set<ProcessStatusDetailVo> taskVos;
+
+    @ApiModelProperty(value = "排序字段")
+    private int sort;
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public int getOperatorSummary() {
+        return operatorSummary;
+    }
+
+    public void setOperatorSummary(int operatorSummary) {
+        this.operatorSummary = operatorSummary;
+    }
+
+    public int getFinishOperatorSummary() {
+        return finishOperatorSummary;
+    }
+
+    public void setFinishOperatorSummary(int finishOperatorSummary) {
+        this.finishOperatorSummary = finishOperatorSummary;
+    }
+
+    public Set<ProcessStatusDetailVo> getTaskVos() {
+        return taskVos;
+    }
+
+    public void setTaskVos(Set<ProcessStatusDetailVo> taskVos) {
+        this.taskVos = taskVos;
+    }
+
+    public int getSort() {
+        return sort;
+    }
+
+    public void setSort(int sort) {
+        this.sort = sort;
+    }
+}

+ 52 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ResourceInfoVo.java

@@ -0,0 +1,52 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wangrs
+ * @date 2021-02-14
+ */
+@ApiModel(description = "资源信息返回")
+public class ResourceInfoVo {
+    @ApiModelProperty(value = "申请方名称")
+    private String visitorName;
+    @ApiModelProperty(value = "申请方代码")
+    private String visitorCode;
+    @ApiModelProperty(value = "访问资源名称")
+    private String visitResourceName;
+    @ApiModelProperty(value = "访问资源代码")
+    private String visitResourceCode;
+
+    public String getVisitorCode() {
+        return visitorCode;
+    }
+
+    public void setVisitorCode(String visitorCode) {
+        this.visitorCode = visitorCode;
+    }
+
+    public String getVisitResourceCode() {
+        return visitResourceCode;
+    }
+
+    public void setVisitResourceCode(String visitResourceCode) {
+        this.visitResourceCode = visitResourceCode;
+    }
+
+    public String getVisitorName() {
+        return visitorName;
+    }
+
+    public void setVisitorName(String visitorName) {
+        this.visitorName = visitorName;
+    }
+
+    public String getVisitResourceName() {
+        return visitResourceName;
+    }
+
+    public void setVisitResourceName(String visitResourceName) {
+        this.visitResourceName = visitResourceName;
+    }
+}

+ 46 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/TaskOperateVo.java

@@ -0,0 +1,46 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/23 19:20
+ */
+public class TaskOperateVo {
+
+    @ApiModelProperty(value = "是否显示退回")
+    private boolean showRecall;
+
+    @ApiModelProperty(value = "是否显示撤回")
+    private boolean showBack;
+
+    @ApiModelProperty(value = "是否可编辑")
+    private boolean showEdit;
+
+    public Boolean getShowEdit() {
+        return showEdit;
+    }
+
+    public void setShowEdit(Boolean showEdit) {
+        this.showEdit = showEdit;
+    }
+
+    public Boolean getShowBack() {
+        return showBack;
+    }
+
+    public void setShowBack(Boolean showBack) {
+        this.showBack = showBack;
+    }
+
+    public Boolean getShowRecall() {
+        return showRecall;
+    }
+
+    public void setShowRecall(Boolean showRecall) {
+        this.showRecall = showRecall;
+    }
+}

+ 132 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/TaskVo.java

@@ -0,0 +1,132 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.dragonsoft.duceap.duwf.api.model.TaskHistoryDetailVo;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/5 8:51
+ */
+public class TaskVo extends TaskHistoryDetailVo {
+
+    @ApiModelProperty(value = "流程类型名称")
+    private String processTypeName;
+
+    @ApiModelProperty(value = "流程标题")
+    private String processTitle;
+
+    @ApiModelProperty(value = "流程类型")
+    private String processType;
+
+    @ApiModelProperty(value = "提请人姓名")
+    private String applicantName;
+
+    @ApiModelProperty(value = "未操作人信息")
+    private String unOperateUsers;
+
+    @ApiModelProperty(value = "流程名称")
+    private String processName;
+
+    @ApiModelProperty(value = "业务ID(审批应用端)")
+    private String businessId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @ApiModelProperty(value = "结束时间")
+    private Date endTime;
+
+    @ApiModelProperty(value = "当前节点名称")
+    private String taskName;
+
+    @Override
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+  public String getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(String businessId) {
+        this.businessId = businessId;
+    }
+
+    @Override
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    @Override
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public String getUnOperateUsers() {
+        return unOperateUsers;
+    }
+
+    public void setUnOperateUsers(String unOperateUsers) {
+        this.unOperateUsers = unOperateUsers;
+    }
+
+    public String getProcessTypeName() {
+        return processTypeName;
+    }
+
+    public void setProcessTypeName(String processTypeName) {
+        this.processTypeName = processTypeName;
+    }
+
+    public String getProcessTitle() {
+        return processTitle;
+    }
+
+    public void setProcessTitle(String processTitle) {
+        this.processTitle = processTitle;
+    }
+
+    public String getProcessType() {
+        return processType;
+    }
+
+    public void setProcessType(String processType) {
+        this.processType = processType;
+    }
+
+    public String getApplicantName() {
+        return applicantName;
+    }
+
+    public void setApplicantName(String applicantName) {
+        this.applicantName = applicantName;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+}

BIN=BIN
approve-api/target/approve-api-1.0.0-SNAPSHOT.jar


BIN=BIN
approve-api/target/classes/META-INF/approve-api.kotlin_module


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowOprationEnum.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/ApproveWorkFlowTaskStateEnum.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/OperateOptionEnum.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/enumresources/YesNoEnum.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IApiApproveFacade.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IApproveFacade.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/IReferenceFacade.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/facade/ITest.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/AgentDTO.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoDTO.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoUpdateDTO.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ApproveOperateDTO.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/req/ResourceInfoDTO.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ActivityNodeInfoVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApproveCommentVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ApproveWorkflowProcessTypeVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/PersonDataVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessInstanceVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusDetailVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ProcessStatusVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/ResourceInfoVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/TaskOperateVo.class


BIN=BIN
approve-api/target/classes/com/dragonsoft/dcuc/approve/model/resp/TaskVo.class


+ 5 - 0
approve-api/target/maven-archiver/pom.properties

@@ -0,0 +1,5 @@
+#Generated by Maven
+#Fri Feb 19 11:30:04 CST 2021
+version=1.0.0-SNAPSHOT
+groupId=com.dragoninfo.dcuc
+artifactId=approve-api

+ 14 - 0
approve-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

@@ -0,0 +1,14 @@
+com\dragonsoft\dcuc\approve\model\req\ResourceInfoDTO.class
+com\dragonsoft\dcuc\approve\model\resp\PersonDataVo.class
+com\dragonsoft\dcuc\approve\model\req\AgentDTO.class
+com\dragonsoft\dcuc\approve\model\resp\ApprovalInfoVo.class
+com\dragonsoft\dcuc\approve\enumresources\ApproveWorkFlowOprationEnum.class
+com\dragonsoft\dcuc\approve\enumresources\ApproveWorkFlowTaskStateEnum.class
+com\dragonsoft\dcuc\approve\model\resp\ProcessInstanceVo.class
+com\dragonsoft\dcuc\approve\model\resp\ResourceInfoVo.class
+com\dragonsoft\dcuc\approve\facade\ITestFacade.class
+com\dragonsoft\dcuc\approve\facade\IReferenceFacade.class
+com\dragonsoft\dcuc\approve\model\resp\TaskVo.class
+com\dragonsoft\dcuc\approve\model\resp\ActivityNodeInfoVo.class
+com\dragonsoft\dcuc\approve\facade\IApproveFacade.class
+com\dragonsoft\dcuc\approve\model\req\ApprovalInfoDTO.class

+ 14 - 0
approve-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst

@@ -0,0 +1,14 @@
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\facade\IReferenceFacade.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\ActivityNodeInfoVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\PersonDataVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\enumresources\ApproveWorkFlowTaskStateEnum.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\ProcessInstanceVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\TaskVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\req\ApprovalInfoDTO.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\facade\ITestFacade.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\ResourceInfoVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\resp\ApprovalInfoVo.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\req\AgentDTO.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\facade\IApproveFacade.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\enumresources\ApproveWorkFlowOprationEnum.java
+D:\code\approve-service\approve-core\approve-api\src\main\java\com\dragonsoft\dcuc\approve\model\req\ResourceInfoDTO.java

+ 318 - 0
approve-core-service/approve-core-service.iml

@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-starter:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.36" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.36" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-openfeign:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-core:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign:feign-hystrix:10.10.1" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.57" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.trove4j:core:3.1.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-restclient:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:guava:2.8.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.ben-manes.caffeine:caffeine:2.8.4" level="project" />
+    <orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.4.0" level="project" />
+    <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.3.4" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-alibaba-nacos-discovery:2.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-client:1.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-common:1.1.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.10" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.1.4" level="project" />
+    <orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.64" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-ribbon:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-netflix-archaius:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-netflix-archaius:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.archaius:archaius-core:0.7.6" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.google.code.findbugs:jsr305:3.0.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-configuration:commons-configuration:1.8" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.ribbon:ribbon-transport:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty-contexts:0.4.9" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty-servo:0.4.9" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-core:1.5.18" level="project" />
+    <orderEntry type="library" name="Maven: javax.inject:javax.inject:1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.reactivex:rxnetty:0.4.9" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-core:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-httpclient:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-client:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey:jersey-core:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: javax.ws.rs:jsr311-api:1.1.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.jersey.contribs:jersey-apache-client4:1.19.1" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.servo:servo-core:0.12.21" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.netflix-commons:netflix-commons-util:0.3.0" level="project" />
+    <orderEntry type="library" name="Maven: com.netflix.ribbon:ribbon-loadbalancer:2.3.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.netflix.netflix-commons:netflix-statistics:0.1.1" level="project" />
+    <orderEntry type="library" name="Maven: io.reactivex:rxjava:1.3.8" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-autoconfigure:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-support-licenseignore:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-service:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-base:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.josql:josql:2.1" level="project" />
+    <orderEntry type="library" name="Maven: com.gentlyweb.utils:gentlyWEB-utils:1.1.GA" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-flyway:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-flyway:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-repository:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: flyway-core:flyway-core:2.3" level="project" />
+    <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.4.5" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-starter-config-apollo:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-cloud-config-apollo:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-client:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.google.inject:guice:4.1.0" level="project" />
+    <orderEntry type="library" name="Maven: aopalliance:aopalliance:1.0" level="project" />
+    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
+    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.0.b2" level="project" />
+    <orderEntry type="library" name="Maven: jaxen:jaxen:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-swagger:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.1.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-auditlog:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-auditlog:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.10" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-druid:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.10" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-mybatis:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-repository-mybatis:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.2.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:2.1" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:5.1.49" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.5.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.2.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka-clients:2.5.0" level="project" />
+    <orderEntry type="library" name="Maven: com.github.luben:zstd-jni:1.4.4-7" level="project" />
+    <orderEntry type="library" name="Maven: org.lz4:lz4-java:1.7.1" level="project" />
+    <orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.1.7.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.11" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.11" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.3.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.50.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
+    <orderEntry type="library" name="Maven: redis.clients:jedis:2.9.3" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-pool2:2.6.0" level="project" />
+    <orderEntry type="module" module-name="approve-api" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-web:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
+    <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-workflow:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-workflow:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-duwf-api:2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-repository-jpa:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.transaction:jakarta.transaction-api:1.3.3" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-jpa:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-orm:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aspects:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.dragoninfo:dcuc-app-model:2.0.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragoninfo:dcuc-app-api:2.0.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:dcuc-common:2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:5.4.17.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:javax.persistence-api:2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.24.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss:jandex:2.1.3.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.3" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.3" level="project" />
+    <orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.11" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate:hibernate-entitymanager:5.4.17.Final" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-boot-starter-metadata:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-metadata:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.github.drinkjava2:jdialects:4.0.0.jre8" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-code:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-extension-search-rest:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-commons:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.56" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.7.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: cglib:cglib:2.2" level="project" />
+    <orderEntry type="library" name="Maven: asm:asm:3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.1.5.Final" level="project" />
+    <orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:transmittable-thread-local:2.11.5" level="project" />
+    <orderEntry type="library" name="Maven: org.jsoup:jsoup:1.12.2" level="project" />
+    <orderEntry type="library" name="Maven: com.belerweb:pinyin4j:2.5.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-rest:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-rest-webmvc:3.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.data:spring-data-rest-core:3.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.hateoas:spring-hateoas:1.1.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.atteo:evo-inflector:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.3.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.5" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-core-web:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.2.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.kafka:kafka_2.11:1.1.0" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.jopt-simple:jopt-simple:5.0.4" level="project" />
+    <orderEntry type="library" name="Maven: com.yammer.metrics:metrics-core:2.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.scala-lang:scala-library:2.11.12" level="project" />
+    <orderEntry type="library" name="Maven: org.scala-lang:scala-reflect:2.11.12" level="project" />
+    <orderEntry type="library" name="Maven: com.typesafe.scala-logging:scala-logging_2.11:3.7.2" level="project" />
+    <orderEntry type="library" name="Maven: com.101tec:zkclient:0.10" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.zookeeper:zookeeper:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:2.2.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.3.3.RELEASE" level="project" />
+    <orderEntry type="module" module-name="approve-common" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-security-jwt:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.14" level="project" />
+    <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt-api:0.10.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.jsonwebtoken:jjwt-impl:0.10.5" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: io.jsonwebtoken:jjwt-jackson:0.10.5" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:duceap-support-license:2.1.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.dragonsoft:author-dragon:3.0.2" level="project" />
+    <orderEntry type="library" name="Maven: org.json:json:20131018" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk13:2.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-openapi:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.ctrip.framework.apollo:apollo-core:1.2.0-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.12" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.30" level="project" />
+  </component>
+</module>

BIN=BIN
approve-core-service/lib/nosql-kafka-1.1.0-SNAPSHOT.jar


+ 270 - 0
approve-core-service/pom.xml

@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>approve-core</artifactId>
+        <groupId>com.dragoninfo.dcuc</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>approve-core-service</artifactId>
+    <modelVersion>4.0.0</modelVersion>
+
+
+
+    <dependencies>
+        <!--配置 duceap 开始-->
+        <!-- 引入duceap-cloud核心包-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-cloud-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>HdrHistogram</artifactId>
+                    <groupId>org.hdrhistogram</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--基础-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.dragonsoft</groupId>
+                    <artifactId>duceap-core-repository-jpa</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--flyway模块-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-flyway</artifactId>
+        </dependency>
+        <!--配置中心-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-cloud-starter-config-apollo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-swagger</artifactId>
+        </dependency>
+        <!--审计-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-auditlog</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>duceap-core-repository-jpa</artifactId>
+                    <groupId>com.dragonsoft</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--MyBatis-Plus-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>duceap-boot-starter-mybatis</artifactId>
+        </dependency>
+        <!--配置 duceap 结束-->
+
+
+        <!--配置第三方组件开始-->
+        <!--oracle 引入-->
+        <!--<dependency>-->
+            <!--<groupId>com.oracle</groupId>-->
+            <!--<artifactId>ojdbc6</artifactId>-->
+        <!--</dependency>-->
+        <!--mysql 引入-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.49</version>
+        </dependency>
+        <!--配置第三方组件结束-->
+
+        <!--配置 spring 开始-->
+        <!--配置处理-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!--kafka审计需要用到-->
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+        </dependency>
+
+        <!--测试-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!--配置 spring 结束-->
+        <!--redis-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <version>2.1.8.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.9.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <!--redis结束-->
+        
+        <dependency>
+            <groupId>com.dragoninfo.dcuc</groupId>
+            <artifactId>approve-api</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.dragoninfo</groupId>
+            <artifactId>dcuc-app-api</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+        <!--工作流-->
+        <!--nosql api依赖开始-->
+        <!--<dependency>
+            <groupId>com.dragonsoft.dyy</groupId>
+            <artifactId>nosql-plugins-springconfig</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.dragonsoft.dyy</groupId>
+            <artifactId>nosql-kafka-api</artifactId>
+            <version>1.0.1-SNAPSHOT</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>nosql-api</artifactId>
+                    <groupId>com.dragonsoft.dyy</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>dcms-mq-client-model</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>-->
+        <!--nosql api依赖结束-->
+        <!--kafka-->
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>dcuc-common</artifactId>
+            <version>2.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>jar</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <properties>
+                <project.packaging>jar</project.packaging>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <version>2.6</version>
+                        <executions>
+                            <execution>
+                                <id>copy-libs</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>copy-dependencies</goal>
+                                </goals>
+                                <configuration>
+                                    <!--<excludeScope>provided</excludeScope>-->
+                                    <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                                    <!--取消依赖包的时间戳-->
+                                    <useBaseVersion>true</useBaseVersion>
+                                    <!--排除licenseignore包,用来禁用许可开关,防止生产环境通过关闭开关,绕过许可-->
+                                    <excludeArtifactIds>duceap-support-licenseignore</excludeArtifactIds>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>unpack</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>unpack</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>com.dragonsoft</groupId>
+                                            <artifactId>duceap-base</artifactId>
+                                            <!--根据框架版本修改-->
+                                            <version>2.1.0-SNAPSHOT</version>
+                                            <!--<version>2.1.0-SNAPSHOT</version>-->
+                                            <outputDirectory>${project.build.directory}/temp</outputDirectory>
+                                            <!--加入平台的启动脚本-->
+                                            <includes>META-INF/scripts/**</includes>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <version>2.5.5</version>
+                        <executions>
+                            <execution>
+                                <id>make-assembly</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <configuration>
+                                    <finalName>${project.name}-${project.version}</finalName>
+                                    <appendAssemblyId>false</appendAssemblyId>
+                                    <!--配置描述文件路径-->
+                                    <descriptor>src/main/assembly/assembly.xml</descriptor>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <version>2.4</version>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <!--运行jar包时运行的主类,要求类全名-->
+                                    <mainClass>com.dragonsoft.dcuc.approve.ApproveApplication</mainClass>
+                                    <addClasspath>true</addClasspath>
+                                    <!--取消MANIFEST.MF中classpath下的时间戳-->
+                                    <useUniqueVersions>false</useUniqueVersions>
+                                </manifest>
+                            </archive>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-compiler-plugin</artifactId>
+                        <version>3.6.0</version>
+                        <configuration>
+                            <source>8</source>
+                            <target>8</target>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

+ 43 - 0
approve-core-service/src/main/assembly/assembly.xml

@@ -0,0 +1,43 @@
+<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>assembly</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <includeBaseDirectory>true</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/temp/META-INF/scripts/</directory>
+            <outputDirectory>/bin</outputDirectory>
+            <includes>
+                <include>*.sh</include>
+                <include>*.bat</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/webapp</directory>
+            <outputDirectory>web</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/assembly/conf</directory>
+            <outputDirectory>conf</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/lib</directory>
+            <outputDirectory>lib</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}</directory>
+            <outputDirectory>lib</outputDirectory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+    </fileSets>
+</assembly>

+ 97 - 0
approve-core-service/src/main/assembly/conf/application.yml

@@ -0,0 +1,97 @@
+spring:
+
+  datasource:
+    username: jzpt_bu
+    password: dragon
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://192.168.120.142:3306/dcuc_2.0?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
+
+    #    username: DCUC2_GD
+    #    password: dragon
+    #    driver-class-name: oracle.jdbc.driver.OracleDriver
+    #    url: jdbc:oracle:thin:@192.168.6.120:1521:orcl
+    druid:
+      filters: sqlaudit
+  application:
+    name: approve-core
+  cloud:
+    nacos:
+      discovery:
+        # 配置nacos地址
+        server-addr: 127.0.0.1:8848
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    password:
+    jedis:
+      pool:
+        max-active: 10
+server:
+  port: 13180
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+mybatis-plus:
+  mapper-locations: classpath:mapping/*Mapper.xml
+  global-config:
+    db-config:
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+duceap:
+  flyway:
+    # 是否执行flyway
+    enabled: true
+    # 执行flyway路径
+    locations: classpath:/config/mysql
+  mybatis-plus:
+    map-camel-case-to-underscore: true
+  auditlog:
+    login:
+      enabled: true
+    audit:
+      enabled: true
+    sqlaudit:
+      output: kafka
+      exclude-tables: T_LOG_*
+  license:
+    enabled: false
+    dataCacheMethod: apollo
+  apollo:
+    client:
+      host: http://192.168.10.27:8070 #配置中心地址(portal端)
+  # 工作流
+  workflow:
+    enabled: true
+    client:
+      type: http
+    http:
+      url: 192.168.10.12:8880/duceap-duwf-core
+  swagger:
+    enabled: true
+    packagePath: com.dragonsoft.dcuc.approve
+approve:
+  workflow:
+    processTypeCode: approve
+  kxPeopleList:
+  #消息中心配置
+  kafka:
+    app-key: dcuc69000787
+    app-secret: dcuc01494668
+    auth-service-apply-topic: 10000027
+    kafka-servers: http://192.168.10.20:9981/dcms-manager
+app:
+  approve:
+    KafkaDataSource: HW_DS_KAFKA
+apollo:
+  bootstrap:
+    enabled: true #是否启用apollo
+    namespaces: application, dragonsoft.approve-common #命名空间,默认application
+  cluster: default #集群,默认default
+  meta: http://192.168.10.27:8080 #配置中心地址(服务端)
+  # 取消placeholder的自动更新功能(默认true)
+  autoUpdateInjectedSpringProperties: false
+logging:
+  level:
+    com.baomidou.mybatisplus: debug

+ 60 - 0
approve-core-service/src/main/assembly/conf/approve-core-nosql.properties

@@ -0,0 +1,60 @@
+#驱动方式(默认)
+nosql.config.driver-provider = FILEPATH
+#nosql  jar路径(根据实际修改)..\audit\audit-service\audit-rzcj\audit-rzcj-service\lib\   |  /opt/docker/audit-rzcj-service/conf
+nosql.config.driver-path = 	/opt/docker/approve-core-service/conf
+#固定参数(默认)
+nosql.config.data-source-provider = SPRING
+#Kafka配置(根据实际修改),开源:DEF_DS_KAFKA,华为:HW_DS_KAFKA
+nosql.datasources[0].id = HW_DS_KAFKA
+#固定参数(默认)
+nosql.datasources[0].type = KAFKA
+#Kafka版本(根据实际修改)
+nosql.datasources[0].version = 1.1.0
+#kafka集群位置(根据实际修改)
+nosql.datasources[0].bootstrapServers = 10.254.22.16:21007,10.254.22.17:21007,10.254.22.18:21007,10.254.22.19:21007
+################################生产者相关配置#####################################
+#可选[0,1,-1,all], all-设置将导致记录的完整提交阻塞,最慢的,但最持久的设置(默认)
+nosql.datasources[0].producer.acks = all
+#是否重试,即使设置为0,请求失败,生产者也会自动重试(默认)
+nosql.datasources[0].producer.retries = 0
+#每批发送大小,默认16k(默认)
+nosql.datasources[0].producer.batch_size = 16384
+#默认立即发送,这里这是延时毫秒数(默认)
+nosql.datasources[0].producer.linger_ms = 1
+#生产者缓冲大小,当缓冲区耗尽后,额外的发送调用将被阻塞。时间超过max.block.ms将抛出TimeoutException(默认)
+nosql.datasources[0].producer.buffer_memory = 33554432
+#key序列器(默认)
+nosql.datasources[0].producer.key_serializer = org.apache.kafka.common.serialization.StringSerializer
+#value序列器(默认)
+nosql.datasources[0].producer.value_serializer = org.apache.kafka.common.serialization.StringSerializer
+################################消费者相关配置#####################################
+#为true将定期提交消费位移(默认)
+nosql.datasources[0].consumer.enable_auto_commit = true
+#自动提交位移周期(默认)
+nosql.datasources[0].consumer.auto_commit_interval_ms = 1000
+#从发送请求到收到ACK确认等待的最长时间(超时时间)(默认)
+nosql.datasources[0].consumer.request_timeout_ms = 305000
+#检测消费者心跳,超过这个值从kafka断开,引发rebalance(默认)
+nosql.datasources[0].consumer.session_timeout_ms = 60000
+#latest-偏移量置为最新 earliest-偏移量置为最早 none-没找到之前位置则抛异常(默认)
+nosql.datasources[0].consumer.auto_offset_reset = latest
+#分区一次返回最大大小,默认1048576(默认)
+nosql.datasources[0].consumer.max_partition_fetch_bytes = 3145728
+#consumer一次poll返回最大记录数(默认)
+nosql.datasources[0].consumer.max_poll_records = 1000
+nosql.datasources[0].consumer.key_deserializer = org.apache.kafka.common.serialization.StringDeserializer
+nosql.datasources[0].consumer.value_deserializer = org.apache.kafka.common.serialization.StringDeserializer
+################################安全访问相关配置#####################################
+#安全访问配置开关,是否需要认证:开源:0,华为:1
+nosql.datasources[0].security.open = 1
+#以下参数使用默认
+nosql.datasources[0].security.strategy = security1
+nosql.datasources[0].security.configs[0].name = security1
+nosql.datasources[0].security.configs[0].type = sasl/kerberos
+nosql.datasources[0].security.configs[0].files[0] = /kafka/security/kerberos/krb5.conf
+nosql.datasources[0].security.configs[0].files[1] = /kafka/security/kerberos/user.keytab
+nosql.datasources[0].security.configs[0].files[2] = /kafka/security/kerberos/kafka_client_jaas.conf
+nosql.datasources[0].security.configs[0].props.security_protocol = SASL_PLAINTEXT
+nosql.datasources[0].security.configs[0].props.sasl_mechanism = GSSAPI
+nosql.datasources[0].security.configs[0].props.sasl_kerberos_service_name = kafka
+nosql.datasources[0].security.configs[0].props.kerberos_domain_name = hadoop.hadoop.com

+ 37 - 0
approve-core-service/src/main/assembly/conf/logback.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>logs/dcuc-approve.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/dcuc-approve.%d{yyyy-MM-dd}.log</fileNamePattern>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!-- project default level -->
+    <logger name="java.sql.Connection" level="${logback.level:-INFO}"/>
+    <logger name="java.sql.Statement" level="${logback.level:-INFO}"/>
+    <logger name="java.sql.PreparedStatement" level="${logback.level:-INFO}"/>
+    <logger name="com.baomidou.mybatisplus" level="${logback.level:-DEBUG}"/>
+    <logger name="com.dragonsoft" level="${logback.level:-DEBUG}"/>
+    <logger name="com.dragonsoft.kafka" level="${logback.level:-WARN}"/>
+    <logger name="org.apache.kafka" level="${logback.level:-WARN}"/>
+    <logger name="com.dragonsoft.duceap.security.dcuc.filter" level="${logback.level:-DEBUG}"/>
+
+
+    <!--log4jdbc -->
+    <logger name="jdbc.sqltiming" level="${logback.level:-INFO}"/>
+
+    <root level="${logback.level:-INFO}">
+        <appender-ref ref="console"/>
+        <appender-ref ref="rollingFile"/>
+    </root>
+</configuration>

+ 26 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/ApproveApplication.java

@@ -0,0 +1,26 @@
+package com.dragonsoft.dcuc.approve;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * @author wangrs
+ * @date 2021/01/22
+ */
+@SpringBootApplication(scanBasePackages = {"com.dragonsoft.*"})
+@EnableDiscoveryClient
+@EnableFeignClients(basePackages = {"com.dragonsoft.*","com.dragoninfo.*"})
+@EnableConfigurationProperties()
+@MapperScan("com.dragonsoft.dcuc.**.mapper")
+@PropertySource("classpath:approve-core-nosql.properties")
+public class ApproveApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(ApproveApplication.class, args);
+    }
+}

+ 115 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/componet/DcucHelper.java

@@ -0,0 +1,115 @@
+package com.dragonsoft.dcuc.approve.componet;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dragonsoft.dcuc.approve.model.PoliceResultVo;
+import com.dragonsoft.duceap.core.entity.response.ResponseResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by lidr on 2021/2/23
+ */
+@Component
+public class DcucHelper {
+    private static final Logger logger = LoggerFactory.getLogger(DcucHelper.class);
+
+    @Autowired
+    @Qualifier("hwRestTemplate")
+    private RestTemplate hwRestTemplate;
+
+    /**
+     * 用户中心服务url
+     */
+    @Value("${app.dcuc.userServiceUrl:}")
+    private String userServiceUrl;
+
+    private static final String AUTH_POLICE_PATH = "dcuc/api/user/users/_search";
+    /***
+     * 获取警员列表
+     * @param userToken
+     * @param appToken
+     * @param pageMap
+     * @return
+     */
+    public List<PoliceResultVo> getPoliceList(String userToken, String appToken, Map pageMap) {
+
+        Map<String, Object> paramMap = new HashMap<>();
+
+        //构建请求头
+        HttpHeaders headers = buildHttpHeaders(appToken, userToken, MediaType.APPLICATION_JSON);
+        //构建RestTemplate
+        List<PoliceResultVo> policeMapList = null;
+        try {
+            HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<Map<String, Object>>(pageMap, headers);
+            //远程调用用户中心接口
+            ResponseEntity<String> resEntity = hwRestTemplate.exchange(userServiceUrl + AUTH_POLICE_PATH, HttpMethod.POST, requestEntity, String.class);
+            logger.info("远程调用返回结果resEntity=【{}】,请求url=【{}】", JSONObject.toJSONString(resEntity), userServiceUrl + AUTH_POLICE_PATH);
+            //判断请求是否成功
+            if (resEntity.getStatusCode() == HttpStatus.OK) {
+                ResponseResult responseResult = JSONObject.parseObject(resEntity.getBody(), ResponseResult.class);
+                if (String.valueOf(HttpStatus.OK.value()).equals(responseResult.getStatusCode())) {
+                    responseResult.getResult();
+                    policeMapList = JSONObject.parseArray(JSON.toJSONString(responseResult.getResult()), PoliceResultVo.class);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return policeMapList;
+    }
+
+    /**
+     * 构建获取人员列表所需的过滤内容
+     *
+     * @param filtersMap
+     * @return
+     */
+    private Map buildUserFiltersMap(Map filtersMap) {
+        Map operatorMap = new HashMap<>();
+        operatorMap.put("operator", "eq");
+        operatorMap.put("value", "");
+
+        filtersMap.put("orgCode", operatorMap);
+        filtersMap.put("name", operatorMap);
+        filtersMap.put("nation", operatorMap);
+        filtersMap.put("sex", operatorMap);
+        filtersMap.put("policeBusiness", operatorMap);
+        filtersMap.put("policeCategory", operatorMap);
+        filtersMap.put("beginUpdateTime", operatorMap);
+        filtersMap.put("endUpdateTime", operatorMap);
+        return filtersMap;
+    }
+
+    /**
+     * 构建RestTemplate header参数
+     *
+     * @param appToken
+     * @param userToken
+     * @return
+     */
+    public HttpHeaders buildHttpHeaders(String appToken, String userToken, MediaType mediaType) {
+        HttpHeaders headers = new HttpHeaders();
+        //设置ContentType
+        headers.setContentType(mediaType);
+        //应用token
+        headers.add("dcucAppToken", appToken);
+        //用户token
+        headers.add("dcucUserToken", userToken);
+        logger.info("userToken=【{}】,appToken=【{}】", userToken, appToken);
+
+
+        return headers;
+    }
+
+}

+ 19 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/ApproveConfig.java

@@ -0,0 +1,19 @@
+package com.dragonsoft.dcuc.approve.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wangrs
+ * @date 2021/02/26
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "approve")
+public class ApproveConfig {
+    /**
+     * 应用 key
+     */
+    private String kxPeopleList;
+}

+ 30 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/KafkaConfig.java

@@ -0,0 +1,30 @@
+package com.dragonsoft.dcuc.approve.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * kafka配置
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "approve.kafka")
+public class KafkaConfig {
+    /**
+     * 授权服务申请主题
+     */
+    private String authServiceApplyTopic;
+    /**
+     * 消息中心提供
+     */
+    private String appKey;
+    /**
+     * 消息中心提供
+     */
+    private String appSecret;
+    /**
+     * kafka地址,包括上下文,发送消息地址
+     */
+    private String kafkaServers;
+}

+ 78 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/NosqlConfig.java

@@ -0,0 +1,78 @@
+package com.dragonsoft.dcuc.approve.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wangrs
+ * @date 2021/02/23
+ * 用户中心配置
+ */
+@Data
+@Component
+public class NosqlConfig {
+
+
+    /**
+     * 发起权限申请的消息主题
+     */
+    @Value("${approve.create.topic:approve-form-apply}")
+    private String approveCreateTopic;
+
+    /**
+     * 审批结果推送的主题
+     */
+    @Value("${approve.result.topic:approve-result-push}")
+    private String approveResultTopic;
+
+
+    @Value("${app.approve.KafkaDataSource:DEF_DS_KAFKA}")
+    private String kafkaDataSource;
+
+    /*@Bean
+    public KafkaDriver bulidKafkaDriver() {
+        KafkaDriver kafkaDriver = (KafkaDriver) NosqlDriverManager.instance().get(kafkaDataSource);
+        return kafkaDriver;
+    }
+
+    @Bean
+    public ProduceComponent bulidProduceComponent(KafkaDriver kafkaDriver) {
+        return kafkaDriver.produceComponent();
+    }
+
+    @Bean
+    public ConsumeComponent bulidConsumeComponent(KafkaDriver kafkaDriver) {
+        return kafkaDriver.consumeComponent();
+    }
+
+    @Bean
+    public TopicAdmin bulidTopicAdmin(KafkaDriver kafkaDriver) {
+        return kafkaDriver.topicAdmin();
+    }
+
+
+    public String getApproveCreateTopic() {
+        return approveCreateTopic;
+    }
+
+    public void setApproveCreateTopic(String approveCreateTopic) {
+        this.approveCreateTopic = approveCreateTopic;
+    }
+
+    public String getApproveResultTopic() {
+        return approveResultTopic;
+    }
+
+    public void setApproveResultTopic(String approveResultTopic) {
+        this.approveResultTopic = approveResultTopic;
+    }
+
+    public String getKafkaDataSource() {
+        return kafkaDataSource;
+    }
+
+    public void setKafkaDataSource(String kafkaDataSource) {
+        this.kafkaDataSource = kafkaDataSource;
+    }*/
+}

+ 13 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/OutterApisInfo.java

@@ -0,0 +1,13 @@
+package com.dragonsoft.dcuc.approve.constants;
+
+/**
+ * @author wangrs
+ * @date 2021/02/23
+ * 第三方接口地址
+ */
+public class OutterApisInfo {
+    /**
+     * 服务资源授权审批结果推送接口地址
+     */
+    public static final String SERVICE_RESOURCE_AUTHORIZATION_GRANT = "";
+}

+ 35 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/controller/ApproveController.java

@@ -0,0 +1,35 @@
+package com.dragonsoft.dcuc.approve.controller;
+
+import com.dragonsoft.dcuc.approve.model.resp.TaskOperateVo;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.base.annotations.parameter.QueryObject;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/23 19:17
+ */
+@RestController
+public class ApproveController {
+
+    @Autowired
+    private IApproveService approveService;
+
+    /**
+     * 获取任务支持的操作对象信息
+     * @param taskId
+     * @return
+     */
+    @RequestMapping(value = "v1/task-operate/{taskId}/{pageType}", method = RequestMethod.GET)
+    ResponseStatus taskOperate(@PathVariable(value = "taskId") String taskId,@PathVariable(value = "pageType") String pageType){
+        TaskOperateVo taskOperateVo = approveService.taskOperate(taskId,pageType);
+        return ResponseDTO.newInstance(taskOperateVo);
+    }
+}

+ 48 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/controller/ReferenceController1.java

@@ -0,0 +1,48 @@
+package com.dragonsoft.dcuc.approve.controller;
+
+import com.dragonsoft.dcuc.approve.model.resp.TaskOperateVo;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/24 10:33
+ */
+@RestController
+public class ReferenceController1 {
+    /**
+     * 工作流api请求url
+     */
+    @Value("${duceap.workflow.http.url:}")
+    private String workflowManageUrl;
+
+    /**
+     * 工作流管理端页面端口
+     */
+    @Value("${duceap.workflow.http.manage.port:8872}")
+    private String workflowManagePort;
+
+    /**
+     * 工作流管理端上下文
+     */
+    private static  final  String workflowManageContext = "/duceap-duwf-manager";
+
+    /**
+     * 工作流管理端页面地址
+     * @return
+     */
+    @RequestMapping(value = "v1/workflow-url", method = RequestMethod.GET)
+    ResponseStatus workflowUrl(){
+        String url = "http://" + workflowManageUrl.substring(0, workflowManageUrl.indexOf(":") + 1) + workflowManagePort + workflowManageContext;
+        return ResponseDTO.newInstance(url);
+    }
+
+}

+ 17 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEvent.java

@@ -0,0 +1,17 @@
+package com.dragonsoft.dcuc.approve.event;
+
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * @author wangrs
+ * @date 2021/01/22
+ * @description 审批事件
+ */
+public class ApproveEvent extends ApplicationEvent {
+    private static final long serialVersionUID = -8659999512606210496L;
+
+    public ApproveEvent(Object source) {
+        super(source);
+    }
+
+}

+ 17 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEventListener.java

@@ -0,0 +1,17 @@
+package com.dragonsoft.dcuc.approve.event;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wangrs
+ * @date 2021/01/22
+ * @desc 事件监听类
+ */
+@Component
+public class ApproveEventListener implements ApplicationListener<ApproveEvent> {
+    @Override
+    public void onApplicationEvent(ApproveEvent approveEvent) {
+        //todo add event handle detail
+    }
+}

+ 32 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/event/ApproveEventPublish.java

@@ -0,0 +1,32 @@
+package com.dragonsoft.dcuc.approve.event;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author wangrs
+ * @date 2021/01/22
+ * @desc 审批服务事件发布
+ */
+@Component
+public class ApproveEventPublish implements ApplicationContextAware {
+
+    private ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    /**
+     * 异步发布事件
+     * @param event
+     */
+    @Async
+    public void publishEvent(ApproveEvent event) {
+        applicationContext.publishEvent(event);
+    }
+}

+ 49 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApiApproveFacade.java

@@ -0,0 +1,49 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragoninfo.dcuc.app.dto.ResourceRequestParamDTO;
+import com.dragoninfo.dcuc.app.facade.IResourceFacade;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.resp.ApproveWorkflowProcessTypeVo;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.duwf.api.model.WorkflowProcesstypeVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class ApiApproveFacade implements IApiApproveFacade{
+    @Autowired
+    private IApproveService approveService;
+    @Autowired
+    private IResourceFacade resourceFacade;
+
+    @Override
+    public ResponseStatus save(ApprovalInfoDTO approvalInfoDTO) {
+        return approveService.save(approvalInfoDTO);
+    }
+
+    @Override
+    public ResponseStatus queryProcessTypeList() {
+        List<ApproveWorkflowProcessTypeVo> approveWorkflowProcessTypeVos = approveService.queryProcessTypeList();
+        return ResponseDTO.newInstance(approveWorkflowProcessTypeVos);
+    }
+
+    @Override
+    public ResponseStatus queryProcessType(String processTypeCode) {
+        WorkflowProcesstypeVo workflowProcesstypeVo = approveService.queryProcessType(processTypeCode);
+        return ResponseDTO.newInstance(workflowProcesstypeVo);
+    }
+
+    @Override
+    public ResponseStatus syncResource() {
+        ResourceRequestParamDTO paramDTO = new ResourceRequestParamDTO();
+        paramDTO.setListingAll(true);
+        resourceFacade.getResourceRequestResults(paramDTO);
+        resourceFacade.resourceSync();
+        return ResponseDTO.success();
+    }
+
+}

+ 218 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApproveFacade.java

@@ -0,0 +1,218 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOprationEnum;
+import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowTaskStateEnum;
+import com.dragonsoft.dcuc.approve.enumresources.YesNoEnum;
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApproveOperateDTO;
+import com.dragonsoft.dcuc.approve.model.resp.ApprovalInfoVo;
+import com.dragonsoft.dcuc.approve.model.resp.ApproveWorkflowProcessTypeVo;
+import com.dragonsoft.dcuc.approve.model.resp.PersonDataVo;
+import com.dragonsoft.dcuc.approve.model.resp.TaskVo;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.base.utils.UserContextUtils;
+import com.dragonsoft.duceap.commons.util.enums.EnumUtils;
+import com.dragonsoft.duceap.core.search.Searchable;
+import com.dragonsoft.duceap.core.search.enums.SearchOperator;
+import com.dragonsoft.duceap.duwf.api.model.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by lidr on 2021/1/29
+ */
+@RestController
+public class ApproveFacade implements IApproveFacade {
+
+    @Autowired
+    private IApproveService approveService;
+
+    /**
+     * 我的请求列表
+     * @param searchable
+     * @return
+     */
+    @Override
+    public Page<ApprovalInfoVo> queryUserApplyList(Searchable searchable) {
+        return approveService.queryUserApproveList(searchable);
+    }
+
+    /**
+     * 待办/已办列表
+     * @param searchable
+     * @return
+     */
+    @Override
+    public  Page<TaskVo> queryApproveList(Searchable searchable) {
+        //设置查询所有数据(待办)
+        //todo 状态由前段传过来,考虑与其他审批混合的情况
+        //searchable.addSearchParam("state_eq", "unfinish");
+        return approveService.queryApproveList(searchable);
+    }
+
+    /**
+     * 我的请求列表-删除
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseStatus delApply(String id) {
+        return approveService.deleteProcessInstance(id);
+    }
+
+    /**
+     * 审批操作
+     * @param approveOperateDTO
+     * @return
+     */
+    @Override
+    public ResponseStatus approveOperate(ApproveOperateDTO approveOperateDTO) {
+        TaskRequest taskRequest = new TaskRequest();
+        ApproveMessage approveMessage = new ApproveMessage();
+        approveMessage.setMessage(approveOperateDTO.getMessage());
+        approveMessage.setApproveState(approveOperateDTO.getOperateType());
+        taskRequest.setApproveMessage(approveMessage);
+        return approveService.approveOperate(approveOperateDTO.getTaskId(),approveOperateDTO.getProcessInstanceId(), EnumUtils.enumOf(ApproveWorkFlowOprationEnum.class, approveOperateDTO.getOperateType()), taskRequest);
+    }
+
+    /**
+     * 申请详情
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseStatus applyDetail(String id) {
+        return approveService.queryApproveDetail(id);
+    }
+
+    /**
+     * 保存或保存并提交
+     * @param approvalInfoDTO
+     * @return
+     */
+    @Override
+    public ResponseStatus save(ApprovalInfoDTO approvalInfoDTO) {
+        return approveService.save(approvalInfoDTO);
+    }
+
+    /**
+     * 修改
+     * @param approvalInfoDTO
+     * @return
+     */
+    @Override
+    public ResponseStatus update(ApprovalInfoUpdateDTO approvalInfoDTO) {
+        return approveService.update(approvalInfoDTO);
+    }
+
+    /**
+     * 转办
+     * @param agentDTO
+     * @return
+     */
+    @Override
+    public ResponseStatus agent(AgentDTO agentDTO) {
+        approveService.agent(agentDTO);
+        return ResponseStatus.success("操作成功!");
+    }
+
+    /**
+     * 审批意见
+     * @param processInstanceId
+     * @return
+     */
+    @Override
+    public ResponseStatus approveComments(String processInstanceId) {
+        ResponseStatus responseStatus = approveService.approveComments(processInstanceId);
+        return responseStatus;
+    }
+
+    @Override
+    public ResponseStatus processPic(String proInsId) {
+        TraceProcessAndOverVo traceProcessAndOverVo = approveService.processPic(proInsId);
+        return ResponseDTO.newInstance(traceProcessAndOverVo);
+    }
+
+    /**
+     * 获取流程图节点详情
+     * @param proInsId
+     * @param statusType
+     * @param taskDefinitionId
+     * @return
+     */
+    @Override
+    public ResponseStatus processPicDetail(String proInsId, String statusType, String taskDefinitionId) {
+        ActivityNodeInfoVo activityNodeInfoVo = approveService.processPicDetail(proInsId, statusType, taskDefinitionId);
+        return ResponseDTO.newInstance(activityNodeInfoVo);
+    }
+
+    /**
+     * 申请统计
+     * @param searchable
+     * @return
+     */
+    @Override
+    public ResponseStatus applyStatistics(Searchable searchable) {
+        //查询已办数量
+        Searchable finishedSearchable = Searchable.newSearchable();
+        finishedSearchable.addSearchFilter("state", SearchOperator.eq, ApproveWorkFlowTaskStateEnum.FINISH.getValue());
+        Integer finishQty = approveService.queryApproveQty(finishedSearchable);
+        //查询待办数量
+        Searchable unfinishSearchable = Searchable.newSearchable();
+        unfinishSearchable.addSearchFilter("state",SearchOperator.eq,ApproveWorkFlowTaskStateEnum.UN_FINISH.getValue());
+        Integer unfinishQty = approveService.queryApproveQty(unfinishSearchable);
+        //查询我的请求数量
+        Searchable myRequestSearchable = Searchable.newSearchable();
+        myRequestSearchable.addSearchFilter("applicantIdcard",SearchOperator.eq, getCurrentUserId());
+        myRequestSearchable.addSearchFilter("isDeleted",SearchOperator.eq, YesNoEnum.NO.getValue());
+        Integer myRequestQty = approveService.queryMyRequestQty(myRequestSearchable);
+        //返回数据封装
+        PersonDataVo personDataVo = new PersonDataVo();
+        personDataVo.setFinishQty(finishQty.toString());
+        personDataVo.setUnfinishQty(unfinishQty.toString());
+        personDataVo.setMyRequestQty(myRequestQty.toString());
+        return ResponseDTO.newInstance(personDataVo);
+    }
+
+    /**
+     * 获取流程类型列表
+     * @return
+     */
+    @Override
+    public ResponseStatus queryProcessTypeList() {
+        List<ApproveWorkflowProcessTypeVo> approveWorkflowProcessTypeVos = approveService.queryProcessTypeList();
+        return ResponseDTO.newInstance(approveWorkflowProcessTypeVos);
+    }
+
+    /**
+     * 获取流程类别详情
+     * @param processTypeCode   流程类别code
+     * @return
+     */
+    @Override
+    public ResponseStatus queryProcessType(String processTypeCode) {
+        WorkflowProcesstypeVo workflowProcesstypeVo = approveService.queryProcessType(processTypeCode);
+        return ResponseDTO.newInstance(workflowProcesstypeVo);
+    }
+
+    @Override
+    public ResponseStatus processStatus(String processInstanceId) {
+        return approveService.approveStatus(processInstanceId);
+    }
+
+    @Override
+    public ResponseStatus queryPoliceList(String userToken, String appToken, int page, int size) {
+        return approveService.queryPoliceList(userToken, appToken, page, size);
+    }
+
+    private String getCurrentUserId() {
+        return (null == UserContextUtils.getCurrentUser()) ? "40288600739638db017399ff8ec60009" : UserContextUtils.getCurrentUser().getId();
+    }
+}

+ 41 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ReferenceFacade.java

@@ -0,0 +1,41 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragoninfo.dcuc.app.dto.ServiceResourceDTO;
+import com.dragoninfo.dcuc.app.entity.ApplyInfo;
+import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
+import com.dragoninfo.dcuc.app.facade.IResourceFacade;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+@RestController
+public class ReferenceFacade implements IReferenceFacade {
+    @Autowired
+    private IApplyInfoFacade applyInfoFacade;
+
+    @Autowired
+    private IResourceFacade resourceFacade;
+
+    @Override
+    public ResponseStatus queryApplicationList() {
+        List<ApplyInfo> allList = applyInfoFacade.getAllList();
+        return ResponseDTO.newInstance(allList);
+        //return null;
+    }
+
+    @Override
+    public Page<ServiceResourceDTO> queryServiceResourceList(Searchable searchable) {
+        Page<ServiceResourceDTO> pages = resourceFacade.serviceResourcePage(searchable.toSearchDTO());
+        return pages;
+    }
+}

+ 23 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/Test.java

@@ -0,0 +1,23 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+@RestController
+public class Test implements ITest {
+    @Autowired
+    private IApproveService approveService;
+
+    @Override
+    public ResponseStatus processStatus() {
+        //approveService.test();
+        return ResponseStatus.success();
+    }
+}

+ 14 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/ApprovalInfoMapper.java

@@ -0,0 +1,14 @@
+package com.dragonsoft.dcuc.approve.mapper;
+
+import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
+import com.dragonsoft.duceap.mybaitsplus.core.BaseMybatisMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author wangrs
+ * @date 2021/02/05
+ * @desc 申请表单信息
+ */
+@Mapper
+public interface ApprovalInfoMapper extends BaseMybatisMapper<ApprovalInfo> {
+}

+ 12 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/ApprovalResourceInfoMapper.java

@@ -0,0 +1,12 @@
+package com.dragonsoft.dcuc.approve.mapper;
+
+import com.dragonsoft.dcuc.approve.model.ApprovalResourceInfo;
+import com.dragonsoft.duceap.mybaitsplus.core.BaseMybatisMapper;
+
+/**
+ * @author wangrs
+ * @date 2021/02/05
+ * @desc 申请资源信息
+ */
+public interface ApprovalResourceInfoMapper extends BaseMybatisMapper<ApprovalResourceInfo> {
+}

+ 215 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalInfo.java

@@ -0,0 +1,215 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author wangrs
+ * @date 2021/02/04
+ * @desc 流程类型实体
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName(value = "T_APPROVAL_INFO")
+public class ApprovalInfo extends IdEntity implements Serializable {
+
+    private static final long serialVersionUID = 5454155825318885342L;
+
+    //alias
+    public static final String TABLE_ALIAS = "ApprovalInfo";
+    public static final String ALIAS_ID = "id";
+    public static final String ALIAS_PR0CESS_TITLE = "processTitle";
+    public static final String ALIAS_PROCESS_TYPE = "processType";
+    public static final String ALIAS_PROCESS_NAME = "processName";
+    public static final String ALIAS_APPLY_REASON = "applyReason";
+    public static final String ALIAS_APPLY_CONTENT = "applyContent";
+    public static final String ALIAS_APPLICANT_IDCARD = "applicantIdcard";
+    public static final String ALIAS_APPLICANT_NAME = "applicantName";
+    public static final String ALIAS_APPLICANT_ORG_CODE = "applicantOrgCode";
+    public static final String ALIAS_APPLICANT_ORG_NAME = "applicantOrgName";
+    public static final String ALIAS_APPLICANT_PHONE_NO = "applicantPhoneNo";
+    public static final String ALIAS_PROCESS_INSTANCE_ID = "processInstanceId";
+    public static final String ALIAS_APPROVE_TASK_IDENTIFIER = "approveTaskIdentifier";
+    public static final String ALIAS_TASK_ID = "taskId";
+    public static final String ALIAS_TASK_NAME = "taskName";
+    public static final String ALIAS_PERMISSION_VALID_TYPE = "permissionValidType";
+    public static final String ALIAS_START_TIME = "startTime";
+    public static final String ALIAS_END_TIME = "endTime";
+    public static final String ALIAS_IS_DELETED = "isDeleted";
+    public static final String ALIAS_CREATE_TIME = "createTime";
+    public static final String ALIAS_UPDATE_TIME = "updateTime";
+    public static final String ALIAS_CREATE_USER = "createUser";
+    public static final String ALIAS_UPDATE_USER = "updateUser";
+
+    /**
+     * 流程标题
+     */
+    //@Column(name =  "PROCESS_TITLE")
+    private String processTitle;
+
+    /**
+     * 流程类型
+     */
+    //@Column(name =  "PROCESS_TYPE")
+    private String processType;
+
+    /**
+     * 流程类型名称
+     */
+    //@Column(name =  "PROCESS_TYPE_NAME")
+    private String processTypeName;
+
+    /**
+     * 流程名称
+     */
+    //@Column(name =  "PROCESS_NAME")
+    private String processName;
+
+    /**
+     * 流程标识码
+     */
+    //@Column(name =  "PROCESS_NAME")
+    private String businessCode;
+
+    /**
+     * 申请理由
+     */
+    //@Column(name =  "APPLY_REASON")
+    private String applyReason;
+
+    /**
+     * 申请内容
+     */
+    //@Column(name =  "APPLY_CONTENT")
+    private String applyContent;
+
+    /**
+     * 申请人员身份证号
+     */
+    //@Column(name =  "APPLICANT_IDCARD")
+    private String applicantIdcard;
+
+    /**
+     * 申请人员姓名
+     */
+    //@Column(name =  "APPLICANT_NAME")
+    private String applicantName;
+
+    /**
+     * 申请人单位代码
+     */
+    //@Column(name =  "APPLICANT_ORG_CODE")
+    private String applicantOrgCode;
+    /**
+     * 申请人单位名称
+     */
+    //@Column(name =  "APPLICANT_ORG_NAME")
+    private String applicantOrgName;
+
+    /**
+     * 申请人联系方式
+     */
+    //@Column(name =  "APPLICANT_PHONE_NO")
+    private String applicantPhoneNo;
+
+    /**
+     * 流程实例ID
+     */
+    //@Column(name =  "PROCESS_INSTANCE_ID")
+    private String processInstanceId;
+
+    /**
+     * 任务标识(Code)
+     */
+    //@Column(name =  "APPROVE_TASK_IDENTIFIER")
+    private String approveTaskIdentifier;
+
+    /**
+     * 任务ID
+     */
+    //@Column(name =  "TASK_ID")
+    private String taskId;
+
+    /**
+     * 任务名称
+     */
+    //@Column(name =  "TASK_NAME")
+    private String taskName;
+
+    /**
+     * 消息ID
+     */
+    //@Column(name =  "TASK_NAME")
+    private String messageId;
+
+    /**
+     * 有效时间类别
+     */
+    //@Column(name =  "PERMISSION_VALID_TYPE")
+    private String permissionValidType;
+
+    /**
+     * 有效时间起始
+     */
+    //@Column(name =  "START_TIME")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date startTime;
+
+    /**
+     * 有效时间终止
+     */
+    //@Column(name =  "END_TIME")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date endTime;
+
+    /**
+     * 是否删除
+     */
+    //@Column(name =  "IS_DELETED")
+    @TableLogic
+    private String isDeleted;
+
+    /**
+     * 创建时间
+     */
+    //@Column(name =  "CREATE_TIME")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    //@Column(name =  "UPDATE_TIME")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+    /**
+     * 创建人
+     */
+    //@Column(name =  "CREATE_USER")
+    private String createUser;
+
+    /**
+     * 修改人
+     */
+    //@Column(name =  "UPDATE_USER")
+    private String updateUser;
+
+    @Override
+    public String toString(){
+        return "ApprovalInfo{" +
+                ", processName='" + processName + '\'' +
+                ", processInstanceId='" + processInstanceId + '\'' +
+                '}';
+    }
+}

+ 69 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalResourceInfo.java

@@ -0,0 +1,69 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author wangrs
+ * @date 2021/02/04
+ * @desc 流程资源信息
+ */
+@Data
+@TableName(value = "T_APPROVAL_RESOURCE_INFO")
+public class ApprovalResourceInfo extends IdEntity{
+
+    private static final long serialVersionUID = 5454155666318885342L;
+
+    //alias
+    public static final String TABLE_ALIAS = "ApprovalResourceInfo";
+    public static final String ALIAS_ID = "id";
+    public static final String ALIAS_APPROVAL_ID = "approvalId";
+    public static final String ALIAS_VISITOR_CODE= "visitorCode";
+    public static final String ALIAS_VISITOR_NAME = "visitorName";
+    public static final String ALIAS_VISIT_RESOURCE_CODE = "resourceCode";
+    public static final String ALIAS_VISIT_RESOURCE_NAME = "resourceName";
+    public static final String ALIAS_VISIT_INFO = "visitInfo";
+
+    /**
+     * 申请ID
+     */
+    //@Column(name = "APPROVAL_ID")
+    private String approvalId;
+
+    /**
+     * 请求方编码
+     */
+    //@Column(name = "VISITOR_CODE")
+    private String visitorCode;
+
+    /**
+     * 请求方名称
+     */
+    //@Column(name = "VISITOR_NAME")
+    private String visitorName;
+
+    /**
+     * 访问资源编码
+     */
+    //@Column(name = "VISIT_RESOURCE_CODE")
+    private String visitResourceCode;
+
+    /**
+     * 访问资源名称
+     */
+    //@Column(name = "VISIT_RESOURCE_NAME")
+    private String visitResourceName;
+
+    /**
+     * 访问信息
+     */
+    //@Column(name = "VISIT_INFO")
+    private String visitInfo;
+
+    @Override
+    public String toString(){
+        return "T_RESOURCE_INFO{" +
+                ", APPROVAL_ID='" + approvalId + '\'' +
+                '}';
+    }
+}

+ 153 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveTaskRequestVo.java

@@ -0,0 +1,153 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import java.io.Serializable;
+
+/**
+ * TaskRequest 对象
+ */
+public class ApproveTaskRequestVo implements Serializable {
+    private static final long serialVersionUID = 5454155656318885342L;
+
+    /**
+     * 申请单标题
+     */
+    private String applyTitle;
+
+    /**
+     * 申请单申请内容
+     */
+    private String applyContent;
+
+    /**
+     * 业务系统代码
+     */
+    private String businessSystem;
+
+    /**
+     * 业务主键(申请表的id)
+     */
+    private String businessKey;
+
+    /**
+     * 业务类型Key
+     */
+    private String businessType;
+
+    /**
+     * 申请人id
+     */
+    private String applyUser;
+
+    /**
+     * 申请人姓名
+     */
+    private String applyUserName;
+
+    /**
+     * 当前节点处理人id
+     */
+    private String handleUser;
+
+    /**
+     * 当前节点处理人姓名
+     */
+    private String handleUserName;
+
+    /**
+     * 是否为科信人员
+     */
+    private Boolean kxPeople;
+
+    /**
+     * 业务id
+     */
+    private String businessId;
+
+    public String getApplyTitle() {
+        return applyTitle;
+    }
+
+    public void setApplyTitle(String applyTitle) {
+        this.applyTitle = applyTitle;
+    }
+
+    public String getApplyContent() {
+        return applyContent;
+    }
+
+    public void setApplyContent(String applyContent) {
+        this.applyContent = applyContent;
+    }
+
+    public String getBusinessSystem() {
+        return businessSystem;
+    }
+
+    public void setBusinessSystem(String businessSystem) {
+        this.businessSystem = businessSystem;
+    }
+
+    public String getBusinessKey() {
+        return businessKey;
+    }
+
+    public void setBusinessKey(String businessKey) {
+        this.businessKey = businessKey;
+    }
+
+    public String getBusinessType() {
+        return businessType;
+    }
+
+    public void setBusinessType(String businessType) {
+        this.businessType = businessType;
+    }
+
+    public String getApplyUser() {
+        return applyUser;
+    }
+
+    public void setApplyUser(String applyUser) {
+        this.applyUser = applyUser;
+    }
+
+    public String getApplyUserName() {
+        return applyUserName;
+    }
+
+    public void setApplyUserName(String applyUserName) {
+        this.applyUserName = applyUserName;
+    }
+
+    public String getHandleUser() {
+        return handleUser;
+    }
+
+    public void setHandleUser(String handleUser) {
+        this.handleUser = handleUser;
+    }
+
+    public String getHandleUserName() {
+        return handleUserName;
+    }
+
+    public void setHandleUserName(String handleUserName) {
+        this.handleUserName = handleUserName;
+    }
+
+    public Boolean getKxPeople() {
+        return kxPeople;
+    }
+
+    public void setKxPeople(Boolean kxPeople) {
+        this.kxPeople = kxPeople;
+    }
+
+    public String getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(String businessId) {
+        this.businessId = businessId;
+    }
+}

+ 24 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/IdEntity.java

@@ -0,0 +1,24 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+/**
+ * @author wangrs
+ * @date 2021/01/28
+ * @desc 主键抽取
+ */
+public class IdEntity {
+    @TableField(value = "ID")
+    @TableId(type = IdType.UUID)
+    private String id;
+
+    public void setId(String value) {
+        this.id = value;
+    }
+
+    public String getId() {
+        return this.id;
+    }
+}

+ 35 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/PoliceResultVo.java

@@ -0,0 +1,35 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import java.io.Serializable;
+
+/**
+ * Created by lidr on 2021/2/23
+ */
+public class PoliceResultVo implements Serializable {
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 身份证号
+     */
+    private String idcard;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdcard() {
+        return idcard;
+    }
+
+    public void setIdcard(String idcard) {
+        this.idcard = idcard;
+    }
+}

+ 51 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/WorkflowConditionDto.java

@@ -0,0 +1,51 @@
+package com.dragonsoft.dcuc.approve.model;
+
+import java.io.Serializable;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/18 9:55
+ */
+public class WorkflowConditionDto implements Serializable {
+
+    /**
+     * 是否为科信人员
+     */
+    private Boolean kxPeople;
+
+    /**
+     * 业务id
+     */
+    private String businessId;
+
+    public Boolean getKxPeople() {
+        return kxPeople;
+    }
+
+    public void setKxPeople(Boolean kxPeople) {
+        this.kxPeople = kxPeople;
+    }
+
+    public String getBusinessId() {
+        return businessId;
+    }
+
+    public void setBusinessId(String businessId) {
+        this.businessId = businessId;
+    }
+
+    public WorkflowConditionDto() {
+    }
+
+    public WorkflowConditionDto(Boolean kxPeople) {
+        this.kxPeople = kxPeople;
+    }
+
+    public WorkflowConditionDto(Boolean kxPeople, String businessId) {
+        this.kxPeople = kxPeople;
+        this.businessId = businessId;
+    }
+}

+ 13 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IApplyInfoService.java

@@ -0,0 +1,13 @@
+package com.dragonsoft.dcuc.approve.service;
+
+import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
+import com.dragonsoft.duceap.core.service.IBaseService;
+
+/**
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+public interface IApplyInfoService extends IBaseService<ApprovalInfo,String> {
+
+}

+ 147 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IApproveService.java

@@ -0,0 +1,147 @@
+package com.dragonsoft.dcuc.approve.service;
+
+import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOprationEnum;
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateDTO;
+import com.dragonsoft.dcuc.approve.model.resp.ApprovalInfoVo;
+import com.dragonsoft.dcuc.approve.model.resp.ApproveWorkflowProcessTypeVo;
+import com.dragonsoft.dcuc.approve.model.resp.TaskOperateVo;
+import com.dragonsoft.dcuc.approve.model.resp.TaskVo;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.core.search.Searchable;
+import com.dragonsoft.duceap.duwf.api.model.*;
+import org.springframework.data.domain.Page;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+import java.util.List;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/3 19:43
+ */
+public interface IApproveService {
+    /**
+     * 我的请求列表
+     * @param searchable
+     */
+    Page<ApprovalInfoVo> queryUserApproveList(Searchable searchable);
+
+    /**
+     * 待办/已办列表
+     * @param searchable
+     */
+    Page<TaskVo> queryApproveList(Searchable searchable);
+
+    /**
+     * 表单申请提交/保存
+     * @param approvalInfoDTO
+     */
+    ResponseStatus save(ApprovalInfoDTO approvalInfoDTO);
+
+    /**
+     * 表单申请提交/保存
+     * @param approvalInfoDTO
+     */
+    ResponseStatus update(ApprovalInfoUpdateDTO approvalInfoDTO);
+
+    /**
+     * 审批操作
+     * 操作类型:complete:提交
+     * complete-agree:同意
+     * complete-disagree:不同意
+     * back:退回
+     * recall:撤回
+     * @param taskId
+     * @param taskRequest
+     */
+    ResponseStatus approveOperate(String taskId,String processInstanceId, ApproveWorkFlowOprationEnum approveWorkFlowOprationEnum, TaskRequest taskRequest);
+
+    /**
+     * 转办
+     * @param agentDTO
+     */
+    void agent(AgentDTO agentDTO);
+
+    /**
+     * 流程图数据
+     * @param proInsId
+     */
+    TraceProcessAndOverVo processPic(String proInsId);
+
+    /**
+     * 查看待办数量和已办数量
+     * 已办:finish
+     * 待办:unfinish
+     * @return
+     */
+    Integer queryApproveQty(Searchable searchable);
+
+    /**
+     * 获取我的请求数量
+     * @return
+     */
+    Integer queryMyRequestQty(Searchable searchable);
+
+    /**
+     * 获取流程类别列表
+     * @return
+     */
+    List<ApproveWorkflowProcessTypeVo> queryProcessTypeList();
+    /**
+     * 获取流程类别详情
+     * @param processTypeCode   流程类别code
+     * @return
+     */
+    WorkflowProcesstypeVo queryProcessType(String processTypeCode);
+
+    /***
+     * 获取审批意见
+     * @param processInstanceId 流程实例ID
+     */
+    ResponseStatus approveComments(String processInstanceId);
+
+    /**
+     * 获取流程图节点信息
+     * @param proInsId
+     * @param statusType
+     * @param taskDefinitionId
+     */
+    ActivityNodeInfoVo processPicDetail(String proInsId, String statusType, String taskDefinitionId);
+
+    /**
+     * 删除流程实例
+     * @param id 申请单ID
+     * @return
+     */
+    ResponseStatus deleteProcessInstance(String id);
+
+    /**
+     * 查看审批详情
+     * @param id
+     * @return
+     */
+    ResponseStatus queryApproveDetail(String id);
+
+    /***
+     * 获取流程图状态信息
+     * @param processInstanceId 流程实例ID
+     */
+    ResponseStatus approveStatus(String processInstanceId);
+
+    /**
+     * 获取警员列表
+     * @return
+     */
+    ResponseStatus queryPoliceList(String userToken, String appToken, int page, int size);
+
+    /**
+     * 获取任务支持的操作对象信息
+     * @param taskId
+     * @return
+     */
+    TaskOperateVo taskOperate(String taskId,String pageType);
+}

+ 16 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IKafkaService.java

@@ -0,0 +1,16 @@
+/*
+package com.dragonsoft.dcuc.approve.service;
+
+import com.dragonsoft.mq.client.model.entity.MessageInfoDTO;
+
+*/
+/**
+ * @author wangrs
+ * @date 2021/02/23
+ * KAFKA服务
+ *//*
+
+public interface IKafkaService {
+    void send(String topic, MessageInfoDTO messageInfoDTO);
+}
+*/

+ 21 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApplyInfoService.java

@@ -0,0 +1,21 @@
+package com.dragonsoft.dcuc.approve.service.impl;
+
+import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
+import com.dragonsoft.dcuc.approve.service.IApplyInfoService;
+import com.dragonsoft.duceap.mybaitsplus.core.BaseMybatisMapper;
+import com.dragonsoft.duceap.mybaitsplus.core.services.BaseMybatisService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author wangrs
+ * @version 1.0
+ * @date 2021/2/5
+ */
+@Service
+@Transactional
+public class ApplyInfoService extends BaseMybatisService<ApprovalInfo,String> implements IApplyInfoService {
+    public ApplyInfoService(BaseMybatisMapper<ApprovalInfo> baseMybatisMapper) {
+        super(baseMybatisMapper);
+    }
+}

+ 1227 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApproveService.java

@@ -0,0 +1,1227 @@
+package com.dragonsoft.dcuc.approve.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.EnumUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.dragonsoft.approve.common.ErrorCode;
+import com.dragonsoft.dcuc.approve.componet.DcucHelper;
+import com.dragonsoft.dcuc.approve.config.ApproveConfig;
+import com.dragonsoft.dcuc.approve.config.KafkaConfig;
+import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOprationEnum;
+import com.dragonsoft.dcuc.approve.enumresources.OperateOptionEnum;
+import com.dragonsoft.dcuc.approve.enumresources.YesNoEnum;
+import com.dragonsoft.dcuc.approve.mapper.ApprovalInfoMapper;
+import com.dragonsoft.dcuc.approve.mapper.ApprovalResourceInfoMapper;
+import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
+import com.dragonsoft.dcuc.approve.model.ApprovalResourceInfo;
+import com.dragonsoft.dcuc.approve.model.ApproveTaskRequestVo;
+import com.dragonsoft.dcuc.approve.model.IdEntity;
+import com.dragonsoft.dcuc.approve.model.req.AgentDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoDTO;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateDTO;
+import com.dragonsoft.dcuc.approve.model.resp.*;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.base.entity.security.BaseSecurityUser;
+import com.dragonsoft.duceap.base.exception.ApplicationException;
+import com.dragonsoft.duceap.base.utils.UserContextUtils;
+import com.dragonsoft.duceap.commons.util.UUIDUtils;
+import com.dragonsoft.duceap.commons.util.date.DateConst;
+import com.dragonsoft.duceap.commons.util.date.DateUtils;
+import com.dragonsoft.duceap.commons.util.enums.EnumUtils;
+import com.dragonsoft.duceap.commons.util.kafkaServer.KafkaServer;
+import com.dragonsoft.duceap.core.context.ContextUtils;
+import com.dragonsoft.duceap.core.entity.page.PageImpl;
+import com.dragonsoft.duceap.core.entity.page.PageRequest;
+import com.dragonsoft.duceap.core.search.Searchable;
+import com.dragonsoft.duceap.core.search.enums.SearchOperator;
+import com.dragonsoft.duceap.duwf.api.enums.StateTypeEnum;
+import com.dragonsoft.duceap.duwf.api.model.ActivityNodeInfoVo;
+import com.dragonsoft.duceap.duwf.api.model.*;
+import com.dragonsoft.duceap.workflow.client.WorkflowClientFactory;
+import com.dragonsoft.duceap.workflow.enums.WorkFlowOprationEnum;
+import com.dragonsoft.mq.client.model.entity.MessageInfoVo;
+import com.dragonsoft.mq.client.model.entity.RequestVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/3 19:43
+ */
+@Service
+@Transactional
+@EnableAsync
+public class ApproveService implements IApproveService {
+
+    private static final Logger logger = LoggerFactory.getLogger(ApproveService.class);
+
+    /**
+     * 结束字符串
+     */
+    private static final String endStr = "END";
+    /**
+     * 页面
+     */
+    private static final String myRequestPage = "request";
+    /**
+     * 审批类型(待办中心用于区分应用、服务等审批类型)
+     */
+    private static final String businessType = "auth-update-apply";
+    private static final String businessSystem = "dcuc-approve";
+
+    @Autowired
+    private WorkflowClientFactory workflowClientFactory;
+    @Autowired
+    private ApprovalInfoMapper approvalInfoMapper;
+    @Autowired
+    private ApprovalResourceInfoMapper approvalResourceInfoMapper;
+    @Autowired
+    private DcucHelper dcucHelper;
+    @Autowired
+    private KafkaServer kafkaService;
+    @Autowired
+    private KafkaConfig kafkaConfig;
+    @Autowired
+    private ApproveConfig approveConfig;
+
+    /**
+     * 工作流审批流程类型编码
+     */
+    @Value("${approve.workflow.processTypeCode:approve}")
+    private String approveProcessTypeCode;
+
+    /**
+     * 我的请求列表
+     *
+     * @param searchable
+     * @return
+     */
+    @Override
+    public Page<ApprovalInfoVo> queryUserApproveList(Searchable searchable) {
+        searchable.addSearchFilter("createUser", SearchOperator.eq, getCurrentUserId());
+        searchable.addSort(Sort.Direction.DESC, "createTime");
+        //获取我的申请列表
+        Page<ApprovalInfo> applyInfoPage = approvalInfoMapper.pagingBySearchable(searchable);
+        List<ApprovalInfoVo> approvalInfoVoList = new ArrayList<>();
+        for (ApprovalInfo approvalInfo : applyInfoPage.getContent()) {
+            ApprovalInfoVo approvalInfoVo = this.fillTaskInfoToApplyInfo(approvalInfo);
+            approvalInfoVoList.add(approvalInfoVo);
+        }
+        return new PageImpl(approvalInfoVoList, applyInfoPage.getPageable(), applyInfoPage.getTotalElements());
+    }
+
+    /**
+     * 待办/已办列表
+     *
+     * @param searchable
+     */
+    @Override
+    public Page<TaskVo> queryApproveList(Searchable searchable) {
+        Page<TaskHistoryDetailVo> page = workflowClientFactory.getWorkflowTaskClient().queryTaskDetailPageByUserId(searchable, getCurrentUserId());
+        List<TaskVo> list = new ArrayList<>();
+        //设置流程类型名称
+        for (TaskHistoryDetailVo taskDetailVo : page.getContent()) {
+            TaskVo taskVo = new TaskVo();
+            BeanUtils.copyProperties(taskDetailVo, taskVo);
+            //获取申请信息填充
+            LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
+            where.eq(ApprovalInfo::getProcessInstanceId,taskDetailVo.getProcessInstanceId());
+            taskVo.setProcessName(taskDetailVo.getProcessDefinitionName());
+            ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
+            if(approvalInfo != null){
+                taskVo.setProcessTitle(approvalInfo.getProcessTitle());
+                taskVo.setApplicantName(approvalInfo.getApplicantName());
+                taskVo.setProcessType(approvalInfo.getProcessType());
+                taskVo.setBusinessId(approvalInfo.getId());
+                //重新设置候选人
+                String state = searchable.getSearchFilterByKey("state_eq").getValue().toString();
+                if("finish".equals(state)){
+                    if(!endStr.equals(approvalInfo.getTaskId())){
+                        TaskHistoryDetailVo nextTaskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
+                        taskVo.setUnOperateUsers(this.getUnOperateUsersFromAssiginerMap(nextTaskDetailVo.getCandidateVo()));
+                    }
+                }else{
+                    taskVo.setUnOperateUsers(this.getUnOperateUsersFromAssiginerMap(taskDetailVo.getCandidateVo()));
+                }
+                taskVo.setTaskName(approvalInfo.getTaskName());
+                taskVo.setProcessTypeName(approvalInfo.getProcessTypeName());
+            }
+            list.add(taskVo);
+        }
+        return new PageImpl(list, page.getPageable(), page.getTotalElements());
+    }
+
+    /**
+     * 表单申请提交/保存
+     *
+     * @param approvalInfoDTO
+     */
+    @Override
+    public ResponseStatus save(ApprovalInfoDTO approvalInfoDTO) {
+        approvalInfoDTO.setEndTime(this.parseEndTime(approvalInfoDTO.getEndTime()));
+        logger.info("====申请单请求体为:{}====",JSONObject.toJSON(approvalInfoDTO));
+        //获取流程类型详情
+        WorkflowProcesstypeVo workflowProcesstypeVo = null;
+        try {
+            workflowProcesstypeVo = queryProcessType(approvalInfoDTO.getProcessType());
+        }catch (ApplicationException e){
+            logger.info("流程类型标识码-Exception:【{}】", approvalInfoDTO.getProcessType());
+            throw new ApplicationException(ErrorCode.WORKFLOW_EXCEPTION.getCode(), ErrorCode.WORKFLOW_EXCEPTION.getMsg());
+        }
+        if (null == workflowProcesstypeVo){
+            logger.info("流程类型标识码:【{}】", approvalInfoDTO.getProcessType());
+            throw new ApplicationException(ErrorCode.WORKFLOW_TYPE_NOT_EXIST.getCode(), ErrorCode.WORKFLOW_TYPE_NOT_EXIST.getMsg());
+        }
+        approvalInfoDTO.setProcessTypeName(workflowProcesstypeVo.getName());
+        //获取流程信息
+        WorkflowProcessVo workflowProcessVo = null;
+        try {
+            workflowProcessVo = workflowClientFactory.getWorkflowProcessClient().queryWorkflowProcessByBusinessCode(approvalInfoDTO.getBusinessCode());
+        }catch (ApplicationException e){
+            logger.info("流程类型标识码-Exception:【{}】", approvalInfoDTO.getProcessType());
+            throw new ApplicationException(ErrorCode.WORKFLOW_EXCEPTION.getCode(), ErrorCode.WORKFLOW_EXCEPTION.getMsg());
+        }
+        if (null == workflowProcessVo){
+            logger.info("流程标识码:【{}】", approvalInfoDTO.getBusinessCode());
+            throw new ApplicationException(ErrorCode.WORKFLOW_NOT_EXIST.getCode(), ErrorCode.WORKFLOW_NOT_EXIST.getMsg());
+        }
+        approvalInfoDTO.setProcessName(workflowProcessVo.getName());
+        ApprovalInfo approvalInfo = buildApprovalInfo(approvalInfoDTO);
+        logger.info("构建申请单信息");
+        approvalInfo.setApplyContent(JSON.toJSON(approvalInfoDTO.getResourceInfoDTO()).toString());
+        approvalInfo.setId(UUIDUtils.getUUID());
+        ApprovalResourceInfo approvalResourceInfo = buildApprovalResourceInfo(approvalInfoDTO, approvalInfo.getId());
+        //判断是否需要提交
+        if (ApprovalInfoDTO.applyAndCommitStr.equals(approvalInfoDTO.getOperateType())) {
+            //提交,更新申请单的实例ID和当前的任务ID和任务代码
+            logger.info("===开始提交===");
+            //构建申请的taskRequest
+            TaskRequest<ApproveTaskRequestVo> taskRequest = new TaskRequest<>();
+            taskRequest.setData(this.buildTaskRequestVo(approvalInfo));
+            String userId = getCurrentUserId(approvalInfoDTO.getApplicantIdcard());
+            logger.info("===提交的用户是:{}===",userId);
+            ProcessInstanceVO vo = workflowClientFactory.getWorkflowTaskClient().startTaskByCode(approvalInfoDTO.getBusinessCode(),
+                    "", taskRequest, userId);
+            approvalInfo.setProcessInstanceId(vo.getProcessInstanceId());
+            //构建流转的taskRequest
+            taskRequest = new TaskRequest<>();
+            this.buildTaskRequest(taskRequest,approvalInfo);
+            boolean sendMessageFlag = true;
+            if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
+                for(TaskHistoryDetailVo taskDetailVo: vo.getTaskRunDetailVos()){
+                    vo = baseApproveOperate(taskDetailVo.getId(), ApproveWorkFlowOprationEnum.COMPLETE_AGREE, taskRequest, approvalInfo);
+                    if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
+                        sendMessageFlag = false;
+                    }
+                    logger.info("工作流申请流程:【{}】,taskId:【{}】", JSON.toJSONString(vo),taskDetailVo.getId());
+                }
+                logger.info("===发送消息标志:{}",sendMessageFlag);
+                if(sendMessageFlag){
+                    sendApproveResultMessage(vo.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
+                }
+            }
+            approvalInfo = this.buildTaskInfoByProcessInstanceId(approvalInfo, vo.getTaskRunDetailVos());
+            logger.info("===保存表单信息====");
+            approvalInfoMapper.insert(approvalInfo);
+        }else {
+            logger.info("===保存表单信息====");
+            approvalInfoMapper.insert(approvalInfo);
+        }
+        approvalResourceInfoMapper.insert(approvalResourceInfo);
+        return ResponseDTO.newInstance(approvalInfo.getProcessInstanceId());
+    }
+
+    /**
+     * 构建资源对象
+     * @param approvalInfoDTO
+     * @param approvalInfoId
+     * @return
+     */
+    private ApprovalResourceInfo buildApprovalResourceInfo(ApprovalInfoDTO approvalInfoDTO, String approvalInfoId) {
+        ApprovalResourceInfo approvalResourceInfo = new ApprovalResourceInfo();
+        BeanUtil.copyProperties(approvalInfoDTO.getResourceInfoDTO(),approvalResourceInfo);
+        approvalResourceInfo.setApprovalId(approvalInfoId);
+        return approvalResourceInfo;
+    }
+
+    /**
+     * 构建申请表单数据
+     * @param approvalInfoDTO
+     * @return
+     */
+    private ApprovalInfo buildApprovalInfo(ApprovalInfoDTO approvalInfoDTO) {
+        ApprovalInfo approvalInfo = new ApprovalInfo();
+        BeanUtil.copyProperties(approvalInfoDTO, approvalInfo);
+        approvalInfo.setIsDeleted(YesNoEnum.NO.getValue());
+        approvalInfo.setCreateUser(StringUtils.isNotEmpty(approvalInfoDTO.getApplicantIdcard()) ? approvalInfoDTO.getApplicantIdcard() : getCurrentUserId());
+        approvalInfo.setId(UUIDUtils.getUUID());
+        approvalInfo.setCreateTime(new Date());
+        //流程标题
+        approvalInfo.setProcessTitle(approvalInfo.getProcessName() + "-" + approvalInfo.getApplicantName() + "-" + DateUtils.getTimeStr(approvalInfo.getCreateTime(), DateConst.HYPHEN_DISPLAY_DATE));
+        return approvalInfo;
+    }
+
+    /**
+     * 修改
+     * @param approvalInfoUpdateDTO
+     * @return
+     */
+    @Override
+    public ResponseStatus update(ApprovalInfoUpdateDTO approvalInfoUpdateDTO) {
+        ApprovalInfoDTO approvalInfoDTO = new ApprovalInfoDTO();
+        BeanUtils.copyProperties(approvalInfoUpdateDTO, approvalInfoDTO);
+        ApprovalInfo approvalInfo = new ApprovalInfo();
+        String instanceId = approvalInfoDTO.getProcessInstanceId();
+        //判断实例id是否存在,不存在的话,原本为草稿状态
+        if (StringUtils.isEmpty(instanceId)){
+
+            String approvalId = approvalInfoDTO.getId();
+            if(StringUtils.isNotEmpty(approvalId)){
+                logger.info("====删除草稿信息====");
+                //有草稿信息
+                approvalInfoMapper.deleteById(approvalId);
+                //删除资源信息
+                LambdaQueryWrapper<ApprovalResourceInfo> deleteWrapper = new LambdaQueryWrapper<>();
+                deleteWrapper.eq(ApprovalResourceInfo::getApprovalId,approvalId);
+                approvalResourceInfoMapper.delete(deleteWrapper);
+            }
+            return save(approvalInfoDTO);
+        }else {
+            String approvalId = approvalInfoDTO.getId();
+            approvalInfo = approvalInfoMapper.selectById(approvalId);
+            approvalInfo.setApplyReason(approvalInfoDTO.getApplyReason());
+            approvalInfo.setApplyContent(approvalInfoDTO.getApplyContent());
+            approvalInfo.setApplicantPhoneNo(approvalInfoDTO.getApplicantPhoneNo());
+            approvalInfo.setPermissionValidType(approvalInfoDTO.getPermissionValidType());
+            approvalInfo.setStartTime(approvalInfoDTO.getStartTime());
+            approvalInfo.setEndTime(this.parseEndTime(approvalInfoDTO.getEndTime()));
+            approvalInfo.setUpdateTime(approvalInfoDTO.getEndTime());
+            approvalInfo.setUpdateUser(getCurrentUserId());
+            approvalInfo.setApplyContent(JSON.toJSON(approvalInfoDTO.getResourceInfoDTO()).toString());
+            //approvalInfoMapper.updateById(approvalInfo);
+            this.updateApprovalById(approvalInfo);
+            //修改资源表
+            //删除资源信息
+            LambdaQueryWrapper<ApprovalResourceInfo> deleteWrapper = new LambdaQueryWrapper<>();
+            deleteWrapper.eq(ApprovalResourceInfo::getApprovalId,approvalId);
+            approvalResourceInfoMapper.delete(deleteWrapper);
+            ApprovalResourceInfo approvalResourceInfo = buildApprovalResourceInfo(approvalInfoDTO, approvalId);
+            approvalResourceInfoMapper.insert(approvalResourceInfo);
+
+            //判断实例id是否存在,存在的话,原本为非草稿状态
+            //原本为非草稿状态,点击保存并提交,需要
+            if (ApprovalInfoDTO.applyAndCommitStr.equals(approvalInfoDTO.getOperateType())) {
+                List<TaskHistoryDetailVo> list = workflowClientFactory.getWorkflowProcessClient().queryTaskDetailByProcessInstanceId(approvalInfo.getProcessInstanceId());
+                TaskRequest<Map> taskRequest = new TaskRequest<>();
+                this.buildTaskRequest(taskRequest,approvalInfo);
+                boolean sendMessageFlag = true;
+                for(TaskHistoryDetailVo taskDetailVo: list){
+                    ProcessInstanceVO vo = baseApproveOperate(taskDetailVo.getId(), ApproveWorkFlowOprationEnum.COMPLETE_AGREE, taskRequest, approvalInfo);
+                    if(CollectionUtils.isNotEmpty(vo.getTaskRunDetailVos())){
+                        sendMessageFlag = false;
+                    }
+                    logger.info("工作流申请流程:【{}】,taskId:【{}】", JSON.toJSONString(vo),taskDetailVo.getId());
+                    approvalInfo = this.buildTaskInfoByProcessInstanceId(approvalInfo, vo.getTaskRunDetailVos());
+                }
+                logger.info("====发送结果标志:{}",sendMessageFlag);
+                if(sendMessageFlag){
+                    sendApproveResultMessage(approvalInfo.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
+                }
+                logger.info("===保存表单信息====");
+                //approvalInfoMapper.updateById(approvalInfo);
+                this.updateApprovalById(approvalInfo);
+            }
+
+        }
+        return ResponseDTO.newInstance(approvalInfo.getProcessInstanceId());
+    }
+
+    /**
+     * 判断当前登录人是否为科信人员
+     * @return
+     */
+    private Boolean judgeCurrentType(String idCard) {
+        //默认非科信人员
+        Boolean kxPeople = false;
+        //TODO 判断当前登录人是否为科信人员,目前采取配置身份证号验证(按需求要求)
+        String kxList = approveConfig.getKxPeopleList();
+        logger.info("config kxList is :{}",kxList);
+        if(StringUtils.isEmpty(kxList)){
+            return kxPeople;
+        }
+        String[] users = kxList.split(",");
+        for(String user:users){
+            if(idCard.equalsIgnoreCase(user)){
+                kxPeople = true;
+                break;
+            }
+        }
+        return kxPeople;
+    }
+
+    /**
+     * 构建工作流请求体
+     * @param taskRequest
+     * @return
+     */
+    private TaskRequest buildTaskRequest(TaskRequest taskRequest,ApprovalInfo approvalInfo) {
+        String idCard = "";
+        if(null != approvalInfo && StringUtils.isNotEmpty(approvalInfo.getApplicantIdcard())){
+            idCard = approvalInfo.getApplicantIdcard();
+        }else {
+            idCard = getCurrentUserId();
+        }
+        Boolean kxPeople = judgeCurrentType(idCard);
+        logger.info("====是否为科信人员判断结果:{}",kxPeople);
+        if (taskRequest == null){
+            taskRequest = new TaskRequest();
+        }
+        ApproveTaskRequestVo approveTaskRequestVo = new ApproveTaskRequestVo();
+        approveTaskRequestVo.setKxPeople(kxPeople);
+        if(approvalInfo!=null){
+            approveTaskRequestVo.setBusinessKey(approvalInfo.getId());
+            approveTaskRequestVo.setApplyTitle(approvalInfo.getProcessTitle());
+            approveTaskRequestVo.setApplyContent(approvalInfo.getApplyContent());
+        }
+        approveTaskRequestVo.setBusinessSystem(businessSystem);
+        approveTaskRequestVo.setBusinessType(approvalInfo!=null?approvalInfo.getBusinessCode():businessType);
+        BaseSecurityUser userInfo = ContextUtils.getUserInfo();
+        approveTaskRequestVo.setHandleUser(userInfo == null?getCurrentUserId():userInfo.getIdcard());
+        approveTaskRequestVo.setHandleUserName(userInfo == null?getCurrentUserId():userInfo.getUserName());
+        taskRequest.setData(approveTaskRequestVo);
+        return  taskRequest;
+    }
+
+
+
+    /**
+     * 审批操作(审批通过、审批不通过、退回、撤回)
+     *
+     * @param taskId                      任务id
+     * @param approveWorkFlowOprationEnum
+     * @param taskRequest
+     * @return
+     */
+    @Override
+    public ResponseStatus approveOperate(String taskId,String processInstanceId, ApproveWorkFlowOprationEnum
+            approveWorkFlowOprationEnum, TaskRequest taskRequest) {
+        ApprovalInfo approvalInfo = null;
+        LambdaQueryWrapper<ApprovalInfo> where = null;
+        if(approvalInfo == null){
+            where = new LambdaQueryWrapper<>();
+            if(StringUtils.isNotEmpty(processInstanceId)){
+                where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
+            }else {
+                where.eq(ApprovalInfo::getTaskId,taskId);
+            }
+            approvalInfo = approvalInfoMapper.selectOne(where);
+        }
+        String operateType = approveWorkFlowOprationEnum.getValue();
+        if(operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.RECALL.getValue())
+                || operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.BACK.getValue())){
+            if(StringUtils.isEmpty(processInstanceId)){
+                return ResponseDTO.fail("退回撤回必须带入流程实例ID");
+            }
+            TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
+            boolean isEnable = false;
+            if(operateType.equalsIgnoreCase(ApproveWorkFlowOprationEnum.RECALL.getValue())){
+                isEnable = this.checkOperateOptionOfCurrentStep(taskId,taskHistoryDetailVo.getProcessInstanceId(),taskHistoryDetailVo.getTaskCode(),OperateOptionEnum._BTN_WITH_DRAW_COMMIT);
+            }else {
+                isEnable = this.checkOperateOptionOfCurrentStep(taskId,taskHistoryDetailVo.getProcessInstanceId(),taskHistoryDetailVo.getTaskCode(),OperateOptionEnum._BTN_BACK_COMMIT);
+            }
+            logger.info("=====节点的{}操作权限判断结果为:{}======",operateType,isEnable);
+            /*where = new LambdaQueryWrapper<>();
+            where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
+            approvalInfo = approvalInfoMapper.selectOne(where);*/
+            if(!isEnable || approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
+                return ResponseDTO.fail("该节点不支持此项操作");
+            }
+            if(approvalInfo != null){
+                if(StringUtils.isNotEmpty(approvalInfo.getTaskId())){
+                    taskId = approvalInfo.getTaskId();
+                }
+            }
+        }
+        this.buildTaskRequest(taskRequest,approvalInfo);
+        ProcessInstanceVO processInstanceVO= baseApproveOperate(taskId,approveWorkFlowOprationEnum,taskRequest, approvalInfo);
+        boolean sendMessageFlag = true;
+        if(CollectionUtils.isNotEmpty(processInstanceVO.getTaskRunDetailVos())){
+            sendMessageFlag = false;
+        }
+        logger.info("====是否发送消息标志位:{}====",sendMessageFlag);
+        if(sendMessageFlag){
+            sendApproveResultMessage(processInstanceVO.getProcessInstanceId(),approvalInfo.getMessageId(),ApproveWorkFlowOprationEnum.COMPLETE_AGREE);
+        }
+       /* where = new LambdaQueryWrapper<>();
+        where.eq(ApprovalInfo::getProcessInstanceId,processInstanceVO.getProcessInstanceId());
+        approvalInfo = approvalInfoMapper.selectOne(where);*/
+        this.buildTaskInfoByProcessInstanceId(approvalInfo, processInstanceVO.getTaskRunDetailVos());
+        logger.info("====当前任务详情:{}====",JSONObject.toJSON(processInstanceVO.getTaskRunDetailVos()));
+        logger.info("====开始更新审批单信息====");
+        this.updateApprovalById(approvalInfo);
+        //approvalInfoMapper.updateById(approvalInfo);
+        return ResponseDTO.success();
+    }
+
+    /**
+     * 基础提交
+     * @param taskId 任务ID
+     * @param approveWorkFlowOprationEnum 提交类型
+     * @param taskRequest 请求体
+     * @param approvalInfo
+     * @return
+     */
+    public ProcessInstanceVO baseApproveOperate(String taskId, ApproveWorkFlowOprationEnum
+            approveWorkFlowOprationEnum, TaskRequest taskRequest, ApprovalInfo approvalInfo) {
+        taskRequest = buildTaskRequest(taskRequest,approvalInfo);
+        if (null == taskRequest.getApproveMessage()) {
+            ApproveMessage approveMessage = new ApproveMessage();
+            approveMessage.setApproveState(approveWorkFlowOprationEnum.getValue());
+            approveMessage.setMessage("");
+            taskRequest.setApproveMessage(approveMessage);
+        }
+
+        ProcessInstanceVO vo = null;
+        switch (approveWorkFlowOprationEnum) {
+            case COMPLETE_AGREE:
+                vo = workflowClientFactory.getWorkflowTaskClient().commitTask(taskId, taskRequest, WorkFlowOprationEnum.COMPLETE_AGREE, getCurrentUserId(approvalInfo.getApplicantIdcard()));
+                break;
+            case COMPLETE_DISAGREE:
+                vo = workflowClientFactory.getWorkflowTaskClient().commitTask(taskId, taskRequest, WorkFlowOprationEnum.COMPLETE_DISAGREE, getCurrentUserId(approvalInfo.getApplicantIdcard()));
+                break;
+            case BACK:
+                vo = workflowClientFactory.getWorkflowTaskClient().backTask(taskId,taskRequest, getCurrentUserId(approvalInfo.getApplicantIdcard()));
+                break;
+            case RECALL:
+                vo = workflowClientFactory.getWorkflowTaskClient().recallTask(taskId ,taskRequest, getCurrentUserId(approvalInfo.getApplicantIdcard()));
+                break;
+            default:
+                break;
+        }
+        return vo;
+    }
+    /**
+     * 任务转办
+     * @param agentDTO
+     */
+    @Override
+    public void agent(AgentDTO agentDTO) {
+        WorkflowRequestData workflowRequestData = new WorkflowRequestData();
+        ApproveMessage approveMessage = new ApproveMessage();
+        workflowRequestData.setApproveMessage(approveMessage);
+        //转办接口
+        workflowClientFactory.getWorkflowTaskClient().taskOperationAssign(agentDTO.getTaskId(),agentDTO.getAssigneeUser(),getCurrentUserId(),workflowRequestData);
+    }
+
+    @Override
+    public ResponseStatus approveComments(String processInstanceId) {
+        if(StringUtils.isEmpty(processInstanceId) || processInstanceId.equalsIgnoreCase("undefined")){
+            return ResponseDTO.newInstance(new ArrayList<>());
+        }
+        //step1 列出任务操作历史信息
+        HashMap<String, WorkFlowApproveVo> hisTaskMap = this.getProcessPath(processInstanceId);
+        //step2 查询流程的所有节点
+        List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
+        for(ApproveCommentVo approveCommentVo:processDefPath){
+            WorkFlowApproveVo flowApproveVo = hisTaskMap.get(approveCommentVo.getId());
+            if(flowApproveVo!=null){
+                approveCommentVo.setApproveMessage(flowApproveVo.getApproveMessage());
+                approveCommentVo.setApproveTime(flowApproveVo.getCreateTime());
+                approveCommentVo.setApproveState(flowApproveVo.getApproveState());
+                approveCommentVo.setAssignee(flowApproveVo.getAssigneeName());
+            }
+        }
+        return ResponseDTO.newInstance(processDefPath.stream().sorted(Comparator.comparing(ApproveCommentVo::getSort)).collect(Collectors.toList()));
+    }
+
+    /**
+     * 流程图信息接口
+     *
+     * @param proInsId
+     * @return
+     */
+    @Override
+    public TraceProcessAndOverVo processPic(String proInsId) {
+        TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(proInsId);
+        return traceProcessAndOverVo;
+    }
+
+    /**
+     * 获取流程图节点详情
+     * @param proInsId
+     * @param statusType
+     * @param taskDefinitionId
+     * @return
+     */
+    @Override
+    public ActivityNodeInfoVo processPicDetail(String proInsId, String statusType, String taskDefinitionId) {
+        ActivityNodeInfoVo activityNodeInfoVo = workflowClientFactory.getWorkflowTaskClient().historyDiagramDetail(proInsId, taskDefinitionId, EnumUtil.likeValueOf(StateTypeEnum.class, statusType));
+        return activityNodeInfoVo;
+    }
+
+    /**
+     * 获取流程类型列表
+     * @return
+     */
+    @Override
+    public List<ApproveWorkflowProcessTypeVo> queryProcessTypeList() {
+        //根据流程类别code获取流程类别信息
+        WorkflowProcesstypeVo workflowProcesstypeVo = queryProcessType(approveProcessTypeCode);
+        List<ApproveWorkflowProcessTypeVo> result = new ArrayList<>();
+        if (null != workflowProcesstypeVo) {
+            //根据流程类别id查询子类别
+            Searchable searchable = Searchable.newSearchable();
+            searchable.addSearchFilter("upProcess",SearchOperator.eq,workflowProcesstypeVo.getId());
+            List<WorkflowProcesstypeVo> list = workflowClientFactory.getWorkflowProcessDefTypeClient().list(searchable);
+            //循环获取每个子类别下的所有定义流程
+            for (WorkflowProcesstypeVo processtypeVo: list){
+                ApproveWorkflowProcessTypeVo approveWorkflowProcessTypeVo = new ApproveWorkflowProcessTypeVo();
+                BeanUtils.copyProperties(processtypeVo, approveWorkflowProcessTypeVo);
+                searchable = Searchable.newSearchable();
+                searchable.setPage(new PageRequest(0, 999));
+                searchable.addSearchFilter("processType",SearchOperator.eq,processtypeVo.getId());
+                Page<WorkflowProcessVo> processVoPage = workflowClientFactory.getWorkflowProcessClient().queryWorkflowProcessPage(searchable);
+                List<WorkflowProcessVo> activeDataList = new ArrayList<>();
+                for(WorkflowProcessVo workFlowApproveVo:processVoPage.getContent()){
+                    if(workFlowApproveVo.getStatus().equalsIgnoreCase("1")){
+                        activeDataList.add(workFlowApproveVo);
+                    }
+                }
+                approveWorkflowProcessTypeVo.setWorkflowProcessVoList(activeDataList);
+                result.add(approveWorkflowProcessTypeVo);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 获取流程类别详情
+     * @param processTypeCode   流程类别code
+     * @return
+     */
+    @Override
+    public WorkflowProcesstypeVo queryProcessType(String processTypeCode) {
+        //获取流程类别详情
+        return workflowClientFactory.getWorkflowProcessDefTypeClient().findOneByCode(processTypeCode);
+    }
+
+    /**
+     * 查看代办/已办数量
+     * 已办:finish
+     * 待办:unfinish
+     *
+     * @return
+     */
+    @Override
+    public Integer queryApproveQty(Searchable searchable) {
+        Page<TaskHistoryDetailVo> page = workflowClientFactory.getWorkflowTaskClient().queryTaskDetailPageByUserId(searchable, getCurrentUserId());
+        return  (int)page.getTotalElements();
+    }
+
+    /**
+     * 获取我的请求数量
+     *
+     * @param searchable
+     * @return
+     */
+    @Override
+    public Integer queryMyRequestQty(Searchable searchable) {
+        LambdaQueryWrapper<ApprovalInfo> where = Wrappers.lambdaQuery();
+        where.eq(ApprovalInfo::getCreateUser, getCurrentUserId());
+        return approvalInfoMapper.selectCount(where);
+    }
+
+    /**
+     * 根据申请ID删除流程实例
+     *
+     * @param id 申请单ID
+     * @return
+     */
+    @Override
+    public ResponseStatus deleteProcessInstance(String id) {
+        LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
+        where.eq(IdEntity::getId,id);
+        ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
+        approvalInfoMapper.selectList(where);
+        if (approvalInfo == null) {
+            return ResponseDTO.fail("申请单不存在");
+        }
+        if(StringUtils.isNotEmpty(approvalInfo.getTaskId())){
+            if(approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
+                return ResponseDTO.fail("流程已结束,不允许删除");
+            }
+        }
+        boolean callBackEnableFlag = false;
+        //判断是否是草稿状态
+        if(StringUtils.isNotEmpty(approvalInfo.getProcessInstanceId())){
+            /**
+             * 1. 获取当前结点可以操作的类型
+             * 2. 判断是否可以执行撤销操作,若可以执行撤销,否则返回错误信息
+             * 3. 将流程实例信息(审批端)的删除标志置1
+             */
+            String taskIds = approvalInfo.getTaskId();
+            String taskCodes = approvalInfo.getApproveTaskIdentifier();
+            String[] arrTaskId = taskIds.split(",");
+            String[] arrTaskCode = taskCodes.split(",");
+            int index = 0;
+            for(String taskId:arrTaskId){
+                logger.info("====检验当前结点是否支持撤销操作====");
+                callBackEnableFlag = this.checkOperateOptionOfCurrentStep(taskId, approvalInfo.getProcessInstanceId(), arrTaskCode[index++], OperateOptionEnum._BTN_REDO_COMMIT);
+                if(callBackEnableFlag){
+                    break;
+                }
+            }
+            //判断并执行撤销操作
+            if(callBackEnableFlag){
+                TaskRequest taskRequest = this.buildTaskRequest(null, approvalInfo);
+                for(String taskId : arrTaskId){
+                    //执行流程撤销操作,撤销会删除流程
+                    workflowClientFactory.getWorkflowTaskClient().handleTaskForRedo(taskId,getCurrentUserId());
+                    //workflowClientFactory.getWorkflowTaskClient().recallTask(taskId ,taskRequest, getCurrentUserId());
+                }
+            }else {
+                return ResponseDTO.fail("当前节点不允许删除操作");
+            }
+        }else {
+            callBackEnableFlag = true;
+        }
+       if(callBackEnableFlag){
+           //执行逻辑删除
+           LambdaUpdateWrapper<ApprovalInfo> updateWrapper = new LambdaUpdateWrapper<>();
+           updateWrapper.eq(IdEntity::getId,id);
+           updateWrapper.set(ApprovalInfo::getIsDeleted,YesNoEnum.YES.getValue());
+           approvalInfoMapper.update(null,updateWrapper);
+       }
+        return ResponseDTO.success();
+    }
+
+    /**
+     * 申请详情
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public ResponseStatus queryApproveDetail(String id) {
+        ApprovalInfo approvalInfo = approvalInfoMapper.selectById(id);
+        if(approvalInfo == null){
+            return ResponseStatus.fail("申请表单不存在");
+        }
+        ApprovalInfoVo approvalInfoVo = new ApprovalInfoVo();
+        BeanUtil.copyProperties(approvalInfo, approvalInfoVo);
+        LambdaQueryWrapper<ApprovalResourceInfo> where = Wrappers.lambdaQuery();
+        where.eq(ApprovalResourceInfo::getApprovalId, approvalInfo.getId());
+        //填充资源信息
+        ApprovalResourceInfo approvalResourceInfo = approvalResourceInfoMapper.selectOne(where);
+        ResourceInfoVo resourceInfoVo = new ResourceInfoVo();
+        BeanUtil.copyProperties(approvalResourceInfo, resourceInfoVo);
+        approvalInfoVo.setResourceInfoVo(resourceInfoVo);
+        return ResponseDTO.newInstance(approvalInfoVo);
+    }
+
+    /**
+     * 设置是否显示撤回按钮
+     * @param taskOperateVo
+     * @param taskId
+     * @param processInstanceId
+     */
+    private void appendShowBack(TaskOperateVo taskOperateVo, String taskId, String processInstanceId,OutgoingVo outgoingVo,String pageType) {
+        ApprovalInfo approvalInfo = this.findApprovalInfo(processInstanceId, "");
+        if(approvalInfo.getTaskId().equalsIgnoreCase(endStr)){
+            //流程结束不能撤回
+            taskOperateVo.setShowBack(false);
+            return;
+        }else {
+            String HistoryTaskDefinitionKey = "";
+            if (pageType.equalsIgnoreCase(myRequestPage)) {
+                Map<String, String> out = outgoingVo.getOutgoingTransitions();
+                Set<String> strings = out.keySet();
+                String next = strings.iterator().next();
+                HistoryTaskDefinitionKey = next;
+            }else {
+                TaskHistoryDetailVo currentTask = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
+                HistoryTaskDefinitionKey = currentTask.getTaskDefinitionKey();
+            }
+            /**
+             * 1. 判断是否为第一个节点,是则不能撤回
+             * 2. 不是第一个节点,且当前流程的上一个节点为撤回人的处理节点,a->b->c->d 只有c能撤回节点才能撤回
+             * 3. 判断当前节点是否有配置撤回的功能
+             */
+            //1.判断是否为第一个节点,是则不能撤回
+            TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
+            String taskDefinitionKey = taskHistoryDetailVo.getTaskDefinitionKey();
+            if(outgoingVo.getOutgoingTransitions().containsKey(taskDefinitionKey)){
+                taskOperateVo.setShowBack(false);
+                return;
+            }
+            /*//2. 判断节点的位置
+            //step1 列出任务操作历史信息
+            Searchable searchable = Searchable.newSearchable();
+            //暂时未提供不分页查询接口,先定时30条
+            searchable.setPage(0, 30);
+            //task1,task2,同一个节点如果执行了两次
+            Page<WorkFlowApproveVo> vo = workflowClientFactory.getWorkflowProcessClient().queryWorkFlowApprovePage(searchable, processInstanceId);
+            //判断流程的当前节点和
+            if(vo.getContent().size()<1){
+                taskOperateVo.setShowBack(false);
+                return;
+            }
+            //taskId(已办)是不是所有审批节点的倒数第二个节点
+            int size = vo.getContent().size();
+            if(vo.getContent().get(size-2).getTaskId().equalsIgnoreCase(taskId)){
+                //3. 判断当前节点是否有撤回按钮
+                //boolean back = this.checkOperateOptionOfCurrentStep(taskId, taskHistoryDetailVo.getProcessInstanceId(), taskHistoryDetailVo.getTaskCode(), OperateOptionEnum._BTN_WITH_DRAW_COMMIT);
+                taskOperateVo.setShowBack(true);
+                return;
+            }*/
+            List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
+            //当前活动节点任务在流程中的位置
+            int currentTaskIndexPosition = 0;
+            //已完成的节点在流程中的位置
+            int finishTaskIndexPosition = 0;
+            //游标
+            int index = 0;
+            for(ApproveCommentVo approveCommentVo:processDefPath){
+                if(approveCommentVo.getId().equalsIgnoreCase(taskDefinitionKey)){
+                    finishTaskIndexPosition = index;
+                }
+                if(approveCommentVo.getId().equalsIgnoreCase(HistoryTaskDefinitionKey)){
+                    currentTaskIndexPosition = index;
+                }
+                index++;
+            }
+            //已完成的任务节点位置在当前任务节点位置的上一个位置,则可以撤回
+            if((finishTaskIndexPosition) == (currentTaskIndexPosition+1)){
+                taskOperateVo.setShowBack(true);
+            }else {
+                taskOperateVo.setShowBack(false);
+            }
+            return;
+        }
+    }
+
+    @Override
+    public ResponseStatus approveStatus(String processInstanceId) {
+        List<ApproveCommentVo> processDefPath = this.getProcessDefPath(processInstanceId);
+        HashMap<String, WorkFlowApproveVo> processPath = this.getProcessPath(processInstanceId);
+        TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(processInstanceId);
+        List<TarceVo> traceData = traceProcessAndOverVo.getData();
+        Map<String,TarceVo> tarceVoMap = new HashMap<>();
+        for(TarceVo traceVo:traceData){
+            tarceVoMap.put(traceVo.getId(),traceVo);
+        }
+        List<ProcessStatusVo> list = new ArrayList<>();
+        for(ApproveCommentVo approveCommentVo:processDefPath){
+            ProcessStatusVo processStatusVo = new ProcessStatusVo();
+            Set<ProcessStatusDetailVo> taskVos = new HashSet<>();
+            processStatusVo.setNodeName(approveCommentVo.getNodeName());
+            if(processPath.containsKey(approveCommentVo.getId())){
+                ActivityNodeInfoVo activityNodeInfoVo = tarceVoMap.get(approveCommentVo.getId()).getActivityNodeInfoVo();
+                WorkFlowApproveVo workFlowApproveVo = processPath.get(approveCommentVo.getId());
+                ProcessStatusDetailVo detailVo = new ProcessStatusDetailVo();
+                detailVo.setAssignee(workFlowApproveVo.getAssignee());
+                detailVo.setAssigneeName(workFlowApproveVo.getAssigneeName());
+                detailVo.setOperateState(EnumUtils.enumOf(ApproveWorkFlowOprationEnum.class, workFlowApproveVo.getApproveState()).getLabel());
+                detailVo.setReceiveTime(activityNodeInfoVo.getActStartTime());
+                detailVo.setHandleTime(activityNodeInfoVo.getActEndTime());
+                long between = DateUtil.between(activityNodeInfoVo.getActStartTime()==null?new Date():activityNodeInfoVo.getActStartTime(),
+                        activityNodeInfoVo.getActEndTime()==null?new Date():activityNodeInfoVo.getActEndTime(), DateUnit.SECOND);
+                long hours = between/3600;
+                long minute = (between-hours*3600)/60;
+                long second = between%60;
+                detailVo.setCostTime(String.format("%d时%d分%d秒",hours,minute,second));
+                taskVos.add(detailVo);
+            }
+            processStatusVo.setTaskVos(taskVos);
+            processStatusVo.setFinishOperatorSummary(taskVos.size());
+            processStatusVo.setOperatorSummary(taskVos.size());
+            processStatusVo.setSort(approveCommentVo.getSort());
+            list.add(processStatusVo);
+        }
+        return ResponseDTO.newInstance(list.stream().sorted(Comparator.comparing(ProcessStatusVo::getSort)).collect(Collectors.toList()));
+    }
+
+    @Override
+    public ResponseStatus queryPoliceList(String userToken, String appToken, int page, int size) {
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("page",page);
+        paramMap.put("size",size);
+
+        return ResponseDTO.newInstance(dcucHelper.getPoliceList(userToken, appToken, paramMap));
+    }
+
+    /**
+     * 获取任务支持的操作对象信息
+     * @param taskId
+     * @return
+     */
+    @Override
+    public TaskOperateVo taskOperate(String taskId,String pageType) {
+        TaskOperateVo taskOperateVo = new TaskOperateVo();
+        if (!endStr.equals(taskId)){
+            TaskHistoryDetailVo taskHistoryDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
+            //退回
+            boolean recallFlag = this.checkOperateOptionOfCurrentStep(taskId, taskHistoryDetailVo.getProcessInstanceId(), taskHistoryDetailVo.getTaskCode(), OperateOptionEnum._BTN_BACK_COMMIT);
+            taskOperateVo.setShowRecall(recallFlag);
+            //流程出口信息
+            OutgoingVo outgoingVo = workflowClientFactory.getWorkflowTaskClient().queryStartOutgoing(taskHistoryDetailVo.getProcessDefinitionId());
+            //设置是否显示撤回
+            appendShowBack(taskOperateVo, taskId, taskHistoryDetailVo.getProcessInstanceId(),outgoingVo,pageType);
+            //设置是否显示编辑
+            appendShowEdit(taskOperateVo, outgoingVo, taskHistoryDetailVo.getTaskDefinitionKey());
+        }
+        return taskOperateVo;
+    }
+
+    /**
+     * 判断是否为第一个节点,是则允许编辑
+     * @param taskOperateVo
+     * @param outgoingVo
+     * @param taskDefinitionKey
+     */
+    private void appendShowEdit(TaskOperateVo taskOperateVo, OutgoingVo outgoingVo, String taskDefinitionKey) {
+        Boolean showEdit = outgoingVo.getOutgoingTransitions().get(taskDefinitionKey) != null;
+        taskOperateVo.setShowEdit(showEdit);
+    }
+
+    /**
+     * 获取当前用户信息
+     *
+     * @return
+     */
+    private String getCurrentUserId() {
+        return (null == UserContextUtils.getCurrentUser()) ? "" : UserContextUtils.getCurrentUser().getIdcard();
+    }
+
+    /**
+     * 根据当前是否存在登录人来获取当前人员
+     * @param idCard
+     * @return
+     */
+    private String getCurrentUserId(String idCard){
+        BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
+        if(currentUser == null){
+            return idCard;
+        }else {
+            return currentUser.getIdcard();
+        }
+    }
+
+
+    /**
+     * 设置我的请求当前结点和未操作者信息
+     *
+     * @param approvalInfo
+     */
+    private ApprovalInfoVo fillTaskInfoToApplyInfo(ApprovalInfo approvalInfo) {
+        ApprovalInfoVo approvalInfoVo = new ApprovalInfoVo();
+        BeanUtil.copyProperties(approvalInfo, approvalInfoVo);
+        try {
+            //查询当前任务详情
+            TaskHistoryDetailVo taskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(approvalInfo.getTaskId());
+            if (taskDetailVo == null) {
+                return approvalInfoVo;
+            }
+            approvalInfoVo.setTaskId(taskDetailVo.getId());
+            String unOperateUsers = "";
+            //approvalInfoVo.setTaskName(taskDetailVo.getName());
+            //重新设置候选人信息
+            unOperateUsers = this.getUnOperateUsersFromAssiginerMap(taskDetailVo.getCandidateVo());
+            approvalInfoVo.setUnOperateUsers(unOperateUsers);
+        }catch (Exception e){
+            logger.info("调用工作流接口报错,报错信息未:{}", e.getMessage());
+        }
+        return approvalInfoVo;
+    }
+
+    /**
+     * 根据未操作人map获取字符串
+     *
+     * @param candidateVo
+     * @return
+     */
+    private String getUnOperateUsersFromAssiginerMap(CandidateVo candidateVo) {
+        String unOperateUsers = "";
+
+        Map<String, String> result = new HashMap<>();
+        if (candidateVo.getCandidateUsers() != null){
+            result.putAll(candidateVo.getCandidateUsers());
+        }
+        if (candidateVo.getCandidateGroupsOrg() != null){
+            result.putAll(candidateVo.getCandidateGroupsOrg());
+        }
+        if (candidateVo.getCandidateGroups() != null){
+            result.putAll(candidateVo.getCandidateGroups());
+        }
+        if (candidateVo.getAssignee() != null){
+            result.putAll(candidateVo.getAssignee());
+        }
+        Iterator<Map.Entry<String, String>> iterator = result.entrySet().iterator();
+        while (iterator.hasNext()) {
+            unOperateUsers += iterator.next().getValue() + ",";
+        }
+
+        return StringUtils.isNotEmpty(unOperateUsers) ? unOperateUsers.substring(0, unOperateUsers.length() - 1) : unOperateUsers;
+    }
+    /**
+     * 更新当前结点任务
+     * @param approvalInfo
+     * @return
+     */
+    private ApprovalInfo buildTaskInfoByProcessInstanceId(ApprovalInfo approvalInfo, List<TaskHistoryDetailVo> list){
+        String taskId = "",taskCode = "",taskName = "";
+        if(CollectionUtils.isNotEmpty(list)){
+            for(TaskHistoryDetailVo taskDetailVo : list){
+                taskId += taskDetailVo.getId();
+                if(StringUtils.isNotEmpty(taskDetailVo.getId())){
+                    taskId += ",";
+                }
+                taskCode += taskDetailVo.getTaskCode();
+                if(StringUtils.isNotEmpty(taskDetailVo.getTaskCode())){
+                    taskCode += ",";
+                }
+                taskName += taskDetailVo.getName();
+                if(StringUtils.isNotEmpty(taskDetailVo.getName())){
+                    taskName += ",";
+                }
+            }
+            if(taskCode.length()>0){
+                taskCode = taskCode.substring(0,taskCode.length()-1);
+            }
+            if(taskName.length()>0){
+                taskName = taskName.substring(0,taskName.length()-1);
+            }
+            if(taskId.length()>0){
+                taskId = taskId.substring(0,taskId.length()-1);
+            }
+        }else {
+            taskCode = endStr;
+            taskId = endStr;
+            taskName = "结束";
+        }
+        approvalInfo.setTaskId(taskId);
+        approvalInfo.setTaskName(taskName);
+        approvalInfo.setApproveTaskIdentifier(taskCode);
+        approvalInfo.setUpdateTime(new Date());
+        approvalInfo.setUpdateUser(getCurrentUserId());
+        return approvalInfo;
+    }
+
+    /**
+     * 根据任务ID查看当前节点允许的操作类型
+     * @param taskId
+     * @param operateOptionEnum
+     * @return
+     */
+    public boolean checkOperateOptionOfCurrentStep(String taskId, String processInstanceId, String taskNode, OperateOptionEnum operateOptionEnum){
+        TaskHistoryDetailVo taskDetailVo = workflowClientFactory.getWorkflowTaskClient().queryTaskDetail(taskId);
+        String taskDefinitionKey = taskDetailVo.getTaskDefinitionKey();
+        //根据流程实例ID和任务定义ID返回表单操作类型
+        FromAndOperationVo fromAndOperationVo = workflowClientFactory.getWorkflowProcessClient().queryFormMetadataByProInsId(processInstanceId, taskDefinitionKey,taskNode);
+        List<OperationVo> operation = fromAndOperationVo.getOperation();
+        if(CollectionUtils.isNotEmpty(operation)){
+            for(OperationVo operationVo:operation){
+                if(operationVo.getBtnId().equalsIgnoreCase(operateOptionEnum.getValue())){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 根据流程实例完成的节点
+     * @param processInstanceId
+     * @return
+     */
+    private HashMap<String,WorkFlowApproveVo> getProcessPath(String processInstanceId){
+        HashMap<String,WorkFlowApproveVo> hisTaskMap = new HashMap<>();
+        //step1 列出任务操作历史信息
+        Searchable searchable = Searchable.newSearchable();
+        searchable.setPage(0, 30);
+        Page<WorkFlowApproveVo> vo = workflowClientFactory.getWorkflowProcessClient().queryWorkFlowApprovePage(searchable, processInstanceId);
+        List<WorkFlowApproveVo> content = vo.getContent();
+        for(WorkFlowApproveVo workFlowApproveVo:content){
+            String taskKey = workFlowApproveVo.getTaskKey();
+            hisTaskMap.put(taskKey,workFlowApproveVo);
+        }
+        return hisTaskMap;
+    }
+
+    /**
+     * 根据流程实例获取流程的定义任务集合
+     * @param processInstanceId
+     * @return
+     */
+    private List<ApproveCommentVo> getProcessDefPath(String processInstanceId){
+        TraceProcessAndOverVo traceProcessAndOverVo = workflowClientFactory.getWorkflowProcessClient().queryTraceProcessAndOver(processInstanceId);
+        JSONObject data = JSONObject.parseObject(traceProcessAndOverVo.getJson());
+        JSONArray jsonArray = JSONArray.parseArray(data.getString("nodeDataArray"));
+        List<ApproveCommentVo> approveCommentVos = new ArrayList<>();
+        for(int m=0;m<jsonArray.size();m++){
+            JSONObject nodeData = jsonArray.getJSONObject(m);
+            if(nodeData.getString("category").equalsIgnoreCase("activity")){
+                ApproveCommentVo approveCommentVo = new ApproveCommentVo();
+                approveCommentVo.setNodeName(nodeData.getString("text"));
+                String assignee = nodeData.getString("assignee");
+                approveCommentVo.setAssignee(assignee);
+                approveCommentVo.setId(nodeData.getString("id"));
+                approveCommentVo.setSort(m);
+                approveCommentVos.add(approveCommentVo);
+            }
+        }
+        return approveCommentVos;
+    }
+
+    /**
+     * 构建任务请求VO
+     * @param approvalInfo
+     * @return
+     */
+    private ApproveTaskRequestVo buildTaskRequestVo(ApprovalInfo approvalInfo){
+        ApproveTaskRequestVo taskRequestVo = new ApproveTaskRequestVo();
+        taskRequestVo.setApplyTitle(approvalInfo.getProcessTitle());
+        taskRequestVo.setApplyContent(approvalInfo.getApplyContent());
+        taskRequestVo.setBusinessId(approvalInfo.getId());
+        taskRequestVo.setBusinessKey(approvalInfo.getId());
+        taskRequestVo.setBusinessSystem(businessSystem);
+        taskRequestVo.setBusinessType(approvalInfo.getBusinessCode());
+        taskRequestVo.setApplyUser(approvalInfo.getApplicantIdcard());
+        taskRequestVo.setApplyUserName(approvalInfo.getApplicantName());
+        return taskRequestVo;
+    }
+
+    /**
+     * 审批完成后发送消息
+     * @param approveWorkFlowOprationEnum
+     *
+     */
+    private void sendApproveResultMessage(String processInstanceId,String messageId, ApproveWorkFlowOprationEnum approveWorkFlowOprationEnum){
+        logger.info("====任务结束,开始发送消息====");
+        //流程结束且是同意操作才发消息
+       if(approveWorkFlowOprationEnum.getValue().equalsIgnoreCase(ApproveWorkFlowOprationEnum.COMPLETE_AGREE.getValue())){
+            RequestVo requestVo = new RequestVo();
+            MessageInfoVo messageInfoVo = new MessageInfoVo();
+            Map map = new HashMap();
+            map.put("processInstanceId", processInstanceId);
+            map.put("approveResult",approveWorkFlowOprationEnum.getValue());
+            map.put("messageId",messageId);
+            List<Map<String,String>> infoSet = new ArrayList<>();
+            infoSet.add(map);
+            messageInfoVo.setTitle("审批系统-权限申请审批");
+            messageInfoVo.setCreateTime(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
+            messageInfoVo.setInfoSet(infoSet);
+            messageInfoVo.setContent(processInstanceId);
+            messageInfoVo.setUserSystem("审批系统");
+            messageInfoVo.setUserSystemCode(businessSystem);
+            messageInfoVo.setUserName("审批系统");
+            messageInfoVo.setMessageId(UUIDUtils.getUUID());
+            messageInfoVo.setInfoType(kafkaConfig.getAuthServiceApplyTopic());
+            List<MessageInfoVo> messageInfoVos = new ArrayList<>();
+            messageInfoVos.add(messageInfoVo);
+            //设置消息
+            requestVo.setMessages(messageInfoVos);
+            requestVo.setTopic(kafkaConfig.getAuthServiceApplyTopic());
+            requestVo.setAppKey(kafkaConfig.getAppKey());
+            requestVo.setAppSecret(kafkaConfig.getAppSecret());
+            logger.info("====kafka开始推送结果,实例ID{}====", processInstanceId);
+            kafkaService.send(requestVo, kafkaConfig.getKafkaServers());
+        }
+    }
+
+    private void updateApprovalById(ApprovalInfo approvalInfo){
+        LambdaUpdateWrapper<ApprovalInfo> update = new LambdaUpdateWrapper<>();
+        update.eq(IdEntity::getId,approvalInfo.getId());
+        update.set(ApprovalInfo::getProcessTitle,approvalInfo.getProcessTitle());
+        update.set(ApprovalInfo::getProcessType,approvalInfo.getProcessType());
+        update.set(ApprovalInfo::getProcessTypeName,approvalInfo.getProcessTypeName());
+        update.set(ApprovalInfo::getBusinessCode,approvalInfo.getBusinessCode());
+        update.set(ApprovalInfo::getProcessName,approvalInfo.getProcessName());
+        update.set(ApprovalInfo::getApplyReason,approvalInfo.getApplyReason());
+        update.set(ApprovalInfo::getApplyContent,approvalInfo.getApplyContent());
+        update.set(ApprovalInfo::getApplicantIdcard,approvalInfo.getApplicantIdcard());
+        update.set(ApprovalInfo::getApplicantName,approvalInfo.getApplicantName());
+        update.set(ApprovalInfo::getApplicantOrgCode,approvalInfo.getApplicantOrgCode());
+        update.set(ApprovalInfo::getApplicantOrgName,approvalInfo.getApplicantOrgName());
+        update.set(ApprovalInfo::getApplicantPhoneNo,approvalInfo.getApplicantPhoneNo());
+        update.set(ApprovalInfo::getProcessInstanceId,approvalInfo.getProcessInstanceId());
+        update.set(ApprovalInfo::getApproveTaskIdentifier,approvalInfo.getApproveTaskIdentifier());
+        update.set(ApprovalInfo::getTaskId,approvalInfo.getTaskId());
+        update.set(ApprovalInfo::getTaskName,approvalInfo.getTaskName());
+        update.set(ApprovalInfo::getPermissionValidType,approvalInfo.getPermissionValidType());
+        update.set(ApprovalInfo::getStartTime,approvalInfo.getStartTime());
+        update.set(ApprovalInfo::getEndTime,approvalInfo.getEndTime());
+        update.set(ApprovalInfo::getMessageId,approvalInfo.getMessageId());
+        update.set(ApprovalInfo::getIsDeleted,approvalInfo.getIsDeleted());
+        update.set(ApprovalInfo::getUpdateUser,approvalInfo.getUpdateUser());
+        update.set(ApprovalInfo::getUpdateTime,new Date());
+        approvalInfoMapper.update(approvalInfo,update);
+    }
+
+    /**
+     * 根据任务ID或实例ID查询审批单信息
+     * @param processInstanceId
+     * @param taskId
+     * @return
+     */
+    private ApprovalInfo findApprovalInfo(String processInstanceId,String taskId){
+        LambdaQueryWrapper<ApprovalInfo> where = new LambdaQueryWrapper<>();
+        if(StringUtils.isNotEmpty(processInstanceId)){
+            where.eq(ApprovalInfo::getProcessInstanceId,processInstanceId);
+        }
+        if(StringUtils.isNotEmpty(taskId)){
+            where.eq(ApprovalInfo::getTaskId,taskId);
+        }
+        ApprovalInfo approvalInfo = approvalInfoMapper.selectOne(where);
+        return approvalInfo;
+    }
+
+    /**
+     * 转换结束时间
+     * @param endTime
+     * @return
+     */
+    private Date parseEndTime(Date endTime){
+        if(endTime!=null){
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String strEndTime = simpleDateFormat.format(endTime);
+            strEndTime += " 23:59:59";
+            try {
+                simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                endTime = simpleDateFormat.parse(strEndTime);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+        return endTime;
+    }
+}
+

+ 91 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/KafkaService.java

@@ -0,0 +1,91 @@
+/*
+package com.dragonsoft.dcuc.approve.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.dragonsoft.dcuc.approve.config.NosqlConfig;
+import com.dragonsoft.dcuc.approve.service.IKafkaService;
+import com.dragonsoft.dyy.nosql.api.kafka.KafkaDriver;
+import com.dragonsoft.dyy.nosql.api.kafka.ProduceComponent;
+import com.dragonsoft.mq.client.model.entity.MessageInfoDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+
+*/
+/**
+ * @date 2021/02/23
+ * @author wangrs
+ * kafka服务类
+ *//*
+
+@Service
+public class KafkaService implements IKafkaService {
+
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private KafkaDriver driver;
+
+    @Autowired
+    private NosqlConfig nosqlConfig;
+
+    @Override
+    @Async
+    public void send(String topic, MessageInfoDTO messageInfoDTO){
+        logger.info("====开始发送审批结果====");
+        ProduceComponent produceComponent = driver.produceComponent();
+        produceComponent.send(topic, JSON.toJSONString(messageInfoDTO));
+    }
+
+    public static Object deserialize(byte[] objectData) {
+        if (objectData == null) {
+            throw new IllegalArgumentException("The byte[] must not be null");
+        }
+        ByteArrayInputStream bais = new ByteArrayInputStream(objectData);
+        return deserialize(bais);
+    }
+
+    public static Object deserialize(InputStream inputStream) {
+        if (inputStream == null) {
+            throw new IllegalArgumentException("The InputStream must not be null");
+        }
+        ObjectInputStream in = null;
+        try {
+            // stream closed in the finally
+            in = new ObjectInputStream(inputStream);
+            return in.readObject();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) { // NOPMD
+                // ignore close exception
+            }
+        }
+        return null;
+    }
+
+   */
+/* @Override
+    public void afterPropertiesSet() throws Exception {
+        ConsumePool subscribe = driver.consumeComponent().subscribe(nosqlConfig.getApproveResultTopic(), "approveGroup", new KafkaRowListener<String>() {
+            @Override
+            public void onMessage(String value) {
+                logger.info("--------收到数据,{}", value);
+            }
+        });
+        subscribe.startConsume();
+    }*//*
+
+}
+*/

+ 39 - 0
approve-core-service/src/main/resources/META-INF/additional-spring-configuration-metadata.json

@@ -0,0 +1,39 @@
+{
+  "properties": [
+    {
+      "name": "apollo.meta",
+      "type": "java.lang.String",
+      "description": "apollo配置中心地址(服务端)."
+    },
+    {
+      "name": "app.id",
+      "type": "java.lang.String",
+      "description": "apollo appid,当app.id没有配置情况下将读取spring.application.name值."
+    },
+    {
+      "name": "apollo.bootstrap.namespaces",
+      "type": "java.lang.String",
+      "description": "apollo 命名空间,支持多个逗号隔开。按命名空间顺序依次加载,可用于公共配置."
+    },
+    {
+      "name": "apollo.bootstrap.enabled",
+      "type": "java.lang.String",
+      "description": "apollo 是否启用apollo."
+    },
+    {
+      "name": "apollo.cluster",
+      "type": "java.lang.String",
+      "description": "apollo 集群,默认default."
+    },
+    {
+      "name": "apollo.autoUpdateInjectedSpringProperties",
+      "type": "java.lang.String",
+      "description": "apollo 取消placeholder的自动更新功能(默认true)."
+    },
+    {
+      "name": "duceap.license.enabled",
+      "type": "java.lang.String",
+      "description": "License认证开关,默认开启."
+    }
+  ]
+}

+ 99 - 0
approve-core-service/src/main/resources/application.yml

@@ -0,0 +1,99 @@
+spring:
+
+  datasource:
+    username: jzpt_bu
+    password: dragon
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://192.168.120.142:3306/approve?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
+
+    #    username: DCUC2_GD
+    #    password: dragon
+    #    driver-class-name: oracle.jdbc.driver.OracleDriver
+    #    url: jdbc:oracle:thin:@192.168.6.120:1521:orcl
+    druid:
+      filters: sqlaudit
+  application:
+    name: approve-core
+  cloud:
+    nacos:
+      discovery:
+        # 配置nacos地址
+        server-addr: 127.0.0.1:8848
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    password:
+    jedis:
+      pool:
+        max-active: 10
+server:
+  port: 13180
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+mybatis-plus:
+  mapper-locations: classpath:mapping/*Mapper.xml
+  global-config:
+    db-config:
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+duceap:
+  flyway:
+    # 是否执行flyway
+    enabled: true
+    # 执行flyway路径
+    locations: classpath:/config/mysql
+  mybatis-plus:
+    map-camel-case-to-underscore: true
+  auditlog:
+    login:
+      enabled: true
+    audit:
+      enabled: true
+    sqlaudit:
+      output: kafka
+      exclude-tables: T_LOG_*
+  license:
+    enabled: false
+    dataCacheMethod: apollo
+  apollo:
+    client:
+      host: http://192.168.10.27:8070 #配置中心地址(portal端)
+  # 工作流
+  workflow:
+    enabled: true
+    client:
+      type: http
+    http:
+      url: 192.168.10.30:8880/duceap-duwf-core
+  swagger:
+    enabled: true
+    packagePath: com.dragonsoft.dcuc.approve
+approve:
+  workflow:
+    processTypeCode: approve
+  kxPeopleList: 371082197703267600
+  kafka:
+    app-key: dcuc69000787
+    app-secret: dcuc01494668
+    auth-service-apply-topic: 10000027
+    kafka-servers: http://192.168.10.20:9981/dcms-manager
+apollo:
+  bootstrap:
+    enabled: false #是否启用apollo
+    namespaces: application, dragonsoft.approve-common #命名空间,默认application
+  cluster: default #集群,默认default
+  meta: http://192.168.10.27:8080 #配置中心地址(服务端)
+  # 取消placeholder的自动更新功能(默认true)
+  autoUpdateInjectedSpringProperties: false
+logging:
+  level:
+    com.baomidou.mybatisplus: debug
+app:
+  approve:
+    KafkaDataSource: HW_DS_KAFKA
+  dcuc:
+    userServiceUrl: http://10.11.1.247:8888
+

+ 62 - 0
approve-core-service/src/main/resources/approve-core-nosql.properties

@@ -0,0 +1,62 @@
+#\u9A71\u52A8\u65B9\u5F0F\uFF08\u9ED8\u8BA4\uFF09
+nosql.config.driver-provider = FILEPATH
+#nosql  jar\u8DEF\u5F84\uFF08\u6839\u636E\u5B9E\u9645\u4FEE\u6539\uFF09..\audit\audit-service\audit-rzcj\audit-rzcj-service\lib\   |  /opt/docker/audit-rzcj-service/conf
+#nosql.config.driver-path = /opt/docker/approve-core-service/conf
+nosql.config.driver-path = ../approve-service/approve-core/approve-core-service/lib/
+#\u56FA\u5B9A\u53C2\u6570\uFF08\u9ED8\u8BA4\uFF09
+nosql.config.data-source-provider = SPRING
+#Kafka\u914D\u7F6E\uFF08\u6839\u636E\u5B9E\u9645\u4FEE\u6539\uFF09\uFF0C\u5F00\u6E90\uFF1ADEF_DS_KAFKA\uFF0C\u534E\u4E3A\uFF1AHW_DS_KAFKA
+nosql.datasources[0].id = HW_DS_KAFKA
+#\u56FA\u5B9A\u53C2\u6570\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].type = KAFKA
+#Kafka\u7248\u672C\uFF08\u6839\u636E\u5B9E\u9645\u4FEE\u6539\uFF09
+nosql.datasources[0].version = 1.1.0
+#kafka\u96C6\u7FA4\u4F4D\u7F6E\uFF08\u6839\u636E\u5B9E\u9645\u4FEE\u6539\uFF09
+nosql.datasources[0].bootstrapServers = 10.254.22.16:21007,10.254.22.17:21007,10.254.22.18:21007,10.254.22.19:21007
+################################\u751F\u4EA7\u8005\u76F8\u5173\u914D\u7F6E#####################################
+#\u53EF\u9009[0,1,-1,all], all-\u8BBE\u7F6E\u5C06\u5BFC\u81F4\u8BB0\u5F55\u7684\u5B8C\u6574\u63D0\u4EA4\u963B\u585E\uFF0C\u6700\u6162\u7684\uFF0C\u4F46\u6700\u6301\u4E45\u7684\u8BBE\u7F6E\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.acks = all
+#\u662F\u5426\u91CD\u8BD5\uFF0C\u5373\u4F7F\u8BBE\u7F6E\u4E3A0\uFF0C\u8BF7\u6C42\u5931\u8D25\uFF0C\u751F\u4EA7\u8005\u4E5F\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.retries = 0
+#\u6BCF\u6279\u53D1\u9001\u5927\u5C0F\uFF0C\u9ED8\u8BA416k\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.batch_size = 16384
+#\u9ED8\u8BA4\u7ACB\u5373\u53D1\u9001\uFF0C\u8FD9\u91CC\u8FD9\u662F\u5EF6\u65F6\u6BEB\u79D2\u6570\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.linger_ms = 1
+#\u751F\u4EA7\u8005\u7F13\u51B2\u5927\u5C0F\uFF0C\u5F53\u7F13\u51B2\u533A\u8017\u5C3D\u540E\uFF0C\u989D\u5916\u7684\u53D1\u9001\u8C03\u7528\u5C06\u88AB\u963B\u585E\u3002\u65F6\u95F4\u8D85\u8FC7max.block.ms\u5C06\u629B\u51FATimeoutException\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.buffer_memory = 33554432
+#key\u5E8F\u5217\u5668\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.key_serializer = org.apache.kafka.common.serialization.StringSerializer
+#value\u5E8F\u5217\u5668\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].producer.value_serializer = org.apache.kafka.common.serialization.StringSerializer
+################################\u6D88\u8D39\u8005\u76F8\u5173\u914D\u7F6E#####################################
+#\u4E3Atrue\u5C06\u5B9A\u671F\u63D0\u4EA4\u6D88\u8D39\u4F4D\u79FB\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.enable_auto_commit = true
+#\u81EA\u52A8\u63D0\u4EA4\u4F4D\u79FB\u5468\u671F\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.auto_commit_interval_ms = 1000
+#\u4ECE\u53D1\u9001\u8BF7\u6C42\u5230\u6536\u5230ACK\u786E\u8BA4\u7B49\u5F85\u7684\u6700\u957F\u65F6\u95F4\uFF08\u8D85\u65F6\u65F6\u95F4\uFF09\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.request_timeout_ms = 305000
+#\u68C0\u6D4B\u6D88\u8D39\u8005\u5FC3\u8DF3\uFF0C\u8D85\u8FC7\u8FD9\u4E2A\u503C\u4ECEkafka\u65AD\u5F00\uFF0C\u5F15\u53D1rebalance\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.session_timeout_ms = 60000
+#latest-\u504F\u79FB\u91CF\u7F6E\u4E3A\u6700\u65B0 earliest-\u504F\u79FB\u91CF\u7F6E\u4E3A\u6700\u65E9 none-\u6CA1\u627E\u5230\u4E4B\u524D\u4F4D\u7F6E\u5219\u629B\u5F02\u5E38\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.auto_offset_reset = latest
+#\u5206\u533A\u4E00\u6B21\u8FD4\u56DE\u6700\u5927\u5927\u5C0F\uFF0C\u9ED8\u8BA41048576\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.max_partition_fetch_bytes = 3145728
+#consumer\u4E00\u6B21poll\u8FD4\u56DE\u6700\u5927\u8BB0\u5F55\u6570\uFF08\u9ED8\u8BA4\uFF09
+nosql.datasources[0].consumer.max_poll_records = 1000
+nosql.datasources[0].consumer.key_deserializer = org.apache.kafka.common.serialization.StringDeserializer
+nosql.datasources[0].consumer.value_deserializer = org.apache.kafka.common.serialization.StringDeserializer
+################################\u5B89\u5168\u8BBF\u95EE\u76F8\u5173\u914D\u7F6E#####################################
+#\u5B89\u5168\u8BBF\u95EE\u914D\u7F6E\u5F00\u5173\uFF0C\u662F\u5426\u9700\u8981\u8BA4\u8BC1\uFF1A\u5F00\u6E90\uFF1A0\uFF0C\u534E\u4E3A\uFF1A1
+nosql.datasources[0].security.open = 1
+#\u4EE5\u4E0B\u53C2\u6570\u4F7F\u7528\u9ED8\u8BA4
+nosql.datasources[0].security.strategy = security1
+nosql.datasources[0].security.configs[0].name = security1
+nosql.datasources[0].security.configs[0].type = sasl/kerberos
+nosql.datasources[0].security.configs[0].files[0] = /kafka/security/kerberos/krb5.conf
+nosql.datasources[0].security.configs[0].files[1] = /kafka/security/kerberos/user.keytab
+nosql.datasources[0].security.configs[0].files[2] = /kafka/security/kerberos/kafka_client_jaas.conf
+nosql.datasources[0].security.configs[0].props.security_protocol = SASL_PLAINTEXT
+nosql.datasources[0].security.configs[0].props.sasl_mechanism = GSSAPI
+nosql.datasources[0].security.configs[0].props.sasl_kerberos_service_name = kafka
+nosql.datasources[0].security.configs[0].props.kerberos_domain_name = hadoop.hadoop.com
+

+ 40 - 0
approve-core-service/src/main/resources/config/mysql/V1_1_0001__INITIAL.sql

@@ -0,0 +1,40 @@
+CREATE TABLE `t_approval_info` (
+  `ID` varchar(32) NOT NULL COMMENT 'id',
+  `PROCESS_TITLE` varchar(200) DEFAULT NULL COMMENT '流程标题',
+  `PROCESS_TYPE` varchar(32) DEFAULT NULL COMMENT '流程类型编码',
+  `PROCESS_TYPE_NAME` varchar(255) DEFAULT NULL COMMENT '流程类型名称',
+  `BUSINESS_CODE` varchar(50) DEFAULT NULL COMMENT '流程业务代码',
+  `PROCESS_NAME` varchar(100) DEFAULT NULL COMMENT '流程名称',
+  `APPLY_REASON` varchar(500) DEFAULT NULL COMMENT '申请理由',
+  `APPLY_CONTENT` varchar(500) DEFAULT NULL COMMENT '申请内容',
+  `APPLICANT_IDCARD` varchar(18) DEFAULT NULL COMMENT '申请人身份证号',
+  `APPLICANT_NAME` varchar(120) DEFAULT NULL COMMENT '申请人姓名',
+  `APPLICANT_ORG_CODE` varchar(32) DEFAULT NULL COMMENT '申请人单位编码',
+  `APPLICANT_ORG_NAME` varchar(100) DEFAULT NULL COMMENT '申请人单位名称',
+  `APPLICANT_PHONE_NO` varchar(20) DEFAULT NULL COMMENT '申请人电话号码',
+  `PROCESS_INSTANCE_ID` varchar(32) DEFAULT NULL COMMENT '流程实例ID',
+  `APPROVE_TASK_IDENTIFIER` varchar(64) DEFAULT NULL COMMENT '节点标识码',
+  `TASK_ID` varchar(64) DEFAULT NULL COMMENT '任务ID',
+  `TASK_NAME` varchar(300) DEFAULT NULL COMMENT '任务名称',
+  `PERMISSION_VALID_TYPE` varchar(2) DEFAULT NULL COMMENT '权限有效类型',
+  `START_TIME` timestamp NULL DEFAULT NULL COMMENT '权限有效开始时间',
+  `END_TIME` timestamp NULL DEFAULT NULL COMMENT '权限有效结束时间',
+  `IS_DELETED` varchar(32) DEFAULT NULL COMMENT '是否删除',
+  `MESSAGE_ID` char(1) DEFAULT NULL COMMENT '消息ID',
+  `CREATE_USER` varchar(32) DEFAULT NULL COMMENT '创建人',
+  `CREATE_TIME` timestamp NULL DEFAULT NULL COMMENT '创建时间',
+  `UPDATE_USER` varchar(32) DEFAULT NULL COMMENT '更新人',
+  `UPDATE_TIME` timestamp NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='申请信息表';
+
+CREATE TABLE `t_approval_resource_info` (
+  `ID` varchar(32) NOT NULL COMMENT 'id',
+  `APPROVAL_ID` varchar(32) DEFAULT NULL COMMENT '申请ID',
+  `VISITOR_CODE` varchar(50) DEFAULT NULL COMMENT '访问者编码',
+  `VISITOR_NAME` varchar(500) DEFAULT NULL COMMENT '访问者名称',
+  `VISIT_RESOURCE_CODE` varchar(1000) DEFAULT NULL COMMENT '访问资源编码',
+  `VISIT_RESOURCE_NAME` varchar(1000) DEFAULT NULL COMMENT '访问资源名称',
+  `VISIT_INFO` blob COMMENT '访问内容',
+  PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='申请资源信息表';

+ 75 - 0
approve-core-service/src/main/resources/config/oracle/V1_1_0001__INITIAL.sql

@@ -0,0 +1,75 @@
+create table T_APPROVAL_INFO
+(
+  ID                      VARCHAR2(32),
+  PROCESS_TITLE           VARCHAR2(200),
+  PROCESS_TYPE            VARCHAR2(32),
+  PROCESS_TYPE_NAME       VARCHAR2(255),
+  BUSINESS_CODE           VARCHAR2(50),
+  PROCESS_NAME            VARCHAR2(100),
+  APPLY_REASON            VARCHAR2(500),
+  APPLY_CONTENT           VARCHAR2(500),
+  APPLICANT_IDCARD        VARCHAR2(20),
+  APPLICANT_NAME          VARCHAR2(120),
+  APPLICANT_ORG_CODE      VARCHAR2(32),
+  APPLICANT_ORG_NAME      VARCHAR2(120),
+  APPLICANT_PHONE_NO      VARCHAR2(20),
+  PROCESS_INSTANCE_ID     VARCHAR2(32),
+  APPROVE_TASK_IDENTIFIER VARCHAR2(64),
+  TASK_ID                 VARCHAR2(64),
+  TASK_NAME               VARCHAR2(300),
+  PERMISSION_VALID_TYPE   VARCHAR2(2),
+  START_TIME              TIMESTAMP(6),
+  END_TIME                TIMESTAMP(6),
+  IS_DELETED              CHAR(1),
+  MESSAGE_ID              VARCHAR2(32),
+  CREATE_USER             VARCHAR2(32),
+  CREATE_TIME             TIMESTAMP(6),
+  UPDATE_USER             VARCHAR2(32),
+  UPDATE_TIME             TIMESTAMP(6)
+);
+COMMENT ON TABLE "T_APPROVAL_INFO" IS '申请信息表';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."ID" IS 'id';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PROCESS_TITLE" IS '流程标题';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PROCESS_TYPE" IS '流程类型编码';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PROCESS_TYPE_NAME" IS '流程类型名称';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."BUSINESS_CODE" IS '流程业务代码';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PROCESS_NAME" IS '流程名称';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLY_REASON" IS '申请理由';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLY_CONTENT" IS '申请内容';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLICANT_IDCARD" IS '申请人身份证号';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLICANT_NAME" IS '申请人姓名';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLICANT_ORG_CODE" IS '申请人单位编码';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLICANT_ORG_NAME" IS '申请人单位名称';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPLICANT_PHONE_NO" IS '申请人手机号';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PROCESS_INSTANCE_ID" IS '流程实例ID';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."APPROVE_TASK_IDENTIFIER" IS '节点标识码';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."TASK_ID" IS '任务id';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."TASK_NAME" IS '任务名称';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."PERMISSION_VALID_TYPE" IS '权限有效类型';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."START_TIME" IS '权限有效开始时间';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."END_TIME" IS '权限有效结束时间';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."IS_DELETED" IS '是否删除';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."MESSAGE_ID" IS '消息ID';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."CREATE_USER" IS '创建人';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."CREATE_TIME" IS '创建时间';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."UPDATE_USER" IS '更新人';
+COMMENT ON COLUMN "T_APPROVAL_INFO"."UPDATE_TIME" IS '更新时间';
+-- Create table
+create table T_APPROVAL_RESOURCE_INFO
+(
+  ID                  varchar2(32),
+  APPROVAL_ID         varchar2(32),
+  VISITOR_CODE        varchar2(50),
+  VISITOR_NAME        varchar2(500),
+  VISIT_RESOURCE_CODE varchar2(1000),
+  VISIT_RESOURCE_NAME varchar2(1000),
+  VISIT_INFO          blob
+);
+COMMENT ON TABLE "T_APPROVAL_RESOURCE_INFO" IS '申请资源信息表';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."ID" IS 'id';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."APPROVAL_ID" IS '申请id';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."VISITOR_CODE" IS '访问者编码';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."VISITOR_NAME" IS '访问者名称';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."VISIT_RESOURCE_CODE" IS '访问资源编码';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."VISIT_RESOURCE_NAME" IS '访问资源名称';
+COMMENT ON COLUMN "T_APPROVAL_RESOURCE_INFO"."VISIT_INFO" IS '访问内容';

+ 6 - 0
approve-core-service/src/main/resources/mapping/ApprovalInfoMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dragonsoft.dcuc.approve.mapper.ApprovalInfoMapper">
+
+</mapper>
+

+ 6 - 0
approve-core-service/src/main/resources/mapping/ApprovalResourceInfoMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dragonsoft.dcuc.approve.mapper.ApprovalResourceInfoMapper">
+
+</mapper>
+

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio