build / build (push) Successful in 1m55s
NOTIFY(2026-09-23):编辑器抄送卡片+抽屉+画布 bpmn:ServiceTask 映射、工作台「抄送我的」页签、轨迹 kind=CC 行、示意图青框卡片 CONDITION(2026-09-24):ConditionBox 互斥分支容器(分支列出口名就地编辑、无 JOIN 语义分支尾隐式汇合)、ConditionDrawer 判断服务下拉(flw_router)、convert 双向序列化(CONDITION+命名出边、uid+c 尾缀往返收敛)、validate 镜像后端口径、画布 bpmn:ExclusiveGateway 映射、轨迹「系统判断→出口」行(失败挂起提示)、示意图紫菱形(SVG 与服务端 PNG 同配色)、管理面 flw_router 维护页(/admin/routers)与办件记录「重跑路由」入口 convert 往返 54 项全过、npm run build 通过
243 lines
9.3 KiB
TypeScript
243 lines
9.3 KiB
TypeScript
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);
|
||
}
|
||
/** 我的抄送(NOTIFY 节点落库;知会不占待办,独立页签) */
|
||
ccMy(params: { page?: number; size?: number }) {
|
||
return get(`${ROOT}/cc/my`, 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);
|
||
}
|
||
|
||
// ==================== 管理面:条件路由注册 / 重跑 ====================
|
||
|
||
/** 判断服务注册列表(flw_router 全局表;编辑器下拉与管理页共用) */
|
||
routerList() {
|
||
return get(`${ROOT}/admin/router/list`);
|
||
}
|
||
routerSave(body: {
|
||
id?: number;
|
||
routerKey: string;
|
||
name: string;
|
||
serviceKey: string;
|
||
path: string;
|
||
basePath?: string;
|
||
}) {
|
||
return post(`${ROOT}/admin/router/save`, body);
|
||
}
|
||
/** 启用/停用注册(停用后发布校验拦截新引用) */
|
||
routerStatus(id: number | string, enabled: boolean) {
|
||
return post(`${ROOT}/admin/router/status/${id}?enabled=${enabled}`);
|
||
}
|
||
/** 重跑路由(判断失败挂起的恢复入口:重新调判断,成功即按出口续走) */
|
||
instanceReroute(instanceId: number | string) {
|
||
return post(`${ROOT}/admin/instance/${instanceId}/reroute`);
|
||
}
|
||
|
||
// ==================== 管理面:办件查询 ====================
|
||
adminInstances(params: { status?: number; keyword?: string; page?: number; size?: number }) {
|
||
return get(`${ROOT}/admin/instance/page`, params);
|
||
}
|
||
}
|
||
|
||
export const flowApi = new FlowApi();
|