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 删列,职务复用公司员工关系子表), # 编辑时若提交了该字段则整体重写子表(未提交保持不动)