feat: 订单排产时增加belong_dept参数

This commit is contained in:
caoqianming 2023-10-26 08:57:26 +08:00
parent b1339f6d6b
commit 0aea02ffc9
3 changed files with 55 additions and 48 deletions

View File

@ -55,6 +55,8 @@ class SchedueSerializer(serializers.Serializer):
label='orderitem的ID列表', queryset=OrderItem.objects.all(), many=True) label='orderitem的ID列表', queryset=OrderItem.objects.all(), many=True)
start_date = serializers.DateField(label='计划开工日期') start_date = serializers.DateField(label='计划开工日期')
end_date = serializers.DateField(label='计划完工日期') end_date = serializers.DateField(label='计划完工日期')
belong_dept = serializers.PrimaryKeyRelatedField(
label='车间ID', queryset=Dept.objects.all(), required=False)
class MtaskDaySerializer(serializers.Serializer): class MtaskDaySerializer(serializers.Serializer):

View File

@ -1,3 +1,4 @@
from apps.system.models import Dept
from apps.sam.models import OrderItem from apps.sam.models import OrderItem
from apps.mtm.models import Route, Material, Mgroup from apps.mtm.models import Route, Material, Mgroup
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
@ -11,7 +12,7 @@ from typing import List
class PmService: class PmService:
@classmethod @classmethod
def make_utasks_from_orderitems(cls, user, orderitemIds: List[str], start_date: date, end_date: date): def make_utasks_from_orderitems(cls, user, orderitemIds: List[str], start_date: date, end_date: date, belong_dept: Dept | None):
start_date_str = start_date.strftime('%Y%m%d') start_date_str = start_date.strftime('%Y%m%d')
if start_date >= end_date: if start_date >= end_date:
raise ParseError('开始时间不可大于结束时间') raise ParseError('开始时间不可大于结束时间')
@ -45,7 +46,8 @@ class PmService:
start_date=start_date, start_date=start_date,
end_date=end_date, end_date=end_date,
create_by=user, create_by=user,
update_by=user update_by=user,
belong_dept=belong_dept
) )
OrderItem.objects.filter(id__in=orderitemIds).update(utask=utask) OrderItem.objects.filter(id__in=orderitemIds).update(utask=utask)
@ -59,51 +61,54 @@ class PmService:
rela_days = (end_date - start_date).days + 1 rela_days = (end_date - start_date).days + 1
if utask.mgroup: # 如果存在指定的mgroup则直接排产 if utask.mgroup: # 如果存在指定的mgroup则直接排产
pass pass
# 获取每个产品的加工路线 else:
rqs = Route.get_routes(product) # 获取产品的加工路线
# 创建小任务 rqs = Route.get_routes(product)
for ind, val in enumerate(rqs): if not rqs.exists():
if val.material_out: raise ParseError('未配置工艺路线')
halfgood = val.material_out # 创建小任务
else: for ind, val in enumerate(rqs):
raise ParseError(f'{ind+1}步-无输出物料') if val.material_out:
if val.material_in: halfgood = val.material_out
material_in = val.material_in else:
elif ind > 0: raise ParseError(f'{ind+1}步-无输出物料')
material_in = rqs[ind-1].material_out if val.material_in:
if val.is_autotask: material_in = val.material_in
# 找到工段 elif ind > 0:
mgroups = Mgroup.objects.filter(process=val.process) material_in = rqs[ind-1].material_out
mgroups_count = mgroups.count() if val.is_autotask:
if mgroups_count == 1: # 找到工段
mgroup = mgroups.first() mgroups = Mgroup.objects.filter(process=val.process)
elif mgroups_count == 0: mgroups_count = mgroups.count()
raise ParseError(f'{ind+1}步-工段不存在!') if mgroups_count == 1:
else: # 后面可能会指定车间 mgroup = mgroups.first()
raise ParseError(f'{ind+1}步-工段存在多个!') elif mgroups_count == 0:
task_count = count raise ParseError(f'{ind+1}步-工段不存在!')
if val.out_rate: else: # 后面可能会指定车间
if val.out_rate > 1: raise ParseError(f'{ind+1}步-工段存在多个!')
task_count = math.ceil( task_count = count
count / (val.out_rate/100)) if val.out_rate:
else: if val.out_rate > 1:
task_count = math.ceil(count / val.out_rate) task_count = math.ceil(
task_count_day = math.ceil(task_count/rela_days) count / (val.out_rate/100))
if rela_days > 1: else:
for i in range(rela_days): task_count = math.ceil(count / val.out_rate)
task_date = start_date + timedelta(days=i) task_count_day = math.ceil(task_count/rela_days)
Mtask.objects.create(**{ if rela_days > 1:
'number': f'{number}_r{ind+1}_{i+1}', for i in range(rela_days):
'material_out': halfgood, task_date = start_date + timedelta(days=i)
'material_in': material_in, Mtask.objects.create(**{
'mgroup': mgroup, 'number': f'{number}_r{ind+1}_{i+1}',
'count': task_count_day, 'material_out': halfgood,
'start_date': task_date, 'material_in': material_in,
'end_date': task_date, 'mgroup': mgroup,
'utask': utask, 'count': task_count_day,
'create_by': user, 'start_date': task_date,
'update_by': user 'end_date': task_date,
}) 'utask': utask,
'create_by': user,
'update_by': user
})
@classmethod @classmethod
def check_orderitems(cls, orderitems: QuerySet[OrderItem]): def check_orderitems(cls, orderitems: QuerySet[OrderItem]):

View File

@ -38,7 +38,7 @@ class UtaskViewSet(CustomModelViewSet):
sr.is_valid(raise_exception=True) sr.is_valid(raise_exception=True)
vdata = sr.validated_data vdata = sr.validated_data
PmService.make_utasks_from_orderitems(request.user, PmService.make_utasks_from_orderitems(request.user,
request.data['orderitems'], vdata['start_date'], vdata['end_date']) request.data['orderitems'], vdata['start_date'], vdata['end_date'], vdata.get('belong_dept', None))
return Response() return Response()
@action(methods=['post'], detail=False, perms_map={'post': 'utask.schedue'}, serializer_class=PkSerializer) @action(methods=['post'], detail=False, perms_map={'post': 'utask.schedue'}, serializer_class=PkSerializer)