From a82405e45135928ece4eee1a7a942b6dcea41373 Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Tue, 31 Mar 2026 11:08:12 +0800 Subject: [PATCH 1/2] =?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 From 159b6441263d4bd956d9a1592a5a56bf0eacff76 Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Tue, 7 Apr 2026 13:42:30 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=20hrm=20&=20rpm?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/services.py | 2 +- apps/rpm/serializers.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/hrm/services.py b/apps/hrm/services.py index a8c45a24..0276c102 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -39,7 +39,7 @@ class HrmService: Returns: _type_: _description_ """ - if not settings.DAHUA_ENABLED: # 如果大华没启用, 直接返回 + if not getattr(settings, 'DAHUA_ENABLED', False): # 如果大华没启用, 直接返回 return dh_id = ep.third_info.get('dh_id', None) dh_photo = ep.third_info.get('dh_photo', None) diff --git a/apps/rpm/serializers.py b/apps/rpm/serializers.py index 7bc92f40..48bdd298 100644 --- a/apps/rpm/serializers.py +++ b/apps/rpm/serializers.py @@ -148,7 +148,7 @@ class RemployeeCreateSerializer(CustomModelSerializer): if Remployee.objects.filter(id_number=validated_data['id_number'], rparty=validated_data['rparty']).exists(): raise ValidationError('该成员已存在') with transaction.atomic(): - if settings.DAHUA_ENABLED: + if getattr(settings, 'DAHUA_ENABLED', False): dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().create(validated_data) @@ -161,7 +161,7 @@ class RemployeeUpdateSerializer(CustomModelSerializer): def update(self, instance, validated_data): with transaction.atomic(): - if settings.DAHUA_ENABLED: + if getattr(settings, 'DAHUA_ENABLED', False): dhClient.request(**dhapis['person_img_upload'], file_path_rela=validated_data['photo']) return super().update(instance, validated_data)