Browse Source

Merge branch 'huangzqa-add-task-approve-240301' into 'master'

Huangzqa add task approve 240301

See merge request dcuc-tjdsj/approve-core!114
黄资权 1 năm trước cách đây
mục cha
commit
76af72094b
43 tập tin đã thay đổi với 1395 bổ sung28 xóa
  1. 50 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveGetApproverEnum.java
  2. 2 2
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveTypeEnum.java
  3. 5 1
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/BizTypeEnum.java
  4. 9 4
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/FlowTypeEnum.java
  5. 33 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3WorkFlowCallbackFacade.java
  6. 1 1
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveAuthInfoVO.java
  7. 31 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveTaskInfoVO.java
  8. 6 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApprovalInfoRespVO.java
  9. 6 0
      approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/resp/ApproveTaskClassDetailRespVO.java
  10. 5 0
      approve-core-service/src/main/assembly/assembly.xml
  11. 0 1
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/ApproveApplication.java
  12. 71 2
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/api/impl/ApiV3ApproveBusinessImpl.java
  13. 23 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/IGetApproverBusiness.java
  14. 33 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/ConfigGetApproverBusinessImpl.java
  15. 38 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/CurrentOrgGetApproverBusinessImpl.java
  16. 64 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/NextAndNextOrgGetApproverBusinessImpl.java
  17. 46 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/NextOrgGetApproverBusinessImpl.java
  18. 22 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/IDcucBusiness.java
  19. 25 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/IWorkFlowCallbackBusiness.java
  20. 1 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/impl/BimBusinessImpl.java
  21. 110 5
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/impl/DcucBusinessImpl.java
  22. 64 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/impl/DcucWorkFlowCallbackBusinessImpl.java
  23. 1 1
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveCommonBusinessImpl.java
  24. 10 5
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveLogBusinessImpl.java
  25. 1 1
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/SecurityUserBusinessImpl.java
  26. 46 2
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApproveTaskClassFacade.java
  27. 35 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/ApiV3WorkFlowCallbackFacade.java
  28. 15 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/resource/AjInfoMapper.java
  29. 15 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/resource/JqInfoMapper.java
  30. 5 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveTaskClass.java
  31. 7 3
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/dto/ProcessInstanceInfoDTO.java
  32. 67 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/resource/AjInfo.java
  33. 67 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/resource/JqInfo.java
  34. 34 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/vo/dcuc/UserLabel2RespVO.java
  35. 45 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/properties/ApproveWorkFlowCallbackProperties.java
  36. 20 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/IAjInfoService.java
  37. 21 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/IJqInfoService.java
  38. 41 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/impl/AjInfoServiceImpl.java
  39. 41 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/impl/JqInfoServiceImpl.java
  40. 36 0
      approve-core-service/src/main/resources/config/mysql/V1_1_0020__add_jqinfo_ajinfo.sql
  41. 2 0
      approve-core-service/src/main/resources/config/mysql/V1_1_0021__add_task_class_app_name.sql
  42. 3 0
      approve-core-service/src/main/resources/workflow/README.md
  43. 238 0
      approve-core-service/src/main/resources/workflow/任务标签审批e1c77bccd12d4081842dcfa4d552f2dd(_)-20240304.xml

+ 50 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveGetApproverEnum.java

@@ -0,0 +1,50 @@
+package com.dragonsoft.dcuc.approve.enumresources;
+
+import com.dragonsoft.duceap.base.enums.ICodeEnum;
+
+/**
+ * <p>
+ * 审批回调获取审批人类型
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ */
+public enum ApproveGetApproverEnum implements ICodeEnum {
+    /**
+     * 当前机构
+     */
+    CURRENT_ORG("currentOrg", "当前机构"),
+    /**
+     * 上一级机构
+     */
+    NEXT_ORG("nextOrg", "上一级机构"),
+    /**
+     * 上一级一直再上级
+     */
+    NEXT_AND_NEXT_ORG("nextAndNextOrg", "上一级一直再上级"),
+    /**
+     * 配置的
+     */
+    CONFIG("config", "配置的");
+
+    private final String value;
+
+    private final String label;
+
+    ApproveGetApproverEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    @Override
+    public String getValue() {
+        return this.value;
+    }
+
+    @Override
+    public String getLabel() {
+        return this.label;
+    }
+
+}

+ 2 - 2
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/ApproveTypeEnum.java

@@ -30,12 +30,12 @@ public enum ApproveTypeEnum implements ICodeEnum {
     /**
      * 业务任务
      */
-    BUSINESS("04", "业务任务"),
+    TASK("04", "业务任务"),
 
     /**
      * 其他
      */
-    OTHER("05", "其他");
+    OTHER("99", "其他");
 
     public final String value;
     public final String label;

+ 5 - 1
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/BizTypeEnum.java

@@ -15,7 +15,11 @@ public enum BizTypeEnum implements ICodeEnum {
     /**
      * 权限
      */
-    AUTH("auth", "权限");
+    AUTH("auth", "权限"),
+    /**
+     * 任务
+     */
+    TASK("task", "任务");
 
     private final String value;
 

+ 9 - 4
approve-api/src/main/java/com/dragonsoft/dcuc/approve/enumresources/FlowTypeEnum.java

@@ -1,6 +1,7 @@
 package com.dragonsoft.dcuc.approve.enumresources;
 
 import com.dragonsoft.duceap.base.enums.ICodeEnum;
+import lombok.Getter;
 
 /**
  * 权限申请类型枚举
@@ -29,6 +30,11 @@ public enum FlowTypeEnum implements ICodeEnum {
      * 数据授权
      */
     DATA_AUTH("DATA_AUTH", "数据授权工作单", "资源资源"),
+
+    /**
+     * 业务任务
+     */
+    TASK("TASK", "业务任务", "任务"),
     /**
      * 其他
      */
@@ -39,6 +45,7 @@ public enum FlowTypeEnum implements ICodeEnum {
 
     private final String label;
 
+    @Getter
     private final String resourceName;
 
     FlowTypeEnum(String value, String label, String resourceName) {
@@ -58,10 +65,6 @@ public enum FlowTypeEnum implements ICodeEnum {
         return label;
     }
 
-    public String getResourceName() {
-        return resourceName;
-    }
-
     public ListResourceTypeEnum toListResourceTypeEnum() {
         switch (this) {
             case DATA_AUTH:
@@ -86,6 +89,8 @@ public enum FlowTypeEnum implements ICodeEnum {
                 return ApproveTypeEnum.SERVICE;
             case APP_FUN_AUTH:
                 return ApproveTypeEnum.APP_FUNCTION;
+            case TASK:
+                return ApproveTypeEnum.TASK;
             case OTHER:
                 return ApproveTypeEnum.OTHER;
             default:

+ 33 - 0
approve-api/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/IApiV3WorkFlowCallbackFacade.java

@@ -0,0 +1,33 @@
+package com.dragonsoft.dcuc.approve.facade.api.v3;
+
+import io.swagger.annotations.Api;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Api(tags = "工作流回调服务接口")
+@FeignClient(name = "approve", path = "api/v3/work-flow-callback/")
+public interface IApiV3WorkFlowCallbackFacade {
+    /**
+     * 1、先获取当前机构所属标签的人
+     * 2、无人员再获取上级机构所属标签的人,循环获取直至顶级节点
+     * 3、获取配置的兜底审批人员
+     *
+     * @param param 参数
+     * @return 进行审批的人员身份证号码
+     */
+    @PostMapping("current-org-next/handlers")
+    List<String> getCurrentOrgAndNextOrgLabelHandlers(@RequestBody Map<String, Object> param);
+
+}

+ 1 - 1
approve-api/src/main/java/com/dragonsoft/dcuc/approve/model/req/v3/ZeroTrustApproveAuthInfoVO.java

@@ -17,7 +17,7 @@ import java.io.Serializable;
  * @author huangzqa
  * @date 2023/11/27
  */
-@ApiModel("创建审批请求")
+@ApiModel("权限审批请求信息")
 @Setter
 @Getter
 @ToString

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

@@ -0,0 +1,31 @@
+package com.dragonsoft.dcuc.approve.model.req.v3;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2024/03/01
+ */
+@ApiModel("任务审批请求信息")
+@Setter
+@Getter
+@ToString
+public class ZeroTrustApproveTaskInfoVO implements Serializable {
+
+    @ApiModelProperty("警情编号")
+    private String jqbh;
+
+    @ApiModelProperty("案件编号")
+    private String ajbh;
+
+}

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

@@ -44,6 +44,12 @@ public class ApprovalInfoRespVO {
     @ApiModelProperty(value = "申请内容")
     private String applyContent;
 
+    @ApiModelProperty(value = "申请业务数据")
+    private String otherApplyContext;
+
+    @ApiModelProperty(value = "任务类型")
+    private String approveTaskClass;
+
     @ApiModelProperty(value = "申请理由")
     private String applyReason;
 

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

@@ -48,6 +48,12 @@ public class ApproveTaskClassDetailRespVO {
     @ApiModelProperty(value = "来源应用代码")
     private String sourceAppCode;
 
+    /**
+     * 来源应用名称
+     */
+    @ApiModelProperty(value = "来源应用名称")
+    private String sourceAppName;
+
     /**
      * 创建人
      */

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

@@ -31,6 +31,11 @@
             <outputDirectory>lib</outputDirectory>
             <fileMode>0755</fileMode>
         </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/classes/workflow</directory>
+            <outputDirectory>workflow</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
         <fileSet>
             <directory>${project.build.directory}</directory>
             <outputDirectory>lib</outputDirectory>

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

@@ -4,7 +4,6 @@ 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.scheduling.annotation.EnableScheduling;

+ 71 - 2
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/api/impl/ApiV3ApproveBusinessImpl.java

@@ -16,13 +16,17 @@ import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoReqVO;
 import com.dragonsoft.dcuc.approve.model.req.ResourceInfoReqVO;
 import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveAuthInfoVO;
 import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCreateReqV3VO;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveTaskInfoVO;
 import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppItemUserTokenInfoRespVO;
 import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
 import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiPoliceResultVo;
 import com.dragonsoft.dcuc.approve.model.vo.dcuc.UserContactVo;
+import com.dragonsoft.dcuc.approve.service.resource.IAjInfoService;
+import com.dragonsoft.dcuc.approve.service.resource.IJqInfoService;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.security.SecurityUser;
+import com.dragonsoft.duceap.base.exception.ApplicationException;
 import com.dragonsoft.duceap.base.utils.UserContextUtils;
 import com.dragonsoft.duceap.commons.util.date.DateConst;
 import com.dragonsoft.duceap.commons.util.date.DateUtils;
@@ -52,6 +56,20 @@ public class ApiV3ApproveBusinessImpl implements IApiV3ApproveBusiness {
 
     private IDcucBusiness dcucBusiness;
 
+    private IAjInfoService ajInfoService;
+
+    private IJqInfoService jqInfoService;
+
+    @Autowired
+    public void setJqInfoService(IJqInfoService jqInfoService) {
+        this.jqInfoService = jqInfoService;
+    }
+
+    @Autowired
+    public void setAjInfoService(IAjInfoService ajInfoService) {
+        this.ajInfoService = ajInfoService;
+    }
+
     @Autowired
     public void setDcucBusiness(IDcucBusiness dcucBusiness) {
         this.dcucBusiness = dcucBusiness;
@@ -198,13 +216,29 @@ public class ApiV3ApproveBusinessImpl implements IApiV3ApproveBusiness {
         if (ObjectUtil.isNotNull(bizTypeObject)) {
             bizTypeEnum = EnumUtils.enumOf(BizTypeEnum.class, bizTypeObject.toString());
         }
-        if (bizTypeEnum == null) {
+        if (bizTypeObject == null) {
             return ResponseUtil.dtoFail("请传入业务类型");
         }
-        if (!bizTypeEnum.equals(BizTypeEnum.AUTH)) {
+        if (ObjectUtil.isNull(bizTypeEnum)) {
             return ResponseUtil.dtoFail(String.format("暂不支持该业务类型:%s", bizTypeObject));
         }
 
+        if (bizTypeEnum.equals(BizTypeEnum.AUTH)) {
+            return parseAuthApprovalInfoReqVO(approvalInfoReqVO, bizData);
+        } else if (bizTypeEnum.equals(BizTypeEnum.TASK)) {
+            return parseTaskApprovalInfoReqVO(approvalInfoReqVO, bizData);
+        }
+        throw new ApplicationException(String.format("暂无适配业务类型:%s", bizTypeEnum));
+    }
+
+    /**
+     * 转化权限类型
+     *
+     * @param approvalInfoReqVO 请求信息
+     * @param bizData           业务数据
+     * @return 转化后的数据
+     */
+    protected ResponseDTO<ApprovalInfoReqVO> parseAuthApprovalInfoReqVO(ApprovalInfoReqVO approvalInfoReqVO, final Map<String, Object> bizData) {
         final Object content = getBizData(bizData, ReqBizDataEnum.BIZ_CONTENT);
         final ZeroTrustApproveAuthInfoVO zeroTrustApproveAuthInfoVO = new ZeroTrustApproveAuthInfoVO();
         BeanUtil.copyProperties(content, zeroTrustApproveAuthInfoVO);
@@ -220,4 +254,39 @@ public class ApiV3ApproveBusinessImpl implements IApiV3ApproveBusiness {
         return ResponseUtil.newInstance(approvalInfoReqVO);
     }
 
+
+    /**
+     * 转化任务类型
+     *
+     * @param approvalInfoReqVO 请求信息
+     * @param bizData           业务数据
+     * @return 转化后的数据
+     */
+    protected ResponseDTO<ApprovalInfoReqVO> parseTaskApprovalInfoReqVO(ApprovalInfoReqVO approvalInfoReqVO, final Map<String, Object> bizData) {
+        final Object content = getBizData(bizData, ReqBizDataEnum.BIZ_CONTENT);
+        final ZeroTrustApproveTaskInfoVO zeroTrustApproveTaskInfoVO = new ZeroTrustApproveTaskInfoVO();
+        BeanUtil.copyProperties(content, zeroTrustApproveTaskInfoVO);
+        String jqbh = zeroTrustApproveTaskInfoVO.getJqbh();
+        String ajbh = zeroTrustApproveTaskInfoVO.getAjbh();
+        if (StrUtil.isAllBlank(jqbh, ajbh)) {
+            return ResponseUtil.dtoFail("警情编号、案件编号其中一个必填");
+        }
+        if (StrUtil.isNotBlank(jqbh)) {
+            // 校验警情编号是否存在
+            if (!jqInfoService.exitsJqbh(jqbh)) {
+                return ResponseUtil.dtoFail(String.format("警情编号:%s 不存在", jqbh));
+            }
+        }
+
+        if (StrUtil.isNotBlank(ajbh)) {
+            // 校验案件编号是否存在
+            if (!ajInfoService.exitsAjbh(ajbh)) {
+                return ResponseUtil.dtoFail(String.format("案件编号:%s 不存在", ajbh));
+            }
+        }
+
+        approvalInfoReqVO.setFlowType(FlowTypeEnum.TASK.getValue());
+
+        return ResponseUtil.newInstance(approvalInfoReqVO);
+    }
 }

+ 23 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/IGetApproverBusiness.java

@@ -0,0 +1,23 @@
+package com.dragonsoft.dcuc.approve.business.approver;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ * @see com.dragonsoft.dcuc.approve.enumresources.ApproveGetApproverEnum
+ */
+public interface IGetApproverBusiness {
+    /**
+     * 获取审批人
+     *
+     * @param applicantUser 申请人
+     * @param labelCode     标签代码
+     * @return 审批人
+     */
+    List<String> getApproverList(String applicantUser, String labelCode);
+}

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

@@ -0,0 +1,33 @@
+package com.dragonsoft.dcuc.approve.business.approver.impl;
+
+import com.dragonsoft.dcuc.approve.business.approver.IGetApproverBusiness;
+import com.dragonsoft.dcuc.approve.properties.ApproveWorkFlowCallbackProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 获取配置的的审批人
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ * @see com.dragonsoft.dcuc.approve.enumresources.ApproveGetApproverEnum
+ */
+@Component(value = "configGetApproverBusiness")
+public class ConfigGetApproverBusinessImpl implements IGetApproverBusiness {
+
+    private ApproveWorkFlowCallbackProperties approveWorkFlowCallbackProperties;
+
+    @Autowired
+    public void setApproveWorkFlowCallbackProperties(ApproveWorkFlowCallbackProperties approveWorkFlowCallbackProperties) {
+        this.approveWorkFlowCallbackProperties = approveWorkFlowCallbackProperties;
+    }
+
+    @Override
+    public List<String> getApproverList(String applicantUser, String labelCode) {
+        return approveWorkFlowCallbackProperties.getFinalApproveList();
+    }
+}

+ 38 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/CurrentOrgGetApproverBusinessImpl.java

@@ -0,0 +1,38 @@
+package com.dragonsoft.dcuc.approve.business.approver.impl;
+
+import com.dragonsoft.dcuc.approve.business.approver.IGetApproverBusiness;
+import com.dragonsoft.dcuc.approve.business.external.IDcucBusiness;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ */
+@Component(value = "currentOrgGetApproverBusiness")
+public class CurrentOrgGetApproverBusinessImpl implements IGetApproverBusiness {
+    private IDcucBusiness dcucBusiness;
+
+    @Autowired
+    public void setDcucBusiness(IDcucBusiness dcucBusiness) {
+        this.dcucBusiness = dcucBusiness;
+    }
+
+    @Override
+    public List<String> getApproverList(String applicantUser, String labelCode) {
+        // 获取申请人对应的机构代码
+        OauthUserVO handleUserInfo = dcucBusiness.getOauthUserInfoByIdcard(applicantUser);
+        String currentOrgCode = handleUserInfo.getOrgCode();
+
+        // 获取机构代码上有这个标签的人
+
+        return dcucBusiness.getUserByLabelCodeUserList(currentOrgCode, labelCode);
+    }
+}

+ 64 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/NextAndNextOrgGetApproverBusinessImpl.java

@@ -0,0 +1,64 @@
+package com.dragonsoft.dcuc.approve.business.approver.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.dragonsoft.dcuc.approve.business.approver.IGetApproverBusiness;
+import com.dragonsoft.dcuc.approve.business.external.IDcucBusiness;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiOrgResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 一级一级的获取机构的审批人
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ */
+@Component(value = "nextAndNextOrgGetApproverBusiness")
+public class NextAndNextOrgGetApproverBusinessImpl implements IGetApproverBusiness {
+    private IDcucBusiness dcucBusiness;
+
+    @Autowired
+    public void setDcucBusiness(IDcucBusiness dcucBusiness) {
+        this.dcucBusiness = dcucBusiness;
+    }
+
+    @Override
+    public List<String> getApproverList(String applicantUser, String labelCode) {
+        // 获取申请人对应的机构代码
+        OauthUserVO handleUserInfo = dcucBusiness.getOauthUserInfoByIdcard(applicantUser);
+        String currentOrgCode = handleUserInfo.getOrgCode();
+        // 看有没有再获取上级机构的
+        ApiOrgResultVo apiOrgResultVo = dcucBusiness.orgInfo(currentOrgCode);
+        String upOrgCode = apiOrgResultVo.getUpOrgCode();
+        // 获取机构代码上有这个标签的人
+        return getNextAndNextApproverList(upOrgCode, labelCode);
+    }
+
+    /**
+     * 一级一级的获取
+     *
+     * @param orgCode   机构代码
+     * @param labelCode 标签代码
+     * @return 审批人
+     */
+    protected List<String> getNextAndNextApproverList(String orgCode, String labelCode) {
+        // 看有没有再获取上级机构的
+        List<String> approverList = dcucBusiness.getUserByLabelCodeUserList(orgCode, labelCode);
+        if (CollUtil.isEmpty(approverList)) {
+            ApiOrgResultVo apiOrgResultVo = dcucBusiness.orgInfo(orgCode);
+            String upOrgCode = apiOrgResultVo.getUpOrgCode();
+            if (CollUtil.isEmpty(approverList)
+                    && StrUtil.isNotBlank(upOrgCode)) {
+                approverList = getNextAndNextApproverList(upOrgCode, labelCode);
+            }
+        }
+        return approverList;
+    }
+
+}

+ 46 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/approver/impl/NextOrgGetApproverBusinessImpl.java

@@ -0,0 +1,46 @@
+package com.dragonsoft.dcuc.approve.business.approver.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.dragonsoft.dcuc.approve.business.approver.IGetApproverBusiness;
+import com.dragonsoft.dcuc.approve.business.external.IDcucBusiness;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.ApiOrgResultVo;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.OauthUserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <p>
+ * 获取上一级
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/4
+ */
+@Component(value = "nextOrgGetApproverBusiness")
+public class NextOrgGetApproverBusinessImpl implements IGetApproverBusiness {
+    private IDcucBusiness dcucBusiness;
+
+    @Autowired
+    public void setDcucBusiness(IDcucBusiness dcucBusiness) {
+        this.dcucBusiness = dcucBusiness;
+    }
+
+    @Override
+    public List<String> getApproverList(String applicantUser, String labelCode) {
+        // 获取申请人对应的机构代码
+        OauthUserVO handleUserInfo = dcucBusiness.getOauthUserInfoByIdcard(applicantUser);
+        String currentOrgCode = handleUserInfo.getOrgCode();
+
+        List<String> approverList = Collections.emptyList();
+        if (CollUtil.isEmpty(approverList)) {
+            // 看有没有再获取上级机构的
+            ApiOrgResultVo apiOrgResultVo = dcucBusiness.orgInfo(currentOrgCode);
+            String upOrgCode = apiOrgResultVo.getUpOrgCode();
+            approverList = dcucBusiness.getUserByLabelCodeUserList(upOrgCode, labelCode);
+        }
+        return approverList;
+    }
+}

+ 22 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/IDcucBusiness.java

@@ -5,6 +5,9 @@ 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;
+import com.dragonsoft.dcuc.approve.model.vo.dcuc.UserLabel2RespVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -50,9 +53,28 @@ public interface IDcucBusiness {
 
     /**
      * 根据身份证号查询警员信息
+     *
      * @param idcard 身份证号
      * @return 警员信息
      */
     ApiPoliceResultVo policeDetailByIdcard(String idcard);
 
+    /**
+     * 根据标签代码获取对应人员信息
+     *
+     * @param orgCode   机构代码
+     * @param labelCode 标签代码
+     * @return 人员信息
+     */
+    List<UserLabel2RespVO> getUserByLabelCode(String orgCode, String labelCode);
+
+    /**
+     * 根据机构代码、标签代码获取审批人员
+     *
+     * @param orgCode   机构代码
+     * @param labelCode 标签代码
+     * @return 审批人
+     */
+    List<String> getUserByLabelCodeUserList(String orgCode, String labelCode);
+
 }

+ 25 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/IWorkFlowCallbackBusiness.java

@@ -0,0 +1,25 @@
+package com.dragonsoft.dcuc.approve.business.external;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 工作流回调
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+public interface IWorkFlowCallbackBusiness {
+    /**
+     * 1、先获取当前机构所属标签的人
+     * 2、无人员再获取上级机构所属标签的人,循环获取直至顶级节点
+     * 3、获取配置的兜底审批人员
+     *
+     * @param param 参数
+     * @return 进行审批的人员身份证号码
+     */
+    List<String> getCurrentOrgAndNextOrgLabelHandlers(Map<String, Object> param);
+
+}

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

@@ -172,6 +172,7 @@ public class BimBusinessImpl implements IBimBusiness {
                     if (checkTokenSign) {
                         boolean b = checkAppTokenSign(responseEntityJsonBody);
                         if (!b) {
+                            log.error("校验应用令牌前面失败");
                             return null;
                         }
                     }

+ 110 - 5
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/impl/DcucBusinessImpl.java

@@ -2,17 +2,20 @@ package com.dragonsoft.dcuc.approve.business.external.impl;
 
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.PageUtil;
 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.SearchParam;
 import com.dragoninfo.dcuc.common.utils.ResponseUtil;
 import com.dragonsoft.dcuc.approve.business.external.IDcucBusiness;
 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.model.vo.dcuc.UserLabel2RespVO;
 import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
 import com.dragonsoft.dcuc.approve.utils.ProofsUtil;
 import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
@@ -20,6 +23,7 @@ import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.security.SecurityUser;
 import com.dragonsoft.duceap.base.utils.UserContextUtils;
 import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.duceap.core.search.enums.SearchOperator;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -29,18 +33,18 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.*;
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
 import java.net.URI;
-import java.util.Collections;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
- * @author lidr
+ * @author lidr huangziquan
  * @date 2021/2/23
  */
-@Service
+@Component
 public class DcucBusinessImpl implements IDcucBusiness {
     private static final Logger logger = LoggerFactory.getLogger(DcucBusinessImpl.class);
 
@@ -61,6 +65,11 @@ public class DcucBusinessImpl implements IDcucBusiness {
      */
     public static final String POLICE_DETAIL_API = "/api/user-service/v3/users/police/%s";
 
+    /**
+     * 用户标签查询
+     */
+    public static final String LABEL_USER_API = "/api/user-service/v1/users/label/search";
+
     private RestTemplate restTemplate;
 
     private ApproveProperties approveProperties;
@@ -228,6 +237,102 @@ public class DcucBusinessImpl implements IDcucBusiness {
         return oauthUserVO;
     }
 
+    @Override
+    public List<String> getUserByLabelCodeUserList(String orgCode, String labelCode) {
+        List<UserLabel2RespVO> userByLabelCodeList = Collections.emptyList();
+        try {
+            userByLabelCodeList = getUserByLabelCode(orgCode, labelCode);
+        } catch (RuntimeException e) {
+            logger.error("查询审批人标签代码异常", e);
+        }
+
+        return Optional.ofNullable(userByLabelCodeList)
+                .orElse(Collections.emptyList())
+                .stream().map(UserLabel2RespVO::getIdcard)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<UserLabel2RespVO> getUserByLabelCode(String orgCode, String labelCode) {
+        SearchParam labelSearchParam = new SearchParam();
+        labelSearchParam.setOperator(SearchOperator.eq.name());
+        labelSearchParam.setValue(labelCode);
+
+        SearchParam orgCodeSearchParam = new SearchParam();
+        orgCodeSearchParam.setOperator(SearchOperator.eq.name());
+        orgCodeSearchParam.setValue(orgCode);
+
+        Map<String, SearchParam> filters = new HashMap<>(2);
+        filters.put("orgCode", orgCodeSearchParam);
+        filters.put("labelCode", labelSearchParam);
+        int size = 1000;
+        int currentPage = 1;
+
+        ApiSearchReq apiSearchReq = ApiSearchReq.reqInfo(currentPage, size, filters);
+
+        ApiResultPage<UserLabel2RespVO> page = labelPage(apiSearchReq);
+        List<UserLabel2RespVO> allContent = new ArrayList<>(page.getContent());
+
+        int total = 0;
+        if (ObjectUtil.isNotNull(page)) {
+            total = Math.toIntExact(page.getTotal());
+        }
+
+        int totalPage = PageUtil.totalPage(total, size);
+        currentPage++;
+        // 循环获取全部
+        for (int i = currentPage; i <= totalPage; i++) {
+            ApiResultPage<UserLabel2RespVO> itemPage = labelPage(apiSearchReq);
+            if (ObjectUtil.isNotNull(itemPage)) {
+                allContent.addAll(itemPage.getContent());
+            }
+        }
+
+        return allContent;
+    }
+
+    @SneakyThrows(JsonProcessingException.class)
+    public ApiResultPage<UserLabel2RespVO> labelPage(ApiSearchReq apiSearchReq) {
+        Assert.notNull(apiSearchReq);
+        String requestName = "获取人员标签列表";
+
+        String userServiceUrl = approveProperties.getUserServiceUrl();
+        String url = userServiceUrl + LABEL_USER_API;
+
+        HttpHeaders httpHeaders = HttpHeaders.EMPTY;
+        SecurityUser currentUser = UserContextUtils.getCurrentUser();
+        if (ObjectUtil.isNotNull(currentUser)) {
+            httpHeaders = ProofsUtil.buildHttpHeaders(currentUser);
+        }
+
+        RequestEntity<ApiSearchReq> apiSearchReqRequestEntity = new RequestEntity<>(apiSearchReq, httpHeaders, HttpMethod.POST, URI.create(url));
+        logger.info(requestName + "参数:{}", JsonUtils.toJSONString(apiSearchReqRequestEntity));
+        ResponseEntity<String> resEntity = restTemplate.exchange(apiSearchReqRequestEntity, String.class);
+        String jsonString = JsonUtils.toJSONString(resEntity);
+        logger.info(requestName + "返回参数:{}", jsonString);
+        if (!resEntity.getStatusCode().is2xxSuccessful()) {
+            logger.error(requestName + "信息错误:{}", jsonString);
+            return null;
+        }
+
+        String body = resEntity.getBody();
+        ApiResult apiResult = objectMapper.readValue(body, ApiResult.class);
+        if (ObjectUtil.isNull(apiResult)) {
+            logger.error(requestName + "信息错误:{}", body);
+            return null;
+        }
+        if (!apiResult.getStatusCode().equalsIgnoreCase(ResponseStatus.SUCCESS_CODE)) {
+            logger.error(requestName + "信息错误:{}", body);
+            return null;
+        }
+
+        Object result = apiResult.getResult();
+        String resultJson = objectMapper.writeValueAsString(result);
+        TypeReference<ApiResultPage<UserLabel2RespVO>> typeReference = new TypeReference<ApiResultPage<UserLabel2RespVO>>() {
+        };
+        return objectMapper.readValue(resultJson, typeReference);
+    }
+
     @Override
     @SneakyThrows(JsonProcessingException.class)
     public ApiResultPage<ApiPoliceResultVo> policePage(ApiSearchReq apiSearchReq) {

+ 64 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/external/impl/DcucWorkFlowCallbackBusinessImpl.java

@@ -0,0 +1,64 @@
+package com.dragonsoft.dcuc.approve.business.external.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import com.dragonsoft.dcuc.approve.business.approver.IGetApproverBusiness;
+import com.dragonsoft.dcuc.approve.business.external.IWorkFlowCallbackBusiness;
+import com.dragonsoft.dcuc.approve.enumresources.ApproveGetApproverEnum;
+import com.dragonsoft.dcuc.approve.properties.ApproveWorkFlowCallbackProperties;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.duceap.core.spring.SpringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Slf4j
+@Component
+public class DcucWorkFlowCallbackBusinessImpl implements IWorkFlowCallbackBusiness {
+
+    private ApproveWorkFlowCallbackProperties approveWorkFlowCallbackProperties;
+
+    @Autowired
+    public void setApproveWorkFlowCallbackProperties(ApproveWorkFlowCallbackProperties approveWorkFlowCallbackProperties) {
+        this.approveWorkFlowCallbackProperties = approveWorkFlowCallbackProperties;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public List<String> getCurrentOrgAndNextOrgLabelHandlers(Map<String, Object> param) {
+        String reqJsonString = JsonUtils.toJSONString(param);
+        log.debug("工作流回调请求参数:{}", reqJsonString);
+
+        Map<String, Object> contextMap = (Map<String, Object>) param.get("context");
+        Map<String, Object> dataMap = (Map<String, Object>) param.get("data");
+        // 需要提交才有
+        String handleUser = MapUtil.getStr(dataMap, "handleUser");
+
+        String labelCode = approveWorkFlowCallbackProperties.getLabelCode();
+        List<ApproveGetApproverEnum> approveGetApproverEnumList = approveWorkFlowCallbackProperties.getApproveGetApproverEnumList();
+        List<String> approverList = Collections.emptyList();
+
+        for (ApproveGetApproverEnum approveGetApproverEnum : approveGetApproverEnumList) {
+            String value = approveGetApproverEnum.getValue();
+            IGetApproverBusiness getApproverBusiness = SpringUtils.getBean(value + "GetApproverBusiness");
+            approverList = getApproverBusiness.getApproverList(handleUser, labelCode);
+            if (CollUtil.isNotEmpty(approverList)) {
+                break;
+            }
+        }
+
+        return approverList;
+    }
+}

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

@@ -887,7 +887,7 @@ public class ApproveCommonBusinessImpl implements IApproveCommonBusiness {
 
     @Override
     public ResponseDTO<List<ApproveCommentVo>> approveComments(String processInstanceId) {
-        if (StringUtils.isEmpty(processInstanceId) || "undefined".equalsIgnoreCase(processInstanceId)) {
+        if (StrUtil.isEmptyOrUndefined(processInstanceId)) {
             return ResponseUtil.newInstance(Collections.emptyList());
         }
 

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

@@ -39,6 +39,7 @@ import com.dragonsoft.duceap.commons.util.json.JsonUtils;
 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.duwf.api.model.TaskHistoryDetailVo;
 import com.dragonsoft.duceap.workflow.client.WorkflowClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -685,8 +686,11 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         String pocessDefinitionId = "";
         String taskDefinitionKey = "";
         if (processInstanceVO != null) {
-            pocessDefinitionId = processInstanceVO.getTaskHistoryDetailVo().getProcessDefinitionId();
-            taskDefinitionKey = processInstanceVO.getTaskHistoryDetailVo().getTaskDefinitionKey();
+            TaskHistoryDetailVo taskHistoryDetailVo = processInstanceVO.getTaskHistoryDetailVo();
+            if (ObjectUtil.isNotNull(taskHistoryDetailVo)) {
+                pocessDefinitionId = taskHistoryDetailVo.getProcessDefinitionId();
+                taskDefinitionKey = taskHistoryDetailVo.getTaskDefinitionKey();
+            }
         }
 
         ApprovalInfoDTO approvalInfoDTO = logDto.getApprovalInfoDTO();
@@ -705,7 +709,8 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         flowManageLog.setApproveNo(approvalInfoDTO.getApproveNo());
         flowManageLog.setProcessInstanceId(processInstanceId);
         //发送审批流程管理日志到消息中心
-        logger.info("=====发送审批流程管理日志消息,消息体为:{}====", JSON.toJSONString(flowManageLog));
+        String flowManageLogJsonString = JSON.toJSONString(flowManageLog);
+        logger.info("=====发送审批流程管理日志消息,消息体为:{}====", flowManageLogJsonString);
         //审批流程管理日志类型不会涉及到审批风险,故taskKey/flowKey可以为空
         LogInfoMetaDTO logInfoMetaDTO = new LogInfoMetaDTO();
         logInfoMetaDTO.setLogType(LogTypeEnum.MANAGE_LOG.getValue());
@@ -714,7 +719,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
         logInfoMetaDTO.setProcessInstanceId(processInstanceId);
         logInfoMetaDTO.setTerminalIp(logDto.getCreateIp());
         logInfoMetaDTO.setBusinessType(manageDisposeTypeEnum.auditCode);
-        sendInfo(JSON.toJSONString(flowManageLog), "审批流程管理日志", logInfoMetaDTO);
+        sendInfo(flowManageLogJsonString, "审批流程管理日志", logInfoMetaDTO);
     }
 
 
@@ -748,7 +753,7 @@ public class ApproveLogBusinessImpl implements IApproveLogBusiness {
     /**
      * 构建日志Dto
      *
-     * @param approvalInfoDTO      审批信息
+     * @param approvalInfoDTO   审批信息
      * @param vo                实例信息
      * @param approveResultEnum 返回信息
      * @param failMsg           错误消息

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

@@ -94,7 +94,7 @@ public class SecurityUserBusinessImpl implements ISecurityUserBusiness {
         }
 
         if (ObjectUtil.isNull(securityUser)) {
-            String format = String.format("无法获取到用户:%s", appCode);
+            String format = String.format("无法获取到用户:%s", idcard);
             log.error(format);
             return ResponseUtil.dtoFail("用户凭据信息无效");
         }

+ 46 - 2
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/ApproveTaskClassFacade.java

@@ -1,5 +1,9 @@
 package com.dragonsoft.dcuc.approve.facade;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.dragoninfo.dcuc.app.entity.ApplyInfo;
+import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
 import com.dragoninfo.dcuc.common.utils.ResponseUtil;
 import com.dragonsoft.dcuc.approve.model.ApproveTaskClass;
 import com.dragonsoft.dcuc.approve.model.req.ApproveTaskClassAddReqVO;
@@ -11,8 +15,12 @@ import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.core.search.Searchable;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *
@@ -26,6 +34,13 @@ public class ApproveTaskClassFacade implements IApproveTaskClassFacade {
 
     private IApproveTaskClassService approveTaskClassService;
 
+    private IApplyInfoFacade applyInfoFacade;
+
+    @Autowired
+    public void setApplyInfoFacade(IApplyInfoFacade applyInfoFacade) {
+        this.applyInfoFacade = applyInfoFacade;
+    }
+
     @Autowired
     public void setApproveTaskClassService(IApproveTaskClassService approveTaskClassService) {
         this.approveTaskClassService = approveTaskClassService;
@@ -33,7 +48,11 @@ public class ApproveTaskClassFacade implements IApproveTaskClassFacade {
 
     @Override
     public Page<ApproveTaskClassDetailRespVO> page(Searchable searchable) {
-        return approveTaskClassService.page(searchable);
+        Page<ApproveTaskClassDetailRespVO> page = approveTaskClassService.page(searchable);
+        List<ApproveTaskClassDetailRespVO> newLit = page.stream().map(this::fillNowAppName)
+                .collect(Collectors.toList());
+
+        return new PageImpl<>(newLit, page.getPageable(), page.getTotalElements());
     }
 
     @Override
@@ -63,6 +82,31 @@ public class ApproveTaskClassFacade implements IApproveTaskClassFacade {
 
     @Override
     public ResponseDTO<ApproveTaskClassDetailRespVO> detail(String id) {
-        return approveTaskClassService.detail(id);
+        ResponseDTO<ApproveTaskClassDetailRespVO> responseDTO = approveTaskClassService.detail(id);
+        if (ResponseUtil.isFail(responseDTO)) {
+            return responseDTO;
+        }
+        ApproveTaskClassDetailRespVO approveTaskClassDetailRespVO = fillNowAppName(ResponseUtil.getResult(responseDTO));
+        return ResponseUtil.newInstance(approveTaskClassDetailRespVO);
     }
+
+    /**
+     * 填充最新的应用名称
+     * 1、如果应用代码存在使用最新的应用名称
+     * 2、如果查不到就用旧的应用名称
+     *
+     * @param approveTaskClassDetailRespVO 任务类型详情
+     * @return 填充后的任务类型详情
+     */
+    protected ApproveTaskClassDetailRespVO fillNowAppName(ApproveTaskClassDetailRespVO approveTaskClassDetailRespVO) {
+        String sourceAppCode = approveTaskClassDetailRespVO.getSourceAppCode();
+        if (StrUtil.isNotBlank(sourceAppCode)) {
+            ApplyInfo applyInfo = applyInfoFacade.getAppByCode(sourceAppCode);
+            if (ObjectUtil.isNotNull(applyInfo)) {
+                approveTaskClassDetailRespVO.setSourceAppName(applyInfo.getApplyName());
+            }
+        }
+        return approveTaskClassDetailRespVO;
+    }
+
 }

+ 35 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/api/v3/ApiV3WorkFlowCallbackFacade.java

@@ -0,0 +1,35 @@
+package com.dragonsoft.dcuc.approve.facade.api.v3;
+
+import com.dragonsoft.dcuc.approve.business.external.IWorkFlowCallbackBusiness;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Slf4j
+@RestController
+@RequestMapping("api/v3/work-flow-callback/")
+public class ApiV3WorkFlowCallbackFacade implements IApiV3WorkFlowCallbackFacade {
+    private IWorkFlowCallbackBusiness workFlowCallbackBusiness;
+
+    @Autowired
+    public void setWorkFlowCallbackBusiness(IWorkFlowCallbackBusiness workFlowCallbackBusiness) {
+        this.workFlowCallbackBusiness = workFlowCallbackBusiness;
+    }
+
+    @Override
+    public List<String> getCurrentOrgAndNextOrgLabelHandlers(Map<String, Object> param) {
+        return workFlowCallbackBusiness.getCurrentOrgAndNextOrgLabelHandlers(param);
+    }
+}

+ 15 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/resource/AjInfoMapper.java

@@ -0,0 +1,15 @@
+package com.dragonsoft.dcuc.approve.mapper.resource;
+
+import com.dragonsoft.dcuc.approve.model.resource.AjInfo;
+import com.dragonsoft.duceap.mybaitsplus.core.BaseMybatisMapper;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+public interface AjInfoMapper extends BaseMybatisMapper<AjInfo> {
+}

+ 15 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/mapper/resource/JqInfoMapper.java

@@ -0,0 +1,15 @@
+package com.dragonsoft.dcuc.approve.mapper.resource;
+
+import com.dragonsoft.dcuc.approve.model.resource.JqInfo;
+import com.dragonsoft.duceap.mybaitsplus.core.BaseMybatisMapper;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1¡
+ */
+public interface JqInfoMapper extends BaseMybatisMapper<JqInfo> {
+}

+ 5 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveTaskClass.java

@@ -52,6 +52,11 @@ public class ApproveTaskClass {
      */
     private String sourceAppCode;
 
+    /**
+     * 来源应用代码
+     */
+    private String sourceAppName;
+
     /**
      * 是否删除
      */

+ 7 - 3
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/dto/ProcessInstanceInfoDTO.java

@@ -1,5 +1,6 @@
 package com.dragonsoft.dcuc.approve.model.dto;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.dragonsoft.duceap.duwf.api.model.ProcessInstanceVO;
 import com.dragonsoft.duceap.duwf.api.model.TaskHistoryDetailVo;
 import lombok.Data;
@@ -53,9 +54,12 @@ public class ProcessInstanceInfoDTO {
         String processInstanceId = "";
         if (processInstanceVO != null) {
             TaskHistoryDetailVo taskHistoryDetailVo = processInstanceVO.getTaskHistoryDetailVo();
-            flowNodeCode = taskHistoryDetailVo.getTaskCode();
-            flowNodeName = taskHistoryDetailVo.getName();
-            taskKey = taskHistoryDetailVo.getTaskDefinitionKey();
+            if (ObjectUtil.isNotNull(taskHistoryDetailVo)) {
+                flowNodeCode = taskHistoryDetailVo.getTaskCode();
+                flowNodeName = taskHistoryDetailVo.getName();
+                taskKey = taskHistoryDetailVo.getTaskDefinitionKey();
+            }
+
             flowKey = processInstanceVO.getPocessDefinitionId();
             processInstanceId = processInstanceVO.getProcessInstanceId();
         }

+ 67 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/resource/AjInfo.java

@@ -0,0 +1,67 @@
+package com.dragonsoft.dcuc.approve.model.resource;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.ibatis.type.JdbcType;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 案件信息
+ * 现场通过ETL同步到此
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Data
+@TableName("t_aj_info")
+public class AjInfo {
+    /**¡¡
+     * 标识ID
+     */
+    @TableId(type = IdType.UUID)
+    private String fhxtsjwybsid;
+    /**
+     * 来源系统
+     */
+    private String sjcjlyxt;
+    /**
+     * 案件名称
+     */
+    private String ajmc;
+    /**
+     * 案件编号
+     */
+    private String ajbh;
+    /**
+     * 受理单位_信息代码
+     */
+    private String sldwXxdm02;
+    /**
+     * 是否删除
+     */
+    @TableLogic
+    private String xxscPdbz;
+    /**
+     * 采集时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date cjsj;
+    /**
+     * 更新时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date gxsj;
+    /**
+     * 同步表创建时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date createTime;
+    /**
+     * 同步表更新时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date updateTime;
+}

+ 67 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/resource/JqInfo.java

@@ -0,0 +1,67 @@
+package com.dragonsoft.dcuc.approve.model.resource;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.ibatis.type.JdbcType;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 警情信息
+ * 现场通过ETL同步到此
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Data
+@TableName("t_jq_info")
+public class JqInfo {
+    /**
+     * 标识ID
+     */
+    @TableId(type = IdType.UUID)
+    private String fhxtsjwybsid;
+    /**
+     * 接警单_信息编号
+     */
+    private String jijdXxbh;
+    /**
+     * 接警单位_公安机关机构代码
+     */
+    private String jjdwGajgjgdm;
+    /**
+     * 受理单_信息编号
+     */
+    private String sldXxbh;
+    /**
+     * 接警_状态_信息代码
+     */
+    private String jjnZtaXxdm02;
+    /**
+     * 是否删除
+     */
+    @TableLogic
+    private String xxscPdbz;
+    /**
+     * 采集时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date cjsj;
+    /**
+     * 更新时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date gxsj;
+    /**
+     * 同步表创建时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date createTime;
+    /**
+     * 同步表更新时间
+     */
+    @TableField(jdbcType = JdbcType.TIMESTAMP)
+    private Date updateTime;
+}

+ 34 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/vo/dcuc/UserLabel2RespVO.java

@@ -0,0 +1,34 @@
+package com.dragonsoft.dcuc.approve.model.vo.dcuc;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author yica
+ * @Date 2021/5/21 14:16
+ **/
+@Api(value = "用户标签输出vo")
+@Data
+public class UserLabel2RespVO {
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "身份证号")
+    private String idcard;
+
+    @ApiModelProperty(value = "所在机构编码")
+    private String orgCode;
+
+    @ApiModelProperty(value = "所在机构编码名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "业务标签")
+    private String labelCode;
+
+    @ApiModelProperty(value = "更新时间")
+    private String updateTime;
+
+    @ApiModelProperty(value = "删除标识")
+    private String deleted;
+}

+ 45 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/properties/ApproveWorkFlowCallbackProperties.java

@@ -0,0 +1,45 @@
+package com.dragonsoft.dcuc.approve.properties;
+
+import com.dragonsoft.dcuc.approve.enumresources.ApproveGetApproverEnum;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <p>
+ * 工作流回调配置
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Setter
+@Getter
+@Component
+@ConfigurationProperties(prefix = "approve.work-flow.callback")
+public class ApproveWorkFlowCallbackProperties {
+    /**
+     * 标签代码
+     */
+    private String labelCode = "";
+
+    /**
+     * 最后兜底审批人员,身份证号
+     */
+    private List<String> finalApproveList = Collections.emptyList();
+
+    /**
+     * 回调获取审批人的顺序,方法
+     */
+    private List<ApproveGetApproverEnum> approveGetApproverEnumList = Arrays.asList(
+            ApproveGetApproverEnum.CURRENT_ORG,
+            ApproveGetApproverEnum.NEXT_AND_NEXT_ORG,
+            ApproveGetApproverEnum.CONFIG
+    );
+
+}

+ 20 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/IAjInfoService.java

@@ -0,0 +1,20 @@
+package com.dragonsoft.dcuc.approve.service.resource;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+public interface IAjInfoService {
+
+    /**
+     * 是否存在案件编号
+     *
+     * @param ajbh 案件编号
+     * @return 是否存在
+     */
+    boolean exitsAjbh(String ajbh);
+}

+ 21 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/IJqInfoService.java

@@ -0,0 +1,21 @@
+package com.dragonsoft.dcuc.approve.service.resource;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+public interface IJqInfoService {
+
+    /**
+     * 是否存在警情编号
+     *
+     * @param jqbh 警情编号
+     * @return 是否存在
+     */
+    boolean exitsJqbh(String jqbh);
+
+}

+ 41 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/impl/AjInfoServiceImpl.java

@@ -0,0 +1,41 @@
+package com.dragonsoft.dcuc.approve.service.resource.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.dragonsoft.dcuc.approve.mapper.resource.AjInfoMapper;
+import com.dragonsoft.dcuc.approve.model.resource.AjInfo;
+import com.dragonsoft.dcuc.approve.service.resource.IAjInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Component
+public class AjInfoServiceImpl implements IAjInfoService {
+
+    private AjInfoMapper ajInfoMapper;
+
+    @Autowired
+    public void setAjInfoMapper(AjInfoMapper ajInfoMapper) {
+        this.ajInfoMapper = ajInfoMapper;
+    }
+
+    @Override
+    public boolean exitsAjbh(String ajbh) {
+        LambdaQueryWrapper<AjInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(AjInfo::getAjbh, ajbh);
+
+        Integer count = ajInfoMapper.selectCount(queryWrapper);
+        if (ObjectUtil.isNull(count)) {
+            return false;
+        }
+        return count > 0;
+    }
+}

+ 41 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/resource/impl/JqInfoServiceImpl.java

@@ -0,0 +1,41 @@
+package com.dragonsoft.dcuc.approve.service.resource.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.dragonsoft.dcuc.approve.mapper.resource.JqInfoMapper;
+import com.dragonsoft.dcuc.approve.model.resource.JqInfo;
+import com.dragonsoft.dcuc.approve.service.resource.IJqInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangziquan
+ * @date 2024/3/1
+ */
+@Service
+public class JqInfoServiceImpl implements IJqInfoService {
+
+    private JqInfoMapper jqInfoMapper;
+
+    @Autowired
+    public void setJqInfoMapper(JqInfoMapper jqInfoMapper) {
+        this.jqInfoMapper = jqInfoMapper;
+    }
+
+    @Override
+    public boolean exitsJqbh(String jqbh) {
+        LambdaQueryWrapper<JqInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(JqInfo::getJijdXxbh, jqbh);
+
+        Integer count = jqInfoMapper.selectCount(queryWrapper);
+        if (ObjectUtil.isNull(count)) {
+            return false;
+        }
+        return count > 0;
+    }
+}

+ 36 - 0
approve-core-service/src/main/resources/config/mysql/V1_1_0020__add_jqinfo_ajinfo.sql

@@ -0,0 +1,36 @@
+DROP TABLE IF EXISTS t_aj_info;
+CREATE TABLE t_aj_info
+(
+    `FHXTSJWYBSID` VARCHAR(32) NOT NULL COMMENT '标识ID',
+    `SJCJLYXT`     VARCHAR(255) COMMENT '来源系统',
+    `AJMC`         VARCHAR(255) COMMENT '案件名称',
+    `AJBH`         VARCHAR(90) NOT NULL COMMENT '案件编号',
+    `SLDW_XXDM02`  VARCHAR(90) COMMENT '受理单位_信息代码',
+    `XXSC_PDBZ`    VARCHAR(1)  NOT NULL COMMENT '是否删除',
+    `CJSJ`         DATETIME COMMENT '采集时间',
+    `GXSJ`         DATETIME COMMENT '更新时间',
+    `CREATE_TIME`  DATETIME    NOT NULL COMMENT '同步表创建时间',
+    `UPDATE_TIME`  DATETIME COMMENT '同步表更新时间',
+    PRIMARY KEY (FHXTSJWYBSID)
+) COMMENT = '案件信息';
+
+CREATE INDEX IDX_AJBH ON t_aj_info (AJBH, XXSC_PDBZ);
+
+DROP TABLE IF EXISTS t_jq_info;
+CREATE TABLE t_jq_info
+(
+    `FHXTSJWYBSID`   VARCHAR(32) NOT NULL COMMENT '标识ID',
+    `JIJD_XXBH`      VARCHAR(90) NOT NULL COMMENT '接警单_信息编号',
+    `JJDW_GAJGJGDM`  VARCHAR(255) COMMENT '接警单位_公安机关机构代码',
+    `SLD_XXBH`       VARCHAR(255) COMMENT '受理单_信息编号',
+    `JJN_ZTA_XXDM02` VARCHAR(255) COMMENT '接警_状态_信息代码',
+    `XXSC_PDBZ`      VARCHAR(1)  NOT NULL COMMENT '是否删除',
+    `CJSJ`           DATETIME COMMENT '采集时间',
+    `GXSJ`           DATETIME COMMENT '更新时间',
+    `CREATE_TIME`    DATETIME    NOT NULL COMMENT '同步表创建时间',
+    `UPDATE_TIME`    DATETIME COMMENT '同步表更新时间',
+    PRIMARY KEY (FHXTSJWYBSID)
+) COMMENT = '警情信息';
+
+
+CREATE INDEX IDX_JJDBH ON t_jq_info (JIJD_XXBH, XXSC_PDBZ);

+ 2 - 0
approve-core-service/src/main/resources/config/mysql/V1_1_0021__add_task_class_app_name.sql

@@ -0,0 +1,2 @@
+alter table t_approve_task_class
+    add source_app_name varchar(256) null comment '来源应用名称' after source_app_code;

+ 3 - 0
approve-core-service/src/main/resources/workflow/README.md

@@ -0,0 +1,3 @@
+# 工作流相关 xml
+## 用途
+现场导入工作流使用

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 238 - 0
approve-core-service/src/main/resources/workflow/任务标签审批e1c77bccd12d4081842dcfa4d552f2dd(_)-20240304.xml


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác