diff --git a/hb_server/apps/mtm/serializers.py b/hb_server/apps/mtm/serializers.py index 153971f..f00b95d 100644 --- a/hb_server/apps/mtm/serializers.py +++ b/hb_server/apps/mtm/serializers.py @@ -209,13 +209,13 @@ class RecordFormDetailSerializer(serializers.ModelSerializer): def get_form_fields(self, obj): serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False), many=True) - vdata = serializer.data + data = serializer.data if obj.type == RecordForm.RF_TYPE_TEST: - for i in vdata: + for i in data: if i['need_judge']: i['is_testok'] = False i['is_teskok_robot'] = False - return serializer.data + return data class RecordFormFieldCreateSerializer(serializers.ModelSerializer): diff --git a/hb_server/apps/sam/migrations/0008_alter_saleproduct_number.py b/hb_server/apps/sam/migrations/0008_alter_saleproduct_number.py new file mode 100644 index 0000000..72e87f2 --- /dev/null +++ b/hb_server/apps/sam/migrations/0008_alter_saleproduct_number.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.9 on 2021-12-06 06:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sam', '0007_saleproduct_remark'), + ] + + operations = [ + migrations.AlterField( + model_name='saleproduct', + name='number', + field=models.CharField(max_length=50, verbose_name='物品编号'), + ), + ] diff --git a/hb_server/apps/sam/models.py b/hb_server/apps/sam/models.py index 774b3ef..bb0fb8e 100644 --- a/hb_server/apps/sam/models.py +++ b/hb_server/apps/sam/models.py @@ -69,9 +69,6 @@ class Order(CommonAModel): class Meta: verbose_name = '订单信息' verbose_name_plural = verbose_name - - def __str__(self): - return self.name class Sale(CommonADModel): @@ -90,7 +87,7 @@ class SaleProduct(BaseModel): 具体产品 """ sale = models.ForeignKey(Sale, verbose_name='关联销售记录', on_delete=models.CASCADE) - number = models.CharField('物品编号', unique=True, max_length=50) + number = models.CharField('物品编号', max_length=50) iproduct = models.ForeignKey('inm.iproduct', verbose_name='关联库存产品', on_delete=models.CASCADE, related_name='sale_iproduct') is_mtested = models.BooleanField('是否军检', default=False) is_mtestok = models.BooleanField('是否军检合格', default=True) diff --git a/hb_server/apps/sam/serializers.py b/hb_server/apps/sam/serializers.py index 6f4bb6a..eb3a840 100644 --- a/hb_server/apps/sam/serializers.py +++ b/hb_server/apps/sam/serializers.py @@ -1,5 +1,5 @@ from django.db import transaction -from rest_framework import serializers +from rest_framework import exceptions, serializers from apps.inm.models import IProduct from apps.inm.serializers import IProductListSerializer @@ -71,22 +71,11 @@ class SaleCreateSerializer(serializers.ModelSerializer): if order.customer: attrs['customer'] = order.customer attrs['product'] = order.product + for i in attrs['iproducts']: + if i.material is not attrs['product']: + raise exceptions.APIException('产品选取错误') return super().validate(attrs) - @transaction.atomic - def create(self, validated_data): - iproducts = validated_data.pop('iproducts') - validated_data['count'] = len(iproducts) - sale = Sale.objects.create(**validated_data) - i_l = [] - for i in iproducts: - i_d ={} - i_d['sale'] = sale - i_d['number'] = i.number - i_d['iproduct'] = i - i_l.append(SaleProduct(**i_d)) - SaleProduct.objects.bulk_create(i_l) - return sale class SaleListSerializer(serializers.ModelSerializer): customer_ = CustomerSimpleSerializer(source='customer', read_only=True) diff --git a/hb_server/apps/sam/urls.py b/hb_server/apps/sam/urls.py index 2418046..7a66e01 100644 --- a/hb_server/apps/sam/urls.py +++ b/hb_server/apps/sam/urls.py @@ -1,6 +1,6 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet, SaleViewSet +from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet, SaleProductViewSet, SaleViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -9,6 +9,7 @@ router.register('customer', CustomerViewSet, basename='customer') router.register('contract', ContractViewSet, basename='contract') router.register('order', OrderViewSet, basename='order') router.register('sale', SaleViewSet, basename='sale') +router.register('sale_product', SaleProductViewSet, basename='sale_product') urlpatterns = [ path('', include(router.urls)), diff --git a/hb_server/apps/sam/views.py b/hb_server/apps/sam/views.py index e613147..624aa2d 100644 --- a/hb_server/apps/sam/views.py +++ b/hb_server/apps/sam/views.py @@ -1,5 +1,7 @@ +from django.db import transaction from rest_framework import exceptions, serializers from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin +from apps.inm.models import FIFO from apps.sam.serializers import ContractCreateUpdateSerializer, ContractSerializer, CustomerCreateUpdateSerializer, CustomerSerializer, OrderCreateUpdateSerializer, OrderSerializer, SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer, SaleProductMtestSerializer from apps.sam.models import Contract, Customer, Order, Sale, SaleProduct from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -8,6 +10,7 @@ from django.shortcuts import render from rest_framework.decorators import action from django.db.models import F from rest_framework.response import Response +from django.utils import timezone # Create your views here. class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet): """ @@ -90,8 +93,28 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C elif self.action == 'retrieve': return SaleListSerializer return super().get_serializer_class() - + + def create(self, request, *args, **kwargs): + data = request.data + serializer = SaleCreateSerializer(data=data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + with transaction.atomic(): + iproducts = vdata.pop('iproducts') + vdata['count'] = len(iproducts) + sale = Sale.objects.create(**vdata) + i_l = [] + for i in iproducts: + i_d ={} + i_d['sale'] = sale + i_d['number'] = i.number + i_d['iproduct'] = i + i_l.append(SaleProduct(**i_d)) + SaleProduct.objects.bulk_create(i_l) + return Response() + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) + @transaction.atomic def audit(self, request, pk=None): """ 审核 @@ -100,6 +123,19 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C if obj.is_audited: raise exceptions.APIException('已审核通过') # 创建出库记录 + fifo = FIFO() + fifo.type = FIFO.FIFO_TYPE_SALE_OUT + fifo.is_audited = True + fifo.auditor = request.user + fifo.inout_date = timezone.now() + fifo.save() + # 出库条目 + spds = SaleProduct.objects.filter(sale=obj) + for i in spds: + if i.is_mtested and i.is_mtestok: + pass + else: + raise exceptions.APIException('存在未军检产品') # 更新库存 return Response() diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 9d3b427..40b4b93 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -58,7 +58,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): elif request.method=='POST': serializer= PickHalfsSerializer(data=request.data) serializer.is_valid(raise_exception=True) - vdata = serializer.data + vdata = serializer.validated_data first_step = Step.objects.get(pk=sp.steps[0]['id']) # 创建领料记录 pick = Pick() @@ -68,12 +68,12 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): pick.save() for i in vdata: if 'wproducts' in i and len(i['wproducts'])>0: - spp = SubProductionProgress.objects.get(pk=i['id']) + spp = i['id'] spp.count_pick = spp.count_pick + len(i['wproducts']) # if spp.count_pick > spp.count: # raise exceptions.APIException('超过计划数') spp.save() - wps = WProduct.objects.filter(pk__in=[x for x in i['wproducts']], act_state=WProduct.WPR_ACT_STATE_OK) + wps = WProduct.objects.filter(pk__in=[x.id for x in i['wproducts']], act_state=WProduct.WPR_ACT_STATE_OK) wps.update(step=first_step, act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None, subproduction_plan=sp, update_by=request.user, update_time=timezone.now()) @@ -99,11 +99,11 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): """ serializer= WplanPutInSerializer(data=request.data) serializer.is_valid(raise_exception=True) - vdata = serializer.data + vdata = serializer.validated_data subplan = self.get_object() material = subplan.main_product batch = subplan.number - warehouse = WareHouse.objects.get(id=vdata['warehouse']) + warehouse = vdata['warehouse'] wproducts = WProduct.objects.filter(subproduction_plan=subplan, act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False) if wproducts.exists(): @@ -253,9 +253,9 @@ class WProductViewSet(ListModelMixin, GenericViewSet): """ serializer= WproductPutInsSerializer(data=request.data) serializer.is_valid(raise_exception=True) - vdata = serializer.data - wproducts = WProduct.objects.filter(pk__in=[x for x in vdata['wproducts']]) - warehouse = WareHouse.objects.get(id=vdata['warehouse']) + vdata = serializer.validated_data + wproducts = WProduct.objects.filter(pk__in=[x.id for x in vdata['wproducts']]) + warehouse = vdata['warehouse'] for i in wproducts: if i.act_state is not WProduct.WPR_ACT_STATE_OK: raise exceptions.APIException('存在不可入库半成品') @@ -267,12 +267,12 @@ class WProductViewSet(ListModelMixin, GenericViewSet): is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark) # 创建入库明细 for i in wproducts_a: - spi = SubProductionPlan.objects.get(pk=i['subproduction_plan']) + spi = i['subproduction_plan'] fifoitem = FIFOItem() fifoitem.is_tested = True fifoitem.is_testok = True fifoitem.warehouse = warehouse - fifoitem.material = Material.objects.get(pk=i['material']) + fifoitem.material = i['material'] fifoitem.count = i['total'] fifoitem.batch = spi.number fifoitem.fifo = fifo @@ -303,9 +303,9 @@ class WProductViewSet(ListModelMixin, GenericViewSet): """ serializer= WproductPutInSerializer(data=request.data) serializer.is_valid(raise_exception=True) - vdata = serializer.data + vdata = serializer.validated_data wproduct = self.get_object() - warehouse = WareHouse.objects.get(id=vdata['warehouse']) + warehouse = vdata['warehouse'] if wproduct.act_state != WProduct.WPR_ACT_STATE_OK: raise exceptions.APIException('半成品不可入库') material = wproduct.material @@ -598,11 +598,11 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): def submit(self, request, pk=None): serializer = OperationRecordSubmitSerializer(data=request.data, context={'request':self.request}) serializer.is_valid(raise_exception=True) - vdata = serializer.data + vdata = serializer.validated_data opr = self.get_object() wrds = [] for m in vdata['record_data']: # 保存记录详情 - form_field = RecordFormField.objects.get(pk=m['form_field']) + form_field = m['form_field'] m['form_field'] = form_field m['field_name'] = form_field.field_name m['field_key'] = form_field.field_key