// 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, }; }