feat: 增加考勤预测类型加班和缺卡并进行逻辑处理

This commit is contained in:
caoqianming 2023-03-14 18:20:47 +08:00
parent 5826e407f5
commit 717c43ca50
3 changed files with 56 additions and 18 deletions

View File

@ -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='异常类型'),
),
]

View File

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

View File

@ -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(