ソースを参照

fix(s0): align employee enums with legacy stored values

雇员列表三枚举口径改为对齐 EmployeeMaster 真实历史存储值(不改存储、未知值原样显示):
性别 0未知/1男/2女(对齐 GenderEnum,数据仅 0/1/2;原前端 0女1男 会误显 0 与漏 2);
在职状态 AC在职/DC离职(数据实为 AC/DC,无 0/1);婚姻 未婚/已婚/其他(中文串,无 0/1)。
列表 formatter 与编辑下拉同口径,未识别值原样显示不转换。
submit 加空枚举归一:空选择→null,防历史 NULL 被写成 ''(保 NULL 语义);
S0EmployeeUpsert 三枚举放宽 string|null。完整字段保值/部门·岗位·生产线·工作中心下拉未回归。

bump version Web 2.4.287
YY968XX 1 ヶ月 前
親
コミット
97247dad79

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 	"name": "admin.net",
 	"type": "module",
-	"version": "2.4.286",
+	"version": "2.4.287",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 3 - 3
Web/src/views/aidop/s0/api/s0WarehouseApi.ts

@@ -88,14 +88,14 @@ export interface S0EmployeeUpsert {
 	domainCode?: string;
 	employee: string;
 	name?: string;
-	sex?: string;
+	sex?: string | null;
 	phone?: string;
 	email?: string;
 	birthDate?: string | null;
 	department?: string;
 	dateEmployed?: string | null;
-	employmentStatus?: string;
-	maritalStatus?: string;
+	employmentStatus?: string | null;
+	maritalStatus?: string | null;
 	jobTitle?: string;
 	dateTerminated?: string | null;
 	workCtr?: string;

+ 11 - 6
Web/src/views/aidop/s0/warehouse/EmployeeList.vue

@@ -150,10 +150,11 @@ import { s0EmployeesApi, s0DepartmentsApi, type S0EmployeeRow, type S0EmployeeUp
 import { s0MfgProductionLinesApi, s0MfgWorkCentersApi } from '../api/s0ManufacturingApi';
 import { loadOrgList, type OrgOption } from '../api/s0SalesApi';
 
-// 字典口径(前端固定 0/1):性别 0女1男、在职 0在职1离职、婚姻 0未婚1已婚
-const SEX_OPTIONS = [{ value: '0', label: '女' }, { value: '1', label: '男' }];
-const EMPLOYMENT_OPTIONS = [{ value: '0', label: '在职' }, { value: '1', label: '离职' }];
-const MARITAL_OPTIONS = [{ value: '0', label: '未婚' }, { value: '1', label: '已婚' }];
+// 枚举口径对齐 EmployeeMaster 真实历史存储值(不改存储、未知值原样显示):
+// 性别 0未知/1男/2女(对齐 GenderEnum,数据仅 0/1/2);在职 AC在职/DC离职(数据无 0/1);婚姻 中文串 未婚/已婚/其他。
+const SEX_OPTIONS = [{ value: '0', label: '未知' }, { value: '1', label: '男' }, { value: '2', label: '女' }];
+const EMPLOYMENT_OPTIONS = [{ value: 'AC', label: '在职' }, { value: 'DC', label: '离职' }];
+const MARITAL_OPTIONS = [{ value: '未婚', label: '未婚' }, { value: '已婚', label: '已婚' }, { value: '其他', label: '其他' }];
 function sexLabel(v?: string | null): string { return SEX_OPTIONS.find((o) => o.value === v)?.label ?? (v ?? ''); }
 function employmentLabel(v?: string | null): string { return EMPLOYMENT_OPTIONS.find((o) => o.value === v)?.label ?? (v ?? ''); }
 
@@ -249,13 +250,17 @@ function openEdit(row: S0EmployeeRow) {
 	});
 	dialogVisible.value = true;
 }
+// 空枚举值归一为 null,避免下拉清空/未选择时把历史 NULL 写成 ''(保 NULL 语义)
+function enumOrNull(v?: string | null): string | null { return v == null || v === '' ? null : v; }
+
 async function submitForm() {
 	await formRef.value?.validate();
 	applyDefaultOrg();
 	saving.value = true;
 	try {
-		if (editingId.value) { await s0EmployeesApi.update(editingId.value, { ...form }); ElMessage.success('已保存'); }
-		else { await s0EmployeesApi.create({ ...form }); ElMessage.success('已创建'); }
+		const payload: S0EmployeeUpsert = { ...form, sex: enumOrNull(form.sex), employmentStatus: enumOrNull(form.employmentStatus), maritalStatus: enumOrNull(form.maritalStatus) };
+		if (editingId.value) { await s0EmployeesApi.update(editingId.value, payload); ElMessage.success('已保存'); }
+		else { await s0EmployeesApi.create(payload); ElMessage.success('已创建'); }
 		dialogVisible.value = false; await loadList();
 	} finally { saving.value = false; }
 }