From a82405e45135928ece4eee1a7a942b6dcea41373 Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Tue, 31 Mar 2026 11:08:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E5=85=89=E8=8A=AF?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/views.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/apps/hrm/views.py b/apps/hrm/views.py index e59ae130..8f59772e 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -387,20 +387,39 @@ class EmployeeViewSet(CustomModelViewSet): if not re.match(r'^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$', data['id_number']): raise ParseError(f'第{row_num}行,身份证号格式不正确') - # 查找或更新 + # 查找或创建/补全 try: with transaction.atomic(): - obj, created = Employee.objects.update_or_create( - id_number=id_number, - name=name, - defaults=data - ) + # 优先按身份证号匹配,匹配不到再按姓名匹配 + existing = None + if id_number: + existing = Employee.objects.filter(id_number=id_number).first() + if not existing and name: + existing = Employee.objects.filter(name=name, id_number__isnull=True).first() or \ + Employee.objects.filter(name=name, id_number='').first() + if existing: + # 只用 Excel 非空值填补数据库中为空的字段 + updated_fields = [] + for field_name, value in data.items(): + if value in [None, '']: + continue + current_value = getattr(existing, field_name, None) + if current_value in [None, '']: + setattr(existing, field_name, value) + updated_fields.append(field_name) + if updated_fields: + existing.save(update_fields=updated_fields + ['update_time']) + myLogger.info(f"✅ 第{row_num}行补全成功:{name},更新字段:{updated_fields}") + else: + myLogger.info(f"⏭️ 第{row_num}行无需补全:{name}") + created = False + else: + Employee.objects.create(id_number=id_number, name=name, **data) + created = True except Exception as e: - raise + raise if created: myLogger.info(f"✅ 第{row_num}行新增成功:{name}") - else: - myLogger.info(f"✅ 第{row_num}行更新成功:{name}") success += 1