feat: 增加考勤预测类型加班和缺卡并进行逻辑处理
This commit is contained in:
parent
5826e407f5
commit
717c43ca50
|
@ -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='异常类型'),
|
||||
),
|
||||
]
|
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue