125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
from django.db import transaction
|
|
from rest_framework.decorators import action
|
|
from rest_framework.exceptions import ParseError
|
|
from rest_framework.response import Response
|
|
|
|
from apps.utils.serializers import PkSerializer
|
|
from apps.utils.viewsets import CustomModelViewSet
|
|
|
|
from .filters import MtaskFilter
|
|
from .models import Mtask, Utask
|
|
from .serializers import MtaskSerializer, SchedueSerializer, UtaskSerializer
|
|
from .services import PmService
|
|
|
|
# Create your views here.
|
|
|
|
|
|
class UtaskViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 生产大任务
|
|
|
|
生产大任务
|
|
"""
|
|
queryset = Utask.objects.all()
|
|
serializer_class = UtaskSerializer
|
|
filterset_fields = ['material', 'state']
|
|
select_related_fields = ['material']
|
|
ordering = ['-start_date']
|
|
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'utask.schedue'}, serializer_class=SchedueSerializer)
|
|
@transaction.atomic
|
|
def schedue_utasks(self, request, *args, **kwargs):
|
|
"""从多个订单明细生成大任务
|
|
|
|
从多个订单明细生成大任务
|
|
"""
|
|
sr = SchedueSerializer(data=request.data)
|
|
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'])
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'utask.schedue'}, serializer_class=PkSerializer)
|
|
@transaction.atomic
|
|
def schedue_mtasks(self, request, *args, **kwargs):
|
|
"""大任务自动排产为小任务
|
|
|
|
大任务自动排产为小任务
|
|
"""
|
|
sr = PkSerializer(data=request.data)
|
|
sr.is_valid(raise_exception=True)
|
|
vdata = sr.validated_data
|
|
utasks = Utask.objects.filter(
|
|
id__in=vdata['ids'], state=Utask.UTASK_CREATED)
|
|
for i in utasks:
|
|
PmService.schedue_mtasks(request.user, i)
|
|
return Response()
|
|
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'utask.assgin'}, serializer_class=PkSerializer)
|
|
@transaction.atomic
|
|
def assgin(self, request):
|
|
"""下达任务
|
|
|
|
下达任务
|
|
"""
|
|
ids = request.data.get('ids', [])
|
|
utasks = Utask.objects.filter(id__in=ids)
|
|
Mtask.objects.filter(utask__in=utasks, state=Mtask.MTASK_CREATED).update(
|
|
state=Mtask.MTASK_ASSGINED)
|
|
utasks.filter(state=Utask.UTASK_CREATED).update(
|
|
state=Utask.UTASK_ASSGINED)
|
|
# 此处要更新订单状态
|
|
from apps.sam.models import OrderItem, Order
|
|
orderIds = OrderItem.objects.filter(
|
|
utask__in=utasks).values_list('order', flat=True).distinct()
|
|
Order.objects.filter(id__in=orderIds, state=Order.ORDER_SUBMITED).update(
|
|
state=Order.ORDER_DOING)
|
|
return Response()
|
|
|
|
|
|
class MtaskViewSet(CustomModelViewSet):
|
|
"""
|
|
list: 生产任务
|
|
|
|
生产任务
|
|
"""
|
|
queryset = Mtask.objects.all()
|
|
serializer_class = MtaskSerializer
|
|
filterset_class = MtaskFilter
|
|
select_related_fields = ['material_in', 'material_out', 'mgroup']
|
|
ordering_fields = ['start_date', 'mgroup__process__sort']
|
|
ordering = ['-start_date', 'mgroup__process__sort', '-create_time']
|
|
|
|
# @action(methods=['post'], detail=False, perms_map={'post': 'mtask.schedue'}, serializer_class=SchedueSerializer)
|
|
# @transaction.atomic
|
|
# def schedue_from_orderitems(self, request, *args, **kwargs):
|
|
# """从多个订单明细自动排产
|
|
|
|
# 从多个订单明细自动排产
|
|
# """
|
|
# sr = SchedueSerializer(data=request.data)
|
|
# sr.is_valid(raise_exception=True)
|
|
# vdata = sr.validated_data
|
|
# PmService.schedue_from_orderitems(request.user,
|
|
# request.data['orderitems'], vdata['start_date'], vdata.get('end_date', None))
|
|
# return Response()
|
|
|
|
def perform_destroy(self, instance):
|
|
if instance.state != Mtask.MTASK_CREATED:
|
|
raise ParseError('该任务非创建中不可删除')
|
|
return super().perform_destroy(instance)
|
|
|
|
@action(methods=['post'], detail=False, perms_map={'post': 'mtask.submit'}, serializer_class=PkSerializer)
|
|
@transaction.atomic
|
|
def submit(self, request):
|
|
"""提交任务
|
|
|
|
提交任务后不可更新日志
|
|
"""
|
|
ids = request.data.get('ids', [])
|
|
mtasks = Mtask.objects.filter(
|
|
id__in=ids, state=Mtask.MTASK_ASSGINED).exclude(parent=None)
|
|
PmService.mtasks_submit(mtasks)
|
|
return Response()
|