feat: 订单排产时增加belong_dept参数
This commit is contained in:
parent
b1339f6d6b
commit
0aea02ffc9
|
@ -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):
|
||||||
|
|
|
@ -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]):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue