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/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 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)