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