Forráskód Böngészése

feat: 增加新标准接口

huangzqa 2 éve
szülő
commit
d8992a5923
19 módosított fájl, 787 hozzáadás és 41 törlés
  1. 2 2
      approve-core-service/pom.xml
  2. 22 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/IBimBusiness.java
  3. 88 17
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/ApproveBusinessImpl.java
  4. 82 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/BimBusinessImpl.java
  5. 3 4
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/business/impl/DcucAuthBusinessImpl.java
  6. 181 2
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/api/ApiV3ApproveFacade.java
  7. 11 7
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalInfo.java
  8. 10 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveRecordInfo.java
  9. 7 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/vo/ApprovalInfoMsgItemDTO.java
  10. 15 1
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/vo/ApproveMessageInfoDTO.java
  11. 24 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/properties/BimProperties.java
  12. 1 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/IApproveService.java
  13. 13 8
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApproveServiceImpl.java
  14. 38 0
      approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/utils/LangUtil.java
  15. 5 0
      approve-core-service/src/main/resources/config/mysql/V1_1_0015__add_TaskClass_ClallBackUrl_.sql
  16. 99 0
      approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/business/impl/BimBusinessImplTest.java
  17. 146 0
      approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/facade/api/ApiV3ApproveFacadeTest.java
  18. 32 0
      approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/utils/LangUtilTest.java
  19. 8 0
      pom.xml

+ 2 - 2
approve-core-service/pom.xml

@@ -108,8 +108,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.junit.platform</groupId>
-            <artifactId>junit-platform-launcher</artifactId>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
         <!--配置 spring 结束-->

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

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

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

@@ -12,21 +12,21 @@ import com.dragoninfo.duceap.commons.util.kafka.KafkaServer;
 import com.dragonsoft.approve.common.ErrorCode;
 import com.dragonsoft.dcuc.approve.business.IApproveBusiness;
 import com.dragonsoft.dcuc.approve.business.IDcucAuthBusiness;
+import com.dragonsoft.dcuc.approve.business.INoticeBusiness;
 import com.dragonsoft.dcuc.approve.business.IWorkFlowBusiness;
 import com.dragonsoft.dcuc.approve.constants.ApproveConstants;
 import com.dragonsoft.dcuc.approve.dto.ContentRespDTO;
 import com.dragonsoft.dcuc.approve.dto.ResourceInfoDTO;
-import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOperationEnum;
-import com.dragonsoft.dcuc.approve.enumresources.CandidateTypeEnum;
-import com.dragonsoft.dcuc.approve.enumresources.FlowTypeEnum;
-import com.dragonsoft.dcuc.approve.enumresources.PageTypeEnum;
+import com.dragonsoft.dcuc.approve.enumresources.*;
 import com.dragonsoft.dcuc.approve.model.*;
 import com.dragonsoft.dcuc.approve.model.req.AppFunctionResourceNameReqVO;
 import com.dragonsoft.dcuc.approve.model.req.AppFunctionResourceReqVO;
 import com.dragonsoft.dcuc.approve.model.req.ResourceInfoReqVO;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCallbackReqV3VO;
 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.ApprovalInfoMsgItemDTO;
 import com.dragonsoft.dcuc.approve.model.vo.ApproveMessageInfoDTO;
 import com.dragonsoft.dcuc.approve.model.vo.AuthAppFunApiVO;
 import com.dragonsoft.dcuc.approve.properties.ApproveProperties;
@@ -72,36 +72,83 @@ import java.util.stream.Collectors;
 @Service
 public class ApproveBusinessImpl implements IApproveBusiness {
 
-    @Autowired
     private IApproveRecordService approveRecordService;
 
-    @Autowired
     private KafkaServer kafkaServer;
 
-    @Autowired
     private KafkaProperties kafkaProperties;
 
-    @Autowired
     private ApproveProperties approveProperties;
 
-    @Autowired
     private IApproveActRunTaskService approveActRunTaskService;
 
-    @Autowired
     private IApproveActHiTaskService approveActHiTaskService;
 
-    @Autowired
     private IApproveActRunIdentityLinkService approveActRunIdentityLinkService;
 
-    @Autowired
     private IWorkFlowBusiness workFlowBusiness;
 
-    @Autowired
     private IDcucAuthBusiness dcucAuthBusiness;
 
-    @Autowired
     private WorkflowClientFactory workflowClientFactory;
 
+    private INoticeBusiness noticeBusiness;
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Autowired
+    public void setKafkaServer(KafkaServer kafkaServer) {
+        this.kafkaServer = kafkaServer;
+    }
+
+    @Autowired
+    public void setKafkaProperties(KafkaProperties kafkaProperties) {
+        this.kafkaProperties = kafkaProperties;
+    }
+
+    @Autowired
+    public void setApproveProperties(ApproveProperties approveProperties) {
+        this.approveProperties = approveProperties;
+    }
+
+    @Autowired
+    public void setApproveActRunTaskService(IApproveActRunTaskService approveActRunTaskService) {
+        this.approveActRunTaskService = approveActRunTaskService;
+    }
+
+    @Autowired
+    public void setApproveActHiTaskService(IApproveActHiTaskService approveActHiTaskService) {
+        this.approveActHiTaskService = approveActHiTaskService;
+    }
+
+    @Autowired
+    public void setApproveActRunIdentityLinkService(IApproveActRunIdentityLinkService approveActRunIdentityLinkService) {
+        this.approveActRunIdentityLinkService = approveActRunIdentityLinkService;
+    }
+
+    @Autowired
+    public void setWorkFlowBusiness(IWorkFlowBusiness workFlowBusiness) {
+        this.workFlowBusiness = workFlowBusiness;
+    }
+
+    @Autowired
+    public void setDcucAuthBusiness(IDcucAuthBusiness dcucAuthBusiness) {
+        this.dcucAuthBusiness = dcucAuthBusiness;
+    }
+
+    @Autowired
+    public void setWorkflowClientFactory(WorkflowClientFactory workflowClientFactory) {
+        this.workflowClientFactory = workflowClientFactory;
+    }
+
+    @Autowired
+    public void setNoticeBusiness(INoticeBusiness noticeBusiness) {
+        this.noticeBusiness = noticeBusiness;
+    }
+
     @Override
     public Date parseEndTime(Date endTime) {
         if (endTime != null) {
@@ -139,11 +186,15 @@ public class ApproveBusinessImpl implements IApproveBusiness {
         MessageInfoReqVo requestVo = new MessageInfoReqVo();
         MessageInfoVo messageInfoVo = new MessageInfoVo();
         String processInstanceId = approveMessageInfoDTO.getProcessInstanceId();
+        String approveNo = approveMessageInfoDTO.getApproveNo();
+        String sourceAppCode = approveMessageInfoDTO.getSourceAppCode();
+        ApprovalInfoMsgItemDTO approvalInfoMsgItemDTO = approveMessageInfoDTO.getApproveInfo();
+        ApproveWorkFlowOperationEnum approveResult = approveMessageInfoDTO.getApproveResult();
 
         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("approveNo", approveNo);
+        map.put("sourceAppCode", sourceAppCode);
+        map.put("approveInfo", JsonUtils.toJSONString(approvalInfoMsgItemDTO));
         map.put("processInstanceId", processInstanceId);
         map.put("approveResult", approveMessageInfoDTO.getApproveResult().getValue());
         map.put("messageId", approveMessageInfoDTO.getMessageId());
@@ -168,6 +219,26 @@ public class ApproveBusinessImpl implements IApproveBusiness {
         requestVo.setAppSecret(kafkaProperties.getAppSecret());
         log.info("====审批流程结束:开始推送结果,实例ID{}====,消息体为:{}", processInstanceId, JSON.toJSONString(requestVo));
         kafkaServer.send(requestVo, kafkaProperties.getKafkaServers());
+
+        // todo
+        String callBackUrl = approveMessageInfoDTO.getCallbackUrl();
+        String message = "";
+
+        if (StrUtil.isNotBlank(callBackUrl)) {
+            ZeroTrustApproveEndEnum zeroTrustApproveEndEnum = ZeroTrustApproveEndEnum.parse(approveResult);
+            ZeroTrustEndFlagEnum zeroTrustEndFlagEnum = ZeroTrustEndFlagEnum.parseApproveWorkFlowOperationEnum(approveResult);
+            ZeroTrustApproveCallbackReqV3VO zeroTrustApproveCallbackReqV3VO = new ZeroTrustApproveCallbackReqV3VO();
+            zeroTrustApproveCallbackReqV3VO.setType(zeroTrustApproveEndEnum.getValue());
+            zeroTrustApproveCallbackReqV3VO.setProcessInstId(processInstanceId);
+            zeroTrustApproveCallbackReqV3VO.setOpenId(approvalInfoMsgItemDTO.getApplicantIdcard());
+            zeroTrustApproveCallbackReqV3VO.setUserName(approvalInfoMsgItemDTO.getApplicantName());
+            zeroTrustApproveCallbackReqV3VO.setEndFlag(zeroTrustEndFlagEnum.getValue());
+            zeroTrustApproveCallbackReqV3VO.setDescription(message);
+            zeroTrustApproveCallbackReqV3VO.setTaskId(approveNo);
+
+            noticeBusiness.baseApproveNotification(callBackUrl, zeroTrustApproveCallbackReqV3VO);
+        }
+
     }
 
     /**

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

@@ -0,0 +1,82 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import cn.hutool.core.lang.Assert;
+import com.dragonsoft.dcuc.approve.business.IBimBusiness;
+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.v3.ZeroTrustResultRespVO;
+import com.dragonsoft.dcuc.approve.properties.BimProperties;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+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;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+@Slf4j
+@Component
+public class BimBusinessImpl implements IBimBusiness {
+
+    private BimProperties bimProperties;
+
+    private RestTemplate restTemplate;
+
+    @Autowired
+    public void setBimProperties(BimProperties bimProperties) {
+        this.bimProperties = bimProperties;
+    }
+
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    @Override
+    public ZeroTrustAppTokenInfoRespVO getAppTokenInfo(String appTokenId) {
+        String appInfoUrl = "/idp/rest/getAppTokenInfo";
+        Assert.notBlank(appTokenId);
+
+        String reqUrl = bimProperties.getIdentityUrl() + appInfoUrl;
+
+        ZeroTrustAppTokenInfoReqVO zeroTrustAppTokenInfoReqVO = new ZeroTrustAppTokenInfoReqVO();
+        zeroTrustAppTokenInfoReqVO.setAppTokenId(appTokenId);
+
+        RequestEntity<ZeroTrustAppTokenInfoReqVO> httpEntity = new RequestEntity<>(zeroTrustAppTokenInfoReqVO, HttpMethod.POST, URI.create(reqUrl));
+
+        ParameterizedTypeReference<ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO>> parameterizedTypeReference =
+                new ParameterizedTypeReference<ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO>>() {
+                };
+
+        ResponseEntity<ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO>> responseEntity = restTemplate.exchange(httpEntity, parameterizedTypeReference);
+        if (responseEntity.getStatusCode().is2xxSuccessful()) {
+            ZeroTrustResultRespVO<ZeroTrustAppTokenInfoRespVO> responseEntityBody = responseEntity.getBody();
+            if (responseEntityBody != null) {
+                if (responseEntityBody.getStatusCode().equalsIgnoreCase(ZeroTrustBusinessRespEnum.SUCCESS.getValue())) {
+                    return responseEntityBody.getResult();
+                } else {
+                    log.error("request error statusCode:{} , message:{}", responseEntityBody.getStatusCode(), responseEntityBody.getMessage());
+                }
+            } else {
+                log.error("responseEntityBody isnull:{}", JsonUtils.toJSONString(responseEntity));
+            }
+
+        } else {
+            log.error("request error :{}", JsonUtils.toJSONString(responseEntity));
+        }
+        return null;
+    }
+}

+ 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();

+ 181 - 2
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/facade/api/ApiV3ApproveFacade.java

@@ -1,13 +1,44 @@
 package com.dragonsoft.dcuc.approve.facade.api;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.dragoninfo.dcuc.common.utils.ResponseUtil;
+import com.dragoninfo.dcuc.duceap.enums.ManageDisposeTypeEnum;
+import com.dragonsoft.dcuc.approve.business.IBimBusiness;
+import com.dragonsoft.dcuc.approve.business.IWorkFlowBusiness;
+import com.dragonsoft.dcuc.approve.dto.OperateReqDTO;
+import com.dragonsoft.dcuc.approve.enumresources.*;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.req.ApprovalInfoReqVO;
+import com.dragonsoft.dcuc.approve.model.req.ResourceInfoReqVO;
 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.OperateRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppItemUserTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
 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 com.dragonsoft.dcuc.approve.model.vo.ApproveTaskRequestVo;
+import com.dragonsoft.dcuc.approve.model.vo.TaskRequestUserInfoDTO;
+import com.dragonsoft.dcuc.approve.service.IApproveRecordService;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.dcuc.approve.utils.LangUtil;
+import com.dragonsoft.duceap.base.entity.http.ResponseDTO;
+import com.dragonsoft.duceap.commons.util.enums.EnumUtils;
+import com.dragonsoft.duceap.commons.util.json.JsonUtils;
+import com.dragonsoft.duceap.duwf.api.model.TaskRequest;
+import com.dragonsoft.duceap.duwf.api.model.WorkflowProcessVo;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  *
@@ -19,13 +50,161 @@ import org.springframework.web.bind.annotation.RestController;
 @Slf4j
 @RestController
 public class ApiV3ApproveFacade implements IApiV3ApproveFacade {
+
+    private IApproveService approveService;
+
+    private IApproveRecordService approveRecordService;
+
+    private IWorkFlowBusiness workFlowBusiness;
+
+    private IBimBusiness bimBusiness;
+
+    @Autowired
+    public void setApproveService(IApproveService approveService) {
+        this.approveService = approveService;
+    }
+
+    @Autowired
+    public void setApproveRecordService(IApproveRecordService approveRecordService) {
+        this.approveRecordService = approveRecordService;
+    }
+
+    @Autowired
+    public void setWorkFlowBusiness(IWorkFlowBusiness workFlowBusiness) {
+        this.workFlowBusiness = workFlowBusiness;
+    }
+
+    @Autowired
+    public void setBimBusiness(IBimBusiness bimBusiness) {
+        this.bimBusiness = bimBusiness;
+    }
+
     @Override
     public ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> create(ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO) {
-        return null;
+        String appTokenId = zeroTrustApproveCreateReqV3VO.getAppTokenId();
+        String processDefId = zeroTrustApproveCreateReqV3VO.getProcessDefId();
+        String title = zeroTrustApproveCreateReqV3VO.getTitle();
+        String approveTaskClass = zeroTrustApproveCreateReqV3VO.getTaskClass();
+        String approveTaskId = zeroTrustApproveCreateReqV3VO.getTaskId();
+
+        String callbackUrl = zeroTrustApproveCreateReqV3VO.getCallbackUrl();
+        String callerSign = zeroTrustApproveCreateReqV3VO.getCallerSign();
+        // 校验必填参数
+        if (LangUtil.isAnyBlank(appTokenId, processDefId, title, approveTaskClass, approveTaskId, callbackUrl, callerSign)) {
+            return ZeroTrustResultDataVO.operateFailMessage("请传入必填参数");
+        }
+        // todo 验证签名
+
+        Map<String, List<Map<String, String>>> bo = zeroTrustApproveCreateReqV3VO.getBo();
+        Map<String, String> bizData = zeroTrustApproveCreateReqV3VO.getBizData();
+
+        ZeroTrustAppTokenInfoRespVO appTokenInfo = bimBusiness.getAppTokenInfo(appTokenId);
+        if (ObjectUtil.isNull(appTokenInfo)) {
+            return ZeroTrustResultDataVO.resultEnumMessage(ZeroTrustBusinessRespEnum.TOKEN_FAIL);
+        }
+        ZeroTrustAppItemUserTokenInfoRespVO userToken = appTokenInfo.getUserToken();
+        // todo 查询应用令牌信息,获取人员信息
+        String appCode = appTokenInfo.getAppId();
+        String applicantIdcard = userToken.getPid();
+        String applicantName = userToken.getName();
+        String applicantOrgCode = userToken.getOrgCode();
+        String applicantOrgName = "";
+        String applicantPhoneNo = "";
+
+        // 获取processType并校验
+        WorkflowProcessVo workflowProcessVo = workFlowBusiness.queryWorkflowProcessByBusinessCode(processDefId);
+        if (ObjectUtil.isNull(workflowProcessVo)) {
+            return ZeroTrustResultDataVO.operateFailMessage("流程标识不存在");
+        }
+        String processType = workflowProcessVo.getProcessType();
+        String content = "";
+        if (MapUtil.isNotEmpty(bo)) {
+            content = JsonUtils.toJSONString(bo);
+        }
+
+        ResourceInfoReqVO resourceInfoReqVO = new ResourceInfoReqVO();
+        if (MapUtil.isNotEmpty(bizData)) {
+            BeanUtil.copyProperties(bizData, resourceInfoReqVO);
+        }
+
+        ApprovalInfoReqVO approvalInfoReqVO = new ApprovalInfoReqVO();
+        approvalInfoReqVO.setProcessTitle(title);
+        approvalInfoReqVO.setProcessType(processType);
+        approvalInfoReqVO.setBusinessCode(processDefId);
+        approvalInfoReqVO.setAppCode(appCode);
+        approvalInfoReqVO.setApplyContent(content);
+        approvalInfoReqVO.setApplyReason(title + "申请");
+        approvalInfoReqVO.setApplicantIdcard(applicantIdcard);
+        approvalInfoReqVO.setApplicantName(applicantName);
+        approvalInfoReqVO.setApplicantOrgCode(applicantOrgCode);
+        approvalInfoReqVO.setApplicantOrgName(applicantOrgName);
+        approvalInfoReqVO.setApplicantPhoneNo(applicantPhoneNo);
+        approvalInfoReqVO.setPermissionValidType(PermissionValidTypeEnum.LONG.getValue());
+        approvalInfoReqVO.setOperateType(CommitTypeEnum.APPLY_COMMIT.getValue());
+        approvalInfoReqVO.setResourceInfoDTO(resourceInfoReqVO);
+        approvalInfoReqVO.setCallbackUrl(callbackUrl);
+        approvalInfoReqVO.setApproveTaskClass(approveTaskClass);
+        approvalInfoReqVO.setApproveTaskId(approveTaskId);
+
+        ApproveRecordInfo approveRecordInfo = approveService.saveBase(approvalInfoReqVO, ManageDisposeTypeEnum.INSERT, new Date());
+        String processInstanceId = approveRecordInfo.getProcessInstanceId();
+        ZeroTrustApproveCreateV3RespVO zeroTrustApproveCreateV3RespVO = new ZeroTrustApproveCreateV3RespVO();
+        zeroTrustApproveCreateV3RespVO.setProcessInstId(processInstanceId);
+        return ZeroTrustResultDataVO.success(zeroTrustApproveCreateV3RespVO);
     }
 
     @Override
     public ZeroTrustMessageRespVO manage(ZeroTrustApproveManagerReqV3VO zeroTrustApproveManagerReqV3VO) {
-        return null;
+        String appTokenId = zeroTrustApproveManagerReqV3VO.getAppTokenId();
+        String processInstId = zeroTrustApproveManagerReqV3VO.getProcessInstId();
+        String actionType = zeroTrustApproveManagerReqV3VO.getActionType();
+
+        if (LangUtil.isAnyBlank(appTokenId, processInstId, actionType)) {
+            return ZeroTrustResultDataVO.operateFailMessage("请传入必填参数");
+        }
+
+        ZeroTrustApproveManageEnum zeroTrustApproveManageEnum = EnumUtils.enumOf(ZeroTrustApproveManageEnum.class, actionType);
+        if (ObjectUtil.isNull(zeroTrustApproveManageEnum)) {
+            return ZeroTrustResultDataVO.operateFailMessage("actionType,参数不正确");
+        }
+        ApproveWorkFlowOperationEnum approveWorkFlowOperationEnum = zeroTrustApproveManageEnum.toApproveWorkFlowOperationEnum();
+        if (ObjectUtil.isNull(approveWorkFlowOperationEnum)) {
+            return ZeroTrustResultDataVO.operateFailMessage("暂不支持该操作");
+        }
+
+        // 获取应用令牌中人员信息
+        ZeroTrustAppTokenInfoRespVO appTokenInfo = bimBusiness.getAppTokenInfo(appTokenId);
+        if (ObjectUtil.isNull(appTokenInfo)) {
+            return ZeroTrustResultDataVO.resultEnumMessage(ZeroTrustBusinessRespEnum.TOKEN_FAIL);
+        }
+        ZeroTrustAppItemUserTokenInfoRespVO userToken = appTokenInfo.getUserToken();
+        String idcard = userToken.getPid();
+        ApproveRecordInfo approveRecordInfo = approveRecordService.findByProcessInstanceId(processInstId);
+        if (ObjectUtil.isNull(approveRecordInfo)) {
+            return ZeroTrustResultDataVO.operateFailMessage("流程实例不存在");
+        }
+        String currentFlowTaskId = approveRecordInfo.getTaskId();
+
+        TaskRequestUserInfoDTO taskRequestUserInfoDTO = new TaskRequestUserInfoDTO();
+        taskRequestUserInfoDTO.setIdCard(idcard);
+
+        TaskRequest<ApproveTaskRequestVo> taskRequest = new TaskRequest<>();
+
+        OperateReqDTO operateReqDTO = OperateReqDTO.builder()
+                .taskId(currentFlowTaskId)
+                .processInstanceId(processInstId)
+                .approveWorkFlowOperationEnum(ApproveWorkFlowOperationEnum.RECALL)
+                .taskRequest(taskRequest)
+                .taskRequestUserInfoDTO(taskRequestUserInfoDTO)
+                .activitiHolderList(Collections.emptyList())
+                .needCheckRedList(false)
+                .build();
+
+        ResponseDTO<OperateRespVO> responseDTO = approveService.approveOperate(operateReqDTO);
+        if (ResponseUtil.isFail(responseDTO)) {
+            return ZeroTrustResultDataVO.operateFailMessage(responseDTO.getMessage());
+        }
+
+        return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
     }
 }

+ 11 - 7
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApprovalInfo.java

@@ -1,8 +1,5 @@
 package com.dragonsoft.dcuc.approve.model;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.dragonsoft.dcuc.approve.dto.ResourceInfoDTO;
 import com.dragonsoft.dcuc.approve.enumresources.ApproveResultEnum;
@@ -12,7 +9,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import javax.persistence.Transient;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -29,8 +25,6 @@ public class ApprovalInfo implements Serializable {
 
     private static final long serialVersionUID = 5454155825318885342L;
 
-    @TableField(value = "ID")
-    @TableId(type = IdType.UUID)
     private String id;
 
     /**
@@ -197,8 +191,18 @@ public class ApprovalInfo implements Serializable {
      */
     private String approveNo;
 
+    /**
+     * 回调通知地址
+     */
+    private String callbackUrl;
+
+    /**
+     * 任务类型
+     */
+    private String approveTaskClass;
+
+
     @ApiModelProperty(value = "访问资源信息")
-    @Transient
     private ResourceInfoDTO resourceInfoVo;
 
 }

+ 10 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/ApproveRecordInfo.java

@@ -268,6 +268,16 @@ public class ApproveRecordInfo {
      */
     private String sign;
 
+    /**
+     * 回调通知地址
+     */
+    private String callbackUrl;
+
+    /**
+     * 任务类型
+     */
+    private String approveTaskClass;
+
     /**
      * 将模式3新表单表构建成旧表单对象
      *

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

@@ -82,4 +82,11 @@ public class ApprovalInfoMsgItemDTO {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
+    /**
+     * 任务类型
+     */
+    @ApiModelProperty(value = "任务类型")
+    private String approveTaskClass;
+
+
 }

+ 15 - 1
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/model/vo/ApproveMessageInfoDTO.java

@@ -1,6 +1,7 @@
 package com.dragonsoft.dcuc.approve.model.vo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Assert;
 import com.dragonsoft.dcuc.approve.dto.ResourceInfoDTO;
 import com.dragonsoft.dcuc.approve.enumresources.ApproveWorkFlowOperationEnum;
 import com.dragonsoft.dcuc.approve.model.ApprovalInfo;
@@ -37,6 +38,16 @@ public class ApproveMessageInfoDTO {
      */
     private String sourceAppCode;
 
+    /**
+     * 回调通知地址
+     */
+    private String callbackUrl;
+
+    /**
+     * 审批内容
+     */
+    private String approveMessage;
+
     /**
      * 审批单信息
      */
@@ -48,7 +59,9 @@ public class ApproveMessageInfoDTO {
     private ApproveWorkFlowOperationEnum approveResult;
 
 
-    public static ApproveMessageInfoDTO newInstance(ApprovalInfo approvalInfo, ApproveWorkFlowOperationEnum approveResult) {
+    public static ApproveMessageInfoDTO newInstance(ApprovalInfo approvalInfo, ApproveWorkFlowOperationEnum approveResult, String approveMessage) {
+        Assert.notNull(approvalInfo);
+        Assert.notNull(approveResult);
 
         String approveNo = approvalInfo.getApproveNo();
         String appCode = approvalInfo.getAppCode();
@@ -67,6 +80,7 @@ public class ApproveMessageInfoDTO {
         approveMessageInfoDTO.setSourceAppCode(appCode);
         approveMessageInfoDTO.setApproveInfo(approvalInfoMsgItemDTO);
         approveMessageInfoDTO.setApproveResult(approveResult);
+        approveMessageInfoDTO.setApproveMessage(approveMessage);
 
         return approveMessageInfoDTO;
     }

+ 24 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/properties/BimProperties.java

@@ -0,0 +1,24 @@
+package com.dragonsoft.dcuc.approve.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ * 竹云配置
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "approve.bim")
+public class BimProperties {
+
+    /**
+     * 竹云认证地址
+     */
+    private String identityUrl;
+}

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

@@ -115,6 +115,7 @@ public interface IApproveService {
     ResponseDTO<ApprovalInfoRespVO> queryApproveDetail(String id);
 
 
+
     /***
      * 获取流程图状态信息
      * @param processInstanceId 流程实例ID

+ 13 - 8
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/service/impl/ApproveServiceImpl.java

@@ -138,6 +138,7 @@ public class ApproveServiceImpl implements IApproveService {
 
     @Override
     public ApproveRecordInfo saveBase(ApprovalInfoReqVO approvalInfoReqVO, ManageDisposeTypeEnum manageDisposeTypeEnum, Date oldCreateTime) {
+        // todo 新增callbackUrl,taskClass,taskId的处理
         ApproveRecordInfo approveRecordInfo = null;
         ApprovalInfo approvalInfo = null;
         ProcessInstanceVO processInstanceVO = null;
@@ -165,7 +166,10 @@ public class ApproveServiceImpl implements IApproveService {
             }
             //构建ApprovalResourceInfo资源对象
             // 生成审批单号
-            String approveNo = approveBusiness.buildApproveNo();
+            String approveNo = approvalInfoReqVO.getApproveTaskId();
+            if (StrUtil.isBlank(approveNo)) {
+                approveNo = approveBusiness.buildApproveNo();
+            }
 
             //判断是否需要提交,创建流程
             @NotBlank String operateType = approvalInfoReqVO.getOperateType();
@@ -240,7 +244,7 @@ public class ApproveServiceImpl implements IApproveService {
                     }
                     logger.info("===发送消息标志:{}====", sendMessageFlag);
                     if (sendMessageFlag) {
-                        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.COMPLETE_AGREE);
+                        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.COMPLETE_AGREE, "");
                         //发送消息
                         approveBusiness.sendApproveResultMessage(approveMessageInfoDTO);
                         approveResult = ApproveResultEnum.SUCCESS;
@@ -411,7 +415,7 @@ public class ApproveServiceImpl implements IApproveService {
                     logger.info("====发送结果标志:{}", sendMessageFlag);
                     if (sendMessageFlag) {
                         //构建消息体并发送到kafka
-                        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.COMPLETE_AGREE);
+                        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.COMPLETE_AGREE, "");
 
                         approveBusiness.sendApproveResultMessage(approveMessageInfoDTO);
                         approveRecordInfo.setFinalApprovalResult(ApproveResultEnum.SUCCESS.getValue());
@@ -630,9 +634,10 @@ public class ApproveServiceImpl implements IApproveService {
 
             logger.info("====是否发送消息标志位:{}====", sendMessageFlag);
             if (sendMessageFlag) {
+                ApproveMessage approveMessage = taskRequest.getApproveMessage();
+                String message = approveMessage.getMessage();
                 //构建消息体并发送
-                sendMessage(approveWorkFlowOperationEnum, approvalInfo);
-
+                sendMessage(approveWorkFlowOperationEnum, approvalInfo, message);
                 //设置流程状态结果
                 switch (approveWorkFlowOperationEnum) {
                     case COMPLETE_AGREE:
@@ -908,7 +913,7 @@ public class ApproveServiceImpl implements IApproveService {
             }
             //执行表单表逻辑删除
             approveRecordService.deleteById(id);
-            ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.RECALL);
+            ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, ApproveWorkFlowOperationEnum.RECALL, "");
             approveBusiness.sendApproveResultMessage(approveMessageInfoDTO);
 
             //删除所有已办
@@ -1123,9 +1128,9 @@ public class ApproveServiceImpl implements IApproveService {
      * @param approveWorkFlowOperationEnum 操作类型
      * @param approvalInfo                 审批信息
      */
-    protected void sendMessage(ApproveWorkFlowOperationEnum approveWorkFlowOperationEnum, ApprovalInfo approvalInfo) {
+    protected void sendMessage(ApproveWorkFlowOperationEnum approveWorkFlowOperationEnum, ApprovalInfo approvalInfo, String approveMessage) {
         //构建消息体并发送
-        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, approveWorkFlowOperationEnum);
+        ApproveMessageInfoDTO approveMessageInfoDTO = ApproveMessageInfoDTO.newInstance(approvalInfo, approveWorkFlowOperationEnum, approveMessage);
         approveBusiness.sendApproveResultMessage(approveMessageInfoDTO);
     }
 

+ 38 - 0
approve-core-service/src/main/java/com/dragonsoft/dcuc/approve/utils/LangUtil.java

@@ -0,0 +1,38 @@
+package com.dragonsoft.dcuc.approve.utils;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * <p>
+ * 工具类
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+public final class LangUtil {
+
+    private LangUtil() {
+    }
+
+    /**
+     * 是否其中有个空
+     *
+     * @param strings 需要验证
+     * @return 是否
+     */
+    public static boolean isAnyBlank(String... strings) {
+        Assert.notNull(strings);
+        if (strings.length == 0) {
+            throw new IllegalArgumentException();
+        }
+
+        for (String string : strings) {
+            if (StrUtil.isBlank(string)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 5 - 0
approve-core-service/src/main/resources/config/mysql/V1_1_0015__add_TaskClass_ClallBackUrl_.sql

@@ -0,0 +1,5 @@
+ALTER TABLE t_approve_record_info
+    ADD callback_url varchar(255) NULL COMMENT '回调地址' AFTER `ALREADY_RED_LIST_APPROVE`;;
+
+ALTER TABLE t_approve_record_info
+    ADD approve_task_class varchar(32) NULL COMMENT '审批单任务类型' AFTER `callback_url`;;

+ 99 - 0
approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/business/impl/BimBusinessImplTest.java

@@ -0,0 +1,99 @@
+package com.dragonsoft.dcuc.approve.business.impl;
+
+import com.dragoninfo.dcuc.common.http.SkipSslVerificationHttpRequestFactory;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppItemUserTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.properties.BimProperties;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.client.ExpectedCount;
+import org.springframework.test.web.client.MockRestServiceServer;
+import org.springframework.test.web.client.match.MockRestRequestMatchers;
+import org.springframework.test.web.client.response.MockRestResponseCreators;
+import org.springframework.web.client.RestTemplate;
+
+import java.net.URI;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+public class BimBusinessImplTest {
+
+    private RestTemplate restTemplate;
+
+    private MockRestServiceServer mockRestServiceServer;
+
+    @Before
+    public void before() {
+        SkipSslVerificationHttpRequestFactory skipSslVerificationHttpRequestFactory
+                = new SkipSslVerificationHttpRequestFactory();
+        skipSslVerificationHttpRequestFactory.setReadTimeout(5000);
+        skipSslVerificationHttpRequestFactory.setConnectTimeout(5000);
+        restTemplate = new RestTemplate(skipSslVerificationHttpRequestFactory);
+
+        mockRestServiceServer = MockRestServiceServer.createServer(restTemplate);
+    }
+
+    @Test
+    public void getAppTokenInfo() {
+        String identityUrl = "http://1.1.1.10:8080";
+        String appInfoUrl = "/idp/rest/getAppTokenInfo";
+
+        String reqUr = identityUrl + appInfoUrl;
+        String respBody = "{\n" +
+                "    \"result\": {\n" +
+                "        \"appId\": \"OA\",\n" +
+                "        \"createTime\": \"2022-07-27 14:05:04\",\n" +
+                "        \"expireAt\": \"2022-07-27 14:35:04\",\n" +
+                "        \"Id\": \"eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTkwNCwiZXhwIjoyNzU3ODkwMTkwNCwidHlwZSI6ImFwcCIsIklEIjoiMWIzZjZmNjMtODgyNy00ZjRjLWE1YWEtNDUzMzRmMmRiOGE4IiwiYXBwSWQiOiJPQSIsInVpZCI6Ijk5YjBjZGRlZjdkNTExZWNhNjQ5MDAwYzI5YzQ5YmY1IiwidXNlclRva2VuSWQiOiIxODhiOGMwOS0xODdiLTRiMjAtOTUwYi03ZmY5ZWYwZTY5ZWEiLCJzZXNzaW9uSWQiOiI5NDQ0NjNkZjhkMWVhMzc5OTQ4MmMyZGEwMDg0YzZhYyJ9.zCy21HdojCtmSh_aoxj_gIhbVNlPYbpI9H4ilb1c-HvyxoBdRAoPnEckBjILBUgAXIHfz9W7fsDiQ0Cygb9DWw\",\n" +
+                "        \"userToken\": {\n" +
+                "            \"pId\": \"test10\",\n" +
+                "            \"name\": \"测试10\",\n" +
+                "            \"orgCode\": \"bamboocloud\",\n" +
+                "            \"mId\": \"1\",\n" +
+                "            \"env\": \"1\",\n" +
+                "            \"createTime\": \"2022-07-27 14:04:45\",\n" +
+                "            \"expireAt\": \"2022-07-27 14:35:04\",\n" +
+                "            \"Id\": \"eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTg4NSwiZXhwIjoxNjg0ODIxODg1LCJ0eXBlIjoidXNlciIsIklEIjoiMTg4YjhjMDktMTg3Yi00YjIwLTk1MGItN2ZmOWVmMGU2OWVhIiwicmVtb3RlSXAiOiIxMS4xMS4xMS4xMSIsInNlc3Npb25JZCI6Ijk0NDQ2M2RmOGQxZWEzNzk5NDgyYzJkYTAwODRjNmFjIiwidWlkIjoiOTliMGNkZGVmN2Q1MTFlY2E2NDkwMDBjMjljNDliZjUiLCJvcmdhbml6YXRpb25Db2RlIjoiYmFtYm9vY2xvdWQiLCJkZXZPbmx5SWQiOiIiLCJlcXVpcG1lbnRUeXBlIjoiIn0.5pGkVDtz4KwFytwjQVkmapOV2QI0EO_1x0HifCKfkdWibGjMb4t8ev5oNx59FhM-NO0v2-BH0s3WyQ-XA19Elg\"\n" +
+                "        }\n" +
+                "    },\n" +
+                "    \"status_code\": \"0000\",\n" +
+                "    \"message\": \"success\"\n" +
+                "}  \n";
+
+        mockRestServiceServer.expect(ExpectedCount.once(),
+                        MockRestRequestMatchers.requestTo(URI.create(reqUr))
+                ).andExpect(MockRestRequestMatchers.method(HttpMethod.POST))
+                .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .body(respBody));
+
+        BimProperties bimProperties = new BimProperties();
+        bimProperties.setIdentityUrl(identityUrl);
+
+        BimBusinessImpl bimBusiness = new BimBusinessImpl();
+        bimBusiness.setRestTemplate(restTemplate);
+        bimBusiness.setBimProperties(bimProperties);
+
+        String appTokenId = "22222";
+        ZeroTrustAppTokenInfoRespVO appTokenInfo = bimBusiness.getAppTokenInfo(appTokenId);
+
+        Assert.assertNotNull(appTokenInfo);
+        Assert.assertEquals("OA", appTokenInfo.getAppId());
+        Assert.assertEquals("eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTkwNCwiZXhwIjoyNzU3ODkwMTkwNCwidHlwZSI6ImFwcCIsIklEIjoiMWIzZjZmNjMtODgyNy00ZjRjLWE1YWEtNDUzMzRmMmRiOGE4IiwiYXBwSWQiOiJPQSIsInVpZCI6Ijk5YjBjZGRlZjdkNTExZWNhNjQ5MDAwYzI5YzQ5YmY1IiwidXNlclRva2VuSWQiOiIxODhiOGMwOS0xODdiLTRiMjAtOTUwYi03ZmY5ZWYwZTY5ZWEiLCJzZXNzaW9uSWQiOiI5NDQ0NjNkZjhkMWVhMzc5OTQ4MmMyZGEwMDg0YzZhYyJ9.zCy21HdojCtmSh_aoxj_gIhbVNlPYbpI9H4ilb1c-HvyxoBdRAoPnEckBjILBUgAXIHfz9W7fsDiQ0Cygb9DWw", appTokenInfo.getId());
+        ZeroTrustAppItemUserTokenInfoRespVO userToken = appTokenInfo.getUserToken();
+        Assert.assertEquals("eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTg4NSwiZXhwIjoxNjg0ODIxODg1LCJ0eXBlIjoidXNlciIsIklEIjoiMTg4YjhjMDktMTg3Yi00YjIwLTk1MGItN2ZmOWVmMGU2OWVhIiwicmVtb3RlSXAiOiIxMS4xMS4xMS4xMSIsInNlc3Npb25JZCI6Ijk0NDQ2M2RmOGQxZWEzNzk5NDgyYzJkYTAwODRjNmFjIiwidWlkIjoiOTliMGNkZGVmN2Q1MTFlY2E2NDkwMDBjMjljNDliZjUiLCJvcmdhbml6YXRpb25Db2RlIjoiYmFtYm9vY2xvdWQiLCJkZXZPbmx5SWQiOiIiLCJlcXVpcG1lbnRUeXBlIjoiIn0.5pGkVDtz4KwFytwjQVkmapOV2QI0EO_1x0HifCKfkdWibGjMb4t8ev5oNx59FhM-NO0v2-BH0s3WyQ-XA19Elg", userToken.getId());
+        Assert.assertEquals("1", userToken.getMid());
+        Assert.assertEquals("test10", userToken.getPid());
+
+    }
+}

+ 146 - 0
approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/facade/api/ApiV3ApproveFacadeTest.java

@@ -0,0 +1,146 @@
+package com.dragonsoft.dcuc.approve.facade.api;
+
+import com.dragonsoft.dcuc.approve.business.IBimBusiness;
+import com.dragonsoft.dcuc.approve.business.IWorkFlowBusiness;
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
+import com.dragonsoft.dcuc.approve.model.ApproveRecordInfo;
+import com.dragonsoft.dcuc.approve.model.req.v3.ZeroTrustApproveCreateReqV3VO;
+import com.dragonsoft.dcuc.approve.model.resp.bim.ZeroTrustAppTokenInfoRespVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustApproveCreateV3RespVO;
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustResultDataVO;
+import com.dragonsoft.dcuc.approve.service.IApproveService;
+import com.dragonsoft.duceap.commons.util.UUIDUtils;
+import com.dragonsoft.duceap.duwf.api.model.WorkflowProcessVo;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+public class ApiV3ApproveFacadeTest {
+
+    private ApiV3ApproveFacade apiV3ApproveFacade;
+    private String processInsId = UUIDUtils.getUUID();
+    private ZeroTrustAppTokenInfoRespVO zeroTrustAppTokenInfoRespVO;
+
+    @Before
+    public void before() {
+        IWorkFlowBusiness workFlowBusiness = Mockito.spy(IWorkFlowBusiness.class);
+        WorkflowProcessVo workflowProcessVo = new WorkflowProcessVo();
+        workflowProcessVo.setProcessType("111");
+
+        Mockito.when(workFlowBusiness.queryWorkflowProcessByBusinessCode(Mockito.anyString()))
+                .thenReturn(workflowProcessVo);
+
+        ApproveRecordInfo approveRecordInfo = new ApproveRecordInfo();
+
+        approveRecordInfo.setProcessInstanceId(processInsId);
+
+        IApproveService approveService = Mockito.spy(IApproveService.class);
+        Mockito.when(approveService.saveBase(Mockito.any(), Mockito.any(), Mockito.any()))
+                .thenReturn(approveRecordInfo);
+
+        String respBody = " {\n" +
+                "        \"appId\": \"OA\",\n" +
+                "        \"createTime\": \"2022-07-27 14:05:04\",\n" +
+                "        \"expireAt\": \"2022-07-27 14:35:04\",\n" +
+                "        \"Id\": \"eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTkwNCwiZXhwIjoyNzU3ODkwMTkwNCwidHlwZSI6ImFwcCIsIklEIjoiMWIzZjZmNjMtODgyNy00ZjRjLWE1YWEtNDUzMzRmMmRiOGE4IiwiYXBwSWQiOiJPQSIsInVpZCI6Ijk5YjBjZGRlZjdkNTExZWNhNjQ5MDAwYzI5YzQ5YmY1IiwidXNlclRva2VuSWQiOiIxODhiOGMwOS0xODdiLTRiMjAtOTUwYi03ZmY5ZWYwZTY5ZWEiLCJzZXNzaW9uSWQiOiI5NDQ0NjNkZjhkMWVhMzc5OTQ4MmMyZGEwMDg0YzZhYyJ9.zCy21HdojCtmSh_aoxj_gIhbVNlPYbpI9H4ilb1c-HvyxoBdRAoPnEckBjILBUgAXIHfz9W7fsDiQ0Cygb9DWw\",\n" +
+                "        \"userToken\": {\n" +
+                "            \"pId\": \"test10\",\n" +
+                "            \"name\": \"测试10\",\n" +
+                "            \"orgCode\": \"bamboocloud\",\n" +
+                "            \"mId\": \"1\",\n" +
+                "            \"env\": \"1\",\n" +
+                "            \"createTime\": \"2022-07-27 14:04:45\",\n" +
+                "            \"expireAt\": \"2022-07-27 14:35:04\",\n" +
+                "            \"Id\": \"eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJCQyIsInN1YiI6InRlc3QxMCIsImlhdCI6MTY1ODkwMTg4NSwiZXhwIjoxNjg0ODIxODg1LCJ0eXBlIjoidXNlciIsIklEIjoiMTg4YjhjMDktMTg3Yi00YjIwLTk1MGItN2ZmOWVmMGU2OWVhIiwicmVtb3RlSXAiOiIxMS4xMS4xMS4xMSIsInNlc3Npb25JZCI6Ijk0NDQ2M2RmOGQxZWEzNzk5NDgyYzJkYTAwODRjNmFjIiwidWlkIjoiOTliMGNkZGVmN2Q1MTFlY2E2NDkwMDBjMjljNDliZjUiLCJvcmdhbml6YXRpb25Db2RlIjoiYmFtYm9vY2xvdWQiLCJkZXZPbmx5SWQiOiIiLCJlcXVpcG1lbnRUeXBlIjoiIn0.5pGkVDtz4KwFytwjQVkmapOV2QI0EO_1x0HifCKfkdWibGjMb4t8ev5oNx59FhM-NO0v2-BH0s3WyQ-XA19Elg\"\n" +
+                "        }\n" +
+                "    }";
+        System.out.println(respBody);
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        try {
+            zeroTrustAppTokenInfoRespVO = objectMapper.readValue(respBody, ZeroTrustAppTokenInfoRespVO.class);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+
+
+        IBimBusiness bimBusiness = Mockito.spy(IBimBusiness.class);
+        Mockito.when(bimBusiness.getAppTokenInfo(Mockito.anyString()))
+                .thenReturn(zeroTrustAppTokenInfoRespVO);
+
+        apiV3ApproveFacade = new ApiV3ApproveFacade();
+        apiV3ApproveFacade.setWorkFlowBusiness(workFlowBusiness);
+        apiV3ApproveFacade.setApproveService(approveService);
+        apiV3ApproveFacade.setBimBusiness(bimBusiness);
+    }
+
+    @Test
+    public void create() {
+
+        ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO = new ZeroTrustApproveCreateReqV3VO();
+        zeroTrustApproveCreateReqV3VO.setAppTokenId("111");
+        zeroTrustApproveCreateReqV3VO.setProcessDefId("222");
+        zeroTrustApproveCreateReqV3VO.setTitle("标题");
+        zeroTrustApproveCreateReqV3VO.setTaskClass("3");
+        zeroTrustApproveCreateReqV3VO.setTaskId("taskIUd");
+        zeroTrustApproveCreateReqV3VO.setCallbackUrl("http:sss");
+        zeroTrustApproveCreateReqV3VO.setCallerSign("1111");
+
+        ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> resultDataVO = apiV3ApproveFacade.create(zeroTrustApproveCreateReqV3VO);
+        Assert.assertEquals(resultDataVO.getStatusCode(), ZeroTrustBusinessRespEnum.SUCCESS.getValue());
+        ZeroTrustApproveCreateV3RespVO data = resultDataVO.getData();
+        Assert.assertEquals(processInsId, data.getProcessInstId());
+
+    }
+
+    @Test
+    public void createFail() {
+
+        ZeroTrustApproveCreateReqV3VO zeroTrustApproveCreateReqV3VO = new ZeroTrustApproveCreateReqV3VO();
+        zeroTrustApproveCreateReqV3VO.setAppTokenId("");
+        zeroTrustApproveCreateReqV3VO.setProcessDefId("222");
+        zeroTrustApproveCreateReqV3VO.setTitle("标题");
+        zeroTrustApproveCreateReqV3VO.setTaskClass("3");
+        zeroTrustApproveCreateReqV3VO.setTaskId("taskIUd");
+        zeroTrustApproveCreateReqV3VO.setCallbackUrl("http:sss");
+        zeroTrustApproveCreateReqV3VO.setCallerSign("1111");
+
+        ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> resultDataVO = apiV3ApproveFacade.create(zeroTrustApproveCreateReqV3VO);
+        Assert.assertEquals(resultDataVO.getStatusCode(), ZeroTrustBusinessRespEnum.OPERATE_FAIL.getValue());
+        Assert.assertEquals("请传入必填参数", resultDataVO.getMessage());
+
+        zeroTrustApproveCreateReqV3VO.setAppTokenId("2222");
+
+        IBimBusiness bimBusiness = Mockito.spy(IBimBusiness.class);
+        Mockito.when(bimBusiness.getAppTokenInfo(Mockito.anyString()))
+                .thenReturn(null);
+        apiV3ApproveFacade.setBimBusiness(bimBusiness);
+
+        ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> resultDataVO1 = apiV3ApproveFacade.create(zeroTrustApproveCreateReqV3VO);
+        Assert.assertEquals(resultDataVO1.getStatusCode(), ZeroTrustBusinessRespEnum.TOKEN_FAIL.getValue());
+        Assert.assertEquals("令牌失效", resultDataVO1.getMessage());
+
+        Mockito.when(bimBusiness.getAppTokenInfo(Mockito.anyString()))
+                .thenReturn(zeroTrustAppTokenInfoRespVO);
+
+        IWorkFlowBusiness workFlowBusiness = Mockito.spy(IWorkFlowBusiness.class);
+        Mockito.when(workFlowBusiness.queryWorkflowProcessByBusinessCode(Mockito.anyString()))
+                .thenReturn(null);
+        apiV3ApproveFacade.setWorkFlowBusiness(workFlowBusiness);
+
+        ZeroTrustResultDataVO<ZeroTrustApproveCreateV3RespVO> resultDataVO2 = apiV3ApproveFacade.create(zeroTrustApproveCreateReqV3VO);
+        Assert.assertEquals(resultDataVO2.getStatusCode(), ZeroTrustBusinessRespEnum.OPERATE_FAIL.getValue());
+        Assert.assertEquals("流程标识不存在", resultDataVO2.getMessage());
+    }
+}

+ 32 - 0
approve-core-service/src/test/java/com/dragonsoft/dcuc/approve/utils/LangUtilTest.java

@@ -0,0 +1,32 @@
+package com.dragonsoft.dcuc.approve.utils;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author huangzqa
+ * @date 2023/6/7
+ */
+class LangUtilTest {
+
+    @Test
+    void isAnyBlank() {
+        boolean anyBlank = LangUtil.isAnyBlank("2", "1");
+        Assertions.assertFalse(anyBlank);
+        boolean anyBlank1 = LangUtil.isAnyBlank("1", "");
+        Assertions.assertTrue(anyBlank1);
+
+
+        Assertions.assertThrows(IllegalArgumentException.class, () -> {
+            LangUtil.isAnyBlank();
+        });
+
+        Assertions.assertThrows(NullPointerException.class, () -> {
+            LangUtil.isAnyBlank(null);
+        });
+    }
+}

+ 8 - 0
pom.xml

@@ -19,6 +19,7 @@
         <mysql.version>5.1.49</mysql.version>
         <lombok.version>1.18.8</lombok.version>
         <guava.retry.version>2.0.0</guava.retry.version>
+        <junit.version>4.13.2</junit.version>
     </properties>
     <artifactId>approve-core</artifactId>
     <packaging>pom</packaging>
@@ -34,6 +35,13 @@
                 <artifactId>guava-retrying</artifactId>
                 <version>${guava.retry.version}</version>
             </dependency>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+                <scope>test</scope>
+            </dependency>
+
             <!-- 导入duceap-cloud 2.1 POM定义-->
             <dependency>
                 <groupId>com.dragonsoft</groupId>