feat: 优化mtask创建
This commit is contained in:
parent
e8a8c1d078
commit
93d0c43b05
|
@ -21,6 +21,7 @@ class MtaskFilter(filters.FilterSet):
|
||||||
"material_out": ["exact"],
|
"material_out": ["exact"],
|
||||||
"material_out__type": ["exact"],
|
"material_out__type": ["exact"],
|
||||||
"material_out__is_hidden": ["exact"],
|
"material_out__is_hidden": ["exact"],
|
||||||
|
"mgroup__belong_dept__name": ["exact"],
|
||||||
"parent": ["exact", "isnull"]
|
"parent": ["exact", "isnull"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ from apps.utils.serializers import CustomModelSerializer
|
||||||
|
|
||||||
class MtaskSerializer(CustomModelSerializer):
|
class MtaskSerializer(CustomModelSerializer):
|
||||||
material_ = MaterialSerializer(source='material', read_only=True)
|
material_ = MaterialSerializer(source='material', read_only=True)
|
||||||
mgroup__name = serializers.CharField(source='mgroup.name', read_only=True)
|
mgroup_name = serializers.CharField(source='mgroup.name', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Mtask
|
model = Mtask
|
||||||
|
|
|
@ -10,6 +10,7 @@ from typing import List
|
||||||
|
|
||||||
class PmService:
|
class PmService:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
def check_orderitems(cls, orderitems: QuerySet[OrderItem]):
|
def check_orderitems(cls, orderitems: QuerySet[OrderItem]):
|
||||||
"""
|
"""
|
||||||
校验orderitems并返回整合后的字典以productId为key, [product, count, end_date, orderitems] 为value
|
校验orderitems并返回整合后的字典以productId为key, [product, count, end_date, orderitems] 为value
|
||||||
|
@ -39,15 +40,25 @@ class PmService:
|
||||||
rdict = cls.check_orderitems(orderitems)
|
rdict = cls.check_orderitems(orderitems)
|
||||||
start_date_str = start_date.strftime('%Y%m%d')
|
start_date_str = start_date.strftime('%Y%m%d')
|
||||||
for k, v in rdict.items():
|
for k, v in rdict.items():
|
||||||
product, count, end_date_cal, orderitemId_list = v
|
xproduct, xcount, end_date_cal, orderitemId_list = v
|
||||||
if end_date is None:
|
if end_date is None:
|
||||||
end_date = end_date_cal
|
end_date = end_date_cal
|
||||||
if start_date >= end_date:
|
if start_date >= end_date:
|
||||||
raise ParseError('开始时间不可大于结束时间')
|
raise ParseError('开始时间不可大于结束时间')
|
||||||
# 计算相差天数
|
# 计算相差天数
|
||||||
rela_days = (end_date - start_date).days + 1
|
rela_days = (end_date - start_date).days + 1
|
||||||
# 获取工艺路线
|
make_list = []
|
||||||
|
if xproduct.is_assemb:
|
||||||
|
for key in xproduct.components:
|
||||||
|
make_list.append([Material.objects.get(
|
||||||
|
id=key), xcount*xproduct.components[key], end_date, orderitemId_list])
|
||||||
|
else:
|
||||||
|
make_list = [[xproduct, xcount, end_date, orderitemId_list]]
|
||||||
|
for i in make_list:
|
||||||
|
product, count, end_date, orderitemId_list = i
|
||||||
|
# 获取每个产品的加工路线
|
||||||
rqs = Route.get_routes(product)
|
rqs = Route.get_routes(product)
|
||||||
|
lasttask = None
|
||||||
# 创建父任务
|
# 创建父任务
|
||||||
for ind, val in enumerate(rqs):
|
for ind, val in enumerate(rqs):
|
||||||
if val.material_out:
|
if val.material_out:
|
||||||
|
@ -55,13 +66,13 @@ class PmService:
|
||||||
else:
|
else:
|
||||||
raise ParseError(f'第{ind+1}步-无输出物料')
|
raise ParseError(f'第{ind+1}步-无输出物料')
|
||||||
if val.material_in:
|
if val.material_in:
|
||||||
material_before = val.material_in
|
material_in = val.material_in
|
||||||
elif ind > 0:
|
elif ind > 0:
|
||||||
material_before = rqs[ind-1].material_out
|
material_in = rqs[ind-1].material_out
|
||||||
if val.is_autotask:
|
if val.is_autotask:
|
||||||
# 找到工段
|
# 找到工段
|
||||||
mgroups = val.mgroups
|
mgroups = Mgroup.objects.filter(process=val.process)
|
||||||
mgroups_count = len(mgroups)
|
mgroups_count = mgroups.count()
|
||||||
if mgroups_count == 1:
|
if mgroups_count == 1:
|
||||||
mgroup = mgroups.first()
|
mgroup = mgroups.first()
|
||||||
elif mgroups_count == 0:
|
elif mgroups_count == 0:
|
||||||
|
@ -71,13 +82,15 @@ class PmService:
|
||||||
task_count = count
|
task_count = count
|
||||||
if val.out_rate:
|
if val.out_rate:
|
||||||
if val.out_rate > 1:
|
if val.out_rate > 1:
|
||||||
task_count = math.ceil(count / (val.out_rate/100))
|
task_count = math.ceil(
|
||||||
|
count / (val.out_rate/100))
|
||||||
else:
|
else:
|
||||||
task_count = math.ceil(count / val.out_rate)
|
task_count = math.ceil(count / val.out_rate)
|
||||||
fmtask, _ = Mtask.objects.get_or_create(mgroup=mgroup, material=halfgood, defaults={
|
print(halfgood)
|
||||||
'number': f'{product.number}_r{ind+1}_{start_date_str}',
|
fmtask = Mtask.objects.create(**{
|
||||||
'material': halfgood,
|
'number': f'{product.number}_{start_date_str}_r{ind+1}',
|
||||||
'material_before': material_before,
|
'material_out': halfgood,
|
||||||
|
'material_in': material_in,
|
||||||
'mgroup': mgroup,
|
'mgroup': mgroup,
|
||||||
'count': task_count,
|
'count': task_count,
|
||||||
'start_date': start_date,
|
'start_date': start_date,
|
||||||
|
@ -86,13 +99,13 @@ class PmService:
|
||||||
'update_by': user,
|
'update_by': user,
|
||||||
})
|
})
|
||||||
task_count_day = math.ceil(task_count/rela_days)
|
task_count_day = math.ceil(task_count/rela_days)
|
||||||
if fmtask.parent is None:
|
if rela_days > 1:
|
||||||
for i in range(rela_days):
|
for i in range(rela_days):
|
||||||
task_date = start_date + timedelta(days=i+1)
|
task_date = start_date + timedelta(days=i)
|
||||||
Mtask.objects.get_or_create(mgroup=mgroup, material=halfgood, parent=fmtask, defaults={
|
Mtask.objects.get_or_create(mgroup=mgroup, material_out=halfgood, parent=fmtask, start_date=task_date, defaults={
|
||||||
'number': f'{fmtask.number}_{i+1}',
|
'number': f'{fmtask.number}_{i+1}',
|
||||||
'material': halfgood,
|
'material_out': halfgood,
|
||||||
'material_before': material_before,
|
'material_in': material_in,
|
||||||
'mgroup': mgroup,
|
'mgroup': mgroup,
|
||||||
'count': task_count_day,
|
'count': task_count_day,
|
||||||
'start_date': task_date,
|
'start_date': task_date,
|
||||||
|
@ -101,11 +114,11 @@ class PmService:
|
||||||
'create_by': user,
|
'create_by': user,
|
||||||
'update_by': user
|
'update_by': user
|
||||||
})
|
})
|
||||||
|
lasttask = fmtask
|
||||||
OrderItem.objects.filter(
|
OrderItem.objects.filter(
|
||||||
id__in=orderitemId_list).update(mtask=fmtask)
|
id__in=orderitemId_list).update(mtask=lasttask)
|
||||||
|
|
||||||
from apps.sam.tasks import change_order_state_when_schedue
|
from apps.sam.tasks import change_order_state_when_schedue
|
||||||
change_order_state_when_schedue.delay(orderitemId_list)
|
change_order_state_when_schedue(orderitemIds)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def mtasks_submit(cls, mtasks: QuerySet[Mtask]):
|
def mtasks_submit(cls, mtasks: QuerySet[Mtask]):
|
||||||
|
|
|
@ -25,7 +25,7 @@ class MtaskViewSet(CustomModelViewSet):
|
||||||
filterset_class = MtaskFilter
|
filterset_class = MtaskFilter
|
||||||
select_related_fields = ['material_in', 'material_out', 'mgroup']
|
select_related_fields = ['material_in', 'material_out', 'mgroup']
|
||||||
ordering_fields = ['start_date', 'mgroup__process__sort']
|
ordering_fields = ['start_date', 'mgroup__process__sort']
|
||||||
ordering = ['mgroup__process__sort', '-start_date', '-create_time']
|
ordering = ['-start_date', 'mgroup__process__sort', '-create_time']
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.schedue'}, serializer_class=SchedueSerializer)
|
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.schedue'}, serializer_class=SchedueSerializer)
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
|
@ -38,7 +38,7 @@ class MtaskViewSet(CustomModelViewSet):
|
||||||
sr.is_valid(raise_exception=True)
|
sr.is_valid(raise_exception=True)
|
||||||
vdata = sr.validated_data
|
vdata = sr.validated_data
|
||||||
PmService.schedue_from_orderitems(request.user,
|
PmService.schedue_from_orderitems(request.user,
|
||||||
vdata['orderitems'], vdata['start_date'], vdata.get('end_date', None))
|
request.data['orderitems'], vdata['start_date'], vdata.get('end_date', None))
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
|
@ -46,7 +46,7 @@ class MtaskViewSet(CustomModelViewSet):
|
||||||
raise ParseError('该任务非创建中不可删除')
|
raise ParseError('该任务非创建中不可删除')
|
||||||
return super().perform_destroy(instance)
|
return super().perform_destroy(instance)
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.asgin'}, serializer_class=PkSerializer)
|
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.assgin'}, serializer_class=PkSerializer)
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def assgin(self, request):
|
def assgin(self, request):
|
||||||
"""下达任务
|
"""下达任务
|
||||||
|
|
Loading…
Reference in New Issue