Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop

This commit is contained in:
shijing 2021-12-06 15:31:29 +08:00
commit 769456c926
7 changed files with 79 additions and 38 deletions

View File

@ -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):

View File

@ -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='物品编号'),
),
]

View File

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

View File

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

View File

@ -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)),

View File

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

View File

@ -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