constants.ts
5.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// REQ-USR-001 / REQ-USR-002: 用户单据页合同级常量(枚举/默认/正则/错误码/文案 + 提交映射纯函数)
import type {
UserCreateReq,
UserUpdateReq,
UserVO,
UserDetailMode,
} from '../../../api/types';
// === mode 常量(由路由 :id 判定) ===
export const MODE_CREATE: UserDetailMode = 'create';
export const MODE_EDIT: UserDetailMode = 'edit';
// === 枚举(逐字一致,原样作为提交值,前端不映射,由后端裁决) ===
/** 用户类型枚举,create 默认「普通用户」(BR6) */
export const USER_TYPE_OPTIONS = ['普通用户', '超级管理员'] as const;
/** 语言枚举(BR7,无默认强制选,create 必选) */
export const LANGUAGE_OPTIONS = ['中文', '英文', '繁体'] as const;
/**
* 受控表单值(spec § 6;`tCreateDate`/`sCreator` 只读展示态另存,不在提交值内)。
*/
export interface UserFormValues {
sUserName: string;
sUserNo: string;
iEmployeeId: number | null;
sUserType: string;
sLanguage: string | undefined;
iCanModifyBill: 0 | 1;
iIsVoid?: 0 | 1;
}
/** create 默认表单值(BR1/BR2/BR6/BR8;sLanguage 未选触发必填校验 BR7) */
export const CREATE_DEFAULTS: UserFormValues = {
sUserName: '',
sUserNo: '',
iEmployeeId: null,
sUserType: '普通用户',
sLanguage: undefined,
iCanModifyBill: 0,
iIsVoid: 0,
};
/** 用户名前置校验正则(3-20 位字母数字下划线,BR3,对齐 docs/05 § REQ-USR-001) */
export const USERNAME_PATTERN = /^[A-Za-z0-9_]{3,20}$/;
// === 错误码常量(对齐 docs/05 § REQ-USR-001 / § REQ-USR-002 / spec § 4) ===
/** 参数校验失败 */
export const ERR_VALIDATION = 40001;
/** 用户名已存在(仅 create) */
export const ERR_USERNAME_EXISTS = 40901;
/** 用户不存在(仅 edit) */
export const ERR_USER_NOT_FOUND = 40401;
/** 无权限 */
export const ERR_NO_PERMISSION = 40301;
// === 静态文案(逐字一致,复刻原型 / spec) ===
export const TEXT_SAVE = '保存';
export const TEXT_CANCEL = '取消';
export const TEXT_NEW = '新增';
export const TEXT_DELETE = '删除';
export const TEXT_VOID = '作废';
export const TEXT_RESET_PWD = '重置密码';
export const TEXT_UNVOID = '取消作废';
export const TEXT_FUNC = '功能';
export const TEXT_CREATOR_PLACEHOLDER = '保存后自动生成';
export const LABEL_CREATE_TIME = '创建时间';
export const LABEL_CREATOR = '制单人';
export const LABEL_EMPLOYEE = '员工名';
export const LABEL_USERNAME = '用户名';
export const LABEL_USER_TYPE = '类型';
export const LABEL_LANGUAGE = '语言';
export const LABEL_USER_NO = '用户号';
export const LABEL_CAN_MODIFY_BILL = '单据修改权限';
export const TAB_PERM_GROUP = '权限组';
/** 5 个占位查看权限页签(D9) */
export const PLACEHOLDER_TABS = [
'客户查看权限',
'供应商查看权限',
'人员查看权限',
'工序查看权限',
'司机查看权限',
] as const;
export const PERM_LIST_HEADER = '权限分类';
// 校验提示
export const MSG_USERNAME_FORMAT = '用户名须为 3-20 位字母数字下划线';
export const MSG_USERNAME_REQUIRED = '请输入用户名';
export const MSG_USERNO_REQUIRED = '请输入用户号';
export const MSG_USERTYPE_REQUIRED = '请选择类型';
export const MSG_LANGUAGE_REQUIRED = '请选择语言';
// 成功 / 错误反馈
export const MSG_CREATE_SUCCESS = '用户创建成功';
export const MSG_EDIT_SUCCESS = '保存成功';
export const MSG_ERR_VALIDATION = '提交信息有误,请检查后重试';
export const MSG_ERR_USERNAME_EXISTS = '用户名已存在,请更换';
export const MSG_ERR_USER_NOT_FOUND = '该用户不存在或已被删除';
export const MSG_ERR_NO_PERMISSION = '无权限执行此操作';
export const MSG_ERR_NETWORK = '保存失败,请稍后重试';
export const MSG_ERR_LOAD_EMPLOYEES = '员工列表加载失败';
export const MSG_ERR_LOAD_PERMISSIONS = '权限列表加载失败';
export const MSG_LOAD_DETAIL_FAIL = '加载失败,点击重试';
export const TEXT_RETRY = '点击重试';
export const MSG_CANCEL_CONFIRM = '放弃未保存的修改?';
export const MSG_FUNC_PLACEHOLDER = '功能开发中';
export const TEXT_BACK_TO_LIST = '返回列表';
// 路由 path(FE-02 已注册占位)
export const PATH_USER_LIST = '/usr/users';
export const PATH_USER_NEW = '/usr/users/new';
// === 提交映射纯函数(跨 task 一致,便于单测) ===
/** 表单值 + 勾选权限 → UserCreateReq(无密码,BR9) */
export function toCreateReq(values: UserFormValues, permissionIds: number[]): UserCreateReq {
return {
sUserName: values.sUserName,
sUserNo: values.sUserNo,
iEmployeeId: values.iEmployeeId,
sUserType: values.sUserType,
sLanguage: values.sLanguage ?? '',
iCanModifyBill: values.iCanModifyBill,
permissionIds,
};
}
/** 表单值 + 勾选权限 → UserUpdateReq(不含 sUserName,BR3;permissionIds 全量覆盖,BR11) */
export function toUpdateReq(values: UserFormValues, permissionIds: number[]): UserUpdateReq {
return {
sUserNo: values.sUserNo,
iEmployeeId: values.iEmployeeId,
sUserType: values.sUserType,
sLanguage: values.sLanguage ?? '',
iCanModifyBill: values.iCanModifyBill,
iIsVoid: values.iIsVoid ?? 0,
permissionIds,
};
}
/**
* edit 回填(BR17)。`UserVO`(FE-03 列表 VO)不暴露 `iCanModifyBill`,
* 故该字段默认 0;其余基本字段按原值回填。
*/
export function userVoToFormValues(vo: UserVO): UserFormValues {
return {
sUserName: vo.sUserName,
sUserNo: vo.sUserNo ?? '',
iEmployeeId: null,
sUserType: vo.sUserType,
sLanguage: vo.sLanguage,
iCanModifyBill: 0,
iIsVoid: (vo.iIsVoid === 1 ? 1 : 0) as 0 | 1,
};
}