diff --git a/apps/pm/serializers.py b/apps/pm/serializers.py index bb83e98b..b714e924 100644 --- a/apps/pm/serializers.py +++ b/apps/pm/serializers.py @@ -55,6 +55,8 @@ class SchedueSerializer(serializers.Serializer): label='orderitem的ID列表', queryset=OrderItem.objects.all(), many=True) start_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): diff --git a/apps/pm/services.py b/apps/pm/services.py index 90658b47..f31fd556 100644 --- a/apps/pm/services.py +++ b/apps/pm/services.py @@ -1,3 +1,4 @@ +from apps.system.models import Dept from apps.sam.models import OrderItem from apps.mtm.models import Route, Material, Mgroup from rest_framework.exceptions import ParseError @@ -11,7 +12,7 @@ from typing import List class PmService: @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') if start_date >= end_date: raise ParseError('开始时间不可大于结束时间') @@ -45,7 +46,8 @@ class PmService: start_date=start_date, end_date=end_date, create_by=user, - update_by=user + update_by=user, + belong_dept=belong_dept ) OrderItem.objects.filter(id__in=orderitemIds).update(utask=utask) @@ -59,51 +61,54 @@ class PmService: rela_days = (end_date - start_date).days + 1 if utask.mgroup: # 如果存在指定的mgroup则直接排产 pass - # 获取每个产品的加工路线 - rqs = Route.get_routes(product) - # 创建小任务 - for ind, val in enumerate(rqs): - if val.material_out: - halfgood = val.material_out - else: - raise ParseError(f'第{ind+1}步-无输出物料') - if val.material_in: - material_in = val.material_in - elif ind > 0: - material_in = rqs[ind-1].material_out - if val.is_autotask: - # 找到工段 - mgroups = Mgroup.objects.filter(process=val.process) - mgroups_count = mgroups.count() - if mgroups_count == 1: - mgroup = mgroups.first() - elif mgroups_count == 0: - raise ParseError(f'第{ind+1}步-工段不存在!') - else: # 后面可能会指定车间 - raise ParseError(f'第{ind+1}步-工段存在多个!') - task_count = count - if val.out_rate: - if val.out_rate > 1: - task_count = math.ceil( - count / (val.out_rate/100)) - else: - task_count = math.ceil(count / val.out_rate) - task_count_day = math.ceil(task_count/rela_days) - if rela_days > 1: - for i in range(rela_days): - task_date = start_date + timedelta(days=i) - Mtask.objects.create(**{ - 'number': f'{number}_r{ind+1}_{i+1}', - 'material_out': halfgood, - 'material_in': material_in, - 'mgroup': mgroup, - 'count': task_count_day, - 'start_date': task_date, - 'end_date': task_date, - 'utask': utask, - 'create_by': user, - 'update_by': user - }) + else: + # 获取产品的加工路线 + rqs = Route.get_routes(product) + if not rqs.exists(): + raise ParseError('未配置工艺路线') + # 创建小任务 + for ind, val in enumerate(rqs): + if val.material_out: + halfgood = val.material_out + else: + raise ParseError(f'第{ind+1}步-无输出物料') + if val.material_in: + material_in = val.material_in + elif ind > 0: + material_in = rqs[ind-1].material_out + if val.is_autotask: + # 找到工段 + mgroups = Mgroup.objects.filter(process=val.process) + mgroups_count = mgroups.count() + if mgroups_count == 1: + mgroup = mgroups.first() + elif mgroups_count == 0: + raise ParseError(f'第{ind+1}步-工段不存在!') + else: # 后面可能会指定车间 + raise ParseError(f'第{ind+1}步-工段存在多个!') + task_count = count + if val.out_rate: + if val.out_rate > 1: + task_count = math.ceil( + count / (val.out_rate/100)) + else: + task_count = math.ceil(count / val.out_rate) + task_count_day = math.ceil(task_count/rela_days) + if rela_days > 1: + for i in range(rela_days): + task_date = start_date + timedelta(days=i) + Mtask.objects.create(**{ + 'number': f'{number}_r{ind+1}_{i+1}', + 'material_out': halfgood, + 'material_in': material_in, + 'mgroup': mgroup, + 'count': task_count_day, + 'start_date': task_date, + 'end_date': task_date, + 'utask': utask, + 'create_by': user, + 'update_by': user + }) @classmethod def check_orderitems(cls, orderitems: QuerySet[OrderItem]): diff --git a/apps/pm/views.py b/apps/pm/views.py index 5214b1cb..043cd987 100644 --- a/apps/pm/views.py +++ b/apps/pm/views.py @@ -38,7 +38,7 @@ class UtaskViewSet(CustomModelViewSet): sr.is_valid(raise_exception=True) vdata = sr.validated_data 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() @action(methods=['post'], detail=False, perms_map={'post': 'utask.schedue'}, serializer_class=PkSerializer)