修复工作人员资质关联与角色过滤

按安装、配送、运维菜单显式过滤工作人员,锁定资质所有者并使用姓名和角色回显。

扩展工作人员状态与多角色查询,补充权限校验、回归测试、操作日志和项目文档。
This commit is contained in:
czl231
2026-08-11 19:15:53 +08:00
parent 4b1f045806
commit 74c5e34275
20 changed files with 976 additions and 100 deletions

View File

@@ -3,6 +3,7 @@
* 版本v1.1.0
*/
import dayjs from 'dayjs';
import { staffRoleLabel } from './resource-staff-relation';
import type { ResourceField, ResourceUiDefinition } from './resources';
import type { RecordPageMode, ResourceRow } from './resource-page-rules';
@@ -110,6 +111,14 @@ export function optionLabel(option: ResourceRow) {
);
}
/** 工作人员关系额外展示角色,其他关系保持原有可读名称。 */
export function relationOptionLabel(field: ResourceField, option: ResourceRow) {
const label = optionLabel(option);
return field.relation === '/staff_account'
? `${label}${staffRoleLabel(option.role_code)}`
: label;
}
function relationLabel(
field: ResourceField,
identity: string,
@@ -119,6 +128,9 @@ function relationLabel(
(option) => String(option.identity) === identity,
);
if (!match) return identity;
if (field.relation === '/staff_account') {
return relationOptionLabel(field, match);
}
return field.displayRelationLabel
? optionLabel(match)
: `${optionLabel(match)} · ${identity}`;
@@ -161,7 +173,10 @@ export function displayResourceField(
field: ResourceField,
row: ResourceRow,
relationOptions: Record<string, ResourceRow[]>,
fieldOptions: Record<string, Array<{ label: string; value: string | number }>> = {},
fieldOptions: Record<
string,
Array<{ label: string; value: string | number }>
> = {},
) {
const value = row[field.key] ?? row[`${field.key}_masked`];
if (value == null || value === '') return field.emptyText ?? '-';
@@ -169,9 +184,7 @@ export function displayResourceField(
Object.prototype.hasOwnProperty.call(fieldOptions, field.key) ||
Boolean(field.options);
const options = fieldOptions[field.key] ?? field.options;
const option = options?.find(
(item) => String(item.value) === String(value),
);
const option = options?.find((item) => String(item.value) === String(value));
if (option) return option.label;
if (hasOptionSource && field.unknownValueLabel) {
return `${field.unknownValueLabel}${String(value)}`;