diff --git a/src/App.vue b/src/App.vue index 04e8130..d64d16e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -82,6 +82,7 @@ async function applySiteThemeRecommend() { {{ userName }} diff --git a/src/api/module/approvalAdapter.ts b/src/api/module/approvalAdapter.ts new file mode 100644 index 0000000..eaffeaa --- /dev/null +++ b/src/api/module/approvalAdapter.ts @@ -0,0 +1,28 @@ +import type { FlowApprovalApi } from "@/components/flow-approval/types"; +import { approvalApi, applyApi } from "@/api/module/svc"; + +/** + * svc-hall 应用内审批适配器(唯一映射位置;沿 Notice approvalAdapter 形态)。 + * + * 纪律: + * - 身份三字段(operatorId/operatorName/schId)不出现——后端从 CAS 会话取; + * - 写面 bizId=applyId 是必需上下文(后端写面双闸),组件契约层已强制携带; + * - trace 复用既有 /api/apply/{id}/progress(卡片不自取轨迹,宿主转换后经 props 传入); + * - alova Method 是 thenable,组件 await 即发。 + */ +export const svcFlowApprovalApi: FlowApprovalApi = { + todo: (p) => approvalApi.todo(p?.page ?? 1, p?.size ?? 10).send(), + my: (p) => + approvalApi + .my(p?.page ?? 1, p?.size ?? 10, p?.flowStatus ?? null) + .send(), + byBiz: (bizId) => approvalApi.byBiz(Number(bizId)).send(), + trace: (bizId) => applyApi.progress(Number(bizId)).send(), + approve: (taskId, opinion, edgeName, bizId) => + approvalApi.approve(taskId, Number(bizId), opinion, edgeName).send(), + reject: (taskId, opinion, bizId) => approvalApi.reject(taskId, Number(bizId), opinion).send(), + recordUrl: (bizId) => approvalApi.recordUrl(Number(bizId)).send(), + taskPageUrl: (bizId, taskId) => approvalApi.taskPageUrl(Number(bizId), taskId).send(), +}; + +export default svcFlowApprovalApi; diff --git a/src/api/module/svc.ts b/src/api/module/svc.ts index 31fa8c4..3118422 100644 --- a/src/api/module/svc.ts +++ b/src/api/module/svc.ts @@ -22,6 +22,7 @@ import type { const HALL = "/api/hall"; const APPLY = "/api/apply"; const FILE = "/api/file"; +const APPROVAL = "/api/apply/approval"; function get(url: string, params?: Record): Method { return new Method("GET", alovaInstance, url, { params }); @@ -125,6 +126,41 @@ class FileApi { } } +class ApprovalApi { + /** 应用内审批代理(P3.1,/api/apply/approval/**;身份全部由后端从 CAS 会话取,前端不传) */ + /** 待我审批(中心 todo;双值双查与合并都在后端) */ + todo(page?: number, size?: number) { + return get(`${APPROVAL}/Todo`, { page, size }); + } + /** 我提交的(本地办件;后端做 {total,list}→FlowPage 信封映射;flowStatus 空=全部) */ + my(page?: number, size?: number, flowStatus?: number | null) { + return get(`${APPROVAL}/My`, { page, size, flowStatus: flowStatus ?? undefined }); + } + /** 当前人在该办件上的待办(0/1/N 均 200;卡片/列表复核同源) */ + byBiz(applyId: number) { + return get(`${APPROVAL}/ByBiz`, { applyId }); + } + /** 通过:taskId/applyId 走查询参数(与中心端点同构),opinion/edgeName 走 JSON body */ + approve(taskId: number, applyId: number, opinion?: string, edgeName?: string) { + return postJSON(`${APPROVAL}/Approve?taskId=${encodeURIComponent(taskId)}&applyId=${encodeURIComponent(applyId)}`, + { opinion: opinion || undefined, edgeName: edgeName || undefined }); + } + /** 拒绝:opinion 必填(后端前置校验) */ + reject(taskId: number, applyId: number, opinion: string) { + return postJSON(`${APPROVAL}/Reject?taskId=${encodeURIComponent(taskId)}&applyId=${encodeURIComponent(applyId)}`, + { opinion }); + } + /** 审批记录抽屉地址(token 只读页,instanceId 形态换址) */ + recordUrl(applyId: number) { + return get(`${APPROVAL}/RecordUrl`, { applyId }); + } + /** 完整办理任务页地址(先 byBiz 归属预检再签发,在后端) */ + taskPageUrl(applyId: number, taskId: number) { + return get(`${APPROVAL}/TaskPageUrl`, { applyId, taskId }); + } +} + export const hallApi = new HallApi(); export const applyApi = new ApplyApi(); export const fileApi = new FileApi(); +export const approvalApi = new ApprovalApi(); diff --git a/src/components/flow-approval/FlowApprovalCard.vue b/src/components/flow-approval/FlowApprovalCard.vue new file mode 100644 index 0000000..d7552fe --- /dev/null +++ b/src/components/flow-approval/FlowApprovalCard.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/src/components/flow-approval/FlowApprovalList.vue b/src/components/flow-approval/FlowApprovalList.vue new file mode 100644 index 0000000..8e839e4 --- /dev/null +++ b/src/components/flow-approval/FlowApprovalList.vue @@ -0,0 +1,412 @@ + + + + + diff --git a/src/components/flow-approval/FlowRecordDrawer.vue b/src/components/flow-approval/FlowRecordDrawer.vue new file mode 100644 index 0000000..d20c152 --- /dev/null +++ b/src/components/flow-approval/FlowRecordDrawer.vue @@ -0,0 +1,130 @@ +