diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index a77694f..a537ae9 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -22,6 +22,13 @@ class ResourceCalSerializer(serializers.Serializer): id = serializers.IntegerField(label='产品ID') count = serializers.IntegerField(label='生产数量') +class ResourceConvertSerializer(serializers.Serializer): + id = serializers.IntegerField(label='半成品ID') + count = serializers.IntegerField(label='折合数量') + +class ResourceConvertListSerializer(serializers.ListSerializer): + child = ResourceConvertSerializer() + class ResourceCalListSerializer(serializers.ListSerializer): child = ResourceCalSerializer() diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 21967b1..28e9c3d 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -10,7 +10,7 @@ from apps.inm.serializers import MaterialBatchSerializer from apps.mtm.models import Material, Step, SubProduction, SubprodctionMaterial from apps.pm.filters import PlanFilterSet, SubproductionProgressFilterSet from apps.system.mixins import CreateUpdateModelAMixin -from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer +from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, PlanDestorySerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, ResourceConvertListSerializer, ResourceConvertSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from apps.pm.models import ProductionPlan, SubProductionProgress, SubProductionPlan from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -216,30 +216,90 @@ class ResourceViewSet(GenericViewSet): rdata = request.data serializer = self.get_serializer(data=rdata) serializer.is_valid(raise_exception=True) + productIdList = [] + productList = [] + for i in rdata: + if i['id'] not in productIdList: + productIdList.append(i['id']) + productList.append(i) + else: + index = productIdList.index(i['id']) + productList[index]['count'] = productList[index]['count'] + i['count'] + res_d_list = [] res = [] - for i in rdata: + for i in productList: # 计算输入物料 materials = SubprodctionMaterial.objects.filter(subproduction__product__id=i['id'], subproduction__is_deleted=False, is_deleted=False, - material__type__in=[Material.MA_TYPE_MAINSO, - Material.MA_TYPE_HELPSO], type= SubprodctionMaterial.SUB_MA_TYPE_IN).order_by('material__number')\ + type= SubprodctionMaterial.SUB_MA_TYPE_IN).order_by('material__number')\ .values('material__id', 'material__name', 'material__number', 'material__type', 'count', 'material__count', 'material__count_safe') l_m = list(materials) for m in l_m: if m['material__id'] in res_d_list: - index = res_d_list.index(m['material__id']) - res[index]['count'] = res[index]['count'] + m['count']*i['count'] + if m['material__type'] in [Material.MA_TYPE_MAINSO, Material.MA_TYPE_HELPSO]: + index = res_d_list.index(m['material__id']) + res[index]['count'] = res[index]['count'] + m['count']*i['count'] else: res_d_list.append(m['material__id']) - res.append({'id':m['material__id'], 'name':m['material__name'], + item = {'id':m['material__id'], 'name':m['material__name'], 'type':m['material__type'], 'number':m['material__number'], - 'count':m['count']*i['count'], 'inv_count':m['material__count'], - 'count_safe':m['material__count_safe']}) + 'count': None,'inv_count':m['material__count'], + 'count_safe':m['material__count_safe']} + if item['type'] in [Material.MA_TYPE_MAINSO, Material.MA_TYPE_HELPSO]: + item['count'] = m['count']*i['count'] + res.append(item) return Response(res) + @action(methods=['post'], detail=False, perms_map={'post':'resource_cal'}, serializer_class=ResourceConvertListSerializer) + def convert(self, request, pk=None): + rdata = request.data + serializer = self.get_serializer(data=rdata) + serializer.is_valid(raise_exception=True) + res_d_list = [] + res = [] + half_list = rdata + while half_list: + fitem = half_list[0] + sm = SubprodctionMaterial.objects.filter( + type= SubprodctionMaterial.SUB_MA_TYPE_OUT, + is_deleted = False, + material__id = fitem['id'] + ).first() + if sm: + spn = sm.subproduction + sm_left_l = list(SubprodctionMaterial.objects.filter( + subproduction = spn, + type= SubprodctionMaterial.SUB_MA_TYPE_IN, + is_deleted = False, + ).order_by('material__number')\ + .values('material__id', 'material__name', + 'material__number', 'material__type', + 'count', 'material__count', 'material__count_safe')) + + for i in sm_left_l: + if i['material__type'] == Material.MA_TYPE_HALFGOOD: + item = { + 'id':i['material__id'], + 'count':(i['count']*fitem['count'])/(sm.count) + } + half_list.append(item) + else: + if i['material__id'] in res_d_list: + index = res_d_list.index(i['material__id']) + res[index]['count'] = res[index]['count'] + \ + (i['count']*fitem['count'])/(sm.count) + else: + res_d_list.append(i['material__id']) + item = { + 'id': i['material__id'], + 'count':(i['count']*fitem['count'])/(sm.count) + } + res.append(item) + del(half_list[0]) + return Response(res) @action(methods=['post'], detail=False, perms_map={'post':'resource_cal_equip'}, serializer_class=ResourceCalListSerializer) def cal_equip(self, request, pk=None): @@ -256,4 +316,4 @@ class ResourceViewSet(GenericViewSet): steps = Step.objects.filter(usedstep__is_deleted=False, usedstep__subproduction__in=subproductions) equips = Equipment.objects.filter(step_equips__in=steps, is_deleted=False).distinct() serializer = EquipmentSimpleSerializer(instance=equips, many=True) - return Response(serializer.data) + return Response(serializer.data) \ No newline at end of file