feat(ehrm): 员工档案一人一份,新增与改绑均拦截重复建档

EmployeeProfile 与员工一一对应:add_record 解析出 UserUUID 后先查重(前端在已有档案时已隐藏新增入口,这里兜住直接调接口/并发提交);modify_record 改绑到已有档案的员工时同样拦截(排除当前档案自身),避免编辑换员工绕过约束。
This commit is contained in:
TermiNexus committed 2026-09-30 23:38:01 +08:00
1 parent 90c7c3403a
commit 29031de724
1 file changed
+13
+13
View File
@@ -1770,6 +1770,12 @@ class FormService(FormServiceBase):
elif not create_data.get('UserUUID'):
return {'error': '请选择「部门员工关联」(员工档案须绑定一条部门员工关联)',
'field': 'UserRoleDepartmentUUID'}
# 一人一份:员工档案与员工一一对应(前端在已有档案时隐藏新增,
# 这里兜住直接调接口/并发提交的情况,避免同一员工出现多份档案)
_ep_user = create_data.get('UserUUID')
if _ep_user and model.objects.filter(UserUUID=_ep_user).exists():
return {'error': '该员工已存在档案(员工档案只能填写一份),请直接编辑现有档案',
'field': 'Table'}
# CompanyInfo 唯一性:同一租户仅一条企业信息(epcreate 是"完善本企业"向导,
# 防重复提交产生多条;修改走租户详情编辑)
if table_name == 'CompanyInfo' and self.current_tenant_uuid:
@@ -2023,6 +2029,13 @@ class FormService(FormServiceBase):
return {'error': _de_err, 'field': 'UserRoleDepartmentUUID'}
if _de_updates:
data = {**data, **_de_updates}
# 一人一份:改绑到「已有档案」的员工时同样拦截(排除当前档案自身),
# 否则编辑时换员工就能绕过新增侧的唯一性约束
_ep_user = _to_uuid_bytes(data.get('UserUUID'))
if (_ep_user and _ep_user != _to_uuid_bytes(getattr(obj, 'UserUUID', None))
and model.objects.filter(UserUUID=_ep_user).exists()):
return {'error': '该员工已存在档案(员工档案只能填写一份),请直接编辑其现有档案',
'field': 'UserRoleDepartmentUUID'}
# UserRoleDepartment / UserRoleWorkgroup 职务多值化(身兼数职):PositionUUID 不在主表
# 字段(部门 0034 删列;工作组 0043 删列,职务复用公司员工关系子表),
# 编辑时若提交了该字段则整体重写子表(未提交保持不动)