Merge branch 'master' of http://gitea.xxhhcty.xyz:8080/zcdsj/factory
This commit is contained in:
commit
96f5133152
|
|
@ -0,0 +1,27 @@
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wf', '0001_initial'),
|
||||||
|
('hrm', '0035_rename_band_card_employee_bank_card'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='empcontract',
|
||||||
|
name='employee',
|
||||||
|
field=models.ForeignKey(
|
||||||
|
blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
|
||||||
|
to='hrm.employee', verbose_name='人员信息'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='empcontract',
|
||||||
|
name='ticket',
|
||||||
|
field=models.ForeignKey(
|
||||||
|
blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
related_name='contract_ticket', to='wf.ticket', verbose_name='关联工单'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.12 on 2026-05-13 03:08
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('hrm', '0036_empcontract_batch'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='empcontract',
|
||||||
|
name='counts',
|
||||||
|
field=models.PositiveSmallIntegerField(default=0, verbose_name='合同变更次数'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -354,8 +354,8 @@ class EmpContract(CommonAModel):
|
||||||
"""
|
"""
|
||||||
TN:劳动合同
|
TN:劳动合同
|
||||||
"""
|
"""
|
||||||
employee = models.OneToOneField(Employee, verbose_name='人员信息', on_delete=models.SET_NULL, null=True, blank=True)
|
employee = models.ForeignKey(Employee, verbose_name='人员信息', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
ticket = models.OneToOneField('wf.ticket', verbose_name='关联工单',
|
ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
|
||||||
on_delete=models.CASCADE, related_name='contract_ticket', null=True, blank=True)
|
on_delete=models.CASCADE, related_name='contract_ticket', null=True, blank=True)
|
||||||
counts = models.PositiveSmallIntegerField('合同变更次数', default=0)
|
counts = models.PositiveSmallIntegerField('合同变更次数', default=0)
|
||||||
plan_renewal = models.DateField('应续签', null=True, blank=True)
|
plan_renewal = models.DateField('应续签', null=True, blank=True)
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,22 @@ class EmpContractSerializer(CustomModelSerializer):
|
||||||
gender = serializers.CharField(source="employee.gender", read_only=True)
|
gender = serializers.CharField(source="employee.gender", read_only=True)
|
||||||
join_date = serializers.CharField(source="employee.start_date", read_only=True)
|
join_date = serializers.CharField(source="employee.start_date", read_only=True)
|
||||||
end_contract = serializers.CharField(source="employee.contract_end_date", read_only=True)
|
end_contract = serializers.CharField(source="employee.contract_end_date", read_only=True)
|
||||||
|
batch_employees = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
def get_batch_employees(self, obj):
|
||||||
|
if obj.ticket_id:
|
||||||
|
siblings = EmpContract.objects.filter(ticket_id=obj.ticket_id).select_related(
|
||||||
|
'employee', 'employee__post', 'employee__belong_dept')
|
||||||
|
if siblings.count() > 1:
|
||||||
|
return [{
|
||||||
|
'employee_name': s.employee.name if s.employee else '',
|
||||||
|
'post_name': s.employee.post.name if s.employee and s.employee.post else '',
|
||||||
|
'dept_name': s.employee.belong_dept.name if s.employee and s.employee.belong_dept else '',
|
||||||
|
'join_date': str(s.employee.start_date or '') if s.employee else '',
|
||||||
|
'end_contract': str(s.employee.contract_end_date or '') if s.employee else '',
|
||||||
|
} for s in siblings]
|
||||||
|
return []
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = EmpContract
|
model = EmpContract
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
@ -33,8 +33,9 @@ from datetime import datetime
|
||||||
from apps.utils.export import export_excel
|
from apps.utils.export import export_excel
|
||||||
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet, EuModelViewSet
|
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet, EuModelViewSet
|
||||||
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin, RetrieveModelMixin
|
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin, RetrieveModelMixin
|
||||||
from apps.wf.models import Ticket
|
from apps.wf.models import Ticket, Workflow, State
|
||||||
from apps.wf.mixins import TicketMixin
|
from apps.wf.mixins import TicketMixin
|
||||||
|
from apps.wf.services import WfService
|
||||||
from apps.system.models import Post, Dept
|
from apps.system.models import Post, Dept
|
||||||
from django.db.models import DateField
|
from django.db.models import DateField
|
||||||
from datetime import datetime, date
|
from datetime import datetime, date
|
||||||
|
|
@ -825,3 +826,49 @@ class EmpContractViewSet(TicketMixin, EuModelViewSet):
|
||||||
def gen_other_ticket_data(self, instance):
|
def gen_other_ticket_data(self, instance):
|
||||||
return {"name": instance.employee.name if instance.employee.name else None}
|
return {"name": instance.employee.name if instance.employee.name else None}
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
result = serializer.save()
|
||||||
|
is_batch = isinstance(result, list)
|
||||||
|
instances = result if is_batch else [result]
|
||||||
|
handler = self.request.user
|
||||||
|
|
||||||
|
workflow_key = self.get_workflow_key(instances[0])
|
||||||
|
if not workflow_key:
|
||||||
|
raise ParseError('工作流异常:必须赋值workflow_key')
|
||||||
|
try:
|
||||||
|
wf = Workflow.objects.get(key=workflow_key)
|
||||||
|
except Exception as e:
|
||||||
|
raise ParseError(f'工作流{workflow_key}异常:{e}')
|
||||||
|
|
||||||
|
# 批量时创建一个工单,所有记录共享
|
||||||
|
if is_batch:
|
||||||
|
names = [ins.employee.name for ins in instances if ins.employee]
|
||||||
|
ticket_data = {
|
||||||
|
"t_model": "EmpContract",
|
||||||
|
"t_id": str(instances[0].id),
|
||||||
|
"batch": True,
|
||||||
|
"count": len(instances),
|
||||||
|
"name": f"批量合同变更({len(instances)}人)",
|
||||||
|
"employees": [
|
||||||
|
{"name": ins.employee.name, "id": str(ins.id)} for ins in instances if ins.employee
|
||||||
|
],
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
ticket_data = self.gen_ticket_data(instances[0])
|
||||||
|
|
||||||
|
ticket = WfService.handle_ticket(ticket=None, transition=None, workflow=wf, new_ticket_data=ticket_data,
|
||||||
|
handler=handler, oinfo={})
|
||||||
|
for ins in instances:
|
||||||
|
ins.ticket = ticket
|
||||||
|
ins.save(update_fields=['ticket'])
|
||||||
|
|
||||||
|
if self.ticket_auto_submit_on_create:
|
||||||
|
source_state = WfService.get_workflow_start_state(wf)
|
||||||
|
transitions = WfService.get_state_transitions(source_state)
|
||||||
|
if transitions.count() == 1:
|
||||||
|
transition = transitions.first()
|
||||||
|
WfService.handle_ticket(ticket=ticket, transition=transition, new_ticket_data=ticket_data,
|
||||||
|
handler=handler, oinfo={})
|
||||||
|
else:
|
||||||
|
raise ParseError(f'工作流{workflow_key}异常:有多个或无后续状态;不可处理')
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue