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)
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):

View File

@ -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]):

View File

@ -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)