feat: 提交流程中心前端代码
build / build (push) Successful in 3m21s

Vue3 + Vite + view-ui-plus 前端源码,含流程工作台、实例详情、
任务处理、管理端(定义/实例/映射/回调)等页面。
保留远程 .gitea/workflows/build.yml CI 配置。
This commit is contained in:
chenxing
2026-09-15 10:42:45 +08:00
parent ca30ff12cc
commit 90db00cf16
328 changed files with 25868 additions and 2 deletions
+125
View File
@@ -0,0 +1,125 @@
<script setup lang="ts">
// 办理人映射管理(概览 §4.7/§六):DEPT_KEY → 办理人;成员检索经 UserBase /oapi/user/byId 补姓名
import { ref, onMounted } from "vue";
import { Message } from "view-ui-plus";
import { flowApi } from "@/api/module/flow";
const loading = ref(false);
const deptKeyFilter = ref("");
const rows = ref<any[]>([]);
const saveVisible = ref(false);
const saving = ref(false);
const form = ref<any>({ deptKey: "", deptName: "", userId: null, userName: "" });
const lookingUp = ref(false);
const columns = [
{ title: "科室编码", key: "deptKey", width: 140 },
{ title: "科室名称", key: "deptName", width: 160, render: (h: any, p: any) => h("span", p.row.deptName || "-") },
{ title: "办理人", key: "userName", width: 120 },
{ title: "用户ID", key: "userId", width: 90 },
{ title: "状态", width: 90, render: (h: any, p: any) => h("Tag", { color: p.row.status === 0 ? "green" : "gray" }, () => (p.row.status === 0 ? "启用" : "停用")) },
{ title: "操作", width: 100, render: (h: any, p: any) =>
p.row.status === 0
? h("Button", { size: "small", type: "warning", onClick: () => onDisable(p.row) }, () => "停用")
: h("span", "-") },
];
async function load() {
loading.value = true;
try {
rows.value = (await flowApi.mapList(deptKeyFilter.value || undefined).send()) || [];
} finally {
loading.value = false;
}
}
function onAdd() {
form.value = { deptKey: "", deptName: "", userId: null, userName: "" };
saveVisible.value = true;
}
async function onLookup() {
if (!form.value.userId) {
Message.warning("请先填用户ID");
return;
}
lookingUp.value = true;
try {
const u: any = await flowApi.mapLookupUser(form.value.userId).send();
form.value.userName = u?.name || "";
Message.success(`检索到用户:${u?.name || "-"}`);
} catch {
Message.error("UserBase 检索失败");
} finally {
lookingUp.value = false;
}
}
async function onSave() {
if (!form.value.deptKey.trim() || !form.value.userId) {
Message.warning("科室编码与用户ID必填");
return;
}
saving.value = true;
try {
await flowApi.mapSave({
deptKey: form.value.deptKey.trim(),
deptName: form.value.deptName,
userId: Number(form.value.userId),
userName: form.value.userName,
}).send();
Message.success("已保存");
saveVisible.value = false;
load();
} finally {
saving.value = false;
}
}
async function onDisable(row: any) {
await flowApi.mapDisable(row.id).send();
Message.success("已停用");
load();
}
onMounted(load);
</script>
<template>
<div class="page">
<div class="filter">
<Input v-model="deptKeyFilter" placeholder="按科室编码筛选" style="width: 200px" clearable @on-enter="load" />
<Button @click="load">查询</Button>
<Button type="primary" @click="onAdd">新增映射</Button>
</div>
<Table :columns="columns" :data="rows" :loading="loading" stripe />
<Modal v-model="saveVisible" title="新增/更新映射" :mask-closable="false">
<Form :label-width="90">
<FormItem label="科室编码">
<Input v-model="form.deptKey" placeholder="流程 JSON 中 DEPT_KEY 引用的编码,如 ybb" />
</FormItem>
<FormItem label="科室名称">
<Input v-model="form.deptName" placeholder="如 医保办(可空)" />
</FormItem>
<FormItem label="用户ID">
<Input v-model="form.userId" placeholder="UserBase 用户主键" />
</FormItem>
<FormItem label="姓名快照">
<Input v-model="form.userName" placeholder="可留空,点检索自动补全" style="width: 180px" />
<Button :loading="lookingUp" @click="onLookup" style="margin-left: 8px">检索</Button>
</FormItem>
</Form>
<template #footer>
<Button @click="saveVisible = false">取消</Button>
<Button type="primary" :loading="saving" @click="onSave">保存</Button>
</template>
</Modal>
</div>
</template>
<style scoped>
.page { padding: 12px 16px; }
.filter { margin-bottom: 10px; display: flex; gap: 8px; }
</style>