瀏覽代碼

Merge branch 'huangzqa-add-sync-20231107' into 'develop'

Huangzqa add sync 20231107

See merge request dcuc-tjdsj/approve-core!102
黄资权 1 年之前
父節點
當前提交
70d5b1e642
共有 100 個文件被更改,包括 5565 次插入477 次删除
  1. 1 2
      Dockerfile
  2. 1 1
      README.md
  3. 1 1
      approve-api/pom.xml
  4. 13 5
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/FlowTypeEnum.java
  5. 70 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustApproveEndEnum.java
  6. 66 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustApproveManageEnum.java
  7. 82 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustBusinessRespEnum.java
  8. 55 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustEndFlagEnum.java
  9. 49 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustTokenActionEnum.java
  10. 37 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustTokenTypeEnum.java
  11. 37 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/ApproveModeEnum.java
  12. 41 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/BizDataTypeEnum.java
  13. 45 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/BuErrorCodeEnum.java
  14. 53 16
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveFacade.java
  15. 53 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveOrgFacade.java
  16. 78 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveTaskClassFacade.java
  17. 53 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveUserFacade.java
  18. 39 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IOpsFacade.java
  19. 24 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/IApiV1TokenFacade.java
  20. 47 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3ApproveFacade.java
  21. 56 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3ApproveTaskClassFacade.java
  22. 28 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3SecurityPolicyFacade.java
  23. 21 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoReqVO.java
  24. 42 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveTaskClassAddReqVO.java
  25. 28 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveTaskClassUpdateReqVO.java
  26. 78 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/TaskApproveOperateReqVO.java
  27. 27 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/bim/ZeroTrustAppTokenInfoReqVO.java
  28. 35 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v1/token/TokenReceiveVO.java
  29. 60 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveCallbackReqV3VO.java
  30. 89 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveCreateReqV3VO.java
  31. 44 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveManagerReqV3VO.java
  32. 61 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/rzy/RzyRiskInfoDetailReqVO.java
  33. 27 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/rzy/RzyRiskInfoReqVO.java
  34. 9 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoRespVO.java
  35. 79 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveOrgInfoRespVO.java
  36. 71 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveTaskClassDetailRespVO.java
  37. 99 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveUserInfoRespVO.java
  38. 25 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/OperateTipResp.java
  39. 25 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/RzyRiskInfoRespVO.java
  40. 85 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustAppItemUserTokenInfoRespVO.java
  41. 62 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustAppTokenInfoRespVO.java
  42. 21 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustUserTokenInfoReqVO.java
  43. 85 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustUserTokenInfoRespVO.java
  44. 65 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizApproveGridReqVO.java
  45. 55 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizApproveReqVO.java
  46. 36 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizDataReqVO.java
  47. 74 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncReqVO.java
  48. 50 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/taskclass/ApiTaskClassRespVO.java
  49. 44 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/taskclass/ApiTaskDetailRespVO.java
  50. 24 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustApproveCreateV3RespVO.java
  51. 109 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustMessageRespVO.java
  52. 75 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustResultDataVO.java
  53. 60 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustResultRespVO.java
  54. 二進制
      approve-core-service/lib/nosql-kafka-1.1.0-SNAPSHOT.jar
  55. 53 28
      approve-core-service/pom.xml
  56. 12 2
      approve-core-service/src/main/assembly/assembly.xml
  57. 0 60
      approve-core-service/src/main/assembly/conf/approve-core-nosql.properties
  58. 0 37
      approve-core-service/src/main/assembly/conf/logback.xml
  59. 5 4
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/ApproveApplication.java
  60. 30 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveApiBusiness.java
  61. 33 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveBaseBusiness.java
  62. 0 21
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveBusiness.java
  63. 18 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveExpirationBusiness.java
  64. 3 6
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveLogBusiness.java
  65. 41 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveTaskBusiness.java
  66. 26 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveTipsBusiness.java
  67. 31 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IBimBusiness.java
  68. 29 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IBuSyncBusiness.java
  69. 60 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/ICacheBusiness.java
  70. 30 11
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IDcucBusiness.java
  71. 32 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/INoticeBusiness.java
  72. 34 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IRiskBusiness.java
  73. 44 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IUserOrgSyncBusiness.java
  74. 20 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IZeroTrustTokenBusiness.java
  75. 67 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveApiBusinessImpl.java
  76. 110 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveBaseBusinessImpl.java
  77. 43 84
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveBusinessImpl.java
  78. 128 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveExpirationBusinessImpl.java
  79. 123 123
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveLogBusinessImpl.java
  80. 117 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveTaskBusinessImpl.java
  81. 120 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveTipsBusinessImpl.java
  82. 317 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/BimBusinessImpl.java
  83. 243 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/BuSyncBusinessImpl.java
  84. 3 4
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/DcucAuthBusinessImpl.java
  85. 171 39
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/DcucBusinessImpl.java
  86. 114 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/NoticeBusinessImpl.java
  87. 147 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/RedisCacheBusinessImpl.java
  88. 95 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/RiskBusinessImpl.java
  89. 296 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/UserOrgSyncBusinessImpl.java
  90. 1 1
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/WorkFlowBusinessImpl.java
  91. 97 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ZeroTrustTokenBusinessiImpl.java
  92. 0 23
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/componet/SkipSslRestTemplateProvider.java
  93. 64 3
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/ApproveConfig.java
  94. 36 6
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/AsyncExecuteThreadPoolConfig.java
  95. 25 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveBeanConstants.java
  96. 15 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveConstants.java
  97. 25 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveLockConstants.java
  98. 35 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveRedisConstants.java
  99. 32 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/dto/ApproveLogDTO.java
  100. 46 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/dto/RzyRiskLogDTO.java

+ 1 - 2
Dockerfile

@@ -3,5 +3,4 @@ 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"];
-
+ENTRYPOINT ["/opt/docker/approve-core-service/bin/start.sh"]

+ 1 - 1
README.md

@@ -10,4 +10,4 @@
   - 对接启明审计
   - 重构代码
   - 新增V2审批接口
-  - 新增对接权限红白名单判断
+  - 新增对接权限红白名单判断 

+ 1 - 1
approve-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>approve-core</artifactId>
         <groupId>com.dragoninfo.dcuc</groupId>
-        <version>1.2.1-tjdsj-SNAPSHOT</version>
+        <version>1.3.0-tjdsj-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 13 - 5
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/FlowTypeEnum.java

@@ -28,13 +28,18 @@ public enum FlowTypeEnum implements ICodeEnum {
     /**
      * 数据授权工作单
      */
-    DATA_AUTH("DATA_AUTH", "数据授权工作单", "资源资源");
+    DATA_AUTH("DATA_AUTH", "数据授权工作单", "资源资源"),
+    /**
+     * 其他
+     */
+    OTHER("OTHER", "其他", "其他");
+
 
-    private String value;
+    private final String value;
 
-    private String label;
+    private final String label;
 
-    private String resourceName;
+    private final String resourceName;
 
     FlowTypeEnum(String value, String label, String resourceName) {
         this.value = value;
@@ -66,8 +71,9 @@ public enum FlowTypeEnum implements ICodeEnum {
             case SERVICE_AUTH:
             case SERVICE_AUTH_CANCEL:
                 return ListResourceTypeEnum.SERVICE;
+            case OTHER:
             default:
-                throw new IllegalArgumentException(String.format("%s is'nt parse to ListResourceTypeEnum", this));
+                throw new IllegalArgumentException(String.format("%s isn't parse to ListResourceTypeEnum", this));
         }
     }
 
@@ -80,6 +86,8 @@ public enum FlowTypeEnum implements ICodeEnum {
                 return ApproveTypeEnum.SERVICE;
             case APP_FUN_AUTH:
                 return ApproveTypeEnum.APP_FUNCTION;
+            case OTHER:
+                return ApproveTypeEnum.OTHER;
             default:
                 throw new IllegalArgumentException(String.format("%s is'nt parse to ApproveTypeEnum", this));
         }

+ 70 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustApproveEndEnum.java

@@ -0,0 +1,70 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import cn.hutool.core.lang.Assert;
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 审批流程结束类型
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+public enum ZeroTrustApproveEndEnum implements ICodeEnum {
+    /**
+     * 结束
+     */
+    END("end", "结束"),
+
+    /**
+     * 撤销
+     */
+    CANCEL("cancel", "撤销"),
+
+    /**
+     * 挂起
+     */
+    HOLD("hold", "挂起"),
+
+    /**
+     * 终止
+     */
+    STOP("stop", "终止"),
+
+
+    ;
+    private final String value;
+
+    private final String label;
+
+    ZeroTrustApproveEndEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+
+    public static ZeroTrustApproveEndEnum parse(ApproveWorkFlowOperationEnum approveWorkFlowOperationEnum) {
+        Assert.notNull(approveWorkFlowOperationEnum);
+        switch (approveWorkFlowOperationEnum) {
+            case COMPLETE_AGREE:
+                return ZeroTrustApproveEndEnum.END;
+            case COMPLETE_DISAGREE:
+                return ZeroTrustApproveEndEnum.STOP;
+            case BACK:
+            case RECALL:
+                return ZeroTrustApproveEndEnum.CANCEL;
+            default:
+                throw new IllegalArgumentException(approveWorkFlowOperationEnum.getValue());
+        }
+    }
+}

+ 66 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustApproveManageEnum.java

@@ -0,0 +1,66 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 审批管理类型
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+public enum ZeroTrustApproveManageEnum implements ICodeEnum {
+    /**
+     * 撤销
+     */
+    CANCEL("01", "撤销"),
+
+    /**
+     * 挂起
+     */
+    HOLD("02", "挂起"),
+
+    /**
+     * 终止
+     */
+    STOP("03", "终止"),
+
+    /**
+     * 激活
+     */
+    ACTIVE("04", "激活"),
+
+    ;
+    private final String value;
+
+    private final String label;
+
+    ZeroTrustApproveManageEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+
+    public ApproveWorkFlowOperationEnum toApproveWorkFlowOperationEnum() {
+        switch (this) {
+            case CANCEL:
+                return ApproveWorkFlowOperationEnum.RECALL;
+            case HOLD:
+            case STOP:
+            case ACTIVE:
+            default:
+                return null;
+        }
+
+    }
+}

+ 82 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustBusinessRespEnum.java

@@ -0,0 +1,82 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 业务通用响应码
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+public enum ZeroTrustBusinessRespEnum implements ICodeEnum {
+    /**
+     * 操作成功
+     */
+    SUCCESS("0000", "操作成功"),
+
+    /**
+     * 操作失败
+     */
+    OPERATE_FAIL("0001", "操作失败"),
+
+    /**
+     * 令牌失效
+     */
+    TOKEN_FAIL("0002", "令牌失效"),
+
+    /**
+     * 权限冻结
+     */
+    PERMISSION_FREEZE("0003", "权限冻结"),
+
+    /**
+     * 用户令牌解密失败
+     */
+    USER_TOKEN_DECODE_FAIL("1000", "用户令牌解密失败"),
+
+    /**
+     * 用户令牌不存在
+     */
+    USER_TOKEN_NOT_EXITS("1001", "用户令牌不存在"),
+
+    /**
+     * 应用令牌解密失败
+     */
+    APP_TOKEN_DECODE_FAIL("1002", "应用令牌解密失败"),
+    /**
+     * 应用令牌不存在
+     */
+    APP_TOKEN_NOT_EXITS("1003", "应用令牌不存在"),
+
+    /**
+     * 用户令牌不需要续期
+     */
+    USER_TOKEN_NO_RENEWAL("1004", "用户令牌不需要续期"),
+
+    /**
+     * 应用令牌不需要续期
+     */
+    APP_TOKEN_NO_RENEWAL("1005", "应用令牌不需要续期");
+
+    private final String value;
+
+    private final String label;
+
+
+    ZeroTrustBusinessRespEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+}

+ 55 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustEndFlagEnum.java

@@ -0,0 +1,55 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import cn.hutool.core.lang.Assert;
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 审批结果标识
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+public enum ZeroTrustEndFlagEnum implements ICodeEnum {
+    /**
+     * 操作成功
+     */
+    COMPLETE_AGREE("1", "操作成功"),
+
+    /**
+     * 操作失败
+     */
+    COMPLETE_DISAGREE("2", "操作失败");
+
+
+    private final String value;
+
+    private final String label;
+
+
+    ZeroTrustEndFlagEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+
+    public static ZeroTrustEndFlagEnum parseApproveWorkFlowOperationEnum(ApproveWorkFlowOperationEnum approveWorkFlowOperationEnum) {
+        Assert.notNull(approveWorkFlowOperationEnum);
+        ZeroTrustEndFlagEnum zeroTrustEndFlagEnum = ZeroTrustEndFlagEnum.COMPLETE_DISAGREE;
+        if (approveWorkFlowOperationEnum.equals(ApproveWorkFlowOperationEnum.COMPLETE_AGREE)) {
+            zeroTrustEndFlagEnum = ZeroTrustEndFlagEnum.COMPLETE_AGREE;
+        }
+        return zeroTrustEndFlagEnum;
+    }
+
+}

+ 49 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustTokenActionEnum.java

@@ -0,0 +1,49 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 令牌动作
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+public enum ZeroTrustTokenActionEnum implements ICodeEnum {
+    /**
+     * 上线
+     */
+    ONLINE("online", "上线"),
+
+    /**
+     * 下线
+     */
+    OFFLINE("offline", "下线"),
+
+    /**
+     * 续期
+     */
+    RENEW("renew", "续期"),
+
+    ;
+    private final String value;
+
+    private final String label;
+
+
+    ZeroTrustTokenActionEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+}

+ 37 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ZeroTrustTokenTypeEnum.java

@@ -0,0 +1,37 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * @author huangzqa
+ */
+
+public enum ZeroTrustTokenTypeEnum implements ICodeEnum {
+    /**
+     * 用户令牌
+     */
+    USER("user", "用户令牌"),
+    /**
+     * 应用令牌
+     */
+    APP("app", "应用令牌");
+
+    private final String value;
+
+    private final String label;
+
+    ZeroTrustTokenTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getLabel() {
+        return label;
+    }
+}

+ 37 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/ApproveModeEnum.java

@@ -0,0 +1,37 @@
+package com.dragonsoft.dcuc.approve.enumresources.bu;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 正常审批
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+public enum ApproveModeEnum implements ICodeEnum {
+
+    /**
+     * 正常审批
+     */
+    NORMAL("1", "正常审批");
+
+    public final String value;
+    public final String label;
+
+    ApproveModeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+}

+ 41 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/BizDataTypeEnum.java

@@ -0,0 +1,41 @@
+package com.dragonsoft.dcuc.approve.enumresources.bu;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 业务数据类型
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+public enum BizDataTypeEnum implements ICodeEnum {
+
+    /**
+     * 承办人信息
+     */
+    HANDLE("01", "承办人信息"),
+    /**
+     * 要素信息
+     */
+    ELEMENT("02", "要素信息");
+
+    public final String value;
+    public final String label;
+
+    BizDataTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+}

+ 45 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/bu/BuErrorCodeEnum.java

@@ -0,0 +1,45 @@
+package com.dragonsoft.dcuc.approve.enumresources.bu;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 错误信息枚举
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+public enum BuErrorCodeEnum implements ICodeEnum {
+
+    /**
+     * 成功
+     */
+    SUCCESS("0000", "成功"),
+    /**
+     * 系统异常
+     */
+    SYSTEM_ERROR("00001", "系统异常"),
+    /**
+     * 参数校验异常
+     */
+    PARAM_ERROR("0100", "参数校验异常");
+
+    public final String value;
+    public final String label;
+
+    BuErrorCodeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+}

+ 53 - 16
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveFacade.java

@@ -1,9 +1,6 @@
 package com.dragonsoft.dcuc.approve.facade;
 
-import com.dragonsoft.dcuc.approve.model.req.AgentReqVO;
-import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoReqVO;
-import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoUpdateReqVO;
-import com.dragonsoft.dcuc.approve.model.req.ApproveOperateReqVO;
+import com.dragonsoft.dcuc.approve.model.req.*;
 import com.dragonsoft.dcuc.approve.model.resp.*;
 import com.dragonsoft.duceap.base.annotations.parameter.QueryObject;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
@@ -19,6 +16,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotBlank;
 import java.util.List;
 
 /**
@@ -80,6 +78,16 @@ public interface IApproveFacade {
     @RequestMapping(value = "v1/approve-operate", method = RequestMethod.PUT)
     ResponseDTO<OperateRespVO> approveOperate(@Validated @RequestBody ApproveOperateReqVO approveOperateReqVO);
 
+    /**
+     * 审批操作提示
+     *
+     * @param processInstanceId 流程实例ID
+     * @return 状态
+     */
+    @ApiOperation(value = "审批操作提示", notes = "审批操作提示")
+    @RequestMapping(value = "v1/approve-operate-tips/{processInstanceId}", method = RequestMethod.GET)
+    ResponseDTO<List<OperateTipResp>> approveOperatePreTip(@Validated @NotBlank @PathVariable String processInstanceId);
+
     /**
      * 查看红名单状态
      *
@@ -193,18 +201,6 @@ public interface IApproveFacade {
     @RequestMapping(value = "v1/process-type/{processTypeCode}", method = RequestMethod.GET)
     ResponseDTO<WorkflowProcesstypeVo> queryProcessType(@PathVariable(value = "processTypeCode") String processTypeCode);
 
-    /**
-     * 警员列表
-     *
-     * @param page 页码
-     * @param size 页面大
-     * @return 状态
-     */
-    @ApiOperation(value = "获取警员列表", notes = "获取警员列表")
-    @RequestMapping(value = "v1/police-list/search", method = RequestMethod.GET)
-    ResponseDTO<List<PoliceResultVO>> queryPoliceList(@RequestParam(value = "page") int page,
-                                                      @RequestParam(value = "size") int size);
-
     /**
      * 流程图状态
      *
@@ -224,4 +220,45 @@ public interface IApproveFacade {
      */
     @GetMapping(value = "v1/task-operate/{taskId}/{pageType}")
     ResponseDTO<TaskOperateRespVO> taskOperateForApprove(@PathVariable("taskId") String taskId, @PathVariable("pageType") String pageType);
+
+    /**
+     * taskNo查找审批意见
+     *
+     * @param taskNo 任务编号
+     * @return 状态
+     */
+    @ApiOperation(value = "taskNo查找审批意见", notes = "taskNo查找审批意见")
+    @RequestMapping(value = "v1/apply-info-task/{taskNo}/approve-comments", method = RequestMethod.GET)
+    ResponseDTO<List<ApproveCommentVo>> taskApproveComments(@PathVariable(value = "taskNo") String taskNo);
+
+    /**
+     * 申请详情
+     *
+     * @param taskNo 任务编号
+     * @return 状态
+     */
+    @ApiOperation(value = "taskNo申请详情", notes = "taskNo申请详情")
+    @RequestMapping(value = "v1/apply-info-task/{taskNo}", method = RequestMethod.GET)
+    ResponseDTO<ApprovalInfoRespVO> taskApplyDetail(@PathVariable(value = "taskNo") String taskNo);
+
+    /**
+     * 审批操作
+     *
+     * @param taskApproveOperateReqVO 操作信息
+     * @return 状态
+     */
+    @ApiOperation(value = "taskNo审批操作", notes = "taskNo审批操作")
+    @RequestMapping(value = "v1/task-approve-operate", method = RequestMethod.PUT)
+    ResponseDTO<OperateRespVO> taskApproveOperate(@Validated @RequestBody TaskApproveOperateReqVO taskApproveOperateReqVO);
+
+    /**
+     * 删除我的请求
+     *
+     * @param taskNo taskNo
+     * @return 状态
+     */
+    @ApiOperation(value = "我的请求列表-删除", notes = "我的请求列表-删除")
+    @RequestMapping(value = "v1/task-delApply/{taskNo}", method = RequestMethod.DELETE)
+    ResponseStatus taskDelApply(@PathVariable(value = "taskNo") String taskNo);
+
 }

+ 53 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveOrgFacade.java

@@ -0,0 +1,53 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.resp.ApproveOrgInfoRespVO;
+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;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Api(tags = "机构信息")
+@FeignClient(name = "approve")
+public interface IApproveOrgFacade {
+    /**
+     * 机构列表
+     *
+     * @param searchable 查询条件
+     * @return 分页
+     */
+    @ApiOperation(value = "机构列表", notes = "机构列表")
+    @RequestMapping(value = "v1/orgs/search", method = RequestMethod.POST)
+    Page<ApproveOrgInfoRespVO> page(@QueryObject Searchable searchable);
+
+    /**
+     * 同步所有机构
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "同步所有机构", notes = "同步所有机构")
+    @RequestMapping(value = "v1/orgs/sync", method = RequestMethod.GET)
+    ResponseStatus syncAllOrg();
+
+    /**
+     * 同步新机构
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "同步新机构", notes = "同步新机构")
+    @RequestMapping(value = "v1/orgs/new-sync", method = RequestMethod.GET)
+    ResponseStatus syncNewOrg();
+
+}

+ 78 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveTaskClassFacade.java

@@ -0,0 +1,78 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.req.ApproveTaskClassAddReqVO;
+import com.dragonsoft.dcuc.approve.model.req.ApproveTaskClassUpdateReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.ApproveTaskClassDetailRespVO;
+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 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.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * @author huangzqa
+ * @date 2023/06/09
+ */
+@Api(tags = "任务类型")
+@FeignClient(name = "approve")
+public interface IApproveTaskClassFacade {
+
+    /**
+     * 任务类型列表
+     *
+     * @param searchable 查询条件
+     * @return 分页
+     */
+    @ApiOperation(value = "任务类型列表", notes = "任务类型列表")
+    @RequestMapping(value = "v1/task-class/search", method = RequestMethod.POST)
+    Page<ApproveTaskClassDetailRespVO> page(@QueryObject Searchable searchable);
+
+    /**
+     * 删除任务类型
+     *
+     * @param id id
+     * @return 状态
+     */
+    @ApiOperation(value = "删除任务类型", notes = "删除任务类型")
+    @RequestMapping(value = "v1/task-class/{id}", method = RequestMethod.DELETE)
+    ResponseStatus delete(@PathVariable(value = "id") String id);
+
+    /**
+     * 任务类型
+     *
+     * @param approveTaskClassAddReqVO 任务类型
+     * @return 状态
+     */
+    @ApiOperation(value = "任务类型", notes = "任务类型")
+    @RequestMapping(value = "v1/task-class", method = RequestMethod.POST)
+    ResponseDTO<String> save(@Validated @RequestBody ApproveTaskClassAddReqVO approveTaskClassAddReqVO);
+
+    /**
+     * 修改任务类型
+     *
+     * @param approveTaskClassUpdateReqVO 修改任务类型
+     * @return 状态
+     */
+    @ApiOperation(value = "修改任务类型", notes = "修改任务类型")
+    @RequestMapping(value = "v1/task-class", method = RequestMethod.PUT)
+    ResponseDTO<String> update(@Validated @RequestBody ApproveTaskClassUpdateReqVO approveTaskClassUpdateReqVO);
+
+    /**
+     * 获取任务类型详情
+     *
+     * @param id 任务类型ID
+     * @return 状态
+     */
+    @ApiOperation(value = "任务类型详情", notes = "任务类型详情")
+    @RequestMapping(value = "v1/task-class/{id}", method = RequestMethod.GET)
+    ResponseDTO<ApproveTaskClassDetailRespVO> detail(@PathVariable("id") String id);
+
+}

+ 53 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/IApproveUserFacade.java

@@ -0,0 +1,53 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+import com.dragonsoft.dcuc.approve.model.resp.ApproveUserInfoRespVO;
+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;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Api(tags = "用户信息")
+@FeignClient(name = "approve")
+public interface IApproveUserFacade {
+    /**
+     * 用户列表
+     *
+     * @param searchable 查询条件
+     * @return 分页
+     */
+    @ApiOperation(value = "用户列表", notes = "用户列表")
+    @RequestMapping(value = "v1/users/search", method = RequestMethod.POST)
+    Page<ApproveUserInfoRespVO> page(@QueryObject Searchable searchable);
+
+    /**
+     * 同步所有用户
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "同步所有用户", notes = "同步所有用户")
+    @RequestMapping(value = "v1/users/sync", method = RequestMethod.GET)
+    ResponseStatus syncAllUser();
+
+    /**
+     * 同步新用户
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "同步新用户", notes = "同步新用户")
+    @RequestMapping(value = "v1/users/new-sync", method = RequestMethod.GET)
+    ResponseStatus syncNewUser();
+
+}

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

@@ -0,0 +1,39 @@
+package com.dragonsoft.dcuc.approve.facade;
+
+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.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/19
+ */
+@Api(tags = "运维")
+@FeignClient(name = "approve")
+public interface IOpsFacade {
+
+    /**
+     * 开始超期审批单任务
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "开始超期审批单任务", notes = "开始超期审批单任务")
+    @RequestMapping(value = "v1/ops/scheduling-expiration_task", method = RequestMethod.GET)
+    ResponseStatus schedulingExpirationTask();
+
+    /**
+     * 开始同步到BU任务
+     *
+     * @return 状态
+     */
+    @ApiOperation(value = "开始同步到BU任务", notes = "开始同步到BU任务")
+    @RequestMapping(value = "v1/ops/sync-to-bu_task", method = RequestMethod.GET)
+    ResponseStatus syncTuBu();
+}

+ 24 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/IApiV1TokenFacade.java

@@ -0,0 +1,24 @@
+package com.dragonsoft.dcuc.approve.facade.api;
+
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @author mazq
+ * @date 2023/2/22
+ */
+@FeignClient(name = "approve", path = "api/v1/tokens/")
+public interface IApiV1TokenFacade {
+
+    /**
+     * 接收令牌
+     *
+     * @param tokenReceiveJson
+     * @return
+     */
+    @PostMapping("receive")
+    ZeroTrustMessageRespVO tokenReceive(@RequestBody String tokenReceiveJson);
+
+}

+ 47 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3ApproveFacade.java

@@ -0,0 +1,47 @@
+package com.dragonsoft.dcuc.approve.facade.api.v3;
+
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCreateReqV3VO;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveManagerReqV3VO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustApproveCreateV3RespVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustResultDataVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+@Api(tags = "审批服务接口V3")
+@FeignClient(name = "approve")
+public interface IApiV3ApproveFacade {
+
+    /**
+     * 流程发起
+     *
+     * @param zeroTrustApproveCreateReqV3VO 流程发起请求
+     * @return 流程发起返回
+     */
+    @ApiOperation(value = "审批请求推送接口", notes = "审批请求推送接口")
+    @RequestMapping(value = "api/v3/apply", method = RequestMethod.POST)
+    ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> create(@RequestBody ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO);
+
+
+    /**
+     * 流程管理
+     *
+     * @param zeroTrustApproveManagerReqV3VO 流程管理请求
+     * @return 状态
+     */
+    @ApiOperation(value = "流程管理", notes = "流程管理")
+    @RequestMapping(value = "api/v3/manage", method = RequestMethod.POST)
+    ZeroTrustMessageRespVO manage(@RequestBody ZeroTrustApproveManagerReqV3VO zeroTrustApproveManagerReqV3VO);
+}

+ 56 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3ApproveTaskClassFacade.java

@@ -0,0 +1,56 @@
+package com.dragonsoft.dcuc.approve.facade.api.v3;
+
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskClassRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskDetailRespVO;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/11
+ */
+@Api(tags = "审批任务类型服务接口")
+@FeignClient(name = "approve")
+public interface IApiV3ApproveTaskClassFacade {
+
+    /**
+     * 获取任务类型列表
+     *
+     * @return 任务类型列表
+     */
+    @ApiOperation(value = "任务类型列表", notes = "任务类型列表")
+    @GetMapping("api/v3/task-classes")
+    ResponseDTO<List<ApiTaskClassRespVO>> taskClassList();
+
+    /**
+     * 根据任务代码获取任务详情
+     *
+     * @param taskCode 任务标识
+     * @return 任务详情
+     */
+    @ApiOperation(value = "根据任务代码获取任务详情", notes = "根据任务代码获取任务详情")
+    @GetMapping("api/v3/tasks/{taskCode}")
+    ResponseDTO<ApiTaskDetailRespVO> taskDetail(@PathVariable("taskCode") String taskCode);
+
+    /**
+     * 根据用户、应用代码获取对应的任务列表
+     *
+     * @param userToken 用户令牌
+     * @param appCode   应用代码
+     * @return 任务列表
+     */
+    @ApiOperation(value = "根据用户、应用代码获取对应的任务列表", notes = "根据用户、应用代码获取对应的任务列表")
+    @GetMapping("api/v3/user-tasks/{userToken}/apps/{appCode}")
+    ResponseDTO<List<ApiTaskDetailRespVO>> getUserAppTaskList(@PathVariable("userToken") String userToken,
+                                                              @PathVariable("appCode") String appCode);
+}

+ 28 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3SecurityPolicyFacade.java

@@ -0,0 +1,28 @@
+package com.dragonsoft.dcuc.approve.facade.api.v3;
+
+import com.dragonsoft.dcuc.approve.model.req.v3.rzy.RzyRiskInfoReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.RzyRiskInfoRespVO;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+@Api(tags = "安全策略控制服务接口")
+@FeignClient(name = "approve")
+public interface IApiV3SecurityPolicyFacade {
+
+    @ApiOperation(value = "权限审批请求推送接口", notes = "审批请求推送接口")
+    @PostMapping(value = "api/v3/security-police/rzy-risk-info")
+    RzyRiskInfoRespVO rzyRiskInfo(@RequestBody String riskInfo) throws JsonProcessingException;
+
+}

+ 21 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApprovalInfoReqVO.java

@@ -120,4 +120,25 @@ public class ApprovalInfoReqVO implements Serializable {
     @ApiModelProperty(value = "下一任务对象信息")
     private List<ActivitiHolder> activitiHolderList;
 
+    @ApiModelProperty(value = "回调通知地址")
+    private String callbackUrl;
+
+    @ApiModelProperty(value = "任务类型")
+    private String approveTaskClass;
+
+    @ApiModelProperty(value = "任务编号")
+    private String approveTaskId;
+
+    /**
+     * 申请人IP
+     */
+    @ApiModelProperty(value = "申请人IP")
+    private String applicantIp;
+
+    /**
+     * 申请人应用令牌
+     */
+    @ApiModelProperty(value = "申请人应用令牌")
+    private String applicantAppToken;
+
 }

+ 42 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveTaskClassAddReqVO.java

@@ -0,0 +1,42 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/9
+ */
+@Data
+public class ApproveTaskClassAddReqVO {
+
+    /**
+     * 任务类型代码
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务类型代码")
+    private String taskClassCode;
+    /**
+     * 任务类型名称
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务类型名称")
+    private String taskClassName;
+    /**
+     * 父任务类型ID
+     */
+    @ApiModelProperty(value = "父任务类型ID")
+    private String parentId;
+
+    /**
+     * 来源应用代码
+     */
+    @ApiModelProperty(value = "来源应用代码")
+    private String sourceAppCode;
+}

+ 28 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/ApproveTaskClassUpdateReqVO.java

@@ -0,0 +1,28 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/9
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ApproveTaskClassUpdateReqVO extends ApproveTaskClassAddReqVO {
+
+    /**
+     * 主键
+     */
+    @NotBlank
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+}

+ 78 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/TaskApproveOperateReqVO.java

@@ -0,0 +1,78 @@
+package com.dragonsoft.dcuc.approve.model.req;
+
+import com.dragonsoft.duceap.duwf.api.model.ActivitiHolder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/2/20 14:25
+ */
+@ApiModel(description = "审批操作请求信息")
+@Data
+public class TaskApproveOperateReqVO {
+    /**
+     * 操作类型
+     *
+     * @see com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOperationEnum
+     */
+    @NotBlank
+    @ApiModelProperty(value = "操作类型")
+    private String operateType;
+    /**
+     * 任务id
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务id")
+    private String taskId;
+
+    /**
+     * 审批信息
+     */
+    @NotBlank
+    @ApiModelProperty(value = "审批信息")
+    private String message;
+
+    /**
+     * 审批人身份证号
+     */
+    @ApiModelProperty(value = "审批人身份证号")
+    private String idCard;
+
+    /**
+     * 当前处理人用户名
+     */
+    @ApiModelProperty(value = "当前处理人用户名")
+    private String userName;
+    /**
+     * 当前处理人机构code
+     */
+    @ApiModelProperty(value = "当前处理人机构code")
+    private String orgCode;
+    /**
+     * 当前处理人机构名称
+     */
+    @ApiModelProperty(value = "当前处理人机构名称")
+    private String orgName;
+
+    /**
+     * 任务编号
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务编号")
+    private String taskNo;
+
+    /**
+     * 下一任务对象信息
+     */
+    @ApiModelProperty(value = "下一任务对象信息")
+    private List<ActivitiHolder> activitiHolderList;
+
+}

+ 27 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/bim/ZeroTrustAppTokenInfoReqVO.java

@@ -0,0 +1,27 @@
+
+package com.dragonsoft.dcuc.approve.model.req.bim;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ * 应用令牌信息服务接口
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@ApiModel(value = "应用令牌信息服务接口")
+@Data
+public class ZeroTrustAppTokenInfoReqVO {
+
+    /**
+     * 应用令牌标识
+     */
+    @ApiModelProperty(value = "应用令牌标识")
+    private String appTokenId;
+
+
+}

+ 35 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v1/token/TokenReceiveVO.java

@@ -0,0 +1,35 @@
+package com.dragonsoft.dcuc.approve.model.req.v1.token;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author mazq
+ * @date 2023/3/31
+ */
+@Data
+public class TokenReceiveVO {
+
+    @NotBlank
+    @ApiModelProperty(value = "令牌行为 online 上线 offline 下线 renew续期")
+    private String action;
+
+    @NotBlank
+    @ApiModelProperty(value = "令牌类型 user用户令牌 app应用令牌")
+    private String type;
+
+    @NotBlank
+    @ApiModelProperty(value = "令牌详细信息")
+    private String token;
+
+    @NotBlank
+    @ApiModelProperty(value = "签名随机数")
+    private String nonce;
+
+    @NotBlank
+    @ApiModelProperty(value = "签名")
+    private String sign;
+
+}

+ 60 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveCallbackReqV3VO.java

@@ -0,0 +1,60 @@
+package com.dragonsoft.dcuc.approve.model.req.v3;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ * 审批结果回调
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+@ApiModel("审批结果回调")
+@Data
+public class ZeroTrustApproveCallbackReqV3VO {
+
+    /**
+     * 流程结束类型
+     *
+     * @see com.dragonsoft.dcuc.approve.enumresources.ZeroTrustApproveEndEnum
+     */
+    @NotBlank
+    @ApiModelProperty("流程结束类型")
+    private String type;
+
+    @NotBlank
+    @ApiModelProperty("流程实例Id")
+    private String processInstId;
+
+    @NotBlank
+    @ApiModelProperty("流程发起人")
+    private String openId;
+
+    @NotBlank
+    @ApiModelProperty("发起人姓名")
+    private String userName;
+
+    /**
+     * End表示流程结束时传入。
+     * “1”表示审批通过;
+     * “2”表示审批不通过
+     *
+     * @see com.dragonsoft.dcuc.approve.enumresources.ZeroTrustEndFlagEnum
+     */
+    @ApiModelProperty("审批结果标识")
+    private String endFlag;
+
+    @ApiModelProperty("审批不通过理由")
+    private String description;
+
+    @NotBlank
+    @ApiModelProperty("任务编号")
+    private String taskId;
+
+
+}

+ 89 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveCreateReqV3VO.java

@@ -0,0 +1,89 @@
+package com.dragonsoft.dcuc.approve.model.req.v3;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 创建审批请求
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+@Data
+public class ZeroTrustApproveCreateReqV3VO {
+
+    /**
+     * 应用令牌
+     */
+    @NotBlank
+    @ApiModelProperty("应用令牌")
+    private String appTokenId;
+
+    /**
+     * 流程标识
+     * 调用审批服务需先在审批中心注册流程,每个注册流程有唯一流程定义ID
+     */
+    @NotBlank
+    @ApiModelProperty("流程标识")
+    private String processDefId;
+
+    /**
+     * 任务名称
+     */
+    @NotBlank
+    @ApiModelProperty("任务名称")
+    private String title;
+
+    /**
+     * 任务类型
+     * “01”表示落地调查 “02”表示立线侦察 “03” 表示立案侦察 “04”表示任务初查 “05”表示刑事任务 “06” 表示重点对象管控 “07” 表示行政任务 “08” 表示权限变更
+     * “98” 表示平台演示 “99” 表示系統巡检
+     */
+    @NotBlank
+    @ApiModelProperty("任务类型")
+    private String taskClass;
+
+    /**
+     * 任务编号
+     * 审批流程所关联的任务唯一标识,任务id编码规则(共32位):RWBH+公安机关组织机构代码(符合GA/T 380-2012的要求)+日期(格式YYYYMMDD)+8位流水号。如:RWBH0100000000002022030100000001
+     */
+    @NotBlank
+    @ApiModelProperty("任务编号")
+    private String taskId;
+
+    /**
+     * 表单
+     * “表名”:[{"字段 1":"值","字段 2":"值"},{"字段 1":"值","字段2":"值"}]}
+     */
+    @ApiModelProperty("表单")
+    private Map<String, List<Map<String, String>>> bo;
+
+    /**
+     * 应用接收审批结果地址(应用开发的接收审批结果变动的地址)
+     */
+    @NotBlank
+    @ApiModelProperty("应用接收审批结果地址")
+    private String callbackUrl;
+
+    /**
+     * 业务数据
+     * 扩展字段
+     */
+    @ApiModelProperty("业务数据")
+    private Map<String, String> bizData;
+
+    /**
+     * 签名
+     * 应采用国产密码算法对接口请求参数进行完整性保护
+     */
+    @NotBlank
+    @ApiModelProperty("签名")
+    private String callerSign;
+
+}

+ 44 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveManagerReqV3VO.java

@@ -0,0 +1,44 @@
+package com.dragonsoft.dcuc.approve.model.req.v3;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ * 审批流程管理请求
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+@ApiModel("审批流程管理请求")
+@Data
+public class ZeroTrustApproveManagerReqV3VO {
+
+    /**
+     * 应用令牌标识
+     */
+    @NotBlank
+    @ApiModelProperty("应用令牌标识")
+    private String appTokenId;
+
+    /**
+     * 流程实例Id
+     */
+    @NotBlank
+    @ApiModelProperty("流程实例Id")
+    private String processInstId;
+
+    /**
+     * 操作类型
+     *
+     * @see com.dragonsoft.dcuc.approve.enumresources.ZeroTrustApproveManageEnum
+     */
+    @NotBlank
+    @ApiModelProperty("操作类型")
+    private String actionType;
+
+}

+ 61 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/rzy/RzyRiskInfoDetailReqVO.java

@@ -0,0 +1,61 @@
+package com.dragonsoft.dcuc.approve.model.req.v3.rzy;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+@Data
+@ApiModel(description = "风险信息内容")
+public class RzyRiskInfoDetailReqVO {
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty("威胁类型1")
+    private String threatClassif;
+
+    @ApiModelProperty("威胁类型2")
+    private String extendThreatClassif;
+
+    @ApiModelProperty("威胁名称,风险名称")
+    private String threatName;
+
+    @ApiModelProperty("威胁描述,风险内容")
+    private String threatDesc;
+
+    @ApiModelProperty("威胁等级")
+    private String threatLevel;
+
+    @ApiModelProperty("威胁评分")
+    private String threatScore;
+
+    @ApiModelProperty("威胁阶段")
+    private String threatStage;
+
+    @ApiModelProperty("来源")
+    private String source;
+
+    @ApiModelProperty("源地址")
+    private String srcAddr;
+
+    @ApiModelProperty("目的地址")
+    private String dstAddr;
+
+    @ApiModelProperty("用户")
+    private List<String> user;
+
+
+}

+ 27 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/rzy/RzyRiskInfoReqVO.java

@@ -0,0 +1,27 @@
+package com.dragonsoft.dcuc.approve.model.req.v3.rzy;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+@Data
+@ApiModel(description = "风险信息")
+public class RzyRiskInfoReqVO {
+
+    @ApiModelProperty("内容")
+    private List<RzyRiskInfoDetailReqVO> content;
+
+    @ApiModelProperty("校验码")
+    private String checksum;
+
+}

+ 9 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoRespVO.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
@@ -103,4 +104,12 @@ public class ApprovalInfoRespVO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
+    /**
+     * 超期时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expirationTime;
+
+
 }

+ 79 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveOrgInfoRespVO.java

@@ -0,0 +1,79 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Data
+@ApiModel(description = "机构信息")
+public class ApproveOrgInfoRespVO {
+    /**
+     * id
+     */
+    @ApiModelProperty(name = "id", notes = "")
+    private String id;
+    /**
+     * 机构代码
+     */
+    @ApiModelProperty(name = "机构代码", notes = "")
+    private String orgCode;
+    /**
+     * 机构名称
+     */
+    @ApiModelProperty(name = "机构名称", notes = "")
+    private String orgName;
+    /**
+     * 上级机构ID
+     */
+    @ApiModelProperty(name = "上级机构ID", notes = "")
+    private String upOrgId;
+    /**
+     * 上级机构代码
+     */
+    @ApiModelProperty(name = "上级机构代码", notes = "")
+    private String upOrgCode;
+    /**
+     * 机构类型
+     */
+    @ApiModelProperty(name = "机构类型", notes = "")
+    private String orgKind;
+    /**
+     * 行政区划
+     */
+    @ApiModelProperty(name = "行政区划", notes = "")
+    private String areaCode;
+    /**
+     * 远程更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "远程更新时间", notes = "")
+    private Date remoteUpdateTime;
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(name = "是否删除", notes = "")
+    private String deleted;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "创建时间", notes = "")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "修改时间", notes = "")
+    private Date updateTime;
+}

+ 71 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveTaskClassDetailRespVO.java

@@ -0,0 +1,71 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/9
+ */
+@Data
+public class ApproveTaskClassDetailRespVO {
+
+    /**
+     * 主键
+     */
+    @NotBlank
+    @ApiModelProperty(value = "主键")
+    private String id;
+
+    /**
+     * 任务类型代码
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务类型代码")
+    private String taskClassCode;
+    /**
+     * 任务类型名称
+     */
+    @NotBlank
+    @ApiModelProperty(value = "任务类型名称")
+    private String taskClassName;
+    /**
+     * 父任务类型ID
+     */
+    @ApiModelProperty(value = "父任务类型ID")
+    private String parentId;
+
+    /**
+     * 来源应用代码
+     */
+    @ApiModelProperty(value = "来源应用代码")
+    private String sourceAppCode;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createUser;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改人
+     */
+    @ApiModelProperty(value = "修改人")
+    private String updateUser;
+    /**
+     * 修改时间
+     */
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+}

+ 99 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveUserInfoRespVO.java

@@ -0,0 +1,99 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Data
+@ApiModel(description = "用户信息")
+public class ApproveUserInfoRespVO {
+    /**
+     * id
+     */
+    @ApiModelProperty(name = "id", notes = "")
+    private String id;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty(name = "身份证号", notes = "")
+    private String idcard;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty(name = "姓名", notes = "")
+    private String userName;
+    /**
+     * 警衔
+     */
+    @ApiModelProperty(name = "警衔", notes = "")
+    private String policeRank;
+    /**
+     * 警号
+     */
+    @ApiModelProperty(name = "警号", notes = "")
+    private String policeNumber;
+    /**
+     * 警种
+     */
+    @ApiModelProperty(name = "警种", notes = "")
+    private String policeCategory;
+    /**
+     * 民族
+     */
+    @ApiModelProperty(name = "民族", notes = "")
+    private String nation;
+    /**
+     * 手机号
+     */
+    @ApiModelProperty(name = "手机号", notes = "")
+    private String mobileWork;
+    /**
+     * 机构代码
+     */
+    @ApiModelProperty(name = "机构代码", notes = "")
+    private String orgCode;
+    /**
+     * 职务信息
+     */
+    @ApiModelProperty(name = "职务信息", notes = "")
+    private String postType;
+    /**
+     * 在职类型
+     */
+    @ApiModelProperty(name = "在职类型", notes = "")
+    private String jobType;
+    /**
+     * 远程更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "远程更新时间", notes = "")
+    private Date remoteUpdateTime;
+    /**
+     * 是否删除
+     */
+    @ApiModelProperty(name = "是否删除", notes = "")
+    private String deleted;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "创建时间", notes = "")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(name = "修改时间", notes = "")
+    private Date updateTime;
+}

+ 25 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/OperateTipResp.java

@@ -0,0 +1,25 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+@Data
+@ApiModel(description = "操作提示")
+public class OperateTipResp {
+
+    @ApiModelProperty(value = "类型")
+    private String type;
+
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+}

+ 25 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/RzyRiskInfoRespVO.java

@@ -0,0 +1,25 @@
+package com.dragonsoft.dcuc.approve.model.resp;
+
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+@ApiModel(description = "日志易风险内容返回")
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RzyRiskInfoRespVO extends ZeroTrustMessageRespVO {
+
+    @ApiModelProperty(value = "校验码")
+    private String checkSum;
+
+}

+ 85 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustAppItemUserTokenInfoRespVO.java

@@ -0,0 +1,85 @@
+package com.dragonsoft.dcuc.approve.model.resp.bim;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 应用令牌信息中的用户令牌信息
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@Data
+@ApiModel(value = "应用令牌信息中的用户令牌信息")
+public class ZeroTrustAppItemUserTokenInfoRespVO {
+
+    /**
+     * 用户令牌标识
+     */
+    @ApiModelProperty(value = "用户令牌标识")
+    private String userTokenId;
+
+    /**
+     * 用户标识
+     */
+    @ApiModelProperty(value = "用户标识")
+    private String pid;
+
+    /**
+     * 组织机构编码
+     */
+    @ApiModelProperty(value = "组织机构编码")
+    private String orgCode;
+
+    /**
+     * 用户IP
+     */
+    @ApiModelProperty(value = "用户IP")
+    private String ip;
+
+    /**
+     * 用户名称
+     */
+    @ApiModelProperty(value = "用户名称")
+    private String name;
+
+    /**
+     * 终端设备标识
+     */
+    @ApiModelProperty(value = "终端设备标识")
+    private String mid;
+
+    /**
+     * 终端环境类型
+     */
+    @ApiModelProperty(value = "终端环境类型")
+    private String env;
+
+    /**
+     * 用户令牌创建时间
+     */
+    @ApiModelProperty(value = "应用令牌创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 用户令牌到期时间
+     */
+    @ApiModelProperty(value = "应用令牌到期时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expireAt;
+
+
+    /**
+     * 用户令牌签名
+     */
+    @ApiModelProperty(value = "用户令牌签名")
+    private String sign;
+}

+ 62 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustAppTokenInfoRespVO.java

@@ -0,0 +1,62 @@
+package com.dragonsoft.dcuc.approve.model.resp.bim;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 应用令牌校验服务接口
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@ApiModel(value = "应用令牌信息服务")
+@Data
+public class ZeroTrustAppTokenInfoRespVO {
+
+    /**
+     * 应用令牌ID
+     */
+    @ApiModelProperty(value = "应用令牌ID")
+    private String appTokenId;
+
+    /**
+     * 应用令牌创建时间
+     */
+    @ApiModelProperty(value = "应用令牌创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 应用令牌到期时间
+     */
+    @ApiModelProperty(value = "应用令牌到期时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expireAt;
+
+    /**
+     * 应用标识
+     */
+    @ApiModelProperty(value = "应用标识")
+    private String appId;
+
+
+    /**
+     * 用户令牌详细信息
+     */
+    @ApiModelProperty(value = "用户令牌详细信息")
+    private ZeroTrustAppItemUserTokenInfoRespVO userToken;
+
+    /**
+     * 应用令牌签名
+     */
+    @ApiModelProperty(value = "应用令牌签名")
+    private String sign;
+
+}

+ 21 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustUserTokenInfoReqVO.java

@@ -0,0 +1,21 @@
+package com.dragonsoft.dcuc.approve.model.resp.bim;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * 用户令牌校验服务接口
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@Data
+public class ZeroTrustUserTokenInfoReqVO {
+
+    /**
+     * 用户令牌标识
+     */
+    private String userTokenId;
+
+}

+ 85 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bim/ZeroTrustUserTokenInfoRespVO.java

@@ -0,0 +1,85 @@
+package com.dragonsoft.dcuc.approve.model.resp.bim;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户令牌信息
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@Data
+@ApiModel(value = "用户令牌信息")
+public class ZeroTrustUserTokenInfoRespVO {
+    /**
+     * 用户令牌标识
+     */
+    @ApiModelProperty(value = "用户令牌标识")
+    private String userTokenId;
+
+    /**
+     * 用户令牌创建时间
+     */
+    @ApiModelProperty(value = "用户令牌创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 用户令牌到期时间
+     */
+    @ApiModelProperty(value = "用户令牌到期时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expireAt;
+
+
+    /**
+     * 用户标识
+     */
+    @ApiModelProperty(value = "用户标识")
+    private String pid;
+
+    /**
+     * 组织机构编码
+     */
+    @ApiModelProperty(value = "组织机构编码")
+    private String orgCode;
+
+    /**
+     * 终端IP地址
+     */
+    @ApiModelProperty(value = "终端IP地址")
+    private String ip;
+
+    /**
+     * 终端设备标识
+     */
+    @ApiModelProperty(value = "终端设备标识")
+    private String mid;
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 终端环境类型
+     */
+    @ApiModelProperty(value = "终端环境类型")
+    private String env;
+
+    /**
+     * 用户令牌签名
+     */
+    @ApiModelProperty(value = "用户令牌签名")
+    private String sign;
+
+
+}

+ 65 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizApproveGridReqVO.java

@@ -0,0 +1,65 @@
+package com.dragonsoft.dcuc.approve.model.resp.bu;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+@Setter
+@Getter
+@ToString
+@ApiModel(value = "流程业务数据")
+public class BuApproveSyncBizApproveGridReqVO {
+
+    @NotBlank
+    @ApiModelProperty(value = "数据唯一ID")
+    private String id;
+
+    @NotBlank
+    @ApiModelProperty(value = "业务数据类型")
+    private String bizDataType;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务ID")
+    private String bizId;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务审批模式")
+    private String approveMode;
+
+    @ApiModelProperty(value = "要素内容,bizDataType为02时必填")
+    private String elementNumber;
+
+    @ApiModelProperty(value = "要素类型编码,bizDataType为02时必填")
+    private String elementType;
+
+    @ApiModelProperty(value = "要素有效期开始时间,bizDataType为02时必填")
+    private String elementTermStart;
+
+    @ApiModelProperty(value = "要素有效期结束时间,bizDataType为02时必填")
+    private String elementTermEnd;
+
+    @ApiModelProperty(value = "承办单位编码")
+    private String handleUnitCode;
+
+    @ApiModelProperty(value = "承办单位名称")
+    private String handleUnitName;
+
+    @ApiModelProperty(value = "承办人ID")
+    private String handleUserId;
+
+    @ApiModelProperty(value = "承办人姓名")
+    private String handleUserName;
+
+}

+ 55 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizApproveReqVO.java

@@ -0,0 +1,55 @@
+package com.dragonsoft.dcuc.approve.model.resp.bu;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+@Setter
+@Getter
+@ToString
+@ApiModel(value = "流程业务数据")
+public class BuApproveSyncBizApproveReqVO {
+
+    @NotBlank
+    @ApiModelProperty(value = "任务ID")
+    private String bizId;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务名称")
+    private String bizTitle;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务类型编码")
+    private String taskClass;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务审批方式")
+    private String approveMode;
+
+    @NotNull
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "任务有效期开始时间")
+    private Date bizTermStart;
+
+    @NotNull
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "任务有效期结束时间")
+    private Date bizTermEnd;
+
+
+}

+ 36 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncBizDataReqVO.java

@@ -0,0 +1,36 @@
+package com.dragonsoft.dcuc.approve.model.resp.bu;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+@Setter
+@Getter
+@ToString
+@ApiModel(value = "流程业务数据")
+public class BuApproveSyncBizDataReqVO {
+
+    @NotNull
+    @Valid
+    @ApiModelProperty(value = "任务数据")
+    private BuApproveSyncBizApproveReqVO bizApprove;
+
+    @Valid
+    @ApiModelProperty(value = "要素/承办人数据")
+    private List<BuApproveSyncBizApproveGridReqVO> bizApproveGrid;
+
+}

+ 74 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/bu/BuApproveSyncReqVO.java

@@ -0,0 +1,74 @@
+package com.dragonsoft.dcuc.approve.model.resp.bu;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+@Setter
+@Getter
+@ToString
+@ApiModel(value = "BU审批同步接口")
+public class BuApproveSyncReqVO {
+
+    @NotBlank
+    @ApiModelProperty(value = "来源系统编码")
+    private String appId;
+
+    @NotBlank
+    @ApiModelProperty(value = "来源系统名称")
+    private String appName;
+
+    @NotNull
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "任务创建时间")
+    private Date createTime;
+
+    @NotNull
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "任务审批结束时间")
+    private Date finishTime;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务创建人ID")
+    private String pid;
+
+    // todo 任务最终审批人
+
+    @NotBlank
+    @ApiModelProperty(value = "任务最终审批人身份证编号")
+    private String lastReviewerIdCard;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务最终审批人名称")
+    private String lastReviewerName;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务最终审批人单位ID")
+    private String lastReviewerUnitCode;
+
+    @NotBlank
+    @ApiModelProperty(value = "任务最终审批人单位名称")
+    private String lastReviewerUnit;
+
+    @NotNull
+    @Valid
+    @ApiModelProperty(value = "流程业务数据")
+    private BuApproveSyncBizDataReqVO bizData;
+
+}

+ 50 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/taskclass/ApiTaskClassRespVO.java

@@ -0,0 +1,50 @@
+package com.dragonsoft.dcuc.approve.model.resp.taskclass;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/11
+ */
+@Data
+@ApiModel(description = "任务类型列表")
+public class ApiTaskClassRespVO {
+
+    /**
+     * 任务类型代码
+     */
+    @ApiModelProperty(value = "任务类型代码")
+    private String taskClassCode;
+    /**
+     * 任务类型名称
+     */
+    @ApiModelProperty(value = "任务类型名称")
+    private String taskClassName;
+    /**
+     * 父任务类型ID
+     */
+    @ApiModelProperty(value = "父任务类型ID")
+    private String parentId;
+    /**
+     * 父任务类型代码
+     */
+    @ApiModelProperty(value = "父任务类型代码")
+    private String parentClassCode;
+    /**
+     * 父任务类型名称
+     */
+    @ApiModelProperty(value = "父任务类型名称")
+    private String parentClassName;
+
+    /**
+     * 来源应用代码
+     */
+    @ApiModelProperty(value = "来源应用代码")
+    private String sourceAppCode;
+}

+ 44 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/taskclass/ApiTaskDetailRespVO.java

@@ -0,0 +1,44 @@
+package com.dragonsoft.dcuc.approve.model.resp.taskclass;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ * 任务详情
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/11
+ */
+@Data
+@ApiModel(description = "任务详情")
+public class ApiTaskDetailRespVO {
+
+    /**
+     * 任务代码
+     */
+    @ApiModelProperty(value = "任务代码")
+    private String taskCode;
+
+    /**
+     * 任务名称
+     */
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    /**
+     * 任务类型代码
+     */
+    @ApiModelProperty(value = "任务类型代码")
+    private String taskClassCode;
+
+    /**
+     * 任务类型名称
+     */
+    @ApiModelProperty(value = "任务类型名称")
+    private String taskClassName;
+
+
+}

+ 24 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustApproveCreateV3RespVO.java

@@ -0,0 +1,24 @@
+package com.dragonsoft.dcuc.approve.model.resp.v3;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/5/22
+ */
+@Data
+@ApiModel("流程提交返回内容")
+public class ZeroTrustApproveCreateV3RespVO {
+
+    /**
+     * 流程实例Id
+     */
+    @ApiModelProperty("流程实例Id")
+    private String processInstId;
+}

+ 109 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustMessageRespVO.java

@@ -0,0 +1,109 @@
+package com.dragonsoft.dcuc.approve.model.resp.v3;
+
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Data;
+
+/**
+ * <p>
+ * 用户令牌校验返回
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@JsonPropertyOrder({"statusCode", "message"})
+@Data
+public class ZeroTrustMessageRespVO {
+
+    /**
+     * “0000” 表示令牌有效;
+     * 其他值表示无效或接口调用出错
+     */
+    @JsonProperty("status_code")
+    private String statusCode;
+
+    /**
+     * 状态码对应的详细描述
+     */
+    private String message;
+
+    /**
+     * 设置业务枚举
+     *
+     * @param zeroTrustBusinessRespEnum 业务枚举
+     */
+    public void setBusinessRespEnum(ZeroTrustBusinessRespEnum zeroTrustBusinessRespEnum) {
+        setStatusCode(zeroTrustBusinessRespEnum.getValue());
+        setMessage(zeroTrustBusinessRespEnum.getLabel());
+    }
+
+
+    /**
+     * 设置业务枚举
+     *
+     * @param zeroTrustBusinessRespEnum 业务枚举
+     */
+    public static ZeroTrustMessageRespVO messageEnumMessage(ZeroTrustBusinessRespEnum zeroTrustBusinessRespEnum) {
+        ZeroTrustMessageRespVO zeroTrustMessageRespVO = new ZeroTrustMessageRespVO();
+        zeroTrustMessageRespVO.setBusinessRespEnum(zeroTrustBusinessRespEnum);
+        return zeroTrustMessageRespVO;
+    }
+
+    /**
+     * 设置请求参数异常
+     *
+     * @param message 异常信息
+     */
+    public static ZeroTrustMessageRespVO requestErrorMessage(String message) {
+        return messageEnumMessage(ZeroTrustBusinessRespEnum.OPERATE_FAIL, message);
+    }
+
+    /**
+     * 设置请求参数异常
+     *
+     * @param zeroTrustBusinessRespEnum 枚举
+     * @param message          异常信息
+     */
+    public static ZeroTrustMessageRespVO messageEnumMessage(ZeroTrustBusinessRespEnum zeroTrustBusinessRespEnum, String message) {
+        ZeroTrustMessageRespVO zeroTrustMessageRespVO = new ZeroTrustMessageRespVO();
+        zeroTrustMessageRespVO.setStatusCode(zeroTrustBusinessRespEnum.getValue());
+        zeroTrustMessageRespVO.setMessage(message);
+        return zeroTrustMessageRespVO;
+    }
+
+    /**
+     * 是否成功
+     *
+     * @return 是否成功
+     */
+    @JsonIgnore
+    public boolean isRespSuccess() {
+        return this.statusCode.equalsIgnoreCase(ZeroTrustBusinessRespEnum.SUCCESS.getValue());
+    }
+
+    /**
+     * 是否失败
+     *
+     * @return 是否失败
+     */
+    @JsonIgnore
+    public boolean isRespFail() {
+        return !isRespSuccess();
+    }
+
+    /**
+     * 转发Result返回
+     *
+     * @param <T> 泛型
+     * @return Result返回
+     */
+    public <T> ZeroTrustResultDataVO<T> toResultRespVO() {
+        ZeroTrustResultDataVO<T> objectZeroTrustResultDataVO = new ZeroTrustResultDataVO<>();
+        objectZeroTrustResultDataVO.setStatusCode(statusCode);
+        objectZeroTrustResultDataVO.setMessage(message);
+        return objectZeroTrustResultDataVO;
+    }
+}

+ 75 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustResultDataVO.java

@@ -0,0 +1,75 @@
+package com.dragonsoft.dcuc.approve.model.resp.v3;
+
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 返回数据
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@JsonPropertyOrder({"statusCode", "message", "data"})
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ZeroTrustResultDataVO<T> extends ZeroTrustMessageRespVO {
+
+    /***
+     * 返回内容
+     */
+    private T data;
+
+    public static <T> ZeroTrustResultDataVO<T> success(T result) {
+        ZeroTrustResultDataVO<T> objectZeroTrustResultDataVO = new ZeroTrustResultDataVO<>();
+        objectZeroTrustResultDataVO.setBusinessRespEnum(ZeroTrustBusinessRespEnum.SUCCESS);
+        objectZeroTrustResultDataVO.setData(result);
+        return objectZeroTrustResultDataVO;
+    }
+
+
+    /**
+     * 设置失败信息
+     *
+     * @param message 失败信息
+     * @param <T>     泛型
+     * @return 消息
+     */
+    public static <T> ZeroTrustResultDataVO<T> operateFailMessage(String message) {
+        ZeroTrustResultDataVO<T> objectZeroTrustResultDataVO = new ZeroTrustResultDataVO<>();
+        objectZeroTrustResultDataVO.setBusinessRespEnum(ZeroTrustBusinessRespEnum.OPERATE_FAIL);
+        objectZeroTrustResultDataVO.setMessage(message);
+        return objectZeroTrustResultDataVO;
+    }
+
+    /**
+     * 设置枚举消息
+     *
+     * @param zeroTrustBusinessRespEnum 枚举类型
+     * @param <T>                       泛型
+     * @return 消息
+     */
+    public static <T> ZeroTrustResultDataVO<T> resultEnumMessage(ZeroTrustBusinessRespEnum zeroTrustBusinessRespEnum) {
+        ZeroTrustResultDataVO<T> objectZeroTrustResultDataVO = new ZeroTrustResultDataVO<>();
+        objectZeroTrustResultDataVO.setBusinessRespEnum(zeroTrustBusinessRespEnum);
+        return objectZeroTrustResultDataVO;
+    }
+
+    /**
+     * 设置枚举消息和内容
+     *
+     * @param zeroTrustBusinessRespEnum 枚举类型
+     * @param data                      内容
+     * @param <T>                       泛型
+     * @return 消息
+     */
+    public static <T> ZeroTrustResultDataVO<T> resultEnumMessage(ZeroTrustBusinessRespEnum zeroTrustBusinessRespEnum, T data) {
+        ZeroTrustResultDataVO<T> objectZeroTrustResultDataVO = new ZeroTrustResultDataVO<>();
+        objectZeroTrustResultDataVO.setBusinessRespEnum(zeroTrustBusinessRespEnum);
+        objectZeroTrustResultDataVO.setData(data);
+        return objectZeroTrustResultDataVO;
+    }
+}

+ 60 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/v3/ZeroTrustResultRespVO.java

@@ -0,0 +1,60 @@
+package com.dragonsoft.dcuc.approve.model.resp.v3;
+
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 返回数据
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2022/8/1
+ */
+@JsonPropertyOrder({"statusCode", "message", "result"})
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ZeroTrustResultRespVO<T> extends ZeroTrustMessageRespVO {
+
+    /***
+     * 返回内容
+     */
+    private T result;
+
+    public static <T> ZeroTrustResultRespVO<T> success(T result) {
+        ZeroTrustResultRespVO<T> objectZeroTrustResultRespVO = new ZeroTrustResultRespVO<>();
+        objectZeroTrustResultRespVO.setBusinessRespEnum(ZeroTrustBusinessRespEnum.SUCCESS);
+        objectZeroTrustResultRespVO.setResult(result);
+        return objectZeroTrustResultRespVO;
+    }
+
+    /**
+     * 设置枚举消息
+     *
+     * @param businessRespEnum 枚举类型
+     * @param <T>              泛型
+     * @return 消息
+     */
+    public static <T> ZeroTrustResultRespVO<T> resultEnumMessage(ZeroTrustBusinessRespEnum businessRespEnum) {
+        ZeroTrustResultRespVO<T> objectZeroTrustResultRespVO = new ZeroTrustResultRespVO<>();
+        objectZeroTrustResultRespVO.setBusinessRespEnum(businessRespEnum);
+        return objectZeroTrustResultRespVO;
+    }
+
+    /**
+     * 设置枚举消息和内容
+     *
+     * @param businessRespEnum 枚举类型
+     * @param result           内容
+     * @param <T>              泛型
+     * @return 消息
+     */
+    public static <T> ZeroTrustResultRespVO<T> resultEnumMessage(ZeroTrustBusinessRespEnum businessRespEnum, T result) {
+        ZeroTrustResultRespVO<T> objectZeroTrustResultRespVO = new ZeroTrustResultRespVO<>();
+        objectZeroTrustResultRespVO.setBusinessRespEnum(businessRespEnum);
+        objectZeroTrustResultRespVO.setResult(result);
+        return objectZeroTrustResultRespVO;
+    }
+}

二進制
approve-core-service/lib/nosql-kafka-1.1.0-SNAPSHOT.jar


+ 53 - 28
approve-core-service/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>approve-core</artifactId>
         <groupId>com.dragoninfo.dcuc</groupId>
-        <version>1.2.1-tjdsj-SNAPSHOT</version>
+        <version>1.3.0-tjdsj-SNAPSHOT</version>
     </parent>
 
     <artifactId>approve-core-service</artifactId>
@@ -43,7 +43,6 @@
         <dependency>
             <groupId>com.dragoninfo</groupId>
             <artifactId>dcuc-duceap-api</artifactId>
-            <version>2.1.2-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>com.dragonsoft</groupId>
@@ -63,11 +62,7 @@
 
 
         <!--配置第三方组件开始-->
-        <!--oracle 引入-->
-        <!--<dependency>-->
-        <!--<groupId>com.oracle</groupId>-->
-        <!--<artifactId>ojdbc6</artifactId>-->
-        <!--</dependency>-->
+
         <!--mysql 引入-->
         <dependency>
             <groupId>mysql</groupId>
@@ -88,11 +83,19 @@
             <artifactId>spring-kafka</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>sm-tools-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.dragonsoft</groupId>
+            <artifactId>sm-tools-local</artifactId>
+        </dependency>
+
         <!--对接审计-->
         <dependency>
             <groupId>com.dragonsoft</groupId>
             <artifactId>auditlog-qm-tj</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
             <exclusions>
                 <exclusion>
                     <artifactId>joda-time</artifactId>
@@ -106,10 +109,20 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>junit-jupiter</artifactId>
+                    <groupId>org.junit.jupiter</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>mockito-junit-jupiter</artifactId>
+                    <groupId>org.mockito</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
-            <groupId>org.junit.platform</groupId>
-            <artifactId>junit-platform-launcher</artifactId>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
         <!--配置 spring 结束-->
@@ -145,22 +158,7 @@
         </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>
@@ -171,8 +169,35 @@
         <dependency>
             <groupId>com.dragoninfo</groupId>
             <artifactId>dcuc-duceap-model</artifactId>
-            <version>2.1.2-SNAPSHOT</version>
-            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.rholder</groupId>
+            <artifactId>guava-retrying</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.dreamhead</groupId>
+            <artifactId>moco-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.dreamhead</groupId>
+            <artifactId>moco-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>it.ozimov</groupId>
+            <artifactId>embedded-redis</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-simple</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 

+ 12 - 2
approve-core-service/src/main/assembly/assembly.xml

@@ -1,5 +1,5 @@
-<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           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>
@@ -39,5 +39,15 @@
             </includes>
             <fileMode>0755</fileMode>
         </fileSet>
+        <fileSet>
+            <directory>src/main/resources/</directory>
+            <outputDirectory>conf</outputDirectory>
+            <includes>
+                <include>*.yml</include>
+                <include>logback.xml</include>
+                <include>logback-dragon.xml</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
     </fileSets>
 </assembly>

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

@@ -1,60 +0,0 @@
-#驱动方式(默认)
-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

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

@@ -1,37 +0,0 @@
-<?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>

+ 5 - 4
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/ApproveApplication.java

@@ -3,21 +3,22 @@ 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.ConfigurationPropertiesScan;
 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;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @author wangrs
  * @date 2021/01/22
  */
+@EnableScheduling
 @SpringBootApplication(scanBasePackages = {"com.dragonsoft.*", "com.dragoninfo.*"})
 @EnableDiscoveryClient
-@EnableFeignClients(basePackages = {"com.dragonsoft.*","com.dragoninfo.*"})
-@EnableConfigurationProperties()
+@EnableFeignClients(basePackages = {"com.dragonsoft.*", "com.dragoninfo.*"})
 @MapperScan("com.dragonsoft.dcuc.**.mapper")
-@PropertySource("classpath:approve-core-nosql.properties")
+@ConfigurationPropertiesScan("com.dragonsoft.dcuc.approve.properties")
 public class ApproveApplication {
 
     public static void main(String[] args) {

+ 30 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveApiBusiness.java

@@ -0,0 +1,30 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCreateReqV3VO;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+public interface IApproveApiBusiness {
+    /**
+     * 校验签名
+     *
+     * @param zeroTrustApproveCreateReqV3VO 审批接口请求信息
+     * @return 是否通过
+     */
+    boolean checkCallerSign(ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO);
+
+
+    /**
+     * 检测taskId格式
+     *
+     * @param taskId taskId
+     * @return 是否正确
+     */
+    boolean checkTaskId(String taskId);
+}

+ 33 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveBaseBusiness.java

@@ -0,0 +1,33 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/8
+ */
+public interface IApproveBaseBusiness {
+
+
+    /**
+     * 转换结束时间
+     *
+     * @param endTime 结束时间
+     * @return 结束时间
+     */
+    Date parseEndTime(Date endTime);
+
+
+    /**
+     * 构建审批单号
+     *
+     * @param appCode 应用代码
+     * @param orgCode 机构代码
+     * @return 审批单号
+     */
+    String buildApproveNo(String appCode, String orgCode);
+}

+ 0 - 21
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveBusiness.java

@@ -29,27 +29,6 @@ import java.util.List;
  */
 public interface IApproveBusiness {
 
-    /**
-     * 转换结束时间
-     *
-     * @param endTime 结束时间
-     * @return 结束时间
-     */
-    Date parseEndTime(Date endTime);
-
-    /**
-     * 构建审批单号
-     *
-     * @return 审批单号
-     */
-    String buildApproveNo();
-
-    /**
-     * 审批完成后发送消息
-     *
-     * @param approveMessageInfoDTO 审批信息
-     */
-    void sendApproveResultMessage(ApproveMessageInfoDTO approveMessageInfoDTO);
 
     /**
      * 删除待办数据,新增已办数据

+ 18 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveExpirationBusiness.java

@@ -0,0 +1,18 @@
+package com.dragonsoft.dcuc.approve.business;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+public interface IApproveExpirationBusiness {
+
+    /**
+     * 调度任务
+     */
+    void schedulingExpirationTask();
+
+}

+ 3 - 6
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveLogBusiness.java

@@ -1,6 +1,7 @@
 package com.dragonsoft.dcuc.approve.business;
 
 import com.dragoninfo.dcuc.duceap.enums.ManageDisposeTypeEnum;
+import com.dragonsoft.dcuc.approve.dto.ApproveLogDTO;
 import com.dragonsoft.dcuc.approve.enumresources.ApproveResultEnum;
 import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOperationEnum;
 import com.dragonsoft.dcuc.approve.enumresources.CommitTypeEnum;
@@ -8,9 +9,6 @@ import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
 import com.dragonsoft.dcuc.approve.model.resp.OperateRespVO;
 import com.dragonsoft.dcuc.approve.model.vo.LogDto;
 import com.dragonsoft.duceap.duwf.api.model.ProcessInstanceVO;
-import com.dragonsoft.mq.client.model.entity.MessageInfoDTO;
-
-import java.util.Map;
 
 /**
  * 代码千万行,注释第一行,编码不规范,同事两行泪
@@ -57,10 +55,9 @@ public interface IApproveLogBusiness {
     /**
      * 处理日志消息进行保存
      *
-     * @param map            内容
-     * @param messageInfoDTO 消息内容
+     * @param approveLogDTO 消息内容
      */
-    void saveLog(Map<String, String> map, MessageInfoDTO messageInfoDTO);
+    void saveLog(ApproveLogDTO approveLogDTO);
 
     /**
      * 构建日志Dto

+ 41 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IApproveTaskBusiness.java

@@ -0,0 +1,41 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskClassRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskDetailRespVO;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/11
+ */
+public interface IApproveTaskBusiness {
+    /**
+     * 获取任务类型列表
+     *
+     * @return 任务类型列表
+     */
+    ResponseDTO<List<ApiTaskClassRespVO>> taskClassList();
+
+    /**
+     * 根据任务代码获取任务详情
+     *
+     * @param taskCode 任务标识
+     * @return 任务详情
+     */
+    ResponseDTO<ApiTaskDetailRespVO> taskDetail(String taskCode);
+
+    /**
+     * 根据用户、应用代码获取对应的任务列表
+     *
+     * @param userToken 用户令牌
+     * @param appCode   应用代码
+     * @return 任务列表
+     */
+    ResponseDTO<List<ApiTaskDetailRespVO>> getUserAppTaskList(String userToken, String appCode);
+}

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

@@ -0,0 +1,26 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.resp.OperateTipResp;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+public interface IApproveTipsBusiness {
+
+    /**
+     * 操作提示
+     *
+     * @param processInstanceId 流程实例ID
+     * @return 状态
+     */
+    ResponseDTO<List<OperateTipResp>> operateTips(String processInstanceId);
+
+}

+ 31 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IBimBusiness.java

@@ -0,0 +1,31 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustUserTokenInfoRespVO;
+
+/**
+ * <p>
+ * 竹云相关
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+public interface IBimBusiness {
+
+    /**
+     * 获取用户令牌信息
+     *
+     * @param useTokenId 用户令牌标识
+     * @return 用户令牌信息
+     */
+    ZeroTrustUserTokenInfoRespVO getUserTokenInfo(String useTokenId);
+
+    /**
+     * 获取应用令牌信息
+     *
+     * @param appTokenId 应用令牌标识
+     * @return 应用令牌信息
+     */
+    ZeroTrustAppTokenInfoRespVO getAppTokenInfo(String appTokenId);
+}

+ 29 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IBuSyncBusiness.java

@@ -0,0 +1,29 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.resp.bu.BuApproveSyncReqVO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+public interface IBuSyncBusiness {
+
+    /**
+     * 同步到BU
+     */
+    ResponseStatus syncTuBu();
+
+    /**
+     * 同步到BU
+     *
+     * @param approveRecordInfo 请求同步请求
+     * @return 状态
+     */
+    ResponseStatus syncToBu(ApproveRecordInfo approveRecordInfo);
+}

+ 60 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/ICacheBusiness.java

@@ -0,0 +1,60 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.dto.zerotrust.AppTokenInfoDTO;
+import com.dragonsoft.dcuc.approve.dto.zerotrust.UserTokenInfoDTO;
+
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+public interface ICacheBusiness {
+    /**
+     * 保存机构同步时间
+     *
+     * @param date 时间
+     */
+    void saveOrgSyncTime(Date date);
+
+    /**
+     * 保存用户同步时间
+     *
+     * @param date 时间
+     */
+    void saveUserSyncTime(Date date);
+
+    /**
+     * 获取上次机构同步时间
+     *
+     * @return 时间
+     */
+    Date getLastOrgSyncTime();
+
+    /**
+     * 获取上次用户同步时间
+     *
+     * @return 时间
+     */
+    Date getLastUserSyncTime();
+
+    /**
+     * 接收用户令牌处理
+     *
+     * @param tokenInfo
+     * @param action
+     */
+    void appTokenActionHandle(AppTokenInfoDTO tokenInfo, String action);
+
+    /**
+     * 接收应用令牌处理
+     *
+     * @param tokenInfo
+     * @param action
+     */
+    void userTokenActionHandle(UserTokenInfoDTO tokenInfo, String action);
+}

+ 30 - 11
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IDcucBusiness.java

@@ -1,10 +1,10 @@
 package com.dragonsoft.dcuc.approve.business;
 
-import com.dragonsoft.dcuc.approve.model.resp.PoliceResultVO;
-import com.dragonsoft.dcuc.approve.model.vo.OauthUserVO;
-
-import java.util.List;
-import java.util.Map;
+import com.dragoninfo.dcuc.common.entity.ApiResultPage;
+import com.dragoninfo.dcuc.common.entity.ApiSearchReq;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiOrgResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiPoliceResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
 
 /**
  * <p>
@@ -15,12 +15,6 @@ import java.util.Map;
  * @date 2021/7/12
  */
 public interface IDcucBusiness {
-    /***
-     * 获取警员列表
-     * @param pageMap
-     * @return
-     */
-    List<PoliceResultVO> getPoliceList(Map<String, Object> pageMap);
 
     /**
      * 获取认证用户信息
@@ -29,4 +23,29 @@ public interface IDcucBusiness {
      * @return 认证用户信息
      */
     OauthUserVO getOauthUserInfoByIdcard(String searchIdcard);
+
+    /**
+     * 获取机构信息
+     *
+     * @param orgCode 机构代码
+     * @return 机构信息
+     */
+    ApiOrgResultVo orgInfo(String orgCode);
+
+    /**
+     * 获取机构列表
+     *
+     * @param apiSearchReq 请求参数
+     * @return 机构列表
+     */
+    ApiResultPage<ApiOrgResultVo> orgPage(ApiSearchReq apiSearchReq);
+
+    /**
+     * 获取警员列表
+     *
+     * @param apiSearchReq 请求参数
+     * @return 警员列表
+     */
+    ApiResultPage<ApiPoliceResultVo> policePage(ApiSearchReq apiSearchReq);
+
 }

+ 32 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/INoticeBusiness.java

@@ -0,0 +1,32 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCallbackReqV3VO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/3/8
+ */
+public interface INoticeBusiness {
+    /**
+     * 审批结果通知
+     *
+     * @param callbackUrl                     回调地址
+     * @param zeroTrustApproveCallbackReqV3VO 消息内容
+     * @return 状态
+     */
+    ResponseStatus retryApproveNotification(String callbackUrl, ZeroTrustApproveCallbackReqV3VO zeroTrustApproveCallbackReqV3VO);
+
+    /**
+     * 审批结果通知
+     *
+     * @param callbackUrl                     回调地址
+     * @param zeroTrustApproveCallbackReqV3VO 内容
+     * @return 状态
+     */
+    ResponseStatus baseApproveNotification(String callbackUrl, ZeroTrustApproveCallbackReqV3VO zeroTrustApproveCallbackReqV3VO);
+}

+ 34 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IRiskBusiness.java

@@ -0,0 +1,34 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+public interface IRiskBusiness {
+
+    /**
+     * 申请人与审批人相同风险
+     *
+     * @param applyIdcard    申请人
+     * @param operateIdcard  操作人
+     * @param createUserName 名称
+     * @return 是否无风险信息
+     */
+    ResponseStatus commitApproveRepetitionRisk(String applyIdcard, String operateIdcard, String createUserName);
+
+    /**
+     * 单人联系审批风险
+     *
+     * @param approveRecordId 审批单ID
+     * @param operateIdcard   审批人
+     * @param createUserName  审批人名称
+     * @return 是否无风险信息
+     */
+    ResponseStatus singleApproveRisk(String approveRecordId, String operateIdcard, String createUserName);
+}

+ 44 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IUserOrgSyncBusiness.java

@@ -0,0 +1,44 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+public interface IUserOrgSyncBusiness {
+
+    /**
+     * 同步所有机构
+     *
+     * @return 状态
+     */
+    ResponseStatus syncAllOrg();
+
+    /**
+     * 同步所有用户
+     *
+     * @return 状态
+     */
+    ResponseStatus syncAllUser();
+
+    /**
+     * 同步新机构
+     *
+     * @return 状态
+     */
+    ResponseStatus syncNewOrg();
+
+    /**
+     * 同步新用户
+     *
+     * @return 状态
+     */
+    ResponseStatus syncNewUser();
+
+
+}

+ 20 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IZeroTrustTokenBusiness.java

@@ -0,0 +1,20 @@
+package com.dragonsoft.dcuc.approve.business;
+
+import com.dragonsoft.dcuc.approve.model.req.v1.token.TokenReceiveVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+
+/**
+ * @author mazq
+ * @date 2023/2/14
+ */
+public interface IZeroTrustTokenBusiness {
+
+    /**
+     * 接收令牌
+     *
+     * @param receiveVo
+     * @return
+     */
+    ZeroTrustMessageRespVO tokenReceive(TokenReceiveVO receiveVo);
+
+}

+ 67 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveApiBusinessImpl.java

@@ -0,0 +1,67 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.dragonsoft.dcuc.approve.business.IApproveApiBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveConstants;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCreateReqV3VO;
+import com.dragonsoft.smtools.loader.SMFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Slf4j
+@Component
+public class ApproveApiBusinessImpl implements IApproveApiBusiness {
+
+    private SMFactory smFactory;
+
+    @Autowired
+    public void setSmFactory(SMFactory smFactory) {
+        this.smFactory = smFactory;
+    }
+
+    @Override
+    public boolean checkCallerSign(ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO) {
+        Assert.notNull(zeroTrustApproveCreateReqV3VO);
+
+        String appTokenId = zeroTrustApproveCreateReqV3VO.getAppTokenId();
+        String processDefId = zeroTrustApproveCreateReqV3VO.getProcessDefId();
+        String title = zeroTrustApproveCreateReqV3VO.getTitle();
+        String taskClass = zeroTrustApproveCreateReqV3VO.getTaskClass();
+        String taskId = zeroTrustApproveCreateReqV3VO.getTaskId();
+        String callbackUrl = zeroTrustApproveCreateReqV3VO.getCallbackUrl();
+
+        List<String> strings = Arrays.asList(appTokenId, processDefId, title, taskClass, taskId, callbackUrl);
+        String origin = String.join(StrUtil.COMMA, strings);
+        log.info("校验签名原文:{}", origin);
+        String generalOrigin = smFactory.getSM3().summary(origin).toString();
+        String callerSign = zeroTrustApproveCreateReqV3VO.getCallerSign();
+
+        log.info("生成后的签名信息:{}", generalOrigin);
+        log.info("传入的签名信息:{}", callerSign);
+        boolean isTrue = generalOrigin.equalsIgnoreCase(callerSign);
+        log.info("签名信息判断结果:{}", isTrue);
+        return isTrue;
+    }
+
+    @Override
+    public boolean checkTaskId(String taskId) {
+        if (StrUtil.isBlank(taskId)) {
+            return false;
+        }
+        return taskId.startsWith(ApproveConstants.TASK_ID_PREFIX);
+
+    }
+}

+ 110 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveBaseBusinessImpl.java

@@ -0,0 +1,110 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.dragonsoft.dcuc.approve.business.IApproveBaseBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveConstants;
+import com.dragonsoft.dcuc.approve.constants.ApproveRedisConstants;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.duceap.commons.util.date.DateConst;
+import com.dragonsoft.duceap.commons.util.date.DateUtils;
+import com.dragonsoft.duceap.commons.util.string.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/8
+ */
+@Slf4j
+@Component
+public class ApproveBaseBusinessImpl implements IApproveBaseBusiness {
+
+    private IApproveRecordService approveRecordService;
+
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Autowired
+    public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
+        this.stringRedisTemplate = stringRedisTemplate;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Override
+    public Date parseEndTime(Date endTime) {
+        if (endTime != null) {
+            String strEndTime = DateUtils.getDateFormat(endTime, DateConst.HYPHEN_DISPLAY_DATE);
+            strEndTime += " 23:59:59";
+            try {
+                endTime = DateUtils.getDate(strEndTime, DateConst.HYPHEN_DISPLAY_TIME.getLabel());
+            } catch (ParseException e) {
+                log.error("parse", e);
+            }
+        }
+        return endTime;
+    }
+
+
+    @Override
+    public String buildApproveNo(String appCode, String orgCode) {
+        Date date = DateUtils.getDate();
+        return generalTaskNo(appCode, orgCode, date);
+    }
+
+    /**
+     * 生成任务ID
+     *
+     * @param appCode 应用编号
+     * @param orgCode 机构代码
+     * @param date    日期
+     * @return 任务ID
+     */
+    protected String generalTaskNo(String appCode, String orgCode, Date date) {
+        Assert.notBlank(appCode);
+        Assert.notBlank(orgCode);
+        Assert.notNull(date);
+
+        String currTimeStr = DateUtils.getTimeStr(date, DateConst.DB_STORE_TIME);
+        String dateTimeStr = DateUtils.getTimeStr(date, DateConst.DB_STORE_DATE);
+
+        // 当日的
+        String key = ApproveRedisConstants.APPROVAL_TASK_ID_PREFIX + appCode + StrUtil.COLON + dateTimeStr;
+        Boolean hasKey = stringRedisTemplate.hasKey(key);
+        Long taskIdNo;
+        // 有Key直接加1
+        if (hasKey != null && hasKey) {
+            taskIdNo = stringRedisTemplate.opsForValue().increment(key);
+        } else {
+            String existTaskId = approveRecordService.getTaskNoByDate(appCode, dateTimeStr);
+            if (StringUtils.isBlank(existTaskId)) {
+                taskIdNo = 1L;
+            } else {
+                taskIdNo = Long.valueOf(existTaskId);
+                taskIdNo += 1;
+            }
+            // 都保留一天,存储量很小,不用担心存储问题
+            Boolean setIfAbsent = stringRedisTemplate.opsForValue().setIfAbsent(key, String.valueOf(taskIdNo), 1, TimeUnit.DAYS);
+            if (setIfAbsent == null || !setIfAbsent) {
+                taskIdNo = stringRedisTemplate.opsForValue().increment(key);
+            }
+        }
+        // 格式化为8位流水号
+        return ApproveConstants.TASK_ID_PREFIX + orgCode + currTimeStr + String.format("%08d", taskIdNo);
+    }
+
+
+}

+ 43 - 84
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveBusinessImpl.java

@@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.dragoninfo.dcuc.common.utils.LangUtil;
 import com.dragoninfo.dcuc.common.utils.ResponseUtil;
-import com.dragoninfo.duceap.commons.util.kafka.KafkaServer;
 import com.dragonsoft.approve.common.ErrorCode;
+import com.dragonsoft.dcuc.approve.business.IApproveBaseBusiness;
 import com.dragonsoft.dcuc.approve.business.IApproveBusiness;
 import com.dragonsoft.dcuc.approve.business.IDcucAuthBusiness;
 import com.dragonsoft.dcuc.approve.business.IWorkFlowBusiness;
@@ -27,10 +27,8 @@ import com.dragonsoft.dcuc.approve.model.req.ResourceInfoReqVO;
 import com.dragonsoft.dcuc.approve.model.resp.ApprovalInfoRespVO;
 import com.dragonsoft.dcuc.approve.model.resp.BatchTaskOperateRespVO;
 import com.dragonsoft.dcuc.approve.model.resp.TaskOperateRespVO;
-import com.dragonsoft.dcuc.approve.model.vo.ApproveMessageInfoDTO;
 import com.dragonsoft.dcuc.approve.model.vo.AuthAppFunApiVO;
 import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
-import com.dragonsoft.dcuc.approve.properties.KafkaProperties;
 import com.dragonsoft.dcuc.approve.service.IApproveActHiTaskService;
 import com.dragonsoft.dcuc.approve.service.IApproveActRunIdentityLinkService;
 import com.dragonsoft.dcuc.approve.service.IApproveActRunTaskService;
@@ -39,15 +37,11 @@ import com.dragonsoft.dcuc.approve.utils.ProofsUtil;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
 import com.dragonsoft.duceap.base.exception.ApplicationException;
-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.json.JsonUtils;
 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.vo.MessageInfoReqVo;
-import com.dragonsoft.mq.client.model.vo.MessageInfoVo;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -56,7 +50,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.validation.constraints.NotBlank;
-import java.text.ParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -72,102 +65,68 @@ import java.util.stream.Collectors;
 @Service
 public class ApproveBusinessImpl implements IApproveBusiness {
 
-    @Autowired
     private IApproveRecordService approveRecordService;
 
-    @Autowired
-    private KafkaServer kafkaServer;
+    private ApproveProperties approveProperties;
 
-    @Autowired
-    private KafkaProperties kafkaProperties;
+    private IApproveActRunTaskService approveActRunTaskService;
+
+    private IApproveActHiTaskService approveActHiTaskService;
+
+    private IApproveActRunIdentityLinkService approveActRunIdentityLinkService;
+
+    private IWorkFlowBusiness workFlowBusiness;
+
+    private IDcucAuthBusiness dcucAuthBusiness;
+
+    private WorkflowClientFactory workflowClientFactory;
+
+    private IApproveBaseBusiness approveBaseBusiness;
 
-    @Autowired
-    private ApproveProperties approveProperties;
 
     @Autowired
-    private IApproveActRunTaskService approveActRunTaskService;
+    public void setApproveBaseBusiness(IApproveBaseBusiness approveBaseBusiness) {
+        this.approveBaseBusiness = approveBaseBusiness;
+    }
 
     @Autowired
-    private IApproveActHiTaskService approveActHiTaskService;
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
 
     @Autowired
-    private IApproveActRunIdentityLinkService approveActRunIdentityLinkService;
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
 
     @Autowired
-    private IWorkFlowBusiness workFlowBusiness;
+    public void setApproveActRunTaskService(IApproveActRunTaskService approveActRunTaskService) {
+        this.approveActRunTaskService = approveActRunTaskService;
+    }
 
     @Autowired
-    private IDcucAuthBusiness dcucAuthBusiness;
+    public void setApproveActHiTaskService(IApproveActHiTaskService approveActHiTaskService) {
+        this.approveActHiTaskService = approveActHiTaskService;
+    }
 
     @Autowired
-    private WorkflowClientFactory workflowClientFactory;
+    public void setApproveActRunIdentityLinkService(IApproveActRunIdentityLinkService approveActRunIdentityLinkService) {
+        this.approveActRunIdentityLinkService = approveActRunIdentityLinkService;
+    }
 
-    @Override
-    public Date parseEndTime(Date endTime) {
-        if (endTime != null) {
-            String strEndTime = DateUtils.getDateFormat(endTime, DateConst.HYPHEN_DISPLAY_DATE);
-            strEndTime += " 23:59:59";
-            try {
-                endTime = DateUtils.getDate(strEndTime, DateConst.HYPHEN_DISPLAY_TIME.getLabel());
-            } catch (ParseException e) {
-                log.error("parse", e);
-            }
-        }
-        return endTime;
+    @Autowired
+    public void setWorkFlowBusiness(IWorkFlowBusiness workFlowBusiness) {
+        this.workFlowBusiness = workFlowBusiness;
     }
 
-    @Override
-    public String buildApproveNo() {
-        String prefix = DateUtils.getTimeStr(new Date(), DateConst.DB_STORE_DATE);
-        ApproveRecordInfo approveRecordInfo = approveRecordService.findByCreateTime(new Date());
-        String no = "00000";
-        if (approveRecordInfo != null) {
-            String approveNo = approveRecordInfo.getApproveNo();
-            no = approveNo.substring(approveNo.indexOf("-") + 1);
-        }
-        return prefix + "-" + String.format("%05d", Integer.parseInt(no) + 1);
+    @Autowired
+    public void setDcucAuthBusiness(IDcucAuthBusiness dcucAuthBusiness) {
+        this.dcucAuthBusiness = dcucAuthBusiness;
     }
 
-    @Override
-    public void sendApproveResultMessage(ApproveMessageInfoDTO approveMessageInfoDTO) {
-        log.info("====审批流程结束,开始发送消息====");
-        String appCode = approveProperties.getAppCode();
-
-        String dateFormat = DateUtils.getDateFormat(DateConst.DB_STORE_TIME);
-        String uuid = UUIDUtils.getUUID();
-        //流程结束且是同意操作才发消息
-        MessageInfoReqVo requestVo = new MessageInfoReqVo();
-        MessageInfoVo messageInfoVo = new MessageInfoVo();
-        String processInstanceId = approveMessageInfoDTO.getProcessInstanceId();
-
-        Map<String, String> map = new HashMap<>(6);
-        map.put("approveNo", approveMessageInfoDTO.getApproveNo());
-        map.put("sourceAppCode", approveMessageInfoDTO.getSourceAppCode());
-        map.put("approveInfo", JsonUtils.toJSONString(approveMessageInfoDTO.getApproveInfo()));
-        map.put("processInstanceId", processInstanceId);
-        map.put("approveResult", approveMessageInfoDTO.getApproveResult().getValue());
-        map.put("messageId", approveMessageInfoDTO.getMessageId());
-
-        List<Map<String, String>> infoSet = new ArrayList<>();
-        infoSet.add(map);
-        messageInfoVo.setTitle("审批系统-权限申请审批");
-        messageInfoVo.setCreateTime(dateFormat);
-        messageInfoVo.setInfoSet(infoSet);
-        messageInfoVo.setContent(processInstanceId);
-        messageInfoVo.setUserSystem("审批系统");
-        messageInfoVo.setUserSystemCode(appCode);
-        messageInfoVo.setUserName("审批系统");
-        messageInfoVo.setMessageId(uuid);
-        messageInfoVo.setInfoType(kafkaProperties.getAuthServiceApplyTopic());
-        List<MessageInfoVo> messageInfoVos = new ArrayList<>();
-        messageInfoVos.add(messageInfoVo);
-        //设置消息
-        requestVo.setMessages(messageInfoVos);
-        requestVo.setTopic(kafkaProperties.getAuthServiceApplyTopic());
-        requestVo.setAppKey(kafkaProperties.getAppKey());
-        requestVo.setAppSecret(kafkaProperties.getAppSecret());
-        log.info("====审批流程结束:开始推送结果,实例ID{}====,消息体为:{}", processInstanceId, JSON.toJSONString(requestVo));
-        kafkaServer.send(requestVo, kafkaProperties.getKafkaServers());
+    @Autowired
+    public void setWorkflowClientFactory(WorkflowClientFactory workflowClientFactory) {
+        this.workflowClientFactory = workflowClientFactory;
     }
 
     /**
@@ -634,7 +593,7 @@ public class ApproveBusinessImpl implements IApproveBusiness {
     @Override
     public void setProcessInfo(ApprovalInfo approvalInfo) {
         // 处理结束时间
-        approvalInfo.setEndTime(this.parseEndTime(approvalInfo.getEndTime()));
+        approvalInfo.setEndTime(approveBaseBusiness.parseEndTime(approvalInfo.getEndTime()));
         //获取流程类型详情
         WorkflowProcesstypeVo workflowProcesstypeVo;
         try {

+ 128 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveExpirationBusinessImpl.java

@@ -0,0 +1,128 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.dragoninfo.dcuc.common.annotation.CacheLock;
+import com.dragonsoft.auditlog.collection.qmtj.LogSendComponent;
+import com.dragonsoft.auditlog.collection.qmtj.pojo.req.ApproveBusLog;
+import com.dragonsoft.dcuc.approve.business.IApproveExpirationBusiness;
+import com.dragonsoft.dcuc.approve.event.listener.ApproveOperateLogEventListener;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.duceap.commons.util.UUIDUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+@Slf4j
+@Component
+public class ApproveExpirationBusinessImpl implements IApproveExpirationBusiness {
+
+    private ApproveProperties approveProperties;
+
+    private IApproveRecordService approveRecordService;
+
+    private LogSendComponent logSendComponent;
+
+    @Autowired
+    public void setLogSendComponent(LogSendComponent logSendComponent) {
+        this.logSendComponent = logSendComponent;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Autowired
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
+
+    @Scheduled(cron = "0 0 * * * ?")
+    @Override
+    public void schedulingExpirationTask() {
+        Integer overdueTimeDays = approveProperties.getExpirationTimeDays();
+        //
+        DateTime date = DateUtil.date();
+        Date startExpirationDateTime = DateUtil.offsetDay(date, -overdueTimeDays);
+
+        execExpirationApprove(startExpirationDateTime);
+    }
+
+    @CacheLock
+    public void execExpirationApprove(Date startExpirationDateTime) {
+        String startExpirationDateTimeString = DateUtil.formatDateTime(startExpirationDateTime);
+        log.info("开始检查超期审批单:超期开始时间 {}", startExpirationDateTimeString);
+        DateTime date = DateUtil.date();
+        // 开始超期的时间
+        List<ApproveRecordInfo> expirationTimeRecord = approveRecordService.findExpirationTimeRecord(startExpirationDateTime);
+        for (ApproveRecordInfo approveRecordInfo : expirationTimeRecord) {
+            approveRecordInfo.setExpirationTime(date);
+            approveRecordInfo.setUpdateTime(date);
+            approveRecordService.updateById(approveRecordInfo);
+            sendAuditOverdueTimeLog(approveRecordInfo);
+        }
+    }
+
+    /**
+     * 发送超期日志
+     *
+     * @param approveRecordInfo 审批单信息
+     */
+    protected void sendAuditOverdueTimeLog(ApproveRecordInfo approveRecordInfo) {
+        String auditSysId = approveProperties.getAuditSysId();
+        String appToken = approveRecordInfo.getApplicantAppToken();
+        String requestIdcard = approveRecordInfo.getApplicantIdcard();
+        String requestUsername = approveRecordInfo.getApplicantName();
+        String requestApproveIp = approveRecordInfo.getApplicantIp();
+        String approveTimeString = System.currentTimeMillis() + "";
+        String approveLogId = UUIDUtils.getUUID();
+        String approveNo = approveRecordInfo.getApproveNo();
+
+        log.info("发送超期日志:审批单号:{}", approveNo);
+
+        ApproveBusLog approveBusLog = new ApproveBusLog();
+        approveBusLog.setAppToken(appToken);
+        approveBusLog.setApplyApproveId(requestIdcard);
+        approveBusLog.setApplyApproveIdCard(requestIdcard);
+        approveBusLog.setApplyApproveName(requestUsername);
+        approveBusLog.setApplyApproveIp(requestApproveIp);
+        approveBusLog.setOperateTime(approveTimeString);
+        // 请求处理
+        approveBusLog.setApplyType("02");
+        // 超期
+        approveBusLog.setBusinessType("23");
+        approveBusLog.setApproveContentHash("");
+        approveBusLog.setApproveTableHash("");
+        approveBusLog.setApproveId("");
+        approveBusLog.setApproveIdCard("");
+        approveBusLog.setApproveName("");
+        approveBusLog.setApproveResult("");
+        approveBusLog.setApproveTime("");
+        approveBusLog.setApproveInforceTime("");
+
+        approveBusLog.setApproveTaskId(approveLogId);
+        approveBusLog.setApplySystemId("");
+        approveBusLog.setApproveCenterId(approveNo);
+        approveBusLog.setExtend("1");
+        approveBusLog.setRelatedId("");
+
+        List<ApproveBusLog> approveBusLogList = Collections.singletonList(approveBusLog);
+        logSendComponent.sendApproveBusLog(auditSysId, ApproveOperateLogEventListener.OPERATE_LOG_TYPE, approveBusLogList);
+    }
+}

+ 123 - 123
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveLogBusinessImpl.java

@@ -1,34 +1,37 @@
 package com.dragonsoft.dcuc.approve.business.impl;
 
-import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.dragoninfo.dcuc.common.Constants;
 import com.dragoninfo.dcuc.common.utils.LangUtil;
+import com.dragoninfo.dcuc.common.utils.ResponseUtil;
 import com.dragoninfo.dcuc.duceap.enums.ManageDisposeTypeEnum;
 import com.dragoninfo.dcuc.duceap.enums.OperateDisposeTypeEnum;
 import com.dragoninfo.dcuc.duceap.enums.RequestDisposeTypeEnum;
 import com.dragoninfo.dcuc.duceap.enums.SchemeTypeEnum;
-import com.dragoninfo.duceap.commons.util.kafka.KafkaServer;
 import com.dragonsoft.dcuc.approve.business.IApproveLogBusiness;
 import com.dragonsoft.dcuc.approve.business.IDcucBusiness;
+import com.dragonsoft.dcuc.approve.business.IRiskBusiness;
 import com.dragonsoft.dcuc.approve.constants.ApproveConstants;
+import com.dragonsoft.dcuc.approve.dto.ApproveLogDTO;
 import com.dragonsoft.dcuc.approve.enumresources.*;
 import com.dragonsoft.dcuc.approve.event.ApproveEventPublish;
 import com.dragonsoft.dcuc.approve.model.*;
 import com.dragonsoft.dcuc.approve.model.resp.OperateRespVO;
-import com.dragonsoft.dcuc.approve.model.vo.*;
+import com.dragonsoft.dcuc.approve.model.vo.LogDto;
+import com.dragonsoft.dcuc.approve.model.vo.LogInfoMetaDTO;
+import com.dragonsoft.dcuc.approve.model.vo.ProcessInstanceInfoDTO;
+import com.dragonsoft.dcuc.approve.model.vo.QmOperateLogDTO;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
 import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
-import com.dragonsoft.dcuc.approve.properties.KafkaProperties;
 import com.dragonsoft.dcuc.approve.service.*;
 import com.dragonsoft.dcuc.approve.utils.ProofsUtil;
+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.ip.IpUtils;
 import com.dragonsoft.duceap.commons.util.json.JsonUtils;
@@ -36,9 +39,6 @@ import com.dragonsoft.duceap.duwf.api.model.OutgoingVo;
 import com.dragonsoft.duceap.duwf.api.model.ProcessInstanceVO;
 import com.dragonsoft.duceap.duwf.api.model.TaskDefinitionVo;
 import com.dragonsoft.duceap.workflow.client.WorkflowClientFactory;
-import com.dragonsoft.mq.client.model.entity.MessageInfoDTO;
-import com.dragonsoft.mq.client.model.vo.MessageInfoReqVo;
-import com.dragonsoft.mq.client.model.vo.MessageInfoVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -63,38 +63,80 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
 
     private static final Logger logger = LoggerFactory.getLogger(ApproveLogBusinessImpl.class);
 
+    private IFlowManageLogService flowManageLogService;
+    private IRequestLogService requestLogService;
+    private IOperateLogService operateLogService;
+
+    private WorkflowClientFactory workflowClientFactory;
+
+    private ApproveProperties approveProperties;
+
+    private IRiskLogService riskLogService;
+
+    private IApproveCirculationService approveCirculationService;
+
+    private ApproveEventPublish approveEventPublish;
+
+    private IRiskSchemeService riskSchemeService;
+
+    private IDcucBusiness dcucBusiness;
+
+    private IRiskBusiness riskBusiness;
+
     @Autowired
-    private KafkaServer kafkaServer;
-    @Autowired
-    private KafkaProperties kafkaProperties;
+    public void setRiskBusiness(IRiskBusiness riskBusiness) {
+        this.riskBusiness = riskBusiness;
+    }
 
     @Autowired
-    private IFlowManageLogService flowManageLogService;
+    public void setFlowManageLogService(IFlowManageLogService flowManageLogService) {
+        this.flowManageLogService = flowManageLogService;
+    }
+
     @Autowired
-    private IRequestLogService requestLogService;
+    public void setRequestLogService(IRequestLogService requestLogService) {
+        this.requestLogService = requestLogService;
+    }
+
     @Autowired
-    private IOperateLogService operateLogService;
+    public void setOperateLogService(IOperateLogService operateLogService) {
+        this.operateLogService = operateLogService;
+    }
 
     @Autowired
-    private WorkflowClientFactory workflowClientFactory;
+    public void setWorkflowClientFactory(WorkflowClientFactory workflowClientFactory) {
+        this.workflowClientFactory = workflowClientFactory;
+    }
 
     @Autowired
-    private ApproveProperties approveProperties;
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
 
     @Autowired
-    private IRiskLogService riskLogService;
+    public void setRiskLogService(IRiskLogService riskLogService) {
+        this.riskLogService = riskLogService;
+    }
 
     @Autowired
-    private IApproveCirculationService approveCirculationService;
+    public void setApproveCirculationService(IApproveCirculationService approveCirculationService) {
+        this.approveCirculationService = approveCirculationService;
+    }
 
     @Autowired
-    private ApproveEventPublish approveEventPublish;
+    public void setApproveEventPublish(ApproveEventPublish approveEventPublish) {
+        this.approveEventPublish = approveEventPublish;
+    }
 
     @Autowired
-    private IRiskSchemeService riskSchemeService;
+    public void setRiskSchemeService(IRiskSchemeService riskSchemeService) {
+        this.riskSchemeService = riskSchemeService;
+    }
 
     @Autowired
-    private IDcucBusiness dcucBusiness;
+    public void setDcucBusiness(IDcucBusiness dcucBusiness) {
+        this.dcucBusiness = dcucBusiness;
+    }
 
 
     /**
@@ -127,7 +169,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
                 break;
             case RECALL:
                 //审批请求日志
-                buildRequestLog(RequestDisposeTypeEnum.RECALL.getValue(), logDto, flowNodeCode, flowNodeName, taskKey, flowKey, processInstanceId);
+                buildRequestLog(RequestDisposeTypeEnum.RECALL.getValue(), logDto, flowNodeCode, flowNodeName, taskKey, flowKey, processInstanceId, "22");
                 break;
             default:
                 break;
@@ -145,7 +187,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
      * @param flowKey      流程key
      */
     private void buildRequestLog(String disposeType, LogDto logDto, String flowNodeCode, String flowNodeName,
-                                 String taskKey, String flowKey, String processInstanceId) {
+                                 String taskKey, String flowKey, String processInstanceId, String businessCode) {
 
         ApprovalInfo approvalInfo = logDto.getApprovalInfo();
         RequestLog requestLog = new RequestLog();
@@ -169,7 +211,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         requestLog.setProcessInstanceId(processInstanceId);
         requestLog.setApproveNo(approvalInfo.getApproveNo());
         //发送审批请求日志到消息中心
-        logger.info("=====发送批申请请求日志-发起消息,消息体为:{}====", JSON.toJSONString(requestLog));
+        logger.info("=====发送批申请请求日志-发起消息,消息体为:{}====", JSON.toJSONString(requestLog));
         LogInfoMetaDTO logInfoMetaDTO = new LogInfoMetaDTO();
         logInfoMetaDTO.setLogType(LogTypeEnum.REQUEST_LOG.getValue());
         logInfoMetaDTO.setTaskKey(taskKey);
@@ -177,7 +219,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         logInfoMetaDTO.setProcessInstanceId(processInstanceId);
         logInfoMetaDTO.setTerminalIp(logDto.getCreateIp());
         // 请求发起
-        logInfoMetaDTO.setBusinessType("21");
+        logInfoMetaDTO.setBusinessType(businessCode);
 
         sendInfo(JSON.toJSONString(requestLog), "审批请求日志", logInfoMetaDTO);
     }
@@ -245,25 +287,20 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         buildFlowManageLogAndSend(logDto, ManageDisposeTypeEnum.DELETED);
     }
 
-    /**
-     * 处理接收到的日志消息
-     *
-     * @param map            内容
-     * @param messageInfoDTO 内容
-     */
     @Override
-    public void saveLog(Map<String, String> map, MessageInfoDTO messageInfoDTO) {
-        LogInfoMetaDTO logInfoMetaDTO = BeanUtil.mapToBean(map, LogInfoMetaDTO.class, false);
+    public void saveLog(ApproveLogDTO approveLogDTO) {
+        String content = approveLogDTO.getContent();
+        LogInfoMetaDTO logInfoMetaDTO = approveLogDTO.getLogInfoMetaDTO();
         String logType = logInfoMetaDTO.getLogType();
         switch (EnumUtils.enumOf(LogTypeEnum.class, logType)) {
             case MANAGE_LOG:
-                saveManageLog(messageInfoDTO.getContent(), logInfoMetaDTO);
+                saveManageLog(content, logInfoMetaDTO);
                 break;
             case REQUEST_LOG:
-                saveRequestLog(messageInfoDTO.getContent(), logInfoMetaDTO);
+                saveRequestLog(content, logInfoMetaDTO);
                 break;
             case OPERATE_LOG:
-                saveOperateLog(messageInfoDTO.getContent(), logInfoMetaDTO);
+                saveOperateLog(content, logInfoMetaDTO);
                 break;
             default:
                 break;
@@ -313,7 +350,6 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
             logIdList.add(operateLogId);
             //流程出口信息
             OutgoingVo outgoingVo = workflowClientFactory.getWorkflowTaskClient().queryStartOutgoing(flowKey);
-            String riskContent;
             if (outgoingVo != null) {
                 boolean needSaveRiskLog = true;
                 //跳过第一个节点
@@ -325,59 +361,41 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
                 }
 
                 if (needSaveRiskLog) {
-                    // 提交人、审批人重复风险判断,跳过第一个节点,只有操作日志才分析提交、审批人风险
                     if (logTypeEnum.equals(LogTypeEnum.OPERATE_LOG)) {
+                        // 提交人、审批人重复风险判断,跳过第一个节点,只有操作日志才分析提交、审批人风险
+                        ResponseStatus commitApproveResponseStatus = riskBusiness.commitApproveRepetitionRisk(applyIdcard, operateIdcard, createUserName);
+                        if (ResponseUtil.isFail(commitApproveResponseStatus)) {
+                            String commitRiskContent = commitApproveResponseStatus.getMessage();
 
-                        if (applyIdcard.equals(operateIdcard)) {
-
-                            RiskScheme riskScheme = riskSchemeService.selectEnableSchemeByType(SchemeTypeEnum.COMMIT_APPROVE_REPETITION_RISK);
-                            if (riskScheme != null) {
-                                riskContent = "审批流程中,提交人与审批人都是:" + createUserName + "(" + operateIdcard + ")。";
-                                //除第一个节点外,审请人和处理人同为一个人,产生《提交人与审批人重复风险》
-
-                                saveRiskLog(businessCode, riskIp, riskContent,
-                                        title, operateIdcard, createUserName,
-                                        applyIdcard, orgName, orgCode,
-                                        createTime, riskScheme.getSchemeType(),
-                                        approveRecordId, processInstanceId, processNo, Collections.singletonList(operateLogId));
-                            }
-
-                        }
-                    }
-
-                    //获取单人连续审批风险方案详情
-                    RiskScheme riskScheme = riskSchemeService.selectEnableSchemeByType(SchemeTypeEnum.SINGLE_APPROVE_RISK);
-                    if (riskScheme != null) {
-
-                        int continuousApproveNum = Integer.parseInt(StringUtils.isEmpty(riskScheme.getContinuousApproveNum())
-                                ? "0" : riskScheme.getContinuousApproveNum());
-                        //查询该流程单最近风险范围条数的审批记录
-                        List<ApproveCirculationInfo> list = approveCirculationService.getListByApproveRecordIdAndAgree(approveRecordId);
-                        // 过滤是当前审批人,去除重复节点,且是同意的条数
-                        long count = list.stream()
-                                .filter(item -> item.getOperateUserId().equalsIgnoreCase(operateIdcard))
-                                .map(ApproveCirculationInfo::getNodeName)
-                                .distinct()
-                                .count();
-                        // 需去除申请人节点
-                        int realCount = (int) (count - 1);
-                        if (realCount >= continuousApproveNum) {
-                            riskContent = "审批流程流转过程中,连续" + continuousApproveNum + "个节点审批人相同,审批人都是:"
-                                    + createUserName + "(" + operateIdcard + ")。";
-
-                            //产生《单人连续审批风险》
-                            saveRiskLog(businessCode, riskIp, riskContent,
+                            saveRiskLog(businessCode, riskIp, commitRiskContent,
                                     title, operateIdcard, createUserName,
                                     applyIdcard, orgName, orgCode,
-                                    createTime, riskScheme.getSchemeType(),
-                                    approveRecordId, processInstanceId, processNo, logIdList);
+                                    createTime, SchemeTypeEnum.COMMIT_APPROVE_REPETITION_RISK.value,
+                                    approveRecordId, processInstanceId, processNo, Collections.singletonList(operateLogId));
                         }
                     }
+
+                    ResponseStatus singleApproveRiskStatus = riskBusiness.singleApproveRisk(approveRecordId, operateIdcard, createUserName);
+                    if (ResponseUtil.isFail(singleApproveRiskStatus)) {
+                        String singleApproveRiskContent = singleApproveRiskStatus.getMessage();
+                        //产生《单人连续审批风险》
+                        saveRiskLog(businessCode, riskIp, singleApproveRiskContent,
+                                title, operateIdcard, createUserName,
+                                applyIdcard, orgName, orgCode,
+                                createTime, SchemeTypeEnum.SINGLE_APPROVE_RISK.value,
+                                approveRecordId, processInstanceId, processNo, logIdList);
+                    }
                 }
             }
 
             Boolean needSendRedListRisk = logInfoMetaDTO.getNeedSendRedListRisk();
+            if (ObjectUtil.isNull(needSendRedListRisk)) {
+                needSendRedListRisk = false;
+            }
             String redListOperateRespString = logInfoMetaDTO.getRedListOperateRespVO();
+            if (StrUtil.isBlank(redListOperateRespString)) {
+                redListOperateRespString = "";
+            }
             if (needSendRedListRisk && (StrUtil.isNotBlank(redListOperateRespString))) {
                 OperateRespVO redListOperateRespVO = JsonUtils.parseObject(redListOperateRespString, OperateRespVO.class);
                 RiskScheme riskScheme = riskSchemeService.selectEnableSchemeByType(SchemeTypeEnum.RED_WHITE_RISK);
@@ -392,7 +410,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
             }
 
         } catch (Exception e) {
-            logger.info("====================构建风险日志异常==============", e);
+            logger.error("====================构建风险日志异常==============", e);
             throw new ApplicationException(e.getMessage());
         }
     }
@@ -461,7 +479,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
      * @param logInfoMetaDTO 日志信息
      */
     private void saveOperateLog(String content, LogInfoMetaDTO logInfoMetaDTO) {
-
+        String appToken = logInfoMetaDTO.getAppToken();
         String processInstanceId = logInfoMetaDTO.getProcessInstanceId();
         String businessType = logInfoMetaDTO.getBusinessType();
         Boolean flowFinish = logInfoMetaDTO.getFlowFinish();
@@ -498,6 +516,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
                 entity.getCreateTime(), processInstanceId, approveNo, id, logInfoMetaDTO);
 
         QmOperateLogDTO qmOperateLogDTO = QmOperateLogDTO.builder()
+                .appToken(appToken)
                 .qmApproveTypeEnum(QmApproveTypeEnum.OPERATE)
                 .approveId(approveRecordId)
                 .approveNo(approveNo)
@@ -634,7 +653,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
             String flowKey = processInstanceInfoDTO.getFlowKey();
             String processInstanceId = processInstanceInfoDTO.getProcessInstanceId();
             //如果是保存并提交,则需要构建(申请请求日志-发起)对象
-            buildRequestLog(RequestDisposeTypeEnum.START.getValue(), logDto, "start", "开始", "start", flowKey, processInstanceId);
+            buildRequestLog(RequestDisposeTypeEnum.START.getValue(), logDto, "start", "开始", "start", flowKey, processInstanceId, "21");
         }
     }
 
@@ -712,44 +731,23 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
      * @param logInfoMetaDTO 日志元信息
      */
     public void sendInfo(String content, String title, LogInfoMetaDTO logInfoMetaDTO) {
-        String appCode = approveProperties.getAppCode();
-        Date date = DateUtils.getDate();
-        String dateFormat = DateUtils.getDateFormat(date, DateConst.DB_STORE_TIME);
-        MessageInfoVo messageInfoVo = new MessageInfoVo();
-        messageInfoVo.setTitle(title);
-        messageInfoVo.setCreateTime(dateFormat);
-        messageInfoVo.setContent(content);
-        messageInfoVo.setUserSystem("审批系统");
-        messageInfoVo.setUserSystemCode(appCode);
-        messageInfoVo.setUserName("审批系统");
-        messageInfoVo.setMessageId(UUIDUtils.getUUID());
-
-        Map<String, Object> stringObjectMap = BeanUtil.beanToMap(logInfoMetaDTO);
-        Set<Map.Entry<String, Object>> entries = stringObjectMap.entrySet();
-        Map<String, String> map = new HashMap<>(stringObjectMap.size());
-        for (Map.Entry<String, Object> entry : entries) {
-            String key = entry.getKey();
-            Object value = entry.getValue();
-            String stringValue = "";
-            if (value != null) {
-                stringValue = value.toString();
+        String appToken = logInfoMetaDTO.getAppToken();
+        if (StrUtil.isBlank(appToken)) {
+            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (servletRequestAttributes != null) {
+                HttpServletRequest request = servletRequestAttributes.getRequest();
+                String appTokenId = request.getHeader(Constants.RZZX_APPTOKEN);
+                logger.info("从请求头获取到应用令牌信息:{}", appTokenId);
+                logInfoMetaDTO.setAppToken(appTokenId);
             }
-            map.put(key, stringValue);
         }
-        List<Map<String, String>> infoSet = new ArrayList<>();
-        infoSet.add(map);
-        messageInfoVo.setInfoSet(infoSet);
-
-        List<MessageInfoVo> messageInfoVos = new ArrayList<>();
-        messageInfoVos.add(messageInfoVo);
-        MessageInfoReqVo requestVo = new MessageInfoReqVo();
-        //设置消息
-        requestVo.setMessages(messageInfoVos);
-        requestVo.setTopic(kafkaProperties.getApproveLogTopic());
-        requestVo.setAppKey(kafkaProperties.getAppKey());
-        requestVo.setAppSecret(kafkaProperties.getAppSecret());
-        logger.info("====kafka开始推送结果,消息体为:{}", JSON.toJSONString(requestVo));
-        kafkaServer.send(requestVo, kafkaProperties.getKafkaServers());
+
+        ApproveLogDTO approveLogDTO = ApproveLogDTO.builder()
+                .content(content)
+                .title(title)
+                .logInfoMetaDTO(logInfoMetaDTO).build();
+
+        approveEventPublish.publishApproveLogEvent(approveLogDTO);
     }
 
     /**
@@ -770,7 +768,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         String realIpAdrress = IpUtils.getRealIpAdrress(request);
 
         String createUser;
-        String createUserName;
+        String createUserName = "";
         BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
         if (currentUser != null) {
             createUser = currentUser.getIdcard();
@@ -780,7 +778,9 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
             String idcard = ProofsUtil.getIdcard();
             createUser = idcard;
             OauthUserVO oauthUserInfoByIdcard = dcucBusiness.getOauthUserInfoByIdcard(idcard);
-            createUserName = oauthUserInfoByIdcard.getName();
+            if (ObjectUtil.isNotNull(oauthUserInfoByIdcard)) {
+                createUserName = oauthUserInfoByIdcard.getName();
+            }
         }
 
         LogDto logDto = new LogDto();

+ 117 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveTaskBusinessImpl.java

@@ -0,0 +1,117 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.dragoninfo.dcuc.common.utils.DcucBeanUtil;
+import com.dragoninfo.dcuc.common.utils.ResponseUtil;
+import com.dragonsoft.dcuc.approve.business.IApproveTaskBusiness;
+import com.dragonsoft.dcuc.approve.business.IBimBusiness;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.ApproveTaskClass;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustUserTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskClassRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.taskclass.ApiTaskDetailRespVO;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.dcuc.approve.service.IApproveTaskClassService;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/11
+ */
+@Slf4j
+@Component
+public class ApproveTaskBusinessImpl implements IApproveTaskBusiness {
+
+    private IApproveTaskClassService approveTaskClassService;
+
+    private IApproveRecordService approveRecordService;
+
+    private IBimBusiness bimBusiness;
+
+    @Autowired
+    public void setBimBusiness(IBimBusiness bimBusiness) {
+        this.bimBusiness = bimBusiness;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Autowired
+    public void setApproveTaskClassService(IApproveTaskClassService approveTaskClassService) {
+        this.approveTaskClassService = approveTaskClassService;
+    }
+
+    @Override
+    public ResponseDTO<List<ApiTaskClassRespVO>> taskClassList() {
+        List<ApproveTaskClass> approveTaskClasses = approveTaskClassService.fillAll();
+
+        List<ApiTaskClassRespVO> respVOList = DcucBeanUtil.createCopyToObjectList(approveTaskClasses, ApiTaskClassRespVO.class);
+
+        return ResponseUtil.newInstance(respVOList);
+    }
+
+    @Override
+    public ResponseDTO<ApiTaskDetailRespVO> taskDetail(String taskCode) {
+        ApproveRecordInfo approveRecordInfo = approveRecordService.selectByApproveNo(taskCode);
+        if (ObjectUtil.isNull(approveRecordInfo)) {
+            return ResponseUtil.dtoFail("当前任务标识不存在");
+        }
+        String processTitle = approveRecordInfo.getProcessTitle();
+        String approveTaskClassCode = approveRecordInfo.getApproveTaskClass();
+        ApproveTaskClass approveTaskClass = approveTaskClassService.detailByCode(approveTaskClassCode);
+        if (ObjectUtil.isNull(approveTaskClass)) {
+            log.error("无法查找到对应的任务类型:{}", approveTaskClassCode);
+            return ResponseUtil.dtoFail("无法查找到对应的任务类型");
+        }
+
+        String taskClassName = approveTaskClass.getTaskClassName();
+        ApiTaskDetailRespVO apiTaskDetailRespVO = new ApiTaskDetailRespVO();
+        apiTaskDetailRespVO.setTaskCode(taskCode);
+        apiTaskDetailRespVO.setTaskName(processTitle);
+        apiTaskDetailRespVO.setTaskClassCode(approveTaskClassCode);
+        apiTaskDetailRespVO.setTaskClassName(taskClassName);
+
+        return ResponseUtil.newInstance(apiTaskDetailRespVO);
+    }
+
+    @Override
+    public ResponseDTO<List<ApiTaskDetailRespVO>> getUserAppTaskList(String userToken, String appCode) {
+        ZeroTrustUserTokenInfoRespVO userTokenInfo = bimBusiness.getUserTokenInfo(userToken);
+        if (ObjectUtil.isNull(userTokenInfo)) {
+            return ResponseUtil.dtoFail("用户令牌失效");
+        }
+
+        String pid = userTokenInfo.getPid();
+        List<ApproveRecordInfo> recordInfoList = approveRecordService.getRecordByIdcardAppCode(pid, appCode);
+
+        List<ApiTaskDetailRespVO> respVOList = DcucBeanUtil.createCopyToObjectList(recordInfoList, ApiTaskDetailRespVO.class, ((sourceObject, targetObject) -> {
+            String approveNo = sourceObject.getApproveNo();
+            String processTitle = sourceObject.getProcessTitle();
+            String approveTaskClassCode = sourceObject.getApproveTaskClass();
+
+            String taskClassName = "";
+            ApproveTaskClass approveTaskClass = approveTaskClassService.detailByCode(approveTaskClassCode);
+            if (ObjectUtil.isNotNull(approveTaskClass)) {
+                taskClassName = approveTaskClass.getTaskClassName();
+            }
+            targetObject.setTaskCode(approveNo);
+            targetObject.setTaskName(processTitle);
+            targetObject.setTaskClassCode(approveTaskClassCode);
+            targetObject.setTaskClassName(taskClassName);
+            return targetObject;
+        }));
+
+        return ResponseUtil.newInstance(respVOList);
+    }
+}

+ 120 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveTipsBusinessImpl.java

@@ -0,0 +1,120 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.dragoninfo.dcuc.common.utils.ResponseUtil;
+import com.dragonsoft.dcuc.approve.business.IApproveTipsBusiness;
+import com.dragonsoft.dcuc.approve.business.IRiskBusiness;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.ApproveSecurityWarningInfo;
+import com.dragonsoft.dcuc.approve.model.resp.OperateTipResp;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.dcuc.approve.service.IApproveSecurityWarningInfoService;
+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.utils.UserContextUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+@Component
+public class ApproveTipsBusinessImpl implements IApproveTipsBusiness {
+
+    private IApproveRecordService approveRecordService;
+
+    private IRiskBusiness riskBusiness;
+
+    private IApproveSecurityWarningInfoService approveSecurityWarningInfoService;
+
+    @Autowired
+    public void setApproveSecurityWarningInfoService(IApproveSecurityWarningInfoService approveSecurityWarningInfoService) {
+        this.approveSecurityWarningInfoService = approveSecurityWarningInfoService;
+    }
+
+    @Autowired
+    public void setRiskBusiness(IRiskBusiness riskBusiness) {
+        this.riskBusiness = riskBusiness;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Override
+    public ResponseDTO<List<OperateTipResp>> operateTips(String processInstanceId) {
+        ApproveRecordInfo approveRecordInfo = approveRecordService.findByProcessInstanceId(processInstanceId);
+        if (ObjectUtil.isNull(approveRecordInfo)) {
+            return ResponseUtil.dtoFail("审批单不存在");
+        }
+        String approveRecordInfoId = approveRecordInfo.getId();
+        BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
+
+        String applicantIdcard = approveRecordInfo.getApplicantIdcard();
+        String idCard = currentUser.getIdcard();
+        String userName = currentUser.getName();
+
+        List<OperateTipResp> riskTipList = getRiskTipList(approveRecordInfoId, applicantIdcard, idCard, userName);
+        List<OperateTipResp> operateTipRespList = new ArrayList<>(riskTipList);
+
+        List<OperateTipResp> securityWarningTipList = getSecurityWarningTipList(applicantIdcard);
+        operateTipRespList.addAll(securityWarningTipList);
+
+        return ResponseUtil.newInstance(operateTipRespList);
+    }
+
+    /**
+     * 获取风险信息提示
+     *
+     * @param approveRecordInfoId 审批单ID
+     * @param applicantIdcard     申请人
+     * @param idCard              身份证号
+     * @param userName            用户名
+     * @return 提示信息
+     */
+    protected List<OperateTipResp> getRiskTipList(String approveRecordInfoId, String applicantIdcard, String idCard, String userName) {
+        List<OperateTipResp> operateTipRespList = new ArrayList<>();
+
+        ResponseStatus responseStatus = riskBusiness.commitApproveRepetitionRisk(applicantIdcard, idCard, userName);
+        if (ResponseUtil.isFail(responseStatus)) {
+            OperateTipResp operateTipResp = new OperateTipResp();
+            operateTipResp.setType("风险");
+            operateTipResp.setContent(responseStatus.getMessage());
+            operateTipRespList.add(operateTipResp);
+        }
+        return operateTipRespList;
+    }
+
+    /**
+     * 获取预警信息提示
+     *
+     * @param applicantIdcard 申请人
+     * @return 提示信息
+     */
+    protected List<OperateTipResp> getSecurityWarningTipList(String applicantIdcard) {
+        List<OperateTipResp> operateTipRespList = new ArrayList<>();
+
+        List<ApproveSecurityWarningInfo> approveSecurityWarningInfos = approveSecurityWarningInfoService.selectByUser(applicantIdcard);
+        for (ApproveSecurityWarningInfo approveSecurityWarningInfo : approveSecurityWarningInfos) {
+            String threatDesc = approveSecurityWarningInfo.getThreatDesc();
+            String content = "接收到的申请人" + applicantIdcard + "预警信息:" + threatDesc;
+            OperateTipResp operateTipResp = new OperateTipResp();
+            operateTipResp.setType("预警信息");
+            operateTipResp.setContent(content);
+            operateTipRespList.add(operateTipResp);
+        }
+        return operateTipRespList;
+    }
+
+
+}

+ 317 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/BimBusinessImpl.java

@@ -0,0 +1,317 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.dragoninfo.dcuc.common.utils.LangUtil;
+import com.dragonsoft.dcuc.approve.business.IBimBusiness;
+import com.dragonsoft.dcuc.approve.config.ApproveConfig;
+import com.dragonsoft.dcuc.approve.constants.ApproveBeanConstants;
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.dragonsoft.dcuc.approve.model.req.bim.ZeroTrustAppTokenInfoReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustUserTokenInfoReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustUserTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustResultRespVO;
+import com.dragonsoft.dcuc.approve.properties.BimProperties;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.smtools.loader.SMFactory;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.RequestEntity;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+@Slf4j
+@Component
+public class BimBusinessImpl implements IBimBusiness {
+
+    private BimProperties bimProperties;
+
+    private RestTemplate restTemplate;
+
+    private ObjectMapper objectMapper;
+
+    private SMFactory smFactory;
+
+    @Autowired
+    public void setSmFactory(SMFactory smFactory) {
+        this.smFactory = smFactory;
+    }
+
+    @Qualifier(ApproveBeanConstants.DRAGON_OBJECT_MAPPER)
+    @Autowired
+    public void setObjectMapper(ObjectMapper objectMapper) {
+        this.objectMapper = objectMapper;
+    }
+
+    @Autowired
+    public void setBimProperties(BimProperties bimProperties) {
+        this.bimProperties = bimProperties;
+    }
+
+    @Qualifier(ApproveBeanConstants.SKIP_SSL_REST_TEMPLATE)
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    @Override
+    public ZeroTrustUserTokenInfoRespVO getUserTokenInfo(String useTokenId) {
+        String userInfoUrl = "/idp/rest/getUserTokenInfo";
+        Assert.notBlank(useTokenId);
+        String requestName = "获取用户令牌信息";
+
+        String reqUrl = bimProperties.getIdentityUrl() + userInfoUrl;
+
+        Boolean checkTokenSign = bimProperties.getCheckTokenSign();
+
+        ZeroTrustUserTokenInfoReqVO zeroTrustUserTokenInfoReqVO = new ZeroTrustUserTokenInfoReqVO();
+        zeroTrustUserTokenInfoReqVO.setUserTokenId(useTokenId);
+
+        log.info("{} 请求路径:{} 参数 :{}", requestName, reqUrl, JsonUtils.toJSONString(zeroTrustUserTokenInfoReqVO));
+        RequestEntity<ZeroTrustUserTokenInfoReqVO> httpEntity = new RequestEntity<>(zeroTrustUserTokenInfoReqVO, HttpMethod.POST, URI.create(reqUrl));
+
+        TypeReference<ZeroTrustResultRespVO<ZeroTrustUserTokenInfoRespVO>> parameterizedTypeReference =
+                new TypeReference<ZeroTrustResultRespVO<ZeroTrustUserTokenInfoRespVO>>() {
+                };
+
+        ResponseEntity<String> responseEntity = restTemplate.exchange(httpEntity, String.class);
+        log.info("{}返回参数 :{}", requestName, JsonUtils.toJSONString(responseEntity));
+
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            String responseEntityJsonBody = responseEntity.getBody();
+
+            ZeroTrustResultRespVO<ZeroTrustUserTokenInfoRespVO> responseEntityBody = null;
+            try {
+                responseEntityBody = objectMapper.readValue(responseEntityJsonBody, parameterizedTypeReference);
+            } catch (JsonProcessingException e) {
+                log.error("解析JSON异常", e);
+            }
+            if (responseEntityBody != null) {
+                if (responseEntityBody.getStatusCode().equalsIgnoreCase(ZeroTrustBusinessRespEnum.SUCCESS.getValue())) {
+
+                    // 校验令牌签名
+                    if (checkTokenSign) {
+                        boolean b = checkUserTokenSign(responseEntityJsonBody);
+                        if (!b) {
+                            return null;
+                        }
+                    }
+
+                    return responseEntityBody.getResult();
+                } else {
+                    log.error("{} statusCode:{} , message:{}", requestName, responseEntityBody.getStatusCode(), responseEntityBody.getMessage());
+                }
+            } else {
+                log.error("{} 返回 isnull:{}", requestName, JsonUtils.toJSONString(responseEntity));
+            }
+
+        } else {
+            log.error("{} 请求 error :{}", requestName, JsonUtils.toJSONString(responseEntity));
+        }
+        return null;
+    }
+
+    @Override
+    public ZeroTrustAppTokenInfoRespVO getAppTokenInfo(String appTokenId) {
+        String appInfoUrl = "/idp/rest/getAppTokenInfo";
+        Assert.notBlank(appTokenId);
+        String requestName = "获取应用令牌信息";
+
+        String reqUrl = bimProperties.getIdentityUrl() + appInfoUrl;
+
+        Boolean checkTokenSign = bimProperties.getCheckTokenSign();
+
+        ZeroTrustAppTokenInfoReqVO zeroTrustAppTokenInfoReqVO = new ZeroTrustAppTokenInfoReqVO();
+        zeroTrustAppTokenInfoReqVO.setAppTokenId(appTokenId);
+
+        log.info("{} 请求路径:{} 参数 :{}", requestName, reqUrl, JsonUtils.toJSONString(zeroTrustAppTokenInfoReqVO));
+        RequestEntity<ZeroTrustAppTokenInfoReqVO> httpEntity = new RequestEntity<>(zeroTrustAppTokenInfoReqVO, HttpMethod.POST, URI.create(reqUrl));
+
+        TypeReference<ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO>> parameterizedTypeReference =
+                new TypeReference<ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO>>() {
+                };
+
+        ResponseEntity<String> responseEntity = restTemplate.exchange(httpEntity, String.class);
+        log.info("{}返回参数 :{}", requestName, JsonUtils.toJSONString(responseEntity));
+
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            String responseEntityJsonBody = responseEntity.getBody();
+
+            ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO> responseEntityBody = null;
+            try {
+                responseEntityBody = objectMapper.readValue(responseEntityJsonBody, parameterizedTypeReference);
+            } catch (JsonProcessingException e) {
+                log.error("解析JSON异常", e);
+            }
+            if (responseEntityBody != null) {
+                if (responseEntityBody.getStatusCode().equalsIgnoreCase(ZeroTrustBusinessRespEnum.SUCCESS.getValue())) {
+
+                    // 校验令牌签名
+                    if (checkTokenSign) {
+                        boolean b = checkAppTokenSign(responseEntityJsonBody);
+                        if (!b) {
+                            return null;
+                        }
+                    }
+
+                    return responseEntityBody.getResult();
+                } else {
+                    log.error("{} statusCode:{} , message:{}", requestName, responseEntityBody.getStatusCode(), responseEntityBody.getMessage());
+                }
+            } else {
+                log.error("{} 返回 isnull:{}", requestName, JsonUtils.toJSONString(responseEntity));
+            }
+
+        } else {
+            log.error("{} 请求 error :{}", requestName, JsonUtils.toJSONString(responseEntity));
+        }
+        return null;
+    }
+
+    /**
+     * 校验应用令牌签名
+     *
+     * @param appTokenJson 应用令牌信息
+     * @return 是否成功
+     */
+    @SuppressWarnings("unchecked")
+    @SneakyThrows(JsonProcessingException.class)
+    public boolean checkAppTokenSign(String appTokenJson) {
+
+        TypeReference<LinkedHashMap<String, Object>> objectTypeReference = new TypeReference<LinkedHashMap<String, Object>>() {
+        };
+        LinkedHashMap<String, Object> body = objectMapper.readValue(appTokenJson, objectTypeReference);
+        LinkedHashMap<String, Object> userTokenInfo = (LinkedHashMap<String, Object>) body.getOrDefault("result", Collections.emptyMap());
+        LinkedHashMap<String, Object> userToken = (LinkedHashMap<String, Object>) userTokenInfo.getOrDefault("userToken", Collections.emptyMap());
+        String userTokenString = generalAppTokenCheckUserTokenString(userToken);
+        log.info("生成后的用户令牌信息:{}", userTokenString);
+        userTokenInfo.put("userToken", userTokenString);
+        return checkAppTokenSign(userTokenInfo);
+    }
+
+    /**
+     * 校验用户令牌签名
+     *
+     * @param userTokenJson 用户令牌JSON
+     * @return 状态
+     */
+    @SuppressWarnings("unchecked")
+    @SneakyThrows(JsonProcessingException.class)
+    public boolean checkUserTokenSign(String userTokenJson) {
+
+        TypeReference<LinkedHashMap<String, Object>> objectTypeReference = new TypeReference<LinkedHashMap<String, Object>>() {
+        };
+        LinkedHashMap<String, Object> body = objectMapper.readValue(userTokenJson, objectTypeReference);
+        LinkedHashMap<String, Object> userTokenInfo = (LinkedHashMap<String, Object>) body.getOrDefault("result", Collections.emptyMap());
+        return checkUserTokenSign(userTokenInfo);
+    }
+
+    /**
+     * 生成应用令牌校验签名的用户令牌字符串
+     *
+     * @param userTokenMap 用户令牌信息
+     * @return 用户令牌字符串
+     */
+    protected String generalAppTokenCheckUserTokenString(LinkedHashMap<String, Object> userTokenMap) {
+        if (CollUtil.isEmpty(userTokenMap)) {
+            throw new IllegalArgumentException();
+        }
+        String symbol = StrUtil.COMMA + " ";
+
+        StringBuilder userTokenStringBuilder = new StringBuilder("{");
+
+        for (String key : userTokenMap.keySet()) {
+            userTokenStringBuilder.append(key).append("=");
+            String value = userTokenMap.getOrDefault(key, "").toString();
+            userTokenStringBuilder.append(value).append(symbol);
+        }
+
+        String string = userTokenStringBuilder.toString();
+        String subLastSymbol = LangUtil.subLastSymbol(string, symbol);
+        return subLastSymbol + "}";
+    }
+
+
+    /**
+     * 校验用户令牌签名
+     *
+     * @param useTokenInfoMap 用户令牌信息
+     * @return 签名结果
+     */
+    protected boolean checkUserTokenSign(Map<String, Object> useTokenInfoMap) {
+        String userTokenId = useTokenInfoMap.getOrDefault("userTokenId", "").toString();
+        String createTime = useTokenInfoMap.getOrDefault("createTime", "").toString();
+        String expireAt = useTokenInfoMap.getOrDefault("expireAt", "").toString();
+        String pid = useTokenInfoMap.getOrDefault("pid", "").toString();
+        String orgCode = useTokenInfoMap.getOrDefault("orgCode", "").toString();
+        String ip = useTokenInfoMap.getOrDefault("ip", "").toString();
+        String mid = useTokenInfoMap.getOrDefault("mid", "").toString();
+        String env = useTokenInfoMap.getOrDefault("env", "").toString();
+        String sign = useTokenInfoMap.getOrDefault("sign", "").toString();
+
+        String origin = "userTokenId=" + userTokenId +
+                "&createTime=" + createTime + "&expireAt=" + expireAt + "&pid=" + pid + "&orgCode=" + orgCode
+                + "&ip=" + ip + "&mid=" + mid + "&env=" + env;
+        log.info("用户令牌校验签名签名原文:{}", origin);
+
+        String generalSign = smFactory.getSM3().summary(origin).toString().toLowerCase(Locale.ROOT);
+        log.info("用户令牌校验签名签名后的值:{}", generalSign);
+        log.info("用户令牌校验签名令牌信息中的签名值:{}", sign);
+
+        boolean ignoreCase = generalSign.equalsIgnoreCase(sign);
+        log.info("用户令牌:{} 校验签名签名结果:{}", userTokenId, ignoreCase);
+
+        return ignoreCase;
+    }
+
+    /**
+     * 校验应用令牌签名
+     *
+     * @param apTokenInfoMap 应用令牌信息
+     * @return 签名结果
+     */
+    protected boolean checkAppTokenSign(Map<String, Object> apTokenInfoMap) {
+        String appTokenId = apTokenInfoMap.getOrDefault("appTokenId", "").toString();
+        String createTime = apTokenInfoMap.getOrDefault("createTime", "").toString();
+        String expireAt = apTokenInfoMap.getOrDefault("expireAt", "").toString();
+        String appId = apTokenInfoMap.getOrDefault("appId", "").toString();
+        String userToken = apTokenInfoMap.getOrDefault("userToken", "").toString();
+        String sign = apTokenInfoMap.getOrDefault("sign", "").toString();
+
+        String origin = "appTokenId=" + appTokenId + "&createTime=" + createTime + "&expireAt=" +
+                expireAt + "&appId=" + appId + "&userToken=" + userToken;
+        log.info("应用令牌校验签名签名原文:{}", origin);
+
+        String generalSign = smFactory.getSM3().summary(origin).toString().toLowerCase(Locale.ROOT);
+        log.info("应用令牌校验签名签名后的值:{}", generalSign);
+        log.info("应用令牌校验签名令牌信息中的签名值:{}", sign);
+
+        boolean ignoreCase = generalSign.equalsIgnoreCase(sign);
+        log.info("应用令牌:{} 校验签名签名结果:{}", appTokenId, ignoreCase);
+
+        return ignoreCase;
+    }
+}

+ 243 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/BuSyncBusinessImpl.java

@@ -0,0 +1,243 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.dragoninfo.dcuc.common.annotation.CacheLock;
+import com.dragoninfo.dcuc.common.utils.ResponseUtil;
+import com.dragonsoft.dcuc.approve.business.IBuSyncBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveBeanConstants;
+import com.dragonsoft.dcuc.approve.constants.ApproveConstants;
+import com.dragonsoft.dcuc.approve.enumresources.bu.ApproveModeEnum;
+import com.dragonsoft.dcuc.approve.enumresources.bu.BuErrorCodeEnum;
+import com.dragonsoft.dcuc.approve.model.ApproveCirculationInfo;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.resp.bu.BuApproveSyncBizApproveReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.bu.BuApproveSyncBizDataReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.bu.BuApproveSyncReqVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustResultDataVO;
+import com.dragoninfo.dcuc.common.utils.ValidUtil;
+import com.dragonsoft.dcuc.approve.properties.ApproveBuProperties;
+import com.dragonsoft.dcuc.approve.service.IApproveCirculationService;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.base.enums.BooleanEnum;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.duceap.commons.util.string.StringUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/11/7
+ */
+@Slf4j
+@Component
+public class BuSyncBusinessImpl implements IBuSyncBusiness {
+
+    private RestTemplate restTemplate;
+
+    private ObjectMapper dragonObjectMapper;
+
+    private ApproveBuProperties approveBuProperties;
+
+    private IApproveRecordService approveRecordService;
+
+    private IApproveCirculationService approveCirculationService;
+
+    @Autowired
+    public void setApproveCirculationService(IApproveCirculationService approveCirculationService) {
+        this.approveCirculationService = approveCirculationService;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Autowired
+    public void setApproveBuProperties(ApproveBuProperties approveBuProperties) {
+        this.approveBuProperties = approveBuProperties;
+    }
+
+    @Qualifier(ApproveBeanConstants.DRAGON_OBJECT_MAPPER)
+    @Autowired
+    public void setDragonObjectMapper(ObjectMapper dragonObjectMapper) {
+        this.dragonObjectMapper = dragonObjectMapper;
+    }
+
+    @Qualifier(ApproveBeanConstants.SKIP_SSL_REST_TEMPLATE)
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    @CacheLock
+    public ResponseStatus syncTuBu() {
+        List<ApproveRecordInfo> unSyncList = approveRecordService.getUnSyncList();
+        for (ApproveRecordInfo approveRecordInfo : unSyncList) {
+            String id = approveRecordInfo.getId();
+            String approveNo = approveRecordInfo.getApproveNo();
+            //  检查任务编号是否正确?,还是初始化脚本就处理
+            if (isStanderTaskNo(approveNo)) {
+                ResponseStatus responseStatus = syncToBu(approveRecordInfo);
+                BooleanEnum booleanEnum = BooleanEnum.TRUE;
+                if (ResponseUtil.isFail(responseStatus)) {
+                    log.error("同步到BU出错:{}", responseStatus.getMessage());
+                    booleanEnum = BooleanEnum.FALSE;
+                }
+                approveRecordService.updateSyncFlag(id, booleanEnum);
+
+            } else {
+                // 非标准的任务ID默认设置为成功
+                approveRecordService.updateSyncFlag(id, BooleanEnum.TRUE);
+            }
+        }
+        return ResponseStatus.success();
+    }
+
+    /**
+     * 是否是标准的任务编号
+     *
+     * @param taskNo 任务编号
+     * @return 是否是
+     */
+    protected boolean isStanderTaskNo(String taskNo) {
+        if (StrUtil.isBlank(taskNo)) {
+            return false;
+        }
+        if (!taskNo.startsWith(ApproveConstants.TASK_ID_PREFIX)) {
+            return false;
+        }
+        return taskNo.length() == 38;
+    }
+
+    /**
+     * 同步到BU
+     *
+     * @param approveRecordInfo 请求同步请求
+     * @return 状态
+     */
+    public ResponseStatus syncToBu(ApproveRecordInfo approveRecordInfo) {
+        Assert.notNull(approveRecordInfo);
+
+        String id = approveRecordInfo.getId();
+
+        BuApproveSyncReqVO buApproveSyncReqVO = new BuApproveSyncReqVO();
+        buApproveSyncReqVO.setAppId(approveRecordInfo.getAppCode());
+        buApproveSyncReqVO.setAppName(approveRecordInfo.getAppName());
+        buApproveSyncReqVO.setCreateTime(approveRecordInfo.getCreateTime());
+        buApproveSyncReqVO.setFinishTime(approveRecordInfo.getUpdateTime());
+        buApproveSyncReqVO.setPid(approveRecordInfo.getApplicantIdcard());
+
+        ApproveCirculationInfo approveCirculationInfo = approveCirculationService.getListByApproveRecordLastAgree(id);
+        Assert.notNull(approveCirculationInfo);
+        // 设置最终审批人信息
+        buApproveSyncReqVO.setLastReviewerIdCard(approveCirculationInfo.getOperateUserId());
+        buApproveSyncReqVO.setLastReviewerName(approveCirculationInfo.getOperateUserName());
+        buApproveSyncReqVO.setLastReviewerUnitCode(approveCirculationInfo.getOperateUserOrgId());
+        buApproveSyncReqVO.setLastReviewerUnit(approveCirculationInfo.getOperateUserOrg());
+
+        BuApproveSyncBizApproveReqVO buApproveSyncBizApproveReqVO = new BuApproveSyncBizApproveReqVO();
+        buApproveSyncBizApproveReqVO.setBizId(approveRecordInfo.getApproveNo());
+        buApproveSyncBizApproveReqVO.setBizTitle(approveRecordInfo.getProcessTitle());
+        buApproveSyncBizApproveReqVO.setTaskClass(approveRecordInfo.getApproveTaskClass());
+        buApproveSyncBizApproveReqVO.setApproveMode(ApproveModeEnum.NORMAL.value);
+        buApproveSyncBizApproveReqVO.setBizTermStart(approveRecordInfo.getStartTime());
+        buApproveSyncBizApproveReqVO.setBizTermEnd(approveRecordInfo.getEndTime());
+
+        BuApproveSyncBizDataReqVO buApproveSyncBizDataReqVO = new BuApproveSyncBizDataReqVO();
+        buApproveSyncBizDataReqVO.setBizApprove(buApproveSyncBizApproveReqVO);
+        buApproveSyncReqVO.setBizData(buApproveSyncBizDataReqVO);
+
+        ResponseStatus responseStatus = requestSyncToBu(buApproveSyncReqVO);
+        if (ResponseUtil.isSuccess(responseStatus)) {
+            approveRecordService.updateSyncFlag(id, BooleanEnum.TRUE);
+            return ResponseStatus.success();
+        }
+        approveRecordService.updateSyncFlag(id, BooleanEnum.FALSE);
+        return ResponseStatus.fail();
+    }
+
+    /**
+     * 请求同步到 BU
+     *
+     * @param buApproveSyncReqVO 同步请求
+     * @return 状态
+     */
+    public ResponseStatus requestSyncToBu(BuApproveSyncReqVO buApproveSyncReqVO) {
+        if (!approveBuProperties.isEnable()) {
+            return ResponseStatus.success();
+        }
+        String syncTaskUrl = approveBuProperties.getSyncTaskUrl();
+
+        return baseReq(syncTaskUrl, buApproveSyncReqVO, "同步任务信息到BU");
+    }
+
+    /**
+     * 流程详情
+     *
+     * @param url                路径
+     * @param buApproveSyncReqVO 请求参数
+     * @return 返回内容
+     */
+    protected ResponseStatus baseReq(String url, BuApproveSyncReqVO buApproveSyncReqVO, String requestName) {
+        // 打印请求参数
+        log.info(requestName + " 请求路径:{} 请求参数:{}", url, JsonUtils.toJSONString(buApproveSyncReqVO));
+        String errorTip = requestName + "失败";
+        ResponseStatus responseStatus = ValidUtil.validReqVo(buApproveSyncReqVO);
+        if (ResponseUtil.isFail(responseStatus)) {
+            log.error("request vo valid error:{}", responseStatus.getMessage());
+            return ResponseUtil.dtoFail(responseStatus.getMessage());
+        }
+
+        HttpEntity<BuApproveSyncReqVO> entity = new HttpEntity<>(buApproveSyncReqVO);
+        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
+
+        if (!exchange.getStatusCode().is2xxSuccessful()) {
+            log.error("{} error. resp: {}", requestName, JsonUtils.toJSONString(exchange));
+            return ResponseUtil.dtoFail(errorTip);
+        }
+        String body = exchange.getBody();
+        if (StringUtils.isBlank(body)) {
+            log.error("{} error. resp: {}", requestName, JsonUtils.toJSONString(exchange));
+            return ResponseUtil.dtoFail(errorTip);
+        }
+
+        log.info("baseReq resp :{}", JsonUtils.toJSONString(exchange));
+        TypeReference<ZeroTrustResultDataVO<Object>> typeReference = new TypeReference<ZeroTrustResultDataVO<Object>>() {
+        };
+
+        ZeroTrustResultDataVO<Object> respDto;
+        try {
+            JsonNode jsonNode = dragonObjectMapper.readTree(body);
+            String statusCode = jsonNode.get("status_code").asText();
+            String message = jsonNode.get("message").asText();
+            if (BuErrorCodeEnum.SUCCESS.getValue().equals(statusCode)) {
+                respDto = dragonObjectMapper.readValue(body, typeReference);
+            } else {
+                return ResponseUtil.dtoFail(message);
+            }
+        } catch (JsonProcessingException e) {
+            log.error("parse error.", e);
+            return ResponseUtil.dtoFail("返回值解析失败");
+        }
+
+        return ResponseUtil.newInstance(respDto.getData());
+    }
+}

+ 3 - 4
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/DcucAuthBusinessImpl.java

@@ -88,7 +88,6 @@ public class DcucAuthBusinessImpl implements IDcucAuthBusiness {
      * @param visitResourceCode 资源代码
      * @return 资源等级
      */
-    @SneakyThrows
     public Set<ListLevelEnum> getRedFunctionListLevel(String visitResourceCode) {
 
         ObjectMapper objectMapper = new ObjectMapper();
@@ -110,7 +109,7 @@ public class DcucAuthBusinessImpl implements IDcucAuthBusiness {
         return totalListLevelEnum;
     }
 
-    @SneakyThrows
+    @SneakyThrows(JsonProcessingException.class)
     private Set<ListLevelEnum> getFunctionLevel(String appCode, List<String> functionCodeArray) {
         Proofs proofs = ThreadLocalProofsHolder.getProofs();
         HttpHeaders httpHeaders = proofs.buildHttpHeaders();
@@ -163,7 +162,7 @@ public class DcucAuthBusinessImpl implements IDcucAuthBusiness {
     }
 
     @Override
-    @SneakyThrows
+    @SneakyThrows(JsonProcessingException.class)
     public List<AuthAppFunApiVO> getFunctionList(String appCode, List<String> functionCodList) {
         Proofs proofs = ThreadLocalProofsHolder.getProofs();
         HttpHeaders httpHeaders = proofs.buildHttpHeaders();
@@ -222,7 +221,7 @@ public class DcucAuthBusinessImpl implements IDcucAuthBusiness {
      * @return 资源等级
      */
     @Override
-    @SneakyThrows
+    @SneakyThrows(JsonProcessingException.class)
     public Optional<ListLevelEnum> getWhiteListLevel(String resourceCode) {
         Proofs proofs = ThreadLocalProofsHolder.getProofs();
         HttpHeaders httpHeaders = proofs.buildHttpHeaders();

+ 171 - 39
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/DcucBusinessImpl.java

@@ -1,16 +1,28 @@
 package com.dragonsoft.dcuc.approve.business.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.dragoninfo.dcuc.common.entity.ApiResult;
+import com.dragoninfo.dcuc.common.entity.ApiResultPage;
+import com.dragoninfo.dcuc.common.entity.ApiSearchReq;
 import com.dragoninfo.dcuc.common.entity.Proofs;
 import com.dragoninfo.dcuc.common.utils.ResponseUtil;
 import com.dragonsoft.dcuc.approve.business.IDcucBusiness;
-import com.dragonsoft.dcuc.approve.model.resp.PoliceResultVO;
-import com.dragonsoft.dcuc.approve.model.vo.OauthUserVO;
+import com.dragonsoft.dcuc.approve.constants.ApproveBeanConstants;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiOrgResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiPoliceResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
 import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
 import com.dragonsoft.dcuc.approve.threadlocal.ThreadLocalProofsHolder;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
-import com.dragonsoft.duceap.core.entity.response.ResponseResult;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,7 +31,8 @@ import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.List;
+import java.net.URI;
+import java.util.Collections;
 import java.util.Map;
 
 /**
@@ -30,55 +43,59 @@ import java.util.Map;
 public class DcucBusinessImpl implements IDcucBusiness {
     private static final Logger logger = LoggerFactory.getLogger(DcucBusinessImpl.class);
 
-    @Autowired
-    @Qualifier("hwRestTemplate")
-    private RestTemplate hwRestTemplate;
+    public static final String OAUTH_USER_PATH = "/api/user-service/v1/users/%s";
+    public static final String ORG_INFO_PATH = "/api/org-service/v3/orgs/%s";
+
+    /**
+     * 警员同步API
+     */
+    public static final String POLICE_SYNC_API = "/api/user-service/v3/users/police/search";
+    /**
+     * 机构同步API
+     */
+    public static final String ORG_SYNC_API = "/api/org-service/v3/orgs/search";
+
+    private RestTemplate restTemplate;
 
-    @Autowired
     private ApproveProperties approveProperties;
 
-    public static final String OAUTH_USER_PATH = "/api/user-service/v1/users/%s";
-    private static final String AUTH_POLICE_PATH = "/api/user/users/_search";
+    private ObjectMapper objectMapper;
 
-    @Override
-    public List<PoliceResultVO> getPoliceList(Map<String, Object> pageMap) {
-        Proofs proofs = ThreadLocalProofsHolder.getProofs();
-        //构建请求头
-        HttpHeaders headers = proofs.buildHttpHeaders();
-        //构建RestTemplate
-        List<PoliceResultVO> policeMapList = null;
+    @Qualifier(ApproveBeanConstants.DRAGON_OBJECT_MAPPER)
+    @Autowired
+    public void setObjectMapper(ObjectMapper objectMapper) {
+        this.objectMapper = objectMapper;
+    }
 
-        String userServiceUrl = approveProperties.getUserServiceUrl();
-        try {
-            HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(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;
+    @Qualifier(ApproveBeanConstants.SKIP_SSL_REST_TEMPLATE)
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    @Autowired
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
     }
 
     @Override
     public OauthUserVO getOauthUserInfoByIdcard(String searchIdcard) {
+        Assert.notBlank(searchIdcard);
         //构建请求头
         Proofs proofs = ThreadLocalProofsHolder.getProofs();
-        HttpHeaders headers = proofs.buildHttpHeaders();
-        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(headers);
+        HttpEntity<Map<String, Object>> requestEntity;
+        if (ObjectUtil.isNotNull(proofs)) {
+            HttpHeaders headers = proofs.buildHttpHeaders();
+            requestEntity = new HttpEntity<>(headers);
+        } else {
+            requestEntity = new HttpEntity<>(Collections.emptyMap());
+        }
         //远程调用用户中心接口
         String userServiceUrl = approveProperties.getUserServiceUrl();
         String url = userServiceUrl + String.format(OAUTH_USER_PATH, searchIdcard);
-        ResponseEntity<String> resEntity = hwRestTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
-        logger.info("远程调用返回结果resEntity=【{}】,请求url=【{}】", JSONObject.toJSONString(resEntity), userServiceUrl + AUTH_POLICE_PATH);
+        logger.info("向认证服务查询用户信息请求路径:{}", url);
+        ResponseEntity<String> resEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
+        logger.info("向认证服务查询用户信息返回结果resEntity=【{}】,请求url=【{}】", JSONObject.toJSONString(resEntity), url);
         //判断请求是否成功
         OauthUserVO oauthUserVO = null;
         if (resEntity.getStatusCode() == HttpStatus.OK) {
@@ -92,4 +109,119 @@ public class DcucBusinessImpl implements IDcucBusiness {
         }
         return oauthUserVO;
     }
+
+    @Override
+    public ApiOrgResultVo orgInfo(String orgCode) {
+        //构建请求头
+        Proofs proofs = ThreadLocalProofsHolder.getProofs();
+        HttpEntity<Map<String, Object>> requestEntity;
+        if (ObjectUtil.isNotNull(proofs)) {
+            HttpHeaders headers = proofs.buildHttpHeaders();
+            requestEntity = new HttpEntity<>(headers);
+        } else {
+            requestEntity = new HttpEntity<>(Collections.emptyMap());
+        }
+        //远程调用用户中心接口
+        String userServiceUrl = approveProperties.getUserServiceUrl();
+        String url = userServiceUrl + String.format(ORG_INFO_PATH, orgCode);
+        logger.info("向认证服务查询机构信息请求路径:{}", url);
+        ResponseEntity<String> resEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);
+        logger.info("向认证服务查询机构信息返回结果resEntity=【{}】,请求url=【{}】", JSONObject.toJSONString(resEntity), url);
+        //判断请求是否成功
+        ApiOrgResultVo apiOrgResultVo = null;
+        if (resEntity.getStatusCode() == HttpStatus.OK) {
+            ResponseDTO<ApiOrgResultVo> responseDTO = JSONObject.parseObject(resEntity.getBody(), ResponseDTO.class);
+            if (responseDTO != null) {
+                if (ResponseUtil.isSuccess(responseDTO)) {
+                    responseDTO.getResult();
+                    apiOrgResultVo = JSONObject.parseObject(JSON.toJSONString(responseDTO.getResult()), ApiOrgResultVo.class);
+                }
+            }
+        }
+        return apiOrgResultVo;
+    }
+
+    @Override
+    @SneakyThrows(JsonProcessingException.class)
+    public ApiResultPage<ApiOrgResultVo> orgPage(ApiSearchReq apiSearchReq) {
+        Assert.notNull(apiSearchReq);
+
+        String userServiceUrl = approveProperties.getUserServiceUrl();
+        String url = userServiceUrl + ORG_SYNC_API;
+        Proofs proofs = ThreadLocalProofsHolder.getProofs();
+        HttpHeaders httpHeaders = HttpHeaders.EMPTY;
+        if (ObjectUtil.isNotNull(proofs)) {
+            httpHeaders = proofs.buildHttpHeaders();
+        }
+
+        RequestEntity<ApiSearchReq> apiSearchReqRequestEntity = new RequestEntity<>(apiSearchReq, httpHeaders, HttpMethod.POST, URI.create(url));
+        logger.info("请求机构信息参数:{}", JsonUtils.toJSONString(apiSearchReqRequestEntity));
+        ResponseEntity<String> resEntity = restTemplate.exchange(apiSearchReqRequestEntity, String.class);
+        String jsonString = JsonUtils.toJSONString(resEntity);
+        logger.info("请求机构信息返回参数:{}", jsonString);
+        if (!resEntity.getStatusCode().is2xxSuccessful()) {
+            logger.error("请求获取机构信息错误:{}", jsonString);
+            return null;
+        }
+
+        String body = resEntity.getBody();
+        ApiResult apiResult = JSONObject.parseObject(body, ApiResult.class);
+        if (ObjectUtil.isNull(apiResult)) {
+            logger.error("请求获取机构信息错误:{}", body);
+            return null;
+        }
+        if (!apiResult.getStatusCode().equalsIgnoreCase(ResponseStatus.SUCCESS_CODE)) {
+            logger.error("请求获取机构信息错误:{}", body);
+            return null;
+        }
+
+        Object result = apiResult.getResult();
+        String resultJson = objectMapper.writeValueAsString(result);
+        TypeReference<ApiResultPage<ApiOrgResultVo>> typeReference = new TypeReference<ApiResultPage<ApiOrgResultVo>>() {
+        };
+        return objectMapper.readValue(resultJson, typeReference);
+
+    }
+
+    @Override
+    @SneakyThrows(JsonProcessingException.class)
+    public ApiResultPage<ApiPoliceResultVo> policePage(ApiSearchReq apiSearchReq) {
+        Assert.notNull(apiSearchReq);
+
+        String userServiceUrl = approveProperties.getUserServiceUrl();
+        String url = userServiceUrl + POLICE_SYNC_API;
+        Proofs proofs = ThreadLocalProofsHolder.getProofs();
+        HttpHeaders httpHeaders = HttpHeaders.EMPTY;
+        if (ObjectUtil.isNotNull(proofs)) {
+            httpHeaders = proofs.buildHttpHeaders();
+        }
+
+        RequestEntity<ApiSearchReq> apiSearchReqRequestEntity = new RequestEntity<>(apiSearchReq, httpHeaders, HttpMethod.POST, URI.create(url));
+        logger.info("请求人员信息参数:{}", JsonUtils.toJSONString(apiSearchReqRequestEntity));
+        ResponseEntity<String> resEntity = restTemplate.exchange(apiSearchReqRequestEntity, String.class);
+        String jsonString = JsonUtils.toJSONString(resEntity);
+        logger.info("请求人员信息返回参数:{}", jsonString);
+        if (!resEntity.getStatusCode().is2xxSuccessful()) {
+            logger.error("请求获取机构信息错误:{}", jsonString);
+            return null;
+        }
+
+        String body = resEntity.getBody();
+        ApiResult apiResult = JSONObject.parseObject(body, ApiResult.class);
+        if (ObjectUtil.isNull(apiResult)) {
+            logger.error("请求获取人员信息错误:{}", body);
+            return null;
+        }
+        if (!apiResult.getStatusCode().equalsIgnoreCase(ResponseStatus.SUCCESS_CODE)) {
+            logger.error("请求获取人员信息错误:{}", body);
+            return null;
+        }
+
+        Object result = apiResult.getResult();
+        String resultJson = objectMapper.writeValueAsString(result);
+        TypeReference<ApiResultPage<ApiPoliceResultVo>> typeReference = new TypeReference<ApiResultPage<ApiPoliceResultVo>>() {
+        };
+        return objectMapper.readValue(resultJson, typeReference);
+    }
+
 }

+ 114 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/NoticeBusinessImpl.java

@@ -0,0 +1,114 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.dragonsoft.dcuc.approve.business.INoticeBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveBeanConstants;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCallbackReqV3VO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.rholder.retry.*;
+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.http.HttpMethod;
+import org.springframework.http.RequestEntity;
+import org.springframework.http.ResponseEntity;
+import org.springframework.remoting.RemoteAccessException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URI;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author hunagzqa
+ * @date 2022/11/16
+ */
+@Component
+public class NoticeBusinessImpl implements INoticeBusiness {
+
+    private RestTemplate restTemplate;
+
+    @Qualifier(ApproveBeanConstants.SKIP_SSL_REST_TEMPLATE)
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+
+    private static final Logger logger = LoggerFactory.getLogger(NoticeBusinessImpl.class);
+
+    private static final Retryer<ResponseStatus> RESPONSE_STATUS_RETRYER =
+            RetryerBuilder.<ResponseStatus>newBuilder()
+                    .retryIfException()
+                    .retryIfResult(item -> !item.getStatusCode().equals(ResponseStatus.SUCCESS_CODE))
+                    .withAttemptTimeLimiter(AttemptTimeLimiters.fixedTimeLimit(5, TimeUnit.SECONDS))
+                    .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
+                    .withStopStrategy(StopStrategies.stopAfterAttempt(5))
+                    .build();
+
+
+    @Override
+    public ResponseStatus retryApproveNotification(String callbackUrl, ZeroTrustApproveCallbackReqV3VO zeroTrustApproveCallbackReqV3VO) {
+        StringBuilder errorMessageBuilder = new StringBuilder();
+
+        ResponseStatus responseStatus;
+        try {
+            responseStatus = RESPONSE_STATUS_RETRYER.call(() -> baseApproveNotification(callbackUrl, zeroTrustApproveCallbackReqV3VO));
+        } catch (ExecutionException | RetryException e) {
+            logger.error("retry error", e);
+            responseStatus = ResponseStatus.fail(e.getMessage());
+        }
+        if (!responseStatus.getStatusCode().equals(ResponseStatus.SUCCESS_CODE)) {
+            errorMessageBuilder.append("URL: ").append(callbackUrl)
+                    .append(responseStatus.getMessage())
+                    .append(";");
+        }
+        String errorMessage = errorMessageBuilder.toString();
+        if (StrUtil.isNotBlank(errorMessage)) {
+            return ResponseStatus.fail(errorMessage);
+        }
+        return ResponseStatus.success();
+    }
+
+    @Override
+    public ResponseStatus baseApproveNotification(String callbackUrl, ZeroTrustApproveCallbackReqV3VO zeroTrustApproveCallbackReqV3VO) {
+
+        String resultMessage;
+        ResponseStatus responseStatus = ResponseStatus.success();
+        try {
+            logger.info("打印状态变更通知请求:{} 内容:{}", callbackUrl, JsonUtils.toJSONString(zeroTrustApproveCallbackReqV3VO));
+
+            RequestEntity<ZeroTrustApproveCallbackReqV3VO> requestEntity = new RequestEntity<>(zeroTrustApproveCallbackReqV3VO,
+                    HttpMethod.POST, URI.create(callbackUrl));
+            ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
+
+            logger.info("打印状态变更通知返回值:" + responseEntity);
+
+            if (responseEntity.getStatusCode().is2xxSuccessful()) {
+                String responseEntityBody = responseEntity.getBody();
+                ObjectMapper objectMapper = new ObjectMapper();
+                ZeroTrustMessageRespVO zeroTrustMessageRespVO = objectMapper.readValue(responseEntityBody, ZeroTrustMessageRespVO.class);
+                if (zeroTrustMessageRespVO == null) {
+                    logger.info("打印状态变更通知返回值:" + responseEntity);
+                    throw new RemoteAccessException(responseEntity.toString());
+
+                } else if (zeroTrustMessageRespVO.isRespFail()) {
+                    logger.info("打印状态变更通知返回值:" + responseEntity);
+                    throw new RemoteAccessException(zeroTrustMessageRespVO.getMessage());
+                }
+            }
+        } catch (Exception e) {
+            logger.error("状态变更通知接口调用失败", e);
+            resultMessage = "状态变更通知接口调用失败:" + e.getMessage();
+            responseStatus = ResponseStatus.fail(resultMessage);
+            throw new RemoteAccessException(responseStatus.getMessage());
+        }
+        return responseStatus;
+    }
+
+}

+ 147 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/RedisCacheBusinessImpl.java

@@ -0,0 +1,147 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.dragonsoft.dcuc.approve.business.ICacheBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveRedisConstants;
+import com.dragonsoft.dcuc.approve.dto.zerotrust.AppTokenInfoDTO;
+import com.dragonsoft.dcuc.approve.dto.zerotrust.UserTokenInfoDTO;
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustTokenActionEnum;
+import com.dragonsoft.duceap.commons.util.date.DateConst;
+import com.dragonsoft.duceap.commons.util.date.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/13
+ */
+@Slf4j
+@Component
+public class RedisCacheBusinessImpl implements ICacheBusiness {
+
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Autowired
+    public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
+        this.stringRedisTemplate = stringRedisTemplate;
+    }
+
+    @Override
+    public void saveOrgSyncTime(Date date) {
+        String dateFormat = DateUtils.getDateFormat(date, DateConst.DB_STORE_TIME);
+        stringRedisTemplate.opsForValue().set(ApproveRedisConstants.SYNC_ORG_TIME, dateFormat);
+    }
+
+    @Override
+    public void saveUserSyncTime(Date date) {
+        String dateFormat = DateUtils.getDateFormat(date, DateConst.DB_STORE_TIME);
+        stringRedisTemplate.opsForValue().set(ApproveRedisConstants.SYNC_USER_TIME, dateFormat);
+    }
+
+    @Override
+    public Date getLastOrgSyncTime() {
+        String dateString = stringRedisTemplate.opsForValue().get(ApproveRedisConstants.SYNC_ORG_TIME);
+        if (StrUtil.isBlank(dateString)) {
+            return null;
+        }
+        try {
+            return DateUtils.getDate(dateString, DateConst.DB_STORE_TIME);
+        } catch (ParseException e) {
+            log.error("parse date ", e);
+            return null;
+        }
+    }
+
+    @Override
+    public Date getLastUserSyncTime() {
+        String dateString = stringRedisTemplate.opsForValue().get(ApproveRedisConstants.SYNC_USER_TIME);
+        if (StrUtil.isBlank(dateString)) {
+            return null;
+        }
+        try {
+            return DateUtils.getDate(dateString, DateConst.DB_STORE_TIME);
+        } catch (ParseException e) {
+            log.error("parse date ", e);
+            return null;
+        }
+    }
+
+
+    @Override
+    public void appTokenActionHandle(AppTokenInfoDTO tokenInfo, String action) {
+        if (null == tokenInfo) {
+            return;
+        }
+        if (ZeroTrustTokenActionEnum.OFFLINE.getValue().equals(action)) {
+            deleteAppToken(tokenInfo);
+        } else if (ZeroTrustTokenActionEnum.ONLINE.getValue().equals(action)) {
+            cacheAppToken(tokenInfo);
+        } else if (ZeroTrustTokenActionEnum.RENEW.getValue().equals(action)) {
+            renewAppToken(tokenInfo);
+        }
+    }
+
+    private void cacheAppToken(AppTokenInfoDTO appToken) {
+        log.info("缓存的应用令牌 令牌id:{}, appId:{}", appToken.getAppTokenId(), appToken.getAppId());
+
+        long tokenExpireTime = appToken.getExpireAt().getTime();
+        long redisExpire = (tokenExpireTime - System.currentTimeMillis()) / 1000;
+        stringRedisTemplate.opsForValue().set(appToken.getAppTokenId(), JSON.toJSONString(appToken), redisExpire, TimeUnit.SECONDS);
+    }
+
+    private void renewAppToken(AppTokenInfoDTO tokenInfo) {
+        log.info("续期应用令牌");
+        cacheAppToken(tokenInfo);
+    }
+
+    private void deleteAppToken(AppTokenInfoDTO tokenInfo) {
+        log.info("删除缓存的应用令牌 令牌id:{}, appId:{}", tokenInfo.getAppTokenId(), tokenInfo.getAppId());
+        stringRedisTemplate.delete(tokenInfo.getAppTokenId());
+    }
+
+    @Override
+    public void userTokenActionHandle(UserTokenInfoDTO tokenInfo, String action) {
+        if (null == tokenInfo) {
+            return;
+        }
+        if (ZeroTrustTokenActionEnum.OFFLINE.getValue().equals(action)) {
+            deleteUserToken(tokenInfo);
+        } else if (ZeroTrustTokenActionEnum.ONLINE.getValue().equals(action)) {
+            cacheUserToken(tokenInfo);
+        } else if (ZeroTrustTokenActionEnum.RENEW.getValue().equals(action)) {
+            renewUserToken(tokenInfo);
+        }
+    }
+
+    private void renewUserToken(UserTokenInfoDTO tokenInfo) {
+        log.info("续期用户令牌");
+        cacheUserToken(tokenInfo);
+    }
+
+    private void cacheUserToken(UserTokenInfoDTO tokenInfo) {
+        log.info("缓存用户令牌 令牌id:{}, pid:{}", tokenInfo.getUserTokenId(), tokenInfo.getPid());
+        // 缓存人员令牌
+        long tokenExpireTime = tokenInfo.getExpireAt().getTime();
+        long redisExpire = (tokenExpireTime - System.currentTimeMillis()) / 1000;
+        stringRedisTemplate.opsForValue().set(tokenInfo.getUserTokenId(), JSON.toJSONString(tokenInfo), redisExpire, TimeUnit.SECONDS);
+
+    }
+
+    private void deleteUserToken(UserTokenInfoDTO tokenInfo) {
+        log.info("删除缓存的用户令牌 令牌id:{}, pid:{}", tokenInfo.getUserTokenId(), tokenInfo.getPid());
+        // 删除令牌
+        stringRedisTemplate.delete(tokenInfo.getUserTokenId());
+    }
+
+}

+ 95 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/RiskBusinessImpl.java

@@ -0,0 +1,95 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.dragoninfo.dcuc.duceap.enums.SchemeTypeEnum;
+import com.dragonsoft.dcuc.approve.business.IRiskBusiness;
+import com.dragonsoft.dcuc.approve.model.ApproveCirculationInfo;
+import com.dragonsoft.dcuc.approve.model.RiskScheme;
+import com.dragonsoft.dcuc.approve.service.IApproveCirculationService;
+import com.dragonsoft.dcuc.approve.service.IRiskSchemeService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/18
+ */
+@Slf4j
+@Component
+public class RiskBusinessImpl implements IRiskBusiness {
+
+    private IRiskSchemeService riskSchemeService;
+
+    private IApproveCirculationService approveCirculationService;
+
+    @Autowired
+    public void setApproveCirculationService(IApproveCirculationService approveCirculationService) {
+        this.approveCirculationService = approveCirculationService;
+    }
+
+    @Autowired
+    public void setRiskSchemeService(IRiskSchemeService riskSchemeService) {
+        this.riskSchemeService = riskSchemeService;
+    }
+
+    @Override
+    public ResponseStatus commitApproveRepetitionRisk(String applyIdcard, String operateIdcard, String createUserName) {
+        Assert.notBlank(applyIdcard);
+        Assert.notBlank(operateIdcard);
+        Assert.notBlank(createUserName);
+
+        if (applyIdcard.equals(operateIdcard)) {
+
+            RiskScheme riskScheme = riskSchemeService.selectEnableSchemeByType(SchemeTypeEnum.COMMIT_APPROVE_REPETITION_RISK);
+            if (riskScheme != null) {
+                String riskContent = "审批流程中,提交人与审批人都是:" + createUserName + "(" + operateIdcard + ")。";
+                //除第一个节点外,审请人和处理人同为一个人,产生《提交人与审批人重复风险》
+
+                return ResponseStatus.fail(riskContent);
+            }
+        }
+        return ResponseStatus.success();
+    }
+
+    @Override
+    public ResponseStatus singleApproveRisk(String approveRecordId, String operateIdcard, String createUserName) {
+        Assert.notBlank(approveRecordId);
+        Assert.notBlank(operateIdcard);
+        Assert.notBlank(createUserName);
+
+        RiskScheme riskScheme = riskSchemeService.selectEnableSchemeByType(SchemeTypeEnum.SINGLE_APPROVE_RISK);
+        if (riskScheme != null) {
+
+            int continuousApproveNum = Integer.parseInt(StringUtils.isEmpty(riskScheme.getContinuousApproveNum())
+                    ? "0" : riskScheme.getContinuousApproveNum());
+            //查询该流程单最近风险范围条数的审批记录
+            List<ApproveCirculationInfo> list = approveCirculationService.getListByApproveRecordIdAndAgree(approveRecordId);
+            // 过滤是当前审批人,去除重复节点,且是同意的条数
+            long count = list.stream()
+                    // 需去除申请人节点
+                    .skip(1)
+                    .filter(item -> item.getOperateUserId().equalsIgnoreCase(operateIdcard))
+                    .map(ApproveCirculationInfo::getNodeName)
+                    .distinct()
+                    .count();
+            log.info("审批单ID:{} 单人连续审批判断:配置的数量{},去除申请人节点的审批节点数:{}", approveRecordId, continuousApproveNum, count);
+
+            if (count >= continuousApproveNum) {
+                String riskContent = "审批流程流转过程中,连续" + continuousApproveNum + "个节点审批人相同,审批人都是:"
+                        + createUserName + "(" + operateIdcard + ")。";
+                return ResponseStatus.fail(riskContent);
+            }
+        }
+        return ResponseStatus.success();
+    }
+
+}

+ 296 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/UserOrgSyncBusinessImpl.java

@@ -0,0 +1,296 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.PageUtil;
+import com.dragoninfo.dcuc.common.annotation.CacheLock;
+import com.dragoninfo.dcuc.common.entity.ApiResultPage;
+import com.dragoninfo.dcuc.common.entity.ApiSearchReq;
+import com.dragoninfo.dcuc.common.entity.SearchParam;
+import com.dragonsoft.dcuc.approve.business.ICacheBusiness;
+import com.dragonsoft.dcuc.approve.business.IDcucBusiness;
+import com.dragonsoft.dcuc.approve.business.IUserOrgSyncBusiness;
+import com.dragonsoft.dcuc.approve.constants.ApproveLockConstants;
+import com.dragonsoft.dcuc.approve.model.ApproveOrgInfo;
+import com.dragonsoft.dcuc.approve.model.ApproveUserInfo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiOrgResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiPoliceResultVo;
+import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
+import com.dragonsoft.dcuc.approve.service.IApproveOrgInfoService;
+import com.dragonsoft.dcuc.approve.service.IApproveUserInfoService;
+import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
+import com.dragonsoft.duceap.commons.util.date.DateConst;
+import com.dragonsoft.duceap.commons.util.date.DateUtils;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.duceap.core.search.enums.SearchOperator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Slf4j
+@Component
+public class UserOrgSyncBusinessImpl implements IUserOrgSyncBusiness {
+
+    private IDcucBusiness dcucBusiness;
+
+    private ApproveProperties approveProperties;
+
+    private IApproveUserInfoService approveUserInfoService;
+
+    private IApproveOrgInfoService approveOrgInfoService;
+
+    private ICacheBusiness cacheBusiness;
+
+    @Autowired
+    public void setCacheBusiness(ICacheBusiness cacheBusiness) {
+        this.cacheBusiness = cacheBusiness;
+    }
+
+    @Autowired
+    public void setApproveOrgInfoService(IApproveOrgInfoService approveOrgInfoService) {
+        this.approveOrgInfoService = approveOrgInfoService;
+    }
+
+    @Autowired
+    public void setApproveUserInfoService(IApproveUserInfoService approveUserInfoService) {
+        this.approveUserInfoService = approveUserInfoService;
+    }
+
+    @Autowired
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
+
+    @Autowired
+    public void setDcucBusiness(IDcucBusiness dcucBusiness) {
+        this.dcucBusiness = dcucBusiness;
+    }
+
+    @CacheLock(prefix = ApproveLockConstants.SYNC_ORG)
+    @Override
+    public ResponseStatus syncAllOrg() {
+        return processOrg(Collections.emptyMap());
+    }
+
+    @CacheLock(prefix = ApproveLockConstants.SYNC_USER)
+    @Override
+    public ResponseStatus syncAllUser() {
+        return processUser(Collections.emptyMap());
+    }
+
+    @CacheLock(prefix = ApproveLockConstants.SYNC_ORG)
+    @Override
+    public ResponseStatus syncNewOrg() {
+        Date lastUpdateTime = getOrgSyncLastTime();
+        Integer syncStartOffsetMinute = approveProperties.getSyncStartOffsetMinute();
+
+        DateTime startDateTime = DateUtil.offsetMinute(lastUpdateTime, -syncStartOffsetMinute);
+
+        DateTime date = DateUtil.date();
+        DateTime endDateTime = DateUtil.offsetMinute(date, syncStartOffsetMinute);
+        Map<String, SearchParam> stringSearchParamMap = generalFilter(startDateTime, endDateTime, "updateDate");
+        return processOrg(stringSearchParamMap);
+    }
+
+    @CacheLock(prefix = ApproveLockConstants.SYNC_USER)
+    @Override
+    public ResponseStatus syncNewUser() {
+        Date lastUpdateTime = getUserSyncLastTime();
+        Integer syncStartOffsetMinute = approveProperties.getSyncStartOffsetMinute();
+
+        DateTime startDateTime = DateUtil.offsetMinute(lastUpdateTime, -syncStartOffsetMinute);
+
+        DateTime date = DateUtil.date();
+        DateTime endDateTime = DateUtil.offsetMinute(date, syncStartOffsetMinute);
+        Map<String, SearchParam> stringSearchParamMap = generalFilter(startDateTime, endDateTime, "updateTime");
+        return processUser(stringSearchParamMap);
+    }
+
+    /**
+     * 处理用户信息
+     *
+     * @param stringSearchParamMap 筛选条件
+     * @return 状态
+     */
+    protected ResponseStatus processOrg(Map<String, SearchParam> stringSearchParamMap) {
+        int orgTotal = getOrgTotal(stringSearchParamMap);
+        Integer syncPageSize = approveProperties.getSyncPageSize();
+        int totalPage = getTotalPage(orgTotal, syncPageSize);
+        int currentPage = 1;
+        log.info("开始同步机构数据:总数 :{} ,页码:{} ,需同步页数:{}", orgTotal, syncPageSize, totalPage);
+        log.info("开始同步机构数据:时间范围:{}", JsonUtils.toJSONString(stringSearchParamMap));
+
+        Date syncStartTime = DateUtils.getDate();
+        for (int i = currentPage; i <= totalPage; i++) {
+            log.info("开始同步机构数据:需同步页数:{} ,当前页数:{}", totalPage, i);
+
+            ApiSearchReq apiSearchReq = ApiSearchReq.reqInfo(i, syncPageSize, stringSearchParamMap);
+            ApiResultPage<ApiOrgResultVo> apiPoliceResultVoApiResultPage = dcucBusiness.orgPage(apiSearchReq);
+            List<ApiOrgResultVo> content = apiPoliceResultVoApiResultPage.getContent();
+
+            List<ApproveOrgInfo> addList = new ArrayList<>();
+            List<ApproveOrgInfo> updateList = new ArrayList<>();
+
+            for (ApiOrgResultVo apiPoliceResultVo : content) {
+                String orgCode = apiPoliceResultVo.getOrgCode();
+                ApproveOrgInfo approveOrgInfo = apiPoliceResultVo.toApproveOrgInfo();
+
+                ApproveOrgInfo exitsApproveUserInfo = approveOrgInfoService.selectByOrgCode(orgCode);
+                if (ObjectUtil.isNotNull(exitsApproveUserInfo)) {
+                    approveOrgInfo.setCreateTime(exitsApproveUserInfo.getCreateTime());
+                    approveOrgInfo.setId(exitsApproveUserInfo.getId());
+                    updateList.add(approveOrgInfo);
+                } else {
+                    addList.add(approveOrgInfo);
+                }
+            }
+
+            approveOrgInfoService.updateAllList(updateList);
+            approveOrgInfoService.saveAllList(addList);
+        }
+        approveOrgInfoService.updateUpOrgId(syncStartTime);
+        cacheBusiness.saveOrgSyncTime(DateUtils.getDate());
+        return ResponseStatus.success();
+    }
+
+    /**
+     * 处理用户信息
+     *
+     * @param stringSearchParamMap 筛选条件
+     * @return 状态
+     */
+    protected ResponseStatus processUser(Map<String, SearchParam> stringSearchParamMap) {
+        int orgTotal = getPoliceTotal(stringSearchParamMap);
+        Integer syncPageSize = approveProperties.getSyncPageSize();
+        int totalPage = getTotalPage(orgTotal, syncPageSize);
+        int currentPage = 1;
+        log.info("开始同步用户数据:总数 :{} ,页码:{} ,需同步页数:{}", orgTotal, syncPageSize, totalPage);
+        log.info("开始同步用户数据:时间范围:{}", JsonUtils.toJSONString(stringSearchParamMap));
+
+
+        for (int i = currentPage; i <= totalPage; i++) {
+            log.info("开始同步用户数据:需同步页数:{} ,当前页数:{}", totalPage, i);
+
+            ApiSearchReq apiSearchReq = ApiSearchReq.reqInfo(i, syncPageSize, stringSearchParamMap);
+            ApiResultPage<ApiPoliceResultVo> apiPoliceResultVoApiResultPage = dcucBusiness.policePage(apiSearchReq);
+            List<ApiPoliceResultVo> content = apiPoliceResultVoApiResultPage.getContent();
+
+            List<ApproveUserInfo> addList = new ArrayList<>();
+            List<ApproveUserInfo> updateList = new ArrayList<>();
+
+            for (ApiPoliceResultVo apiPoliceResultVo : content) {
+                String idcard = apiPoliceResultVo.getIdcard();
+                ApproveUserInfo approveUserInfo = apiPoliceResultVo.toApproveUserInfo();
+
+                ApproveUserInfo exitsApproveUserInfo = approveUserInfoService.selectByIdcard(idcard);
+                if (ObjectUtil.isNotNull(exitsApproveUserInfo)) {
+                    approveUserInfo.setCreateTime(exitsApproveUserInfo.getCreateTime());
+                    approveUserInfo.setId(exitsApproveUserInfo.getId());
+                    updateList.add(approveUserInfo);
+                } else {
+                    addList.add(approveUserInfo);
+                }
+            }
+
+            approveUserInfoService.updateAllList(updateList);
+            approveUserInfoService.saveAllList(addList);
+        }
+        cacheBusiness.saveUserSyncTime(DateUtils.getDate());
+        return ResponseStatus.success();
+    }
+
+    /**
+     * 生成总页数,从第一页开始
+     *
+     * @param total 总数量
+     * @param size  页面大小
+     * @return 总页数
+     */
+    protected int getTotalPage(int total, int size) {
+        return PageUtil.totalPage(total, size);
+    }
+
+    /**
+     * 获取机构总条数
+     *
+     * @param filterMap 过滤条件
+     * @return 总条数
+     */
+    protected int getOrgTotal(Map<String, SearchParam> filterMap) {
+        ApiSearchReq apiSearchReq = ApiSearchReq.reqInfo(1, 1, filterMap);
+        ApiResultPage<ApiOrgResultVo> apiOrgResultVoApiResultPage = dcucBusiness.orgPage(apiSearchReq);
+        int total = 0;
+        if (ObjectUtil.isNotNull(apiOrgResultVoApiResultPage)) {
+            total = Math.toIntExact(apiOrgResultVoApiResultPage.getTotal());
+        }
+        return total;
+    }
+
+    /**
+     * 获取警员总条数
+     *
+     * @param filterMap 过滤条件
+     * @return 总条数
+     */
+    protected int getPoliceTotal(Map<String, SearchParam> filterMap) {
+        ApiSearchReq apiSearchReq = ApiSearchReq.reqInfo(1, 1, filterMap);
+        ApiResultPage<ApiPoliceResultVo> apiOrgResultVoApiResultPage = dcucBusiness.policePage(apiSearchReq);
+        int total = 0;
+        if (ObjectUtil.isNotNull(apiOrgResultVoApiResultPage)) {
+            total = Math.toIntExact(apiOrgResultVoApiResultPage.getTotal());
+        }
+        return total;
+    }
+
+    /**
+     * 生成过滤参数
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @param keyName   键名称
+     * @return 过滤参数
+     */
+    protected Map<String, SearchParam> generalFilter(Date startTime, Date endTime, String keyName) {
+        //设置同步时间
+        SearchParam updateTimeSearch = new SearchParam();
+        updateTimeSearch.setOperator(SearchOperator.rangeDate.name());
+        String start = DateUtils.getDateFormat(startTime, DateConst.HYPHEN_DISPLAY_TIME);
+        String end = DateUtils.getDateFormat(endTime, DateConst.HYPHEN_DISPLAY_TIME);
+        updateTimeSearch.setValue(new String[]{start, end});
+
+        Map<String, SearchParam> filters = new HashMap<>(2);
+        filters.put(keyName, updateTimeSearch);
+        return filters;
+    }
+
+
+    protected Date getUserSyncLastTime() {
+        Date date = cacheBusiness.getLastUserSyncTime();
+
+        if (ObjectUtil.isNull(date)) {
+            date = approveUserInfoService.getLastUpdateTime();
+        }
+        return date;
+    }
+
+    protected Date getOrgSyncLastTime() {
+        Date date = cacheBusiness.getLastOrgSyncTime();
+
+        if (ObjectUtil.isNull(date)) {
+            date = approveOrgInfoService.getLastUpdateTime();
+        }
+        return date;
+    }
+
+}

+ 1 - 1
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/WorkFlowBusinessImpl.java

@@ -107,7 +107,7 @@ public class WorkFlowBusinessImpl implements IWorkFlowBusiness {
             //调用工作流获取流程信息
             workflowProcessVo = workflowClientFactory.getWorkflowProcessClient().queryWorkflowProcessByBusinessCode(businessCode);
         } catch (ApplicationException e) {
-            log.info("流程类型标识码-Exception:【{}】", businessCode);
+            log.error("流程类型标识码-Exception:【{}】", businessCode, e);
             throw new ApplicationException(ErrorCode.WORKFLOW_EXCEPTION.getCode(), ErrorCode.WORKFLOW_EXCEPTION.getMsg());
         }
         return workflowProcessVo;

+ 97 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ZeroTrustTokenBusinessiImpl.java

@@ -0,0 +1,97 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import com.dragonsoft.dcuc.approve.business.ICacheBusiness;
+import com.dragonsoft.dcuc.approve.business.IZeroTrustTokenBusiness;
+import com.dragonsoft.dcuc.approve.dto.zerotrust.AppTokenInfoDTO;
+import com.dragonsoft.dcuc.approve.dto.zerotrust.UserTokenInfoDTO;
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustTokenTypeEnum;
+import com.dragonsoft.dcuc.approve.model.req.v1.token.TokenReceiveVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
+import com.dragonsoft.smtools.loader.SMFactory;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author mazq
+ * @date 2023/9/8
+ */
+@Slf4j
+@Service
+public class ZeroTrustTokenBusinessiImpl implements IZeroTrustTokenBusiness {
+
+    private ICacheBusiness cacheBusiness;
+
+    private SMFactory smFactory;
+
+    @Autowired
+    public void setSmFactory(SMFactory smFactory) {
+        this.smFactory = smFactory;
+    }
+
+    @Autowired
+    public void setCacheBusiness(ICacheBusiness cacheBusiness) {
+        this.cacheBusiness = cacheBusiness;
+    }
+
+    @SneakyThrows
+    @Override
+    public ZeroTrustMessageRespVO tokenReceive(TokenReceiveVO receiveVo) {
+        // 校验请求签名
+        ZeroTrustMessageRespVO check = tokenReceiveSignCheck(receiveVo);
+        if (check.isRespFail()) {
+            return check;
+        }
+        // 缓存令牌到redis
+        tokenReceiveCache(receiveVo);
+
+        return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
+    }
+
+    private ZeroTrustMessageRespVO tokenReceiveSignCheck(TokenReceiveVO receiveVo) {
+        String generalNoticeSign = generalNoticeSign(receiveVo);
+        String requestSign = receiveVo.getSign();
+        if (!generalNoticeSign.equalsIgnoreCase(requestSign)) {
+            log.info("令牌接收签名校验不通过, 请求中的签名:{}, 原文生成的签名:{}", requestSign, generalNoticeSign);
+            return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.OPERATE_FAIL);
+        } else {
+            return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
+        }
+    }
+
+    /**
+     * 生成令牌通知签名
+     *
+     * @param tokenReceiveReqVo 应用通知信息
+     * @return 签名
+     */
+    public String generalNoticeSign(TokenReceiveVO tokenReceiveReqVo) {
+        String action = tokenReceiveReqVo.getAction();
+        String type = tokenReceiveReqVo.getType();
+        String token = tokenReceiveReqVo.getToken();
+        String nonce = tokenReceiveReqVo.getNonce();
+
+        String origin = "action=" + action + "&type=" + type + "&token=" + token + "&nonce=" + nonce;
+        log.info("noticeOrigin :{}", origin);
+        return smFactory.getSM3().summary(origin).toString();
+    }
+
+    private void tokenReceiveCache(TokenReceiveVO receiveVo) throws JsonProcessingException {
+        String action = receiveVo.getAction();
+        String type = receiveVo.getType();
+        String token = receiveVo.getToken();
+        ObjectMapper objectMapper = new ObjectMapper();
+        if (ZeroTrustTokenTypeEnum.USER.getValue().equals(type)) {
+            UserTokenInfoDTO tokenInfo = objectMapper.readValue(token, UserTokenInfoDTO.class);
+            cacheBusiness.userTokenActionHandle(tokenInfo, action);
+        } else {
+            AppTokenInfoDTO tokenInfo = objectMapper.readValue(token, AppTokenInfoDTO.class);
+            cacheBusiness.appTokenActionHandle(tokenInfo, action);
+        }
+    }
+
+}

+ 0 - 23
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/componet/SkipSslRestTemplateProvider.java

@@ -1,23 +0,0 @@
-package com.dragonsoft.dcuc.approve.componet;
-
-import com.dragoninfo.dcuc.common.http.SkipSslVerificationHttpRequestFactory;
-import com.dragonsoft.auditlog.collection.qmtj.provider.IRestTemplateProvider;
-import org.springframework.web.client.RestTemplate;
-
-/**
- * <p>
- * 忽略https请求客户端
- * </p>
- *
- * @author huangzqa
- * @date 2021/6/30
- */
-public class SkipSslRestTemplateProvider implements IRestTemplateProvider {
-    @Override
-    public RestTemplate getRestTemplate() {
-        SkipSslVerificationHttpRequestFactory skipSslVerificationHttpRequestFactory
-                = new SkipSslVerificationHttpRequestFactory();
-
-        return new RestTemplate(skipSslVerificationHttpRequestFactory);
-    }
-}

+ 64 - 3
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/ApproveConfig.java

@@ -1,11 +1,22 @@
 package com.dragonsoft.dcuc.approve.config;
 
+import com.dragoninfo.dcuc.common.http.SkipSslVerificationHttpRequestFactory;
 import com.dragonsoft.auditlog.collection.qmtj.provider.IRestTemplateProvider;
-import com.dragonsoft.dcuc.approve.componet.SkipSslRestTemplateProvider;
+import com.dragonsoft.dcuc.approve.constants.ApproveBeanConstants;
 import com.dragonsoft.dcuc.approve.filter.ProofsFilter;
+import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
+import com.dragonsoft.duceap.base.exception.ApplicationException;
+import com.dragonsoft.smtools.loader.SMFactory;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+import java.lang.reflect.InvocationTargetException;
 
 /**
  * <p>
@@ -15,14 +26,62 @@ import org.springframework.context.annotation.Configuration;
  * @author huangzqa
  * @date 2021/6/30
  */
+@Slf4j
 @Configuration
 public class ApproveConfig {
 
+    private ApproveProperties approveProperties;
+
+    @Autowired
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
+
     @Bean
-    IRestTemplateProvider restTemplateProvider() {
+    public IRestTemplateProvider restTemplateProvider() {
         return new SkipSslRestTemplateProvider();
+
     }
 
+    static class SkipSslRestTemplateProvider implements IRestTemplateProvider {
+        @Override
+        public RestTemplate getRestTemplate() {
+            SkipSslVerificationHttpRequestFactory skipSslVerificationHttpRequestFactory
+                    = new SkipSslVerificationHttpRequestFactory();
+
+            return new RestTemplate(skipSslVerificationHttpRequestFactory);
+        }
+    }
+
+
+    @Bean(name = ApproveBeanConstants.SKIP_SSL_REST_TEMPLATE)
+    public RestTemplate restTemplate() {
+        SkipSslVerificationHttpRequestFactory skipSslVerificationHttpRequestFactory
+                = new SkipSslVerificationHttpRequestFactory();
+        skipSslVerificationHttpRequestFactory.setReadTimeout(approveProperties.getRequestTimeout());
+        skipSslVerificationHttpRequestFactory.setConnectTimeout(approveProperties.getRequestTimeout());
+        return new RestTemplate(skipSslVerificationHttpRequestFactory);
+    }
+
+    @Bean(name = ApproveBeanConstants.DRAGON_OBJECT_MAPPER)
+    public ObjectMapper dragonObjectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 忽略不对应的字段
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        return objectMapper;
+    }
+
+    @Bean
+    public SMFactory smFactory() {
+        try {
+            return SMFactory.init(approveProperties.getSmTypeEnum());
+        } catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) {
+            log.error("国密初始化错误", e);
+            throw new ApplicationException("国密初始化错误");
+        }
+    }
+
+
     @Bean
     public ProofsFilter proofsFilter() {
         return new ProofsFilter();
@@ -32,7 +91,9 @@ public class ApproveConfig {
     public FilterRegistrationBean<ProofsFilter> filterRegistrationBean() {
         FilterRegistrationBean<ProofsFilter> filterRegistrationBean = new FilterRegistrationBean<>();
         filterRegistrationBean.setFilter(proofsFilter());
-        filterRegistrationBean.addUrlPatterns("/*");
+        filterRegistrationBean.addUrlPatterns("/api/v1/*");
+        filterRegistrationBean.addUrlPatterns("/api/v2/*");
+        filterRegistrationBean.addUrlPatterns("/v1/*");
         filterRegistrationBean.setName("proofsFilter");
         return filterRegistrationBean;
     }

+ 36 - 6
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/config/AsyncExecuteThreadPoolConfig.java

@@ -3,13 +3,21 @@ package com.dragonsoft.dcuc.approve.config;
 import com.alibaba.ttl.threadpool.TtlExecutors;
 import com.dragonsoft.duceap.commons.util.json.JsonUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.context.event.EventPublishingRunListener;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.SimpleApplicationEventMulticaster;
 import org.springframework.scheduling.annotation.AsyncConfigurer;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.util.ErrorHandler;
 
+import java.lang.reflect.Method;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ThreadPoolExecutor;
 
@@ -46,7 +54,6 @@ public class AsyncExecuteThreadPoolConfig implements AsyncConfigurer {
     @Override
     public Executor getAsyncExecutor() {
         initDefaultPoolProperties();
-
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(corePoolSize);
         executor.setMaxPoolSize(maxPoolSize);
@@ -58,20 +65,43 @@ public class AsyncExecuteThreadPoolConfig implements AsyncConfigurer {
         executor.setAwaitTerminationSeconds(60);
         executor.initialize();
 
-        //线程池获取 ThreadLocal 中的地址
+        //线程中获取主线程的用户信息和请求信息
         return TtlExecutors.getTtlExecutor(executor);
     }
 
+    /**
+     * 配置监听器的异常处理器
+     */
+    @Bean("applicationEventMulticaster")
+    public SimpleApplicationEventMulticaster applicationEventMulticaster(BeanFactory beanFactory) {
+        SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
+        multicaster.setErrorHandler(new LoggingErrorHandler());
+        return multicaster;
+    }
+
+    private static class LoggingErrorHandler implements ErrorHandler {
+
+        private static final Log logger = LogFactory.getLog(EventPublishingRunListener.class);
+
+        @Override
+        public void handleError(Throwable throwable) {
+            logger.warn("Error calling ApplicationEventListener", throwable);
+        }
+
+    }
+
+
     @Override
     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
-        return (ex, method, params) -> log.error("异步线程调用["
-                + method.getDeclaringClass().getName() + "." + method.getName()
-                + "]方法出错,参数:" + JsonUtils.toJSONString(params), ex);
+        return (ex, method, params) -> log.error("异步线程调用[" + method.getDeclaringClass().getName() + "." + method.getName() + "]方法出错,参数:" + JsonUtils.toJSONString(params), ex);
     }
 
+
     /**
      * 初始化默认线程池参数
-     **/
+     *
+     * @author pan.lu 2020-7-13 9:27:33
+     */
     private void initDefaultPoolProperties() {
         int procNum = Runtime.getRuntime().availableProcessors();
         if (corePoolSize == -1) {

+ 25 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveBeanConstants.java

@@ -0,0 +1,25 @@
+package com.dragonsoft.dcuc.approve.constants;
+
+/**
+ * <p>
+ * 常量
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2021/6/29
+ */
+public final class ApproveBeanConstants {
+
+    /**
+     * 忽略了SSL证书的RestTemplate
+     */
+    public static final String SKIP_SSL_REST_TEMPLATE = "skipSslRestTemplate";
+
+    /**
+     * 自定义的OBJECT_MAPPER
+     */
+    public static final String DRAGON_OBJECT_MAPPER = "dragonObjectMapper";
+
+    private ApproveBeanConstants() {
+    }
+}

+ 15 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveConstants.java

@@ -31,6 +31,21 @@ public final class ApproveConstants {
      */
     public static final String LIST_TIP = "%s申请访问%s红名单%s。";
 
+    /**
+     * task id 任务编号前缀
+     */
+    public static final String TASK_ID_PREFIX = "RWBH";
+
+    /**
+     * 任务ID长度
+     */
+    public static final Integer TAK_ID_LENGTH = 38;
+
+    /**
+     * syslog日志sysLogName
+     */
+    public static final String SYS_LOG_NAME = "sysLog";
+
     private ApproveConstants() {
     }
 }

+ 25 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveLockConstants.java

@@ -0,0 +1,25 @@
+package com.dragonsoft.dcuc.approve.constants;
+
+/**
+ * <p>
+ * 常量
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2021/6/29
+ */
+public final class ApproveLockConstants {
+
+    /**
+     * 同步机构
+     */
+    public static final String SYNC_ORG = "syncOrg";
+
+    /**
+     * 同步用户
+     */
+    public static final String SYNC_USER = "syncUser";
+
+    private ApproveLockConstants() {
+    }
+}

+ 35 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/constants/ApproveRedisConstants.java

@@ -0,0 +1,35 @@
+package com.dragonsoft.dcuc.approve.constants;
+
+/**
+ * <p>
+ * redis 常量
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/8
+ */
+public final class ApproveRedisConstants {
+
+    /**
+     * 审批命名空间
+     */
+    public static final String APPROVE_NAMESPACE = "DCUC-APPROVE:";
+
+    /**
+     * 审批推送,任务id redis前缀
+     */
+    public static final String APPROVAL_TASK_ID_PREFIX = APPROVE_NAMESPACE + "APPROVAL_TASK_ID:";
+
+    /**
+     * 同步机构时间
+     */
+    public static final String SYNC_ORG_TIME = APPROVE_NAMESPACE + "SYNC_ORG_TIME";
+
+    /**
+     * 同步用户时间
+     */
+    public static final String SYNC_USER_TIME = APPROVE_NAMESPACE + "SYNC_USER_TIME";
+
+
+}
+

+ 32 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/dto/ApproveLogDTO.java

@@ -0,0 +1,32 @@
+package com.dragonsoft.dcuc.approve.dto;
+
+import com.dragonsoft.dcuc.approve.model.vo.LogInfoMetaDTO;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/7/12
+ */
+@Builder
+@Data
+public class ApproveLogDTO {
+    /**
+     * 日志内容
+     */
+    private String content;
+
+    /**
+     * 日志标题
+     */
+    private String title;
+
+    /**
+     * 日志信息
+     */
+    private LogInfoMetaDTO logInfoMetaDTO;
+}

+ 46 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/dto/RzyRiskLogDTO.java

@@ -0,0 +1,46 @@
+package com.dragonsoft.dcuc.approve.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 权限风险
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/20
+ */
+@Builder
+@Data
+public class RzyRiskLogDTO {
+    /**
+     * 风险类型
+     **/
+    private String riskType;
+
+    /**
+     * 用户名
+     */
+    private String userName;
+
+    /**
+     * 鉴权者IP
+     */
+    private String authIp;
+
+    /**
+     * 风险发送时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date riskAt;
+
+    /**
+     * 风险详情
+     */
+    private String detail;
+
+}

Some files were not shown because too many files changed in this diff