refactor: 统一项目中状态字段类型为数字类型

这是一个大规模的类型对齐优化:
1.  将多处字符串类型的status字段统一改为数字类型,包括前后端接口定义、数据模型、页面组件
2.  重构编排节点相关的命名和注释,统一改为"节点类型"替代"编排节点类型"
3.  移除了过时的忘记密码相关接口和模板代码
4.  优化搜索栏组件,支持展开仅显示次要字段
5.  调整部分接口参数和路由逻辑,对齐前后端参数格式
This commit is contained in:
zhangtao
2026-06-23 00:30:40 +08:00
parent 134337b502
commit 414d5c80c3
95 changed files with 561 additions and 883 deletions
@@ -192,7 +192,7 @@
</ElLink>
·
<ElLink href="#page-nodetype" type="primary" underline="never">
编排节点类型
节点类型
</ElLink>
</div>
</li>
@@ -921,7 +921,7 @@ const MANUAL_TOC: ManualModule[] = [
{ anchor: "page-cronjob", title: "调度器监控" },
{ anchor: "page-cronnode", title: "节点管理" },
{ anchor: "page-workflow", title: "流程编排" },
{ anchor: "page-nodetype", title: "编排节点类型" },
{ anchor: "page-nodetype", title: "节点类型" },
],
},
{
@@ -214,7 +214,7 @@ export const MANUAL_MODULES_AFTER_SYSTEM: ManualModuleSection[] = [
},
{
anchor: "page-nodetype",
title: "编排节点类型",
title: "节点类型",
path: "module_task/workflow/node-type/index.vue",
notes: [
"检索:FaSearchBar(可展开)。",
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -196,36 +197,6 @@ const memorySearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "创建时间",
key: "created_at",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
{
label: "更新时间",
key: "updated_at",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const dataFormRef = ref<InstanceType<typeof FaForm> | null>(null);
@@ -13,7 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:include-audit="true"
include-audit
@search="handleSearch"
@reset="onResetSearch"
/>
@@ -12,7 +12,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -833,6 +833,20 @@ const gencodeSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
options: [
{ label: "未生成", value: 0 },
{ label: "已生成", value: 1 },
],
clearable: true,
},
span: 6,
},
]);
const {
@@ -14,7 +14,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handleConfigSearch"
@reset="onConfigResetSearch"
/>
@@ -68,7 +68,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handleTemplateSearch"
@reset="onTemplateResetSearch"
/>
@@ -122,7 +122,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleLogSearch"
@reset="onLogResetSearch"
/>
@@ -317,6 +318,20 @@ const configSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
options: [
{ label: "启用", value: 0 },
{ label: "停用", value: 1 },
],
clearable: true,
},
span: 6,
},
]);
const configTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -443,6 +458,20 @@ const templateSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
options: [
{ label: "启用", value: 0 },
{ label: "停用", value: 1 },
],
clearable: true,
},
span: 6,
},
]);
const templateTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -553,6 +582,21 @@ const logSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
options: [
{ label: "待发送", value: 0 },
{ label: "成功", value: 1 },
{ label: "失败", value: 2 },
],
clearable: true,
},
span: 6,
},
]);
const {
@@ -15,7 +15,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handlePlatformSearch"
@reset="handlePlatformReset"
/>
@@ -165,6 +165,36 @@ const platformSearchItems = computed<SearchFormItem[]>(() => [
],
},
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
{
label: "更新时间",
key: "updated_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const platformSearchBarRef = ref();
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -470,21 +471,6 @@ const menuSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const tableRef = ref<{
@@ -15,7 +15,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handleOrderSearch"
@reset="handleOrderReset"
/>
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -12,6 +12,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -335,21 +336,6 @@ const tenantSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -414,7 +414,7 @@ const validateRegisterConfirm = (_rule: unknown, value: string, callback: (e?: E
callback();
};
const registerRules = computed<FormRules<RegisterForm>>(() => ({
const registerRules = computed<FormRules<RegisterForm & { email: string }>>(() => ({
username: [{ required: true, message: t("login.message.username.required"), trigger: "blur" }],
password: [
{ required: true, validator: validateRegisterPassword, trigger: "blur" },
@@ -425,6 +425,14 @@ const registerRules = computed<FormRules<RegisterForm>>(() => ({
{ min: 6, message: t("login.message.password.min"), trigger: "blur" },
{ validator: validateRegisterConfirm, trigger: "blur" },
],
email: [
{ required: true, message: t("login.email.required"), trigger: "blur" },
{
type: "email",
message: t("login.email.invalid"),
trigger: "blur",
},
],
}));
const validateForgetConfirm = (_rule: unknown, value: string, callback: (e?: Error) => void) => {
@@ -13,6 +13,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -240,21 +242,6 @@ const deptSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const tableRef = ref<{
@@ -13,6 +13,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -164,6 +166,7 @@ type DictTypeSearchForm = {
dict_type?: string;
status?: number;
created_time?: string[];
updated_time?: string[];
};
const dictStore = useDictStore();
@@ -174,6 +177,7 @@ const searchForm = ref<DictTypeSearchForm>({
dict_type: undefined,
status: undefined,
created_time: undefined,
updated_time: undefined,
});
const showSearchBar = ref(true);
@@ -213,21 +217,6 @@ const dictTypeSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -15,18 +15,11 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleOpSearch"
@reset="onOpResetSearch"
>
<template #created_id>
<FaUserTableSelect
:model-value="opSearchForm.created_id == null ? undefined : opSearchForm.created_id"
@update:model-value="(v: number | undefined) => (opSearchForm.created_id = v)"
@confirm-click="afterOpUserSelectSearch"
@clear-click="afterOpUserSelectSearch"
/>
</template>
</FaSearchBar>
/>
<ElCard
shadow="hover"
@@ -126,7 +119,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleLoginSearch"
@reset="onLoginResetSearch"
/>
@@ -255,22 +249,6 @@ const opSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{ label: "创建人", key: "created_id", type: "input", span: 6 },
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
function buildOpReplaceParams(p: OpSearchForm): Record<string, unknown> {
@@ -398,17 +376,6 @@ async function handleOpSearch(params: OpSearchForm) {
opGetData();
}
async function applyOpSearchFromForm() {
await opSearchBarRef.value?.validate?.();
opReplaceSearchParams(buildOpReplaceParams(opSearchForm.value));
opGetData();
}
async function afterOpUserSelectSearch() {
await nextTick();
await applyOpSearchFromForm();
}
function onOpResetSearch() {
opSearchForm.value = { request_path: undefined, created_id: undefined, created_time: undefined };
void opResetSearchParams();
@@ -486,9 +453,9 @@ async function handleOpBatchDelete() {
// ==================== 登录日志 ====================
type LoginSearchForm = { username?: string; status?: number };
type LoginSearchForm = { username?: string; status?: number; created_time?: string[] };
const loginSearchForm = ref<LoginSearchForm>({ username: undefined, status: undefined });
const loginSearchForm = ref<LoginSearchForm>({ username: undefined, status: undefined, created_time: undefined });
const loginShowSearchBar = ref(true);
const loginSearchBarRef = ref<InstanceType<typeof FaSearchBar> | null>(null);
const loginSearchBarRules: Record<string, unknown> = {};
@@ -514,6 +481,21 @@ const loginSearchItems = computed<SearchFormItem[]>(() => [
props: { placeholder: "请选择状态", options: loginStatusOptions.value, clearable: true },
span: 6,
},
{
label: "登录时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
function buildLoginReplaceParams(p: LoginSearchForm): Record<string, unknown> {
@@ -523,6 +505,8 @@ function buildLoginReplaceParams(p: LoginSearchForm): Record<string, unknown> {
p.status !== undefined && p.status !== null && p.status !== ("" as unknown as number)
? Number(p.status)
: undefined,
created_time:
Array.isArray(p.created_time) && p.created_time.length === 2 ? p.created_time : undefined,
};
}
@@ -614,7 +598,7 @@ async function handleLoginSearch(params: LoginSearchForm) {
}
function onLoginResetSearch() {
loginSearchForm.value = { username: undefined, status: undefined };
loginSearchForm.value = { username: undefined, status: undefined, created_time: undefined };
void loginResetSearchParams();
}
@@ -13,6 +13,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
>
@@ -257,27 +259,6 @@ const noticeSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
{
label: "创建人",
key: "created_id",
type: "input",
span: 6,
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -13,6 +13,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -212,19 +214,18 @@ const paramSearchItems = computed<SearchFormItem[]>(() => [
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
label: "状态",
key: "status",
type: "select",
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
placeholder: "请选择状态",
options: [
{ label: "启用", value: 0 },
{ label: "停用", value: 1 },
],
clearable: true,
},
span: 6,
},
]);
@@ -13,18 +13,11 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
>
<template #created_id>
<FaUserTableSelect
:model-value="searchForm.created_id == null ? undefined : searchForm.created_id"
@update:model-value="(v: number | undefined) => (searchForm.created_id = v)"
@confirm-click="afterUserSelectSearch"
@clear-click="afterUserSelectSearch"
/>
</template>
</FaSearchBar>
/>
<ElCard
shadow="hover"
@@ -330,27 +323,6 @@ const positionSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
{
label: "创建人",
key: "created_id",
type: "input",
span: 6,
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -596,17 +568,6 @@ async function handleSearchBarSearch(params: PositionSearchForm) {
getData();
}
async function applyPositionSearchFromForm() {
await searchBarRef.value?.validate?.();
replaceSearchParams(buildPositionReplaceParams(searchForm.value));
getData();
}
async function afterUserSelectSearch() {
await nextTick();
await applyPositionSearchFromForm();
}
function onResetSearch() {
searchForm.value = {
name: undefined,
@@ -13,6 +13,8 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -339,21 +341,6 @@ const roleSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -13,26 +13,11 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
>
<template #created_id>
<FaUserTableSelect
:model-value="searchForm.created_id == null ? undefined : searchForm.created_id"
@update:model-value="(v: number | undefined) => (searchForm.created_id = v)"
@confirm-click="afterUserSelectSearch"
@clear-click="afterUserSelectSearch"
/>
</template>
<template #assigned_id>
<FaUserTableSelect
:model-value="searchForm.assigned_id == null ? undefined : searchForm.assigned_id"
@update:model-value="(v: number | undefined) => (searchForm.assigned_id = v)"
@confirm-click="afterUserSelectSearch"
@clear-click="afterUserSelectSearch"
/>
</template>
</FaSearchBar>
/>
<ElCard
shadow="hover"
@@ -325,27 +310,6 @@ const ticketSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
{
label: "创建人",
key: "created_id",
type: "input",
span: 6,
},
{
label: "处理人",
key: "assigned_id",
@@ -656,17 +620,6 @@ async function handleSearchBarSearch(params: TicketSearchForm) {
getData();
}
async function applyTicketSearchFromForm() {
await searchBarRef.value?.validate?.();
replaceSearchParams(buildTicketReplaceParams(searchForm.value));
getData();
}
async function afterUserSelectSearch() {
await nextTick();
await applyTicketSearchFromForm();
}
function onResetSearch() {
searchForm.value = {
title: undefined,
@@ -32,18 +32,11 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
:audit-item-options="{ showTenantId: true }"
@search="handleSearchBarSearch"
@reset="onResetSearch"
>
<template #created_id>
<FaUserTableSelect
:model-value="searchForm.created_id == null ? undefined : searchForm.created_id"
@update:model-value="(v: number | undefined) => (searchForm.created_id = v)"
@confirm-click="afterUserSelectSearch"
@clear-click="afterUserSelectSearch"
/>
</template>
</FaSearchBar>
/>
<ElCard
shadow="hover"
@@ -514,27 +507,6 @@ const userSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "创建人",
key: "created_id",
type: "input",
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -552,7 +524,7 @@ async function handleResetPassword(row: UserInfo) {
ElMessage.warning("密码至少需要6位字符,请重新输入");
return;
}
await UserAPI.resetUserPassword({ id: row.id!, password: value });
await UserAPI.resetUserPassword(row.id!, { password: value });
} catch {
// 用户取消
}
@@ -789,17 +761,6 @@ async function handleSearchBarSearch(params: UserSearchForm) {
await getData();
}
async function applyUserSearchFromForm() {
await searchBarRef.value?.validate?.();
replaceSearchParams(buildUserReplaceParams(searchForm.value));
await getData();
}
async function afterUserSelectSearch() {
await nextTick();
await applyUserSearchFromForm();
}
function onResetSearch() {
searchForm.value = {
username: undefined,
@@ -917,7 +878,7 @@ async function handleSubmit() {
const id = formData.value.id;
try {
if (id) {
await UserAPI.updateUser(id, { id, ...formData.value });
await UserAPI.updateUser(id, formData.value);
await refreshUpdate();
} else {
await UserAPI.createUser(formData.value);
@@ -13,9 +13,9 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
@search="handleJobSearchBarSearch"
@reset="onJobResetSearch"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
<ElCard
@@ -65,7 +65,7 @@
v-hasPerm="['module_task:cronjob:job:scheduler']"
type="success"
icon="VideoPlay"
:disabled="schedulerStatus.status !== '停止'"
:disabled="schedulerStatus.status !== 0"
size="small"
@click="handleStartScheduler"
>
@@ -75,7 +75,7 @@
v-hasPerm="['module_task:cronjob:job:scheduler']"
type="warning"
icon="VideoPause"
:disabled="schedulerStatus.status !== '运行中'"
:disabled="schedulerStatus.status !== 1"
size="small"
@click="handlePauseScheduler"
>
@@ -85,7 +85,7 @@
v-hasPerm="['module_task:cronjob:job:scheduler']"
type="primary"
icon="RefreshRight"
:disabled="schedulerStatus.status !== '暂停'"
:disabled="schedulerStatus.status !== 2"
size="small"
@click="handleResumeScheduler"
>
@@ -95,7 +95,7 @@
v-hasPerm="['module_task:cronjob:job:scheduler']"
type="danger"
icon="SwitchButton"
:disabled="schedulerStatus.status === '停止'"
:disabled="schedulerStatus.status === 0"
size="small"
@click="handleShutdownScheduler"
>
@@ -350,7 +350,7 @@ import { computed, nextTick, onMounted, ref } from "vue";
import { Terminal, TerminalApi } from "vue-web-terminal";
const schedulerStatus = ref<SchedulerStatus>({
status: "未知",
status: 0,
is_running: false,
job_count: 0,
});
@@ -386,9 +386,9 @@ const jobSearchItems = computed<SearchFormItem[]>(() => [
placeholder: "请选择状态",
clearable: true,
options: [
{ label: "运行中", value: "运行中" },
{ label: "暂停", value: "暂停" },
{ label: "停止", value: "停止" },
{ label: "运行中", value: 0 },
{ label: "暂停", value: 1 },
{ label: "停止", value: 2 },
],
},
span: 6,
@@ -410,17 +410,16 @@ const jobLoading = ref(false);
/** 主区域为卡片列表无表格列配置,仅占位满足 FaTableHeader v-model */
const jobColumnChecks = ref<ColumnOption<SchedulerJob>[]>([]);
function matchesJobStatusFilter(jobStatus: string | undefined, filter?: string): boolean {
if (!filter) return true;
const map: Record<string, string[]> = {
运行中: ["运行中"],
暂停: ["暂停", "暂停中"],
停止: ["停止", "已停止"],
function matchesJobStatusFilter(jobStatus: number | undefined, filter?: number): boolean {
if (filter === undefined) return true;
const map: Record<number, number[]> = {
0: [0], // 运行中
1: [1], // 暂停
2: [2], // 停止
};
const aliases = map[filter];
if (!aliases) return true;
const s = jobStatus ?? "";
return aliases.some((a) => s === a || s.includes(a));
const allowed = map[filter];
if (!allowed) return true;
return allowed.includes(jobStatus ?? -1);
}
async function fetchSchedulerJobs() {
@@ -433,7 +432,7 @@ async function fetchSchedulerJobs() {
const statusQ = searchForm.value.status;
jobList.value = list.filter((j) => {
if (nameQ && !(j.name ?? "").includes(nameQ)) return false;
if (!matchesJobStatusFilter(j.status.toString(), statusQ?.toString())) return false;
if (!matchesJobStatusFilter(j.status, statusQ)) return false;
return true;
});
await loadSchedulerStatus();
@@ -447,12 +446,12 @@ async function fetchSchedulerJobs() {
const refreshJobList = fetchSchedulerJobs;
async function handleJobSearchBarSearch() {
async function handleSearchBarSearch() {
await searchBarRef.value?.validate?.();
await fetchSchedulerJobs();
}
async function onJobResetSearch() {
async function onResetSearch() {
searchForm.value = {
name: undefined,
status: undefined,
@@ -725,13 +724,13 @@ const executionLogDrawerVisible = ref(false);
const jobStateVisible = ref(false);
const jobStateData = ref<any>(null);
function getSchedulerStatusType(status: string) {
function getSchedulerStatusType(status: number) {
switch (status) {
case "运行中":
case 1:
return "success";
case "暂停":
case 2:
return "warning";
case "停止":
case 0:
return "danger";
default:
return "info";
@@ -13,7 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
:button-left-limit="0"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -343,6 +343,20 @@ const nodeSearchItems = computed<SearchFormItem[]>(() => [
clearable: true,
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
options: [
{ label: "启用", value: 0 },
{ label: "停用", value: 1 },
],
clearable: true,
},
span: 6,
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -55,7 +56,7 @@
<template #workflow-operation="{ row }">
<ElSpace class="flex">
<ElButton
v-if="row.status === 'draft'"
v-if="row.status === 0"
v-hasPerm="['module_task:workflow:definition:update']"
type="success"
size="small"
@@ -66,7 +67,7 @@
发布
</ElButton>
<ElDropdown
v-if="row.status === 'published'"
v-if="row.status === 1"
v-hasPerm="['module_task:workflow:definition:execute']"
@command="(e: string) => handleExecute(e, row)"
>
@@ -180,9 +181,9 @@ const workflowSearchItems = computed<SearchFormItem[]>(() => [
placeholder: "请选择状态",
clearable: true,
options: [
{ label: "草稿", value: "draft" },
{ label: "已发布", value: "published" },
{ label: "已归档", value: "archived" },
{ label: "草稿", value: 0 },
{ label: "已发布", value: 1 },
{ label: "已归档", value: 2 },
],
},
span: 6,
@@ -285,9 +286,9 @@ const {
minWidth: 100,
align: "center",
status: {
draft: { type: "info", text: "草稿" },
published: { type: "success", text: "已发布" },
archived: { type: "warning", text: "已归档" },
0: { type: "info", text: "草稿" },
1: { type: "success", text: "已发布" },
2: { type: "warning", text: "已归档" },
},
},
{
@@ -392,7 +393,7 @@ async function handleExecute(action: string, record: WorkflowTable) {
});
if (res.data?.data) {
const result = res.data.data;
ElMessage.success(`工作流执行${result.status === "completed" ? "成功" : "失败"}`);
ElMessage.success(`工作流执行${result.status === 0 ? "成功" : "失败"}`);
}
await refreshUpdate();
} catch {
@@ -13,6 +13,7 @@
:show-search="true"
:disabled-search="false"
:default-expanded="false"
include-audit
@search="handleSearchBarSearch"
@reset="onResetSearch"
/>
@@ -197,7 +198,7 @@ import type { EditorConfiguration } from "codemirror";
import "codemirror/mode/python/python.js";
import "codemirror/theme/dracula.css";
const BATCH_DELETE_MSG = "确认删除选中的编排节点类型吗?";
const BATCH_DELETE_MSG = "确认删除选中的节点类型吗?";
type NodeTypeSearchForm = {
name?: string;
@@ -256,6 +257,35 @@ const nodeTypeSearchItems = computed<SearchFormItem[]>(() => [
},
span: 6,
},
{
label: "状态",
key: "status",
type: "select",
props: {
placeholder: "请选择状态",
clearable: true,
options: [
{ label: "启用", value: 0 },
{ label: "停用", value: 1 },
],
},
span: 6,
},
{
label: "创建时间",
key: "created_time",
type: "datetimerange",
span: 6,
props: {
type: "datetimerange",
rangeSeparator: "至",
startPlaceholder: "开始日期",
endPlaceholder: "结束日期",
format: "YYYY-MM-DD HH:mm:ss",
valueFormat: "YYYY-MM-DD HH:mm:ss",
style: { width: "100%" },
},
},
]);
const faTableRef = ref<{ elTableRef?: { clearSelection: () => void } } | null>(null);