feat: hrm中的attendance
This commit is contained in:
parent
fddadfe30c
commit
6b81f2a394
|
@ -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(
|
|
@ -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')},
|
||||
),
|
||||
]
|
|
@ -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='备注信息'),
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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']
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue