From 29031de724078edef617ef7bb6014c9796233282 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 30 Sep 2026 23:37:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(ehrm):=20=E5=91=98=E5=B7=A5=E6=A1=A3?= =?UTF-8?q?=E6=A1=88=E4=B8=80=E4=BA=BA=E4=B8=80=E4=BB=BD=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=B8=8E=E6=94=B9=E7=BB=91=E5=9D=87=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=BB=BA=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EmployeeProfile 与员工一一对应:add_record 解析出 UserUUID 后先查重(前端在已有档案时已隐藏新增入口,这里兜住直接调接口/并发提交);modify_record 改绑到已有档案的员工时同样拦截(排除当前档案自身),避免编辑换员工绕过约束。 --- gvsds/apps/gerp/form_service.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/gvsds/apps/gerp/form_service.py b/gvsds/apps/gerp/form_service.py index ecc03406..b71ec1b9 100644 --- a/gvsds/apps/gerp/form_service.py +++ b/gvsds/apps/gerp/form_service.py @@ -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 删列,职务复用公司员工关系子表), # 编辑时若提交了该字段则整体重写子表(未提交保持不动)