/** * 定义域管理端接口(后端 `FormAdminController`,/api/form/admin/*,CAS 会话 + 定义管理模块行把关)。 * * 写法沿 T5 定稿的 P49:`alovaInstance.Get(url, {params})` / `Post(url, body, {params})`—— * 同一个 Method 对象、同一套拦截器与信封解包(Notice 的 `new Method` 在 alova 3.5 类型下不合法)。 * * 两条参数分工照后端原样,别自己发挥: * - `uuid` 寻址表单(库内 id 从不外露,契约 §1/V5); * - `schId` 只是**超管的目标域**选择(含 0=平台级),校级管理员传别的值直接被 FormAdminGuard 拒; * 本端默认不传(会话校),只有超管切平台级上下文时才显式带。 * publish/disable/enable/softDelete 的 uuid 走 query(后端是 @RequestParam,没有请求体)。 */ import { alovaInstance } from "@/utils/alova/alova-iview"; import type { FormConfigRequest, FormCopyRequest, FormCreateRequest, FormSaveRequest, FormView, StatusDefsRequest, VersionView } from "@/types/form"; const BASE = "/api/form/admin"; /** 目标域参数:只在超管显式选择上下文时带(undefined 一律剔除,避免 query 里出现空值) */ type Scope = { schId?: number }; function paramsOf(params: Record): Record { const out: Record = {}; for (const [k, v] of Object.entries(params)) { if (v === undefined || v === null || v === "") continue; out[k] = v; } return out; } class FormApi { /** 表单列表(头表 + 版本指针,不含 schema 正文;无服务端分页,一期按校量级够用) */ list(scope: Scope = {}, filter: { appCode?: string; status?: number } = {}) { return alovaInstance.Get(`${BASE}/list`, { params: paramsOf({ ...scope, ...filter }) }); } /** 单个表单头表(状态/版本指针/表单级配置/状态定义都在这里,schema 正文要另查版本行) */ get(uuid: string, scope: Scope = {}) { return alovaInstance.Get(`${BASE}/get`, { params: paramsOf({ ...scope, uuid }) }); } /** 版本行清单(升版流水账:version/published/changeLog/publishTime) */ versions(uuid: string, scope: Scope = {}) { return alovaInstance.Get(`${BASE}/versions`, { params: paramsOf({ ...scope, uuid }) }); } /** 单个版本行的 schema 正文(编辑回显;已发布行内容逐字节冻结,V7) */ version(uuid: string, version: number, scope: Scope = {}) { return alovaInstance.Get(`${BASE}/version`, { params: paramsOf({ ...scope, uuid, version }) }); } /** 筛选候选列:只出显式 searchable 且当前发布版本里的字段,附件两类已被后端排除(P28) */ filterFields(uuid: string, scope: Scope = {}) { return alovaInstance.Get(`${BASE}/filterFields`, { params: paramsOf({ ...scope, uuid }) }); } /** 新建草稿(建草稿即生成 uuid,跨版本不变;version 从 1 起) */ create(body: FormCreateRequest, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/create`, body, { params: paramsOf({ ...scope }) }); } /** 保存:草稿直改;已发布表单=开草稿行,头表 status/current_version 不动(V7、P20) */ save(body: FormSaveRequest, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/save`, body, { params: paramsOf({ ...scope }) }); } /** 发布:schema 契约校验 + 字段身份稳定 + 字典可解析,三道都过才把草稿行钉成版本并推指针 */ publish(uuid: string, changeLog?: string, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/publish`, {}, { params: paramsOf({ ...scope, uuid, changeLog }) }); } /** 停用:只断填报入口,数据可读可导(方案 §5.4) */ disable(uuid: string, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/disable`, {}, { params: paramsOf({ ...scope, uuid }) }); } /** 停用恢复:重新发布当前版本,不产生新版本行 */ enable(uuid: string, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/enable`, {}, { params: paramsOf({ ...scope, uuid }) }); } /** 软删(唯一删除形态,无物理删除接口) */ softDelete(uuid: string, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/softDelete`, {}, { params: paramsOf({ ...scope, uuid }) }); } /** 另存为副本(V41):新 code/新 uuid/version 从 1 起/schema 深拷贝,源表单零改动 */ copy(body: FormCopyRequest, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/copy`, body, { params: paramsOf({ ...scope }) }); } /** 表单级配置(不进版本快照,改它不升版):audience/限次/截止/报名号/分组标签 */ config(body: FormConfigRequest, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/config`, body, { params: paramsOf({ ...scope }) }); } /** 状态定义(V12):statusDefs 传 null=回默认「待处理/已处理」 */ statusDefs(body: StatusDefsRequest, scope: Scope = {}) { return alovaInstance.Post(`${BASE}/statusDefs`, body, { params: paramsOf({ ...scope }) }); } } export const formApi = new FormApi();