1. 剔除掉多余的文档以及标记
This commit is contained in:
@@ -114,15 +114,21 @@ Controller 暴露的 REST 接口:
|
||||
|
||||
- IWorkUserInfoRespVO(解析用户响应)
|
||||
- `userId` (String):从 iWork 响应中解析出的用户编号(如果能解析到)。
|
||||
- `payload` / `rawBody`:原始返回信息。
|
||||
- `success` / `message`:调用成功标志与提示信息。
|
||||
|
||||
- IWorkWorkflowCreateReqVO(发起流程)
|
||||
- `requestName` (String):流程标题。
|
||||
- `workflowId` (Long):流程模板 ID(可选,缺省时使用配置的默认值)。
|
||||
- `mainFields` (`List<IWorkFormFieldVO>`):主表字段集合。
|
||||
- `detailTables` (`List<IWorkDetailTableVO>`):明细表集合(可选)。
|
||||
- `otherParams` / `formExtras`:额外参数,`formExtras` 会以 form-data 方式追加。
|
||||
- IWorkWorkflowCreateReqVO(统一用印流程发起)
|
||||
- `workflowId` (String):流程模板 ID,必填,不再回退到配置。
|
||||
- `jbr`:用印申请人(iWork 人员 ID,必填)。
|
||||
- `yybm`:用印部门 ID(必填)。
|
||||
- `fb`:用印单位/分部 ID(必填)。
|
||||
- `sqsj`:申请时间(yyyy-MM-dd,必填)。
|
||||
- `yyqx`:用印去向(必填)。
|
||||
- `yyfkUrl`:用印依据附件 URL(可选)。
|
||||
- `yysy`:用印事由或摘要(可选)。
|
||||
- `xyywjUrl`:用印材料附件 URL(必填)。
|
||||
- `yysx`:用印事项(必填)。
|
||||
- `ywxtdjbh`:业务系统单据编号(必填,同时用于生成流程标题“用印-{ywxtdjbh}”)。
|
||||
- 额外字段不再支持,Service 会根据以上字段自动补齐固定流程类型 (`lclx=2979600781334966993`) 与签署动作 (`qsdz=CORPORATE`)。
|
||||
|
||||
- IWorkWorkflowVoidReqVO(作废)
|
||||
- `requestId` (String):流程请求编号(必填)。
|
||||
@@ -147,57 +153,34 @@ Controller 暴露的 REST 接口:
|
||||
项目同时提供 `IWorkIntegrationService` Bean,可直接注入并调用:
|
||||
|
||||
```java
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkDetailRecordVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkDetailTableVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFormFieldVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOperationRespVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkWorkflowCreateReqVO;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkIntegrationService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
import java.util.List;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Component
|
||||
public class MyService {
|
||||
private final IWorkIntegrationService iworkService;
|
||||
|
||||
public void startFlow() {
|
||||
public void startSealFlow() {
|
||||
IWorkWorkflowCreateReqVO req = new IWorkWorkflowCreateReqVO();
|
||||
// 使用 application.yml 中配置的 app-id,无需额外指定
|
||||
req.setRequestName("测试-创建流程");
|
||||
// 若需要覆盖配置的默认流程,可显式设置 workflowId
|
||||
// req.setWorkflowId(54L);
|
||||
|
||||
// 主表字段
|
||||
IWorkFormFieldVO nameField = new IWorkFormFieldVO();
|
||||
nameField.setFieldName("name");
|
||||
nameField.setFieldValue("张三");
|
||||
|
||||
IWorkFormFieldVO amountField = new IWorkFormFieldVO();
|
||||
amountField.setFieldName("amount");
|
||||
amountField.setFieldValue("1000");
|
||||
req.setMainFields(List.of(nameField, amountField));
|
||||
|
||||
// 明细表(可选)
|
||||
IWorkFormFieldVO detailField = new IWorkFormFieldVO();
|
||||
detailField.setFieldName("itemName");
|
||||
detailField.setFieldValue("办公用品");
|
||||
|
||||
IWorkDetailRecordVO record = new IWorkDetailRecordVO();
|
||||
record.setRecordOrder(0);
|
||||
record.setFields(List.of(detailField));
|
||||
|
||||
IWorkDetailTableVO detailTable = new IWorkDetailTableVO();
|
||||
detailTable.setTableDBName("formtable_main_26_dt1");
|
||||
detailTable.setRecords(List.of(record));
|
||||
req.setDetailTables(List.of(detailTable));
|
||||
req.setWorkflowId("54");
|
||||
req.setJbr("1001");
|
||||
req.setYybm("2001");
|
||||
req.setFb("3001");
|
||||
req.setSqsj("2025-01-01");
|
||||
req.setYyqx("对外邮寄");
|
||||
req.setYyfkUrl("https://files.example.com/evidence.pdf");
|
||||
req.setYysy("与客户合同用印");
|
||||
req.setXyywjUrl("https://files.example.com/contract.pdf");
|
||||
req.setYysx("合同用印");
|
||||
req.setYwxtdjbh("DJ-2025-0001");
|
||||
|
||||
IWorkOperationRespVO resp = iworkService.createWorkflow(req);
|
||||
if (resp.isSuccess()) {
|
||||
// 处理成功,例如记录 requestId
|
||||
} else {
|
||||
// 日志或重试
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -245,13 +228,22 @@ curl -X POST \
|
||||
|
||||
```bash
|
||||
curl -X POST -H "Content-Type: application/json" -d '{
|
||||
"requestName":"测试REST创建流程",
|
||||
"workflowId":54,
|
||||
"mainFields":[{"fieldName":"name","fieldValue":"张三"}],
|
||||
"appId":"my-iwork-app"
|
||||
"workflowId":"54",
|
||||
"jbr":"1001",
|
||||
"yybm":"2001",
|
||||
"fb":"3001",
|
||||
"sqsj":"2025-01-01",
|
||||
"yyqx":"对外邮寄",
|
||||
"yyfkUrl":"https://files.example.com/evidence.pdf",
|
||||
"yysy":"与客户合同用印",
|
||||
"xyywjUrl":"https://files.example.com/contract.pdf",
|
||||
"yysx":"合同用印",
|
||||
"ywxtdjbh":"DJ-2025-0001"
|
||||
}' https://your-zt-server/admin-api/system/integration/iwork/workflow/create
|
||||
```
|
||||
|
||||
> 说明:外部仍以 JSON 请求调用本服务,系统在向 iWork 转发时会自动将负载转换为 `application/x-www-form-urlencoded` 表单(含 `requestName`、`workflowId`、`mainData` 等字段)。
|
||||
|
||||
1. Void workflow
|
||||
|
||||
```bash
|
||||
@@ -288,8 +280,9 @@ curl -X POST -H "Content-Type: application/json" -d '{
|
||||
|
||||
1. 请求构造
|
||||
|
||||
- JSON 请求使用 `application/json`,表单请求(如创建流程/作废)使用 `application/x-www-form-urlencoded`。
|
||||
- 认证 Header:由 `IWorkProperties.Headers` 中的常量控制,固定键名为 `app-id`、`client-public-key`、`secret`、`token`、`time`、`user-id`。
|
||||
- 用户解析、作废等场景继续以 `application/json` 调用 iWork。
|
||||
- 用印流程发起在转发至 iWork 时改为 `application/x-www-form-urlencoded` 表单,请求正文包含 `requestName`、`workflowId` 及字符串化后的 `mainData`,与 iWork 网关当前要求保持一致。
|
||||
- 认证 Header:由 `IWorkProperties.Headers` 中的常量控制,固定键名为 `app-id`、`client-public-key`、`secret`、`token`、`time`、`user-id`。
|
||||
|
||||
1. 响应解析
|
||||
|
||||
@@ -306,9 +299,9 @@ curl -X POST -H "Content-Type: application/json" -d '{
|
||||
- 场景:`app-id`、`client-public-key`、`user-id` 等关键字段没有配置或只包含空白字符。
|
||||
- 处理:在 `application.yml` 或配置中心中补充对应字段,确保它们与 iWork 侧一致。
|
||||
|
||||
- 流程编号缺失(IWORK_WORKFLOW_ID_MISSING)
|
||||
- 场景:请求体、凭证与全局配置均未提供流程模板编号。
|
||||
- 处理:在请求中指定 `workflowId`,或在配置中设置 `workflow-id` / 凭证级 `default-workflow-id`。
|
||||
- 用印必填字段缺失(IWORK_SEAL_REQUIRED_FIELD_MISSING)
|
||||
- 场景:`workflowId`、`jbr`、`yybm`、`fb`、`sqsj`、`yyqx`、`xyywjUrl`、`yysx`、`ywxtdjbh` 等任一字段为空。
|
||||
- 处理:根据返回的字段名称补齐相应值后重新发起。
|
||||
|
||||
- RSA 加密/注册/申请 token 失败(IWORK_REGISTER_FAILED / IWORK_APPLY_TOKEN_FAILED / IWORK_REMOTE_REQUEST_FAILED)
|
||||
- 处理:通过日志查看 iWork 返回的 HTTP 状态码与 body,确认请求头/路径/参数是否匹配 iWork 网关要求。
|
||||
|
||||
@@ -104,10 +104,15 @@ databus:
|
||||
nonce-ttl-seconds: 600
|
||||
require-body-encryption: true
|
||||
encrypt-response: true
|
||||
gateway:
|
||||
web-client:
|
||||
connection-pool-enabled: true # 默认启用 Reactor Netty 连接池,可在排查连接复用/长连接异常时设为 false
|
||||
```
|
||||
|
||||
> `GatewaySecurityFilter` 会自动注册到最高优先级 +10,确保该路径的请求先经过安全校验。
|
||||
|
||||
关闭连接池后,每次 HTTP Step 请求都会新建 TCP 连接,适合短期定位“连接被复用导致 Reset/超时”的场景,但会带来额外的握手开销;切换时可关注启动日志中的 `Databus gateway WebClient pooling` 提示。
|
||||
|
||||
## 8. 第三方调用流程详解
|
||||
|
||||
### 8.1 前置准备
|
||||
@@ -135,7 +140,7 @@ databus:
|
||||
|
||||
#### 签名字段示例
|
||||
|
||||
```
|
||||
```text
|
||||
appId=demo-app
|
||||
&body={"orderNo":"SO20251120001"}
|
||||
&nonce=0c5e2df9a1
|
||||
|
||||
Reference in New Issue
Block a user