+23
-1
@@ -144,7 +144,29 @@ class FlowApi {
|
||||
defGet(id: number | string) {
|
||||
return get(`${ROOT}/admin/def/get`, { id });
|
||||
}
|
||||
defSave(body: { id?: number; code: string; name: string; contentJson: string; baseGuid?: string; appKey?: string; changeLog?: string }) {
|
||||
/**
|
||||
* 表单中心目录(v3/TASK_1):编辑器"关联表单"选择器的数据源。
|
||||
* 走本应用同源代理,浏览器不持 appKey/secret、也不出现 form-center 地址;
|
||||
* **没有 schId 入参**——管理域由后端从 CAS 会话派生,这是有意的,别"顺手加一个"。
|
||||
*/
|
||||
formCenterForms(params: { keyword?: string; page?: number; pageSize?: number } = {}) {
|
||||
return get<{ items: any[]; total: number }>(`${ROOT}/admin/form-center/forms`, params);
|
||||
}
|
||||
/**
|
||||
* 保存定义。`formUuid`/`formVersion`(v3)是**行字段**、不进 contentJson:
|
||||
* 成对提交(后端单传一个即拒);`formUuid=""`=取消关联并同时清空版本;不传=保持原关联。
|
||||
*/
|
||||
defSave(body: {
|
||||
id?: number;
|
||||
code: string;
|
||||
name: string;
|
||||
contentJson: string;
|
||||
baseGuid?: string;
|
||||
appKey?: string;
|
||||
changeLog?: string;
|
||||
formUuid?: string;
|
||||
formVersion?: number;
|
||||
}) {
|
||||
return post(`${ROOT}/admin/def/save`, body);
|
||||
}
|
||||
/** 元数据原地编辑(2026-10-10 议题2):只改 name/appKey 不升版本;已发布亦可 */
|
||||
|
||||
@@ -61,6 +61,15 @@ const sourceFlowGuid = ref("");
|
||||
const appKey = ref("");
|
||||
/** 应用清单下拉(应用设置白名单 flw_app enabled=1,显示应用名),拉取失败降级为仅当前值 */
|
||||
const appOptions = ref<{ appKey: string; appName: string }[]>([]);
|
||||
/**
|
||||
* 关联表单坐标(flw_def.form_uuid / form_version,v3/TASK_1):行字段、不进 contentJson。
|
||||
* 版本由选中时那一条目录行带出(中心当前发布版),不给手填——存的就是服务端核验过的坐标。
|
||||
*/
|
||||
const formUuid = ref("");
|
||||
const formVersion = ref<number | undefined>(undefined);
|
||||
/** 表单中心目录(同源代理);拉不到时选择器禁用并说明原因,不假装"这所学校没有表单" */
|
||||
const formOptions = ref<any[]>([]);
|
||||
const formCenterError = ref("");
|
||||
|
||||
const model = reactive<EditorModel>(createEmptyModel());
|
||||
/** 科室列表(deptList 聚合行):仅用于下拉选项与"无启用人员"提示 */
|
||||
@@ -249,6 +258,15 @@ async function load(): Promise<void> {
|
||||
} catch {
|
||||
appOptions.value = [];
|
||||
}
|
||||
// 表单中心目录:授权没配/中心不可达时选择器禁用并说明原因(空列表 ≠ "没有可用表单")
|
||||
try {
|
||||
const page: any = await flowApi.formCenterForms({ page: 1, pageSize: 100 }).send();
|
||||
formOptions.value = page?.items || [];
|
||||
formCenterError.value = "";
|
||||
} catch (e: any) {
|
||||
formOptions.value = [];
|
||||
formCenterError.value = String(e?.message || e || "表单中心目录不可达");
|
||||
}
|
||||
|
||||
const queryId = route.query.id ? Number(route.query.id) : null;
|
||||
const queryGuid = (route.query.baseGuid as string) || "";
|
||||
@@ -273,6 +291,8 @@ async function load(): Promise<void> {
|
||||
model.code = d?.code || "";
|
||||
model.name = d?.name || "";
|
||||
appKey.value = d?.appKey || "";
|
||||
formUuid.value = d?.formUuid || "";
|
||||
formVersion.value = d?.formVersion == null ? undefined : Number(d.formVersion);
|
||||
try {
|
||||
applyParsed(fromContentJson(JSON.parse(d?.contentJson || "{}")));
|
||||
} catch (e: any) {
|
||||
@@ -430,6 +450,16 @@ function onJsonApplied(p: ParsedDef): void {
|
||||
applyParsed(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* 选表=成对记下 uuid 与中心当时发布版;清空则两列一起清(后端要求成对,半个坐标存不下)。
|
||||
* 版本号一律取自目录行,页面不提供手填——填一个中心没有的版本,只会在发布期撞"坐标不符"。
|
||||
*/
|
||||
function onFormChange(uuid: string): void {
|
||||
const hit = uuid ? formOptions.value.find((f) => f.formUuid === uuid) : null;
|
||||
formUuid.value = hit ? hit.formUuid : "";
|
||||
formVersion.value = hit ? Number(hit.version) : undefined;
|
||||
}
|
||||
|
||||
async function onSave(): Promise<void> {
|
||||
if (!model.name.trim()) {
|
||||
Message.warning("请填写流程名称");
|
||||
@@ -445,6 +475,11 @@ async function onSave(): Promise<void> {
|
||||
Message.warning("请选择归属应用(应用需先在 流程管理 > 应用设置 中开启)");
|
||||
return;
|
||||
}
|
||||
// 关联表单必须成对:改造前只有关联、没有版本号的存量行,重新选一次才能保存(后端同样会拒)
|
||||
if (formUuid.value && !formVersion.value) {
|
||||
Message.warning("该流程关联的表单还没有确切版本号,请在「关联表单」里重新选择一次(版本由表单中心给出,不可手填)");
|
||||
return;
|
||||
}
|
||||
const errors = countErrors(issues.value);
|
||||
if (errors.length) {
|
||||
Message.error(`校验未通过:${errors[0].text}`);
|
||||
@@ -503,6 +538,9 @@ async function submitSave(changeLog?: string): Promise<void> {
|
||||
baseGuid: baseGuid.value || undefined,
|
||||
appKey: (appKey.value || "").trim() || undefined,
|
||||
changeLog: changeLog || undefined,
|
||||
// 关联表单成对提交:空串=显式取消关联(后端同时清空版本),有值=uuid + 中心当时发布版
|
||||
formUuid: formUuid.value,
|
||||
formVersion: formUuid.value ? formVersion.value : undefined,
|
||||
}).send();
|
||||
savedSnapshot.value = currentSnapshot.value;
|
||||
Message.success(willCreateVersion()
|
||||
@@ -617,6 +655,23 @@ onUnmounted(() => window.removeEventListener("beforeunload", onBeforeUnload));
|
||||
<Option v-for="a in appOptions" :key="a.appKey" :value="a.appKey">{{ a.appName }}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
<div class="ip-fld">
|
||||
<label>关联表单<span class="ip-mini">表单中心 · 成对存版本</span></label>
|
||||
<Select :value="formUuid" clearable filterable placeholder="不关联(原生办理)"
|
||||
:disabled="!!formCenterError" @on-change="onFormChange">
|
||||
<Option v-for="f in formOptions" :key="f.formUuid" :value="f.formUuid">
|
||||
{{ f.name }}({{ f.appCode }}/{{ f.code }} · v{{ f.version }})
|
||||
</Option>
|
||||
</Select>
|
||||
<div v-if="formCenterError" class="ip-mini" style="color: #ed4014">
|
||||
{{ formCenterError }}
|
||||
</div>
|
||||
<div v-else-if="formUuid && !formVersion" class="ip-mini" style="color: #ed4014">
|
||||
历史关联缺版本号,请重新选择表单后再保存
|
||||
</div>
|
||||
<div v-else-if="formUuid" class="ip-mini">已绑定 v{{ formVersion }}(发布时按这组坐标核验快照)</div>
|
||||
<div v-else class="ip-mini">目录只列中心已发布、且已授权给本应用的表单</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="ip-sec">
|
||||
|
||||
Reference in New Issue
Block a user