diff --git a/apps/hrm/migrations/0009_alter_clockrecord_exception_type.py b/apps/hrm/migrations/0009_alter_clockrecord_exception_type.py new file mode 100644 index 00000000..92c58c87 --- /dev/null +++ b/apps/hrm/migrations/0009_alter_clockrecord_exception_type.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2023-03-14 10:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hrm', '0008_clockrecord_exception_type'), + ] + + operations = [ + migrations.AlterField( + model_name='clockrecord', + name='exception_type', + field=models.PositiveSmallIntegerField(blank=True, choices=[(10, '在岗时间短'), (20, '在岗时间长'), (30, '缺卡'), (40, '加班')], null=True, verbose_name='异常类型'), + ), + ] diff --git a/apps/hrm/models.py b/apps/hrm/models.py index dd4ad618..11ef8ba5 100755 --- a/apps/hrm/models.py +++ b/apps/hrm/models.py @@ -85,9 +85,13 @@ class ClockRecord(BaseModel): ) E_TYPE_LESS = 10 E_TYPE_MORE = 20 + E_TYPE_MISS = 30 + E_TYPE_ADD = 40 E_TYPE_CHOISE = ( (E_TYPE_LESS, '在岗时间短'), - (E_TYPE_MORE, '在岗时间长') + (E_TYPE_MORE, '在岗时间长'), + (E_TYPE_MISS, '缺卡'), + (E_TYPE_ADD, '加班') ) type = models.PositiveSmallIntegerField('打卡类型', choices=type_choice, default=ClOCK_ON) employee = models.ForeignKey(Employee, verbose_name='对应人员', on_delete=models.CASCADE) diff --git a/apps/hrm/services.py b/apps/hrm/services.py index 0c1a2ccb..3e551956 100755 --- a/apps/hrm/services.py +++ b/apps/hrm/services.py @@ -276,6 +276,7 @@ class HrmService: cr_20 = ClockRecord.objects.filter( type=20, employee=ep, create_time__gte=first_time, create_time__lte=end_time).first() if cr_20: + cr_20.exception_type = None if s_time_f > cr_20.create_time: cr_20.create_time = s_time_f cr_20.trigger = 'door' @@ -293,21 +294,28 @@ class HrmService: ep.last_check_time = s_time_f ep.save() # 判断是否有异常 - # 找到最近的上班时间 - cr_e = ClockRecord.objects.filter(create_time__lte=cr_20.create_time, type=10, employee=ep).order_by('-create_time').first() + # 找到最近的打卡时间 + cr_e = ClockRecord.objects.filter(create_time__lte=cr_20.create_time, employee=ep).order_by('-create_time').first() if cr_e: time_d = cr_20.create_time - cr_e.create_time - if time_d < timedelta(hours=7): - cr_20.exception_type = ClockRecord.E_TYPE_LESS - cr_20.save() - elif time_d > timedelta(hours=14): - cr_20.exception_type = ClockRecord.E_TYPE_MORE - cr_20.save() + if cr_e.type == 10: + if time_d < timedelta(hours=7): + cr_20.exception_type = ClockRecord.E_TYPE_LESS + cr_20.save() + elif time_d > timedelta(hours=14): + cr_20.exception_type = ClockRecord.E_TYPE_MORE + cr_20.save() + elif time_d > timedelta(hours=9): + cr_20.exception_type = ClockRecord.E_TYPE_ADD + cr_20.save() + elif cr_e.type == 20: + cr_20.exception_type = ClockRecord.E_TYPE_MISS + cr_20.save() elif e_type == 3: # 如果不确定根据时间来 card_type = None time_10_x = datetime(year=s_time_f.year, month=s_time_f.month, - day=s_time_f.day, hour=4, minute=0, second=0, tzinfo=tzinfo) + day=s_time_f.day, hour=3, minute=0, second=0, tzinfo=tzinfo) time_10_y = datetime(year=s_time_f.year, month=s_time_f.month, day=s_time_f.day, hour=11, minute=0, second=0, tzinfo=tzinfo) time_20_x = datetime(year=s_time_f.year, month=s_time_f.month, @@ -346,6 +354,7 @@ class HrmService: cr_20 = ClockRecord.objects.filter( type=20, employee=ep, create_time__gte=first_time, create_time__lte=end_time).first() if cr_20: + cr_20.exception_type = None if s_time_f > cr_20.create_time: cr_20.create_time = s_time_f cr_20.trigger = 'panel' @@ -363,16 +372,23 @@ class HrmService: ep.last_check_time = s_time_f ep.save() # 判断是否有异常 - # 找到最近的上班时间 - cr_e = ClockRecord.objects.filter(create_time__lte=cr_20.create_time, type=10, employee=ep).order_by('-create_time').first() + # 找到最近的打卡时间 + cr_e = ClockRecord.objects.filter(create_time__lte=cr_20.create_time, employee=ep).order_by('-create_time').first() if cr_e: time_d = cr_20.create_time - cr_e.create_time - if time_d < timedelta(hours=7): - cr_20.exception_type = ClockRecord.E_TYPE_LESS - cr_20.save() - elif time_d > timedelta(hours=14): - cr_20.exception_type = ClockRecord.E_TYPE_MORE - cr_20.save() + if cr_e.type == 10: + if time_d < timedelta(hours=7): + cr_20.exception_type = ClockRecord.E_TYPE_LESS + cr_20.save() + elif time_d > timedelta(hours=14): + cr_20.exception_type = ClockRecord.E_TYPE_MORE + cr_20.save() + elif time_d > timedelta(hours=9): + cr_20.exception_type = ClockRecord.E_TYPE_ADD + cr_20.save() + elif cr_e.type == 20: + cr_20.exception_type = ClockRecord.E_TYPE_MISS + cr_20.save() # 进行相关方/访客项目更新 Visit.objects.filter(state=Visit.V_ENTER, visitors__employee__id_number=id_number).update(