diff --git a/apps/hrm/migrations/0017_auto_20231117_1700.py b/apps/hrm/migrations/0017_auto_20231120_1828.py similarity index 77% rename from apps/hrm/migrations/0017_auto_20231117_1700.py rename to apps/hrm/migrations/0017_auto_20231120_1828.py index 89d706b9..1e3af99f 100644 --- a/apps/hrm/migrations/0017_auto_20231117_1700.py +++ b/apps/hrm/migrations/0017_auto_20231120_1828.py @@ -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( diff --git a/apps/hrm/migrations/0018_alter_attendance_unique_together.py b/apps/hrm/migrations/0018_alter_attendance_unique_together.py deleted file mode 100644 index b23a9f51..00000000 --- a/apps/hrm/migrations/0018_alter_attendance_unique_together.py +++ /dev/null @@ -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')}, - ), - ] diff --git a/apps/hrm/migrations/0019_alter_attendance_note.py b/apps/hrm/migrations/0019_alter_attendance_note.py deleted file mode 100644 index 504ebb59..00000000 --- a/apps/hrm/migrations/0019_alter_attendance_note.py +++ /dev/null @@ -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='备注信息'), - ), - ] diff --git a/apps/hrm/models.py b/apps/hrm/models.py index 95d79b8c..929ff989 100755 --- a/apps/hrm/models.py +++ b/apps/hrm/models.py @@ -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): diff --git a/apps/hrm/serializers.py b/apps/hrm/serializers.py index 5535cd0e..e6bf7460 100755 --- a/apps/hrm/serializers.py +++ b/apps/hrm/serializers.py @@ -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'] diff --git a/apps/hrm/views.py b/apps/hrm/views.py index d988a47c..c692fefb 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -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']