from django.db import transaction from django.shortcuts import render from rest_framework.decorators import action from rest_framework.exceptions import ParseError from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin from rest_framework.response import Response from rest_framework.serializers import Serializer from apps.mtm.models import Material from apps.pm.models import Mtask from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import BulkCreateModelMixin from .filters import SfLogExpFilter, SfLogFilter, WMaterialFilter, MlogFilter from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover from .serializers import SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer, GenHandoverSerializer from .services import mlog_submit, update_mtask # Create your views here. class StLogViewSet(ListModelMixin, CustomGenericViewSet): """ list:停机记录 停机记录 """ perms_map = {'get': '*'} queryset = StLog.objects.all() serializer_class = StLogSerializer select_related_fields = ['mgroup'] filterset_fields = ['mgroup'] ordering = ['-start_time'] class SfLogViewSet(UpdateModelMixin, ListModelMixin, DestroyModelMixin, CustomGenericViewSet): """ list:值班记录 值班记录 """ perms_map = {'get': '*', 'put': 'sflog.update', 'delete': 'sflog.delete'} queryset = SfLog.objects.all() serializer_class = SfLogSerializer select_related_fields = ['mgroup', 'shift', 'team', 'leader'] filterset_class = SfLogFilter search_fields = ['note'] ordering = ['-start_time'] @action(methods=['get'], detail=True, perms_map={'get': '*'}) def init_test(self, request, pk=None): """ 初始化检测录入 初始化检测录入 """ from apps.qm.models import QuaStat, TestItem from apps.qm.serializers import QuaStatSerializer obj = self.get_object() test_materials = Material.objects.filter( id__in=obj.mgroup.test_materials).order_by('sort', '-create_time') for material in test_materials: testitems = TestItem.objects.filter( id__in=material.testitems).order_by('sort', '-create_time') for testitem in testitems: params = {'material': material, 'testitem': testitem, 'sflog': obj} QuaStat.objects.get_or_create( **params, defaults={**params, **{'create_by': request.user, 'belong_dept': obj.mgroup.belong_dept}}) qs = QuaStat.objects.filter(sflog=obj).order_by( 'material__sort', 'material__create_time', 'testitem__sort', 'testitem__create_time') sr = QuaStatSerializer(instance=qs, many=True) return Response(sr.data) class SfLogExpViewSet(CustomModelViewSet): """ list:生产异常动态 生产异常动态 """ queryset = SfLogExp.objects.all() serializer_class = SflogExpSerializer select_related_fields = ['sflog', 'sflog__mgroup', 'stlog'] filterset_class = SfLogExpFilter class WMaterialViewSet(ListModelMixin, CustomGenericViewSet): """ list: 车间库存 车间库存 """ perms_map = {'get': '*'} queryset = WMaterial.objects.all() serializer_class = WMaterialSerializer select_related_fields = ['material', 'belong_dept'] search_fields = ['material__name', 'material__number', 'material__specification'] filterset_class = WMaterialFilter @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=DeptBatchSerializer) @transaction.atomic def batchs(self, request): """获取车间出现过的批次号 获取车间出现过的批次号 """ sr = DeptBatchSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data batchs = WMaterial.objects.filter( belong_dept__name=vdata['belong_dept_name']).values_list('batch', flat=True).distinct() return Response(list(batchs)) class MlogViewSet(CustomModelViewSet): """ list: 生产日志 生产日志 """ queryset = Mlog.objects.all() serializer_class = MlogSerializer select_related_fields = ['create_by', 'update_by', 'mtask', 'handle_user', 'handle_user_2', 'equipment', 'equipment_2'] prefetch_related_fields = ['handle_users', 'material_outs'] filterset_class = MlogFilter def perform_destroy(self, instance): if instance.mtask.state == Mtask.MTASK_DONE: raise ParseError('任务已提交日志不可变动') return super().perform_destroy(instance) @action(methods=['post'], detail=True, perms_map={'post': 'mlog.submit'}, serializer_class=Serializer) @transaction.atomic def submit(self, request): """日志提交(变动车间库存) 日志提交 """ ins: Mlog = self.get_object() if ins.submit_time is None: mlog_submit(ins, self.request.user, None) if ins.mtask: update_mtask(ins.mtask) return Response() @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=MlogRelatedSerializer) @transaction.atomic def related_first(self, request): """获取相关任务的第一道工序日志 获取相关任务的第一道工序日志 """ sr = MlogRelatedSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data mtask = vdata['mtask'] if mtask.utask: mtasks = mtask.related mlogs = Mlog.objects.filter(mtask__in=mtasks).order_by( 'mtask__mgroup__process__sort', 'batch', 'create_time') data = MlogSerializer(instance=mlogs, many=True).data res_data = [] for ind, val in enumerate(data): if ind == 0: res_data.append(val) else: before = data[ind-1] if val['batch'] != before['batch']: res_data.append(val) return Response(res_data) class HandoverViewSet(CustomModelViewSet): """ list: 交接记录 交接记录 """ queryset = Handover.objects.all() serializer_class = HandoverSerializer select_related_fields = ['send_user', 'send_dept', 'recive_user', 'recive_dept'] filterset_fields = ['send_user', 'send_dept', 'recive_user', 'recive_dept', 'recive_dept__name', 'send_date'] def perform_destroy(self, instance): user = self.request.user if instance.send_user != user and instance.recive_user != user and instance.create_by != user: raise ParseError('非交送人和接收人不可删除该记录') return super().perform_destroy(instance) @action(methods=['post'], detail=False, perms_map={'post': 'handover.create'}, serializer_class=GenHandoverSerializer) @transaction.atomic def gen_by_mlogs(self, request): """从生产日志生成交接记录 从生产日志生成交接记录 """ sr = GenHandoverSerializer(data=request.data) sr.is_valid(raise_exception=True) vdata = sr.validated_data user = request.user send_date, send_user, recive_dept, recive_user = vdata['send_date'], vdata[ 'send_user'], vdata['recive_dept'], vdata['recive_user'] for mlog in vdata['mlogs']: Handover.objects.create( send_date=send_date, send_user=send_user, recive_dept=recive_dept, recive_user=recive_user, send_dept=mlog.mgroup.belong_dept, batch=mlog.batch, material=mlog.material_out, count=mlog.count_real, count_eweight=mlog.count_real_eweight, mlog=mlog, create_by=user ) return Response()