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, UtaskFilter 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_class = UtaskFilter 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()