feat:新增人员交接单及其修改 人员交接时候反存校验

This commit is contained in:
TianyangZhang 2025-12-25 09:43:58 +08:00
parent 79e957bd83
commit 90cb2ed7f7
5 changed files with 33 additions and 50 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2025-12-23 03:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hrm', '0023_empjoin_emppersoninfo'),
]
operations = [
migrations.AddField(
model_name='emppersoninfo',
name='post',
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='岗位'),
),
]

View File

@ -243,5 +243,6 @@ class EmpPersonInfo(CommonADModel):
gender = models.CharField('性别', max_length=10, default='') gender = models.CharField('性别', max_length=10, default='')
IDcard = models.CharField('身份证号', max_length=20) IDcard = models.CharField('身份证号', max_length=20)
phone = models.CharField('手机号', max_length=20,validators=[PHONE_VALIDATOR], null=True, blank=True) phone = models.CharField('手机号', max_length=20,validators=[PHONE_VALIDATOR], null=True, blank=True)
post = models.CharField('岗位', max_length=20, null=True, blank=True)
note = models.TextField('备注', null=True, blank=True) note = models.TextField('备注', null=True, blank=True)

View File

@ -351,6 +351,7 @@ class EmpNeedSerializer(CustomModelSerializer):
class EmpJoinSerializer(CustomModelSerializer): class EmpJoinSerializer(CustomModelSerializer):
ticket_ = TicketSimpleSerializer(source='ticket', read_only=True) ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
dept_name = serializers.CharField(source='dept_need.name', read_only=True)
class Meta: class Meta:
model = EmpJoin model = EmpJoin
fields = '__all__' fields = '__all__'
@ -363,43 +364,7 @@ class EmpPersonInfoSerializer(CustomModelSerializer):
'gender', 'gender',
'IDcard', 'IDcard',
'phone', 'phone',
'post',
'note', 'note',
) )
class EmpJoinApproveSerializer(CustomModelSerializer):
empjoin_id = serializers.IntegerField()
def validate_empjoin_id(self, value):
try:
empjoin = EmpJoin.objects.get(id=value)
except EmpJoin.DoesNotExist:
raise ParseError('该入职申请不存在')
if not isinstance(empjoin.person, list) or not empjoin.person:
raise ParseError('该入职申请未添加人员')
self.empjoin = empjoin
return value
def validate(self, attrs):
"""
校验 person 中每一个人员
"""
self.person_serializers = []
errors = []
for index, item in enumerate(self.empjoin.person):
serializer = EmpPersonInfoSerializer(data=item)
if serializer.is_valid():
self.person_serializers.append(serializer)
else:
errors.append({
"index": index,
"errors": serializer.errors
})
if errors:
raise serializers.ValidationError({"person": errors})
return attrs
@transaction.atomic
def create(self, validated_data):
objs = [EmpPersonInfo(**serializer.validated_data) for serializer in self.person_serializers]
EmpPersonInfo.objects.bulk_create(objs)
return objs

View File

@ -16,11 +16,11 @@ from apps.hrm.models import Certificate, ClockRecord, Employee, NotWorkRemark, A
from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer, EmpJoinSerializer, from apps.hrm.serializers import (CertificateCreateUpdateSerializer, CertificateSerializer, ChannelAuthoritySerializer, EmpJoinSerializer,
ClockRecordListSerializer, ClockRecordListSerializer,
EmployeeCreateUpdateSerializer, EmployeeDetailSerializer, EmployeeImproveSerializer, EmployeeCreateUpdateSerializer, EmployeeDetailSerializer, EmployeeImproveSerializer,
EmployeeNotWorkRemarkSerializer, EmployeeNotWorkRemarkSerializer,EmpPersonInfoSerializer,
EmployeeSerializer, EmployeeSerializer,
ClockRecordSimpleSerializer, ClockRecordCreateSerializer, ClockRecordSimpleSerializer, ClockRecordCreateSerializer,
NotWorkRemarkListSerializer, CorrectSerializer, AttendanceSerializer, NotWorkRemarkListSerializer, CorrectSerializer, AttendanceSerializer,
ResignationSerializer, EmpNeedSerializer, EmpJoinApproveSerializer) ResignationSerializer, EmpNeedSerializer)
from apps.hrm.services import HrmService from apps.hrm.services import HrmService
from apps.third.dahua import dhClient from apps.third.dahua import dhClient
@ -439,15 +439,14 @@ class EmpJoinViewSet(TicketMixin, EuModelViewSet):
workflow_key = "wf_empjoin" workflow_key = "wf_empjoin"
def gen_other_ticket_data(self, instance): def gen_other_ticket_data(self, instance):
return {"dept_need": instance.dept_need} return {"dept_name": instance.dept_need.name if instance.dept_need else None}
@action(methods=['post'], detail=True) @staticmethod
def approve(self, request, pk=None): def approve(ticket: Ticket, transition, new_ticket_data: dict):
serializer = EmpJoinApproveSerializer(data={'empjoin_id': pk}) person = new_ticket_data.get("person", None)
EmpJoin.objects.filter(ticket=ticket).update(person=person)
if not person:
raise ParseError("请选择人员")
serializer = EmpPersonInfoSerializer(data=person, many=True)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
person = serializer.save() serializer.save()
return Response({
"msg":"审批通过,人员入库",
"count": len(person)
})

View File

@ -60,7 +60,7 @@ class VehicleUse(CommonBDModel):
via = models.CharField('途经地点', null=True, blank=True, max_length=100) via = models.CharField('途经地点', null=True, blank=True, max_length=100)
destination = models.CharField('到达地点', null=True, blank=True, max_length=100) destination = models.CharField('到达地点', null=True, blank=True, max_length=100)
start_km = models.PositiveIntegerField('出发公里数', null=True, blank=True) start_km = models.PositiveIntegerField('出发公里数', null=True, blank=True)
end_km = models.PositiveIntegerField('归还公里数', null=True, blank=True) end_km = models.PositiveIntegerField('归还公里数')
actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False) actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False)
is_city = models.BooleanField('是否市内用车', default=True) is_city = models.BooleanField('是否市内用车', default=True)
reason = models.CharField('用车事由', max_length=100) reason = models.CharField('用车事由', max_length=100)