feat: hrm中的attendance

This commit is contained in:
caoqianming 2023-11-20 18:47:36 +08:00
parent fddadfe30c
commit 6b81f2a394
6 changed files with 33 additions and 55 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 3.2.12 on 2023-11-17 09:00
# Generated by Django 3.2.12 on 2023-11-20 10:28
from django.conf import settings
from django.db import migrations, models
@ -9,8 +9,9 @@ import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('system', '0002_myschedule'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('mtm', '0024_auto_20231116_1416'),
('mtm', '0025_auto_20231120_1139'),
('hrm', '0016_clockrecord_clock_time'),
]
@ -26,14 +27,16 @@ class Migration(migrations.Migration):
('work_time_start', models.DateTimeField(verbose_name='工作开始时间')),
('work_time_end', models.DateTimeField(verbose_name='工作结束时间')),
('state', models.CharField(choices=[('pending', '待定'), ('normal', '正常'), ('late', '迟到'), ('early_leave', '早退'), ('absent', '未到岗'), ('leave', '请假')], default='pending', help_text="[('pending', '待定'), ('normal', '正常'), ('late', '迟到'), ('early_leave', '早退'), ('absent', '未到岗'), ('leave', '请假')]", max_length=20, verbose_name='状态')),
('note', models.TextField(default='', verbose_name='备注信息')),
('note', models.TextField(blank=True, default='', verbose_name='备注信息')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='attendance_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hrm.employee', verbose_name='关联人员')),
('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.post', verbose_name='岗位')),
('shift', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.shift', verbose_name='班次')),
('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='mtm.team', verbose_name='班组')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='attendance_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='关联人员')),
],
options={
'abstract': False,
'unique_together': {('user', 'work_date', 'shift')},
},
),
migrations.AddField(

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.12 on 2023-11-17 09:24
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('mtm', '0024_auto_20231116_1416'),
('hrm', '0017_auto_20231117_1700'),
]
operations = [
migrations.AlterUniqueTogether(
name='attendance',
unique_together={('employee', 'work_date', 'shift')},
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.12 on 2023-11-17 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hrm', '0018_alter_attendance_unique_together'),
]
operations = [
migrations.AlterField(
model_name='attendance',
name='note',
field=models.TextField(blank=True, default='', verbose_name='备注信息'),
),
]

View File

@ -96,11 +96,15 @@ class Attendance(CommonADModel):
# 可以根据需要添加更多状态
]
employee = models.ForeignKey(
Employee, verbose_name='关联人员', on_delete=models.CASCADE)
user = models.ForeignKey(
User, verbose_name='关联人员', on_delete=models.CASCADE)
work_date = models.DateField('工作日期')
shift = models.ForeignKey('mtm.shift', verbose_name='班次',
on_delete=models.CASCADE)
shift = models.ForeignKey(
'mtm.shift', verbose_name='班次', on_delete=models.CASCADE)
team = models.ForeignKey('mtm.team', verbose_name='班组',
on_delete=models.SET_NULL, null=True, blank=True)
post = models.ForeignKey('system.post', verbose_name='岗位',
on_delete=models.SET_NULL, null=True, blank=True)
work_time_start = models.DateTimeField('工作开始时间')
work_time_end = models.DateTimeField('工作结束时间')
state = models.CharField('状态', max_length=20,
@ -108,7 +112,7 @@ class Attendance(CommonADModel):
note = models.TextField('备注信息', default='', blank=True)
class Meta:
unique_together = ('employee', 'work_date', 'shift')
unique_together = ('user', 'work_date', 'shift')
class ClockRecord(BaseModel):

View File

@ -265,13 +265,14 @@ class CorrectSerializer(serializers.Serializer):
class AttendanceSerializer(CustomModelSerializer):
employee_name = serializers.CharField(
source='employee.name', read_only=True)
user_name = serializers.CharField(
source='user.name', read_only=True)
belong_dept_name = serializers.CharField(
source='employee.belong_dept.name', read_only=True)
source='user.belong_dept.name', read_only=True)
post_name = serializers.CharField(
source='employee.post.name', read_only=True)
source='user.post.name', read_only=True)
shift_name = serializers.CharField(source='shift.name', read_only=True)
team_name = serializers.CharField(source='team.name', read_only=True)
work_time_start = serializers.DateTimeField(read_only=True)
work_time_end = serializers.DateTimeField(read_only=True)
@ -280,10 +281,16 @@ class AttendanceSerializer(CustomModelSerializer):
fields = '__all__'
def create(self, validated_data):
user = validated_data['user']
shift = validated_data['shift']
work_date = validated_data['work_date']
post = validated_data.get('post', None)
if post is None:
post = user.post
if post is None:
raise ParseError(f'{user.name}未配置岗位')
att = Attendance.objects.filter(
employee=validated_data['employee'], work_date=work_date, shift=shift).first()
user=user, work_date=work_date, shift=shift).first()
if att:
att.note = validated_data.get('note', '')
att.state = validated_data['state']

View File

@ -251,10 +251,10 @@ class AttendanceViewSet(CustomModelViewSet):
"""
queryset = Attendance.objects.all()
serializer_class = AttendanceSerializer
select_related_fields = ['employee',
'employee__belong_dept', 'employee__post', 'shift']
filterset_fields = ['employee',
'employee__belong_dept', 'employee__post', 'state']
select_related_fields = ['user',
'user__belong_dept', 'user__post', 'shift', 'team']
filterset_fields = ['user',
'user__belong_dept', 'user__post', 'state']
ordering = ['-create_time']