feat:新增人员交接单及其修改 人员交接时候反存校验
This commit is contained in:
parent
79e957bd83
commit
90cb2ed7f7
|
|
@ -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='岗位'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue