流程:发起流程,回调接口

This commit is contained in:
efren
2025-08-07 10:44:26 +08:00
parent 0e366da5e8
commit 3a3119796e
5 changed files with 209 additions and 0 deletions

View File

@ -122,6 +122,12 @@
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.71</version>
</dependency>
</dependencies>
<repositories>

View File

@ -0,0 +1,30 @@
package com.chinaunicom.mall.ebtp.extend.workflow.client;
import com.chinaunicom.mall.ebtp.common.workflow.entity.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(name = "workflow-service", url = "${spring.workflow.url}")
public interface WorkFlowClient {
/**
* 获取token接口
*/
@PostMapping("/lcdp/sso/token/lcdp/common/login/loginBySecureInfo")
WorkflowBaseResponse<WorkflowTokenResponse> getToken(WorkflowTokenRequest workflowToken);
/**
* 流程发起
* @param createWorkflow
* @param token
* @return
*/
@PostMapping("/lcdp/manager/workflow/v2/runtime/process-instances")
WorkflowBaseResponse<WorkflowCreateResponse> createWorkflow(
@RequestHeader("Cookie") String token,
@RequestBody WorkflowCreateRequest createWorkflow
);
}

View File

@ -0,0 +1,59 @@
package com.chinaunicom.mall.ebtp.extend.workflow.controller;
import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
import com.chinaunicom.mall.ebtp.common.workflow.entity.WorkflowCreateResponse;
import com.chinaunicom.mall.ebtp.common.workflow.entity.WorkflowBaseResponse;
import com.chinaunicom.mall.ebtp.extend.workflow.service.WorkflowService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@Slf4j
@RestController
@Api(tags = "流程中心接口")
@RequestMapping("/workflow")
public class WorkFlowController {
@Resource
private WorkflowService workflowService;
@GetMapping("/create")
public BaseResponse<WorkflowCreateResponse> create(
@RequestParam String userEmail,
@RequestParam String userName,
@RequestParam String userOrgId,
@RequestParam String modelId,
@RequestParam String businessKey,
@RequestParam String url
) throws Exception {
WorkflowBaseResponse<WorkflowCreateResponse> workflow = workflowService.createWorkflow(userEmail, userName, userOrgId, modelId, businessKey, url);
if ("0".equals(workflow.getResultCode())) {
return BaseResponse.success(workflow.getResultMsg(), workflow.getResultObject());
} else {
return BaseResponse.fail(workflow.getResultMsg(), null);
}
}
/**
* 流程中心回调接口
| busiDataId | string | 是 | 业务数据ID(表单数据) |
| businessKey | string | 是 | 同上 |
| processInstanceId | string | 是 | 流程实例id |
| status | string | 是 | 当前流程实例状态 |
回调接口多线程调用需要的业务处理接口各自业务处理接口需要根据流程实例ID查询是否有对应的业务数据 (类似消息总线模式)
*/
@GetMapping("/callback")
public BaseResponse<String> callback(
@RequestParam("busiDataId") String busiDataId,
@RequestParam("businessKey") String businessKey,
@RequestParam("processInstanceId") String processInstanceId,
@RequestParam("status") String status
) {
log.info("Workflow callback received: busiDataId={}, businessKey={}, processInstanceId={}, status={}",
busiDataId, businessKey, processInstanceId, status);
return BaseResponse.success();
}
}

View File

@ -0,0 +1,96 @@
package com.chinaunicom.mall.ebtp.extend.workflow.service;
import com.chinaunicom.mall.ebtp.extend.workflow.client.AESUtils;
import com.chinaunicom.mall.ebtp.extend.workflow.client.WorkFlowClient;
import com.chinaunicom.mall.ebtp.common.workflow.entity.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service
@Slf4j
public class WorkflowService {
@Resource
private WorkFlowClient workFlowClient;
@Value("${spring.workflow.client_id:zhongyuan-haiyun}")
private String clientId;
@Value("${spring.workflow.secret_key:7t8qC8XYRh3AANfhP9Pqjeu5AHZRv19G}")
private String secretKey;
/**
* 测试的默认值等待流程中心对接完用户信息后才可使用真实数据
*/
private String getToken(String userEmail, String userName, String userOrgId) throws Exception {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
WorkflowUser userVO = WorkflowUser.builder()
// 测试用,如果是空的则使用默认值
.userMail("dingx23@chinaunicom.cn")
// .userMail(userEmail)
// 测试用,如果是空的则使用默认值
.loginName("dingx23").build();
// .loginName(userName).build();
WorkflowExchange tokenReq = WorkflowExchange.builder()
.dateTime(sf.format(new Date()))
// 测试用,如果是空的则使用默认值
.userOrgId("ce7d12dd8bcd416aafe3bea5a4e96edd")
// .userOrgId(userOrgId)
.createUserWhenNotExist(false)
.userVo(userVO).build();
ObjectMapper objectMapper = new ObjectMapper();
String tokenJson = objectMapper.writeValueAsString(tokenReq);
String exchangeRequest = AESUtils.encryptAES(tokenJson, secretKey);
WorkflowTokenRequest workflowTokenRequest = new WorkflowTokenRequest();
workflowTokenRequest.setClientId(clientId);
workflowTokenRequest.setExchangeRequest(exchangeRequest);
WorkflowBaseResponse<WorkflowTokenResponse> tokenResponse = workFlowClient.getToken(workflowTokenRequest);
if (tokenResponse == null || !"0".equals(tokenResponse.getResultCode())) {
throw new RuntimeException("获取token失败");
}
String token = "lcdpAccessToken=" + tokenResponse.getResultObject().getToken();
log.info("获取token成功: {}", token);
return token;
}
/**
* 发起流程
* <p>
* {
* "modelId": "1953018896810274817",
* "businessKey":"10002",
* "variables": [{
* "name":"internal_app_env_key",
* "value":"env_test"
* },{
* "name":"url",
* "value":"http://10.0.0.125:3000/index"
* }
* ]
* }
* @return
*/
public WorkflowBaseResponse<WorkflowCreateResponse> createWorkflow(String userEmail, String userName, String userOrgId, String modelId, String businessKey, String url) throws Exception {
String token = this.getToken(userEmail, userName, userOrgId);
String modelIdValue = modelId != null ? modelId : "1953018896810274817";
String businessKeyValue = businessKey != null ? businessKey : "10002";
WorkflowVariable var1 = WorkflowVariable.builder().name("internal_app_env_key").value("env_test").build();
WorkflowVariable var2 = WorkflowVariable.builder()
.name("url")
.value(url).build();
WorkflowCreateRequest createWorkflow = WorkflowCreateRequest.builder()
.modelId(modelIdValue)
.businessKey(businessKeyValue)
.variables(new WorkflowVariable[]{var1, var2})
.build();
WorkflowBaseResponse<WorkflowCreateResponse> response = workFlowClient.createWorkflow(token, createWorkflow);
log.info("发起流程响应: {}", response);
return response;
}
}

View File

@ -139,6 +139,12 @@ spring:
accountSid: 8aaf070857f4daef0157fe76a1220724
authToken: fb5198e122fc4d1e9344525e5288029d
appId: 8aaf070857f4daef0157fe76a316072b
# 流程中心
workflow:
url: http://59.110.10.99:59999/
secret_key: 7t8qC8XYRh3AANfhP9Pqjeu5AHZRv19G
client_id: zhongyuan-haiyun
mybatis-plus:
@ -224,3 +230,15 @@ management:
cors:
allowed-origins: "*"
allowed-methods: "*"
check:
porject:
name-value: 33333
num-value: 33333
length: 2000
checkBoolen: false
tokentime:
timeLimit: 5000
onof: 0
checkprivateKey : MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAk7N3OeQS9WJa/v5dX/s9/DCKpJ8kOjR1Zrh1X+TF98udqGbGBWmiyVk2SqGPA4Q9kUCWw46CocjE047gx5AFrQIDAQABAkAIHG/stvCvlxImNLPOBI8X3VaPycmEhML5vCF9/aM9g1SuFa298Q5W8FqAmm8SE5lRpw2yyToWtLbufJtAa7wFAiEAxViJBkLU4wfPCwiPiAn17owXbocC9rj3fAzEH9DYDdcCIQC/mZp4ujO035Qqw2QQeFWpDc/vITx1OTWaxq6/LvvwGwIgXTZLSmzItw9aKOD7QotJ4UnES41zxetp4er5u/leA3MCIGcRw2ZEjII1b+hdOdweT75kfsId9/77apm7Xc/c/4yXAiEAnBrCiVXRNN+slO0MYaxynr4eIiPG/EjYBYxXlwBpeOc=
checkpublicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJOzdznkEvViWv7+XV/7PfwwiqSfJDo0dWa4dV/kxffLnahmxgVposlZNkqhjwOEPZFAlsOOgqHIxNOO4MeQBa0CAwEAAQ==