Files
flow-center-front/src/api/module/flow.ts
T
chenxing cdf04f0930
build / build (push) Successful in 3m17s
feat(ui): 应用页规范全量重构 + 工作台与流程轨迹优化
应用页规范(bsch)重构:
- 6 个列表页迁规范骨架: page-wrapper/tabs-wrapper + search-wrap 搜索区(关键字 200px 即输即搜, 去查询按钮) + link-table table-bottom-box 定高表格 + page-panel 分页栏
- 分页列表统一接 TablePageAlovaNew(页长 [10,20,30,40]/customPageCount 记忆/增删智能翻页); dataApi 须返回 Method, 调 .send() 会导致表格静默空数据
- 操作列统一图标式 operatingHandle(Tooltip+fixed right 居中); 各列表补序号列; 危险操作统一 MyConfirm 二次确认
- 弹窗表单必填红星 + 统一提示「请填写红色星号内容!」
- TablePageAlovaNew 补页长记忆与重载后清空勾选; 新增 src/types OperatorEnum

工作台与流程轨迹优化:
- 已办列表去重: 每办件一行, doneCount>1 显示「共办理 N 次」标签
- 新增 TraceTimeline 轨迹时间流(时间升序/kind/轮次, 按人员/科室切换写回 URL), 接入详情/办理页
- 新增流程源码只读抽屉 SourceDrawer, 接入定义列表与图示页
- 办理人映射/流程定义新增「启用」回路(/admin/map/enable, /admin/def/enable)
- 图示视图口径统一 dept/user 两档, 缺省人员视图; 状态列 Tag 色映射统一导出
2026-09-18 16:52:40 +08:00

214 lines
8.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Method } from "alova";
import { alovaInstance } from "@/utils/alova/alova-iview";
/**
* 流程中心用户面/管理面接口(/api/flow/**)。
* 响应 {code,msg,data} 由 alova 实例统一解包(code!=0 抛错提示)。
*/
const ROOT = "/api/flow";
function get<T = any>(url: string, params?: Record<string, any>): Method<T> {
return new Method<T>("GET", alovaInstance, url, { params });
}
// alova 的请求体是 Method 构造的第 5 个参数(instance.data),不是 config 上的键:
// 写进 config 的 body/data 都会被适配器忽略,POST 将发出空 body。
function post<T = any>(url: string, body?: any): Method<T> {
return new Method<T>("POST", alovaInstance, url, {}, body);
}
/** 状态枚举(后端 FlwEnums 口径) */
export const INSTANCE_STATUS: Record<number, string> = {
10: "审批中",
20: "已完成",
30: "已拒绝",
40: "已撤回",
};
/** 状态列 Tag 主题色(与 INSTANCE_STATUS 同码表,缺省灰) */
export const INSTANCE_STATUS_COLOR: Record<number, string> = {
10: "blue",
20: "green",
30: "red",
40: "gray",
};
export const TASK_STATUS: Record<number, string> = {
0: "待办",
1: "同意",
2: "拒绝",
3: "失效",
4: "退回",
5: "移交",
// 6/7 为轨迹留痕事件行(发起/重新提交、撤回),不是审批动作
6: "提交",
7: "撤回",
};
/** 任务结果 Tag 主题色(同 TASK_STATUS 码表,缺省灰) */
export const TASK_STATUS_COLOR: Record<number, string> = {
0: "blue",
1: "green",
2: "red",
3: "default",
4: "orange",
5: "cyan",
6: "green",
7: "orange",
};
class FlowApi {
// ==================== 用户面 ====================
/** 我的待办 */
todo(params: { page?: number; size?: number }) {
return get(`${ROOT}/todo`, params);
}
/** 我的已办 */
done(params: { page?: number; size?: number }) {
return get(`${ROOT}/done`, params);
}
/** 我提交的办件 */
my(params: { status?: number; page?: number; size?: number }) {
return get(`${ROOT}/my`, params);
}
/** 办件详情(提交人/办理人/本校管理员可见) */
detail(instanceId: number | string) {
return get(`${ROOT}/instance/${instanceId}`);
}
/** 任务定位办件详情(办理页 /task/:taskId 数据源) */
taskDetail(taskId: number | string) {
return get(`${ROOT}/task/${taskId}/detail`);
}
/** 同意(多出口节点必须传 edgeName=所选出口名,单出口可省) */
approve(taskId: number | string, opinion?: string, edgeName?: string) {
return post(`${ROOT}/task/${taskId}/approve`, { opinion: opinion || null, edgeName: edgeName || null });
}
/** 退回(targetNodeId 可选=缺省最近已办主线节点;opinion 可选) */
returnBack(taskId: number | string, targetNodeId?: string, opinion?: string) {
return post(`${ROOT}/task/${taskId}/returnBack`, { targetNodeId: targetNodeId || null, opinion: opinion || null });
}
/** 移交(toUserId 必填;reason 可选) */
transfer(taskId: number | string, toUserId: number, reason?: string) {
return post(`${ROOT}/task/${taskId}/transfer`, { toUserId, reason: reason || null });
}
/** 拒绝(opinion 必填) */
reject(taskId: number | string, opinion: string) {
return post(`${ROOT}/task/${taskId}/reject`, { opinion });
}
/** 撤回(提交人;仅尚无任务被办理时) */
withdraw(instanceId: number | string) {
return post(`${ROOT}/instance/${instanceId}/withdraw`);
}
/** 催办(提交人/管理员) */
urge(instanceId: number | string) {
return post(`${ROOT}/instance/${instanceId}/urge`);
}
// ==================== 用户面:流程示意图 ====================
/** 流程示意图(flowGuid=最高已发布版;instanceId=办件 def 快照版;mode=dept|user,缺省 user) */
diagram(params: { flowGuid?: string; instanceId?: number | string; mode?: string }) {
return get(`${ROOT}/diagram`, params);
}
/** 流程源码(图示页「源码」抽屉;可见性同 /diagram) */
defSource(params: { flowGuid?: string; instanceId?: number | string }) {
return get(`${ROOT}/def/source`, params);
}
// ==================== 管理面:流程定义 ====================
defList() {
return get(`${ROOT}/admin/def/list`);
}
defGet(id: number | string) {
return get(`${ROOT}/admin/def/get`, { id });
}
defSave(body: { id?: number; code: string; name: string; contentJson: string; baseGuid?: string }) {
return post(`${ROOT}/admin/def/save`, body);
}
defPublish(id: number | string) {
return post(`${ROOT}/admin/def/publish/${id}`);
}
defOffline(id: number | string) {
return post(`${ROOT}/admin/def/offline/${id}`);
}
/** 启用(与 defOffline 对称:仅停用版 → 已发布,重跑发布期静态校验) */
defEnable(id: number | string) {
return post(`${ROOT}/admin/def/enable/${id}`);
}
defVersions(flowGuid: string) {
return get(`${ROOT}/admin/def/versions`, { flowGuid });
}
/** 流程定义示意图(管理面:defId 任意版本,草稿可预览) */
adminDefDiagram(params: { id: number | string; mode?: string }) {
return get(`${ROOT}/admin/def/diagram`, params);
}
// ==================== 管理面:办理人映射 ====================
mapList(deptKey?: string) {
return get(`${ROOT}/admin/map/list`, deptKey ? { deptKey } : undefined);
}
mapSave(body: { deptKey: string; deptName?: string; userId: number; userName?: string }) {
return post(`${ROOT}/admin/map/save`, body);
}
mapDisable(id: number | string) {
return post(`${ROOT}/admin/map/disable/${id}`);
}
/** 启用映射(停用行的恢复入口;DEPT_KEY 解析只取启用行) */
mapEnable(id: number | string) {
return post(`${ROOT}/admin/map/enable/${id}`);
}
mapLookupUser(userId: number) {
return get(`${ROOT}/admin/map/lookupUser`, { userId });
}
/** 选人组件数据源:学校组树(组→组内用户叶子) */
adminUserTree() {
return get(`${ROOT}/admin/user/tree`);
}
/** 选人组件数据源·教师版(仿 Notice:组树骨架 + YschClassOpenApi 教师按 GroupIds 挂组) */
adminTeacherTree() {
return get(`${ROOT}/admin/user/teacherTree`);
}
/** 一键拉取教师组·预览(学校子树教师组容器 → 科室+组内成员) */
mapGroupPreview() {
return get(`${ROOT}/admin/map/groupPreview`);
}
/** 一键拉取教师组·导入(批量落映射,已存在跳过) */
mapImportGroups() {
return post(`${ROOT}/admin/map/importGroups`);
}
// ==================== 管理面:回调注册/日志/死信 ====================
regList() {
return get(`${ROOT}/admin/callback/regList`);
}
regStatus(id: number | string, enabled: boolean) {
return post(`${ROOT}/admin/callback/regStatus/${id}?enabled=${enabled}`);
}
regResetSecret(id: number | string) {
return post(`${ROOT}/admin/callback/resetSecret/${id}`);
}
callbackLogs(params: { status?: number; event?: string; instanceId?: number; page?: number; size?: number }) {
return get(`${ROOT}/admin/callback/logs`, params);
}
callbackDead(params: { page?: number; size?: number }) {
return get(`${ROOT}/admin/callback/dead`, params);
}
/** 挂起列表(待推且重试达阈值) */
callbackHung(params: { page?: number; size?: number }) {
return get(`${ROOT}/admin/callback/hung`, params);
}
/** 手工标记死信(标记后可 repush 复活) */
callbackMarkDead(id: number | string) {
return post(`${ROOT}/admin/callback/markDead/${id}`);
}
callbackRepush(ids: number[]) {
return post(`${ROOT}/admin/callback/repush`, ids);
}
// ==================== 管理面:办件查询 ====================
adminInstances(params: { status?: number; keyword?: string; page?: number; size?: number }) {
return get(`${ROOT}/admin/instance/page`, params);
}
}
export const flowApi = new FlowApi();