From 1af6555e267811f9cccde656f6dc27bd5ae1093f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 12 Dec 2025 16:57:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/hrm/migrations/0022_empneed.py | 44 +++++++++++++++++++++++++++++ apps/hrm/models.py | 20 ++++++++++++- apps/hrm/serializers.py | 11 ++++++-- apps/hrm/views.py | 14 +++++++-- 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 apps/hrm/migrations/0022_empneed.py diff --git a/apps/hrm/migrations/0022_empneed.py b/apps/hrm/migrations/0022_empneed.py new file mode 100644 index 00000000..e8f11496 --- /dev/null +++ b/apps/hrm/migrations/0022_empneed.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.12 on 2025-12-12 08:48 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0006_auto_20241213_1249'), + ('wf', '0005_workflow_cate'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('hrm', '0021_alter_resignation_ticket'), + ] + + operations = [ + migrations.CreateModel( + name='EmpNeed', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('post_need', models.TextField(verbose_name='需求岗位')), + ('count_need', models.PositiveIntegerField(verbose_name='需求人数')), + ('salary', models.PositiveIntegerField(verbose_name='工资报酬')), + ('arrival_date', models.DateField(verbose_name='到岗日期')), + ('reason', models.TextField(help_text='新增人员/该岗原人员离职或辞职或辞退需补充/其他原因', verbose_name='申请理由')), + ('duty', models.TextField(verbose_name='岗位人员职责描述')), + ('gender', models.CharField(help_text='男/女/不限', max_length=10, verbose_name='性别要求')), + ('education', models.CharField(help_text='高中/大专/不限', max_length=50, verbose_name='学历要求')), + ('professional_requirement', models.TextField(blank=True, null=True, verbose_name='相关专业及技能要求')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='empneed_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('dept_need', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.dept', verbose_name='需求部门')), + ('ticket', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='empneed_ticket', to='wf.ticket', verbose_name='关联工单')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='empneed_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/hrm/models.py b/apps/hrm/models.py index 2f56f925..79f2f379 100755 --- a/apps/hrm/models.py +++ b/apps/hrm/models.py @@ -202,4 +202,22 @@ class Resignation(CommonADModel): end_date = models.DateField('离职日期') reason = models.TextField('离职原因') handle_date = models.DateField('办理离职交接日期', null=True, blank=True) - ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.SET_NULL, null=True, blank=True, related_name='resignation_ticket') \ No newline at end of file + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.SET_NULL, null=True, blank=True, related_name='resignation_ticket') + + +class EmpNeed(CommonADModel): + """ + TN:员工需求 + """ + dept_need = models.ForeignKey('system.Dept', verbose_name='需求部门', on_delete=models.CASCADE) + post_need = models.TextField("需求岗位") + count_need = models.PositiveIntegerField('需求人数') + salary = models.PositiveIntegerField("工资报酬") + arrival_date = models.DateField('到岗日期') + reason = models.TextField('申请理由', help_text="新增人员/该岗原人员离职或辞职或辞退需补充/其他原因") + duty = models.TextField("岗位人员职责描述") + gender = models.CharField('性别要求', max_length=10, help_text="男/女/不限") + education = models.CharField('学历要求', max_length=50, help_text='高中/大专/不限') + professional_requirement = models.TextField(verbose_name="相关专业及技能要求", null=True, blank=True) + ticket = models.OneToOneField('wf.ticket', verbose_name='关联工单', + on_delete=models.CASCADE, related_name='empneed_ticket', null=True, blank=True) \ No newline at end of file diff --git a/apps/hrm/serializers.py b/apps/hrm/serializers.py index 203e889b..f27915ca 100755 --- a/apps/hrm/serializers.py +++ b/apps/hrm/serializers.py @@ -9,7 +9,7 @@ from django.utils import timezone from apps.utils.serializers import CustomModelSerializer from apps.utils.constants import EXCLUDE_FIELDS from apps.hrm.models import (Certificate, ClockRecord, Employee, - NotWorkRemark, Attendance, Resignation) + NotWorkRemark, Attendance, Resignation, EmpNeed) from apps.system.serializers import DeptSimpleSerializer, UserSimpleSerializer from django.db import transaction from django.core.cache import cache @@ -339,4 +339,11 @@ class ResignationSerializer(CustomModelSerializer): raise ParseError('员工不在职,不可创建申请') if Resignation.objects.filter(employee=employee).exists(): raise ParseError('该员工已存在离职申请') - return super().create(validated_data) \ No newline at end of file + return super().create(validated_data) + + +class EmpNeedSerializer(CustomModelSerializer): + dept_need_name = serializers.CharField(source='dept_need.name', read_only=True) + class Meta: + model = EmpNeed + fields = '__all__' \ No newline at end of file diff --git a/apps/hrm/views.py b/apps/hrm/views.py index 6152ead1..3a09c6f4 100755 --- a/apps/hrm/views.py +++ b/apps/hrm/views.py @@ -12,7 +12,7 @@ from rest_framework.response import Response from apps.hrm.errors import NO_NEED_LEVEL_REMARK from apps.hrm.filters import (CertificateFilterSet, ClockRecordFilterSet, EmployeeFilterSet, NotWorkRemarkFilterSet) -from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark, Attendance, Resignation +from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark, Attendance, Resignation, EmpNeed from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer, ClockRecordListSerializer, EmployeeCreateUpdateSerializer, EmployeeDetailSerializer, EmployeeImproveSerializer, @@ -20,7 +20,7 @@ from apps.hrm.serializers import (CertificateCreateUpdateSerializer, Certificate EmployeeSerializer, ClockRecordSimpleSerializer, ClockRecordCreateSerializer, NotWorkRemarkListSerializer, CorrectSerializer, AttendanceSerializer, - ResignationSerializer) + ResignationSerializer, EmpNeedSerializer) from apps.hrm.services import HrmService from apps.third.dahua import dhClient @@ -419,4 +419,12 @@ class ResignationViewSet(TicketMixin, EuModelViewSet): emp.save(update_fields=['job_state']) user = emp.user user.is_deleted = True - user.save(update_fields=['is_deleted']) \ No newline at end of file + user.save(update_fields=['is_deleted']) + + +class EmpNeedViewSet(TicketMixin, EuModelViewSet): + queryset = EmpNeed.objects.all() + serializer_class = EmpNeedSerializer + filterset_fields = ['dept_need'] + search_fields = ["dept_need__name", "post_need"] + workflow_key = "wf_empneed" \ No newline at end of file