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): def get_form_fields(self, obj):
serializer = RecordFormFieldSerializer(instance=RecordFormField.objects.filter(form=obj, is_deleted=False), many=True) 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: if obj.type == RecordForm.RF_TYPE_TEST:
for i in vdata: for i in data:
if i['need_judge']: if i['need_judge']:
i['is_testok'] = False i['is_testok'] = False
i['is_teskok_robot'] = False i['is_teskok_robot'] = False
return serializer.data return data
class RecordFormFieldCreateSerializer(serializers.ModelSerializer): 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

@ -70,9 +70,6 @@ class Order(CommonAModel):
verbose_name = '订单信息' verbose_name = '订单信息'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Sale(CommonADModel): class Sale(CommonADModel):
""" """
@ -90,7 +87,7 @@ class SaleProduct(BaseModel):
具体产品 具体产品
""" """
sale = models.ForeignKey(Sale, verbose_name='关联销售记录', on_delete=models.CASCADE) 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') iproduct = models.ForeignKey('inm.iproduct', verbose_name='关联库存产品', on_delete=models.CASCADE, related_name='sale_iproduct')
is_mtested = models.BooleanField('是否军检', default=False) is_mtested = models.BooleanField('是否军检', default=False)
is_mtestok = models.BooleanField('是否军检合格', default=True) is_mtestok = models.BooleanField('是否军检合格', default=True)

View File

@ -1,5 +1,5 @@
from django.db import transaction 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.models import IProduct
from apps.inm.serializers import IProductListSerializer from apps.inm.serializers import IProductListSerializer
@ -71,22 +71,11 @@ class SaleCreateSerializer(serializers.ModelSerializer):
if order.customer: if order.customer:
attrs['customer'] = order.customer attrs['customer'] = order.customer
attrs['product'] = order.product attrs['product'] = order.product
for i in attrs['iproducts']:
if i.material is not attrs['product']:
raise exceptions.APIException('产品选取错误')
return super().validate(attrs) 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): class SaleListSerializer(serializers.ModelSerializer):
customer_ = CustomerSimpleSerializer(source='customer', read_only=True) customer_ = CustomerSimpleSerializer(source='customer', read_only=True)

View File

@ -1,6 +1,6 @@
from django.db.models import base from django.db.models import base
from rest_framework import urlpatterns 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 django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
@ -9,6 +9,7 @@ router.register('customer', CustomerViewSet, basename='customer')
router.register('contract', ContractViewSet, basename='contract') router.register('contract', ContractViewSet, basename='contract')
router.register('order', OrderViewSet, basename='order') router.register('order', OrderViewSet, basename='order')
router.register('sale', SaleViewSet, basename='sale') router.register('sale', SaleViewSet, basename='sale')
router.register('sale_product', SaleProductViewSet, basename='sale_product')
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),

View File

@ -1,5 +1,7 @@
from django.db import transaction
from rest_framework import exceptions, serializers from rest_framework import exceptions, serializers
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin 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.serializers import ContractCreateUpdateSerializer, ContractSerializer, CustomerCreateUpdateSerializer, CustomerSerializer, OrderCreateUpdateSerializer, OrderSerializer, SaleCreateSerializer, SaleListSerializer, SaleProductCreateSerializer, SaleProductListSerializer, SaleProductMtestSerializer
from apps.sam.models import Contract, Customer, Order, Sale, SaleProduct from apps.sam.models import Contract, Customer, Order, Sale, SaleProduct
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.viewsets import GenericViewSet, ModelViewSet
@ -8,6 +10,7 @@ from django.shortcuts import render
from rest_framework.decorators import action from rest_framework.decorators import action
from django.db.models import F from django.db.models import F
from rest_framework.response import Response from rest_framework.response import Response
from django.utils import timezone
# Create your views here. # Create your views here.
class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet): class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet):
""" """
@ -91,7 +94,27 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C
return SaleListSerializer return SaleListSerializer
return super().get_serializer_class() 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) @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer)
@transaction.atomic
def audit(self, request, pk=None): def audit(self, request, pk=None):
""" """
审核 审核
@ -100,6 +123,19 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C
if obj.is_audited: if obj.is_audited:
raise exceptions.APIException('已审核通过') 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() return Response()

View File

@ -58,7 +58,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
elif request.method=='POST': elif request.method=='POST':
serializer= PickHalfsSerializer(data=request.data) serializer= PickHalfsSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.validated_data
first_step = Step.objects.get(pk=sp.steps[0]['id']) first_step = Step.objects.get(pk=sp.steps[0]['id'])
# 创建领料记录 # 创建领料记录
pick = Pick() pick = Pick()
@ -68,12 +68,12 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
pick.save() pick.save()
for i in vdata: for i in vdata:
if 'wproducts' in i and len(i['wproducts'])>0: 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']) spp.count_pick = spp.count_pick + len(i['wproducts'])
# if spp.count_pick > spp.count: # if spp.count_pick > spp.count:
# raise exceptions.APIException('超过计划数') # raise exceptions.APIException('超过计划数')
spp.save() 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, wps.update(step=first_step,
act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None, act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None,
subproduction_plan=sp, update_by=request.user, update_time=timezone.now()) 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= WplanPutInSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.validated_data
subplan = self.get_object() subplan = self.get_object()
material = subplan.main_product material = subplan.main_product
batch = subplan.number batch = subplan.number
warehouse = WareHouse.objects.get(id=vdata['warehouse']) warehouse = vdata['warehouse']
wproducts = WProduct.objects.filter(subproduction_plan=subplan, wproducts = WProduct.objects.filter(subproduction_plan=subplan,
act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False) act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False)
if wproducts.exists(): if wproducts.exists():
@ -253,9 +253,9 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
""" """
serializer= WproductPutInsSerializer(data=request.data) serializer= WproductPutInsSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.validated_data
wproducts = WProduct.objects.filter(pk__in=[x for x in vdata['wproducts']]) wproducts = WProduct.objects.filter(pk__in=[x.id for x in vdata['wproducts']])
warehouse = WareHouse.objects.get(id=vdata['warehouse']) warehouse = vdata['warehouse']
for i in wproducts: for i in wproducts:
if i.act_state is not WProduct.WPR_ACT_STATE_OK: if i.act_state is not WProduct.WPR_ACT_STATE_OK:
raise exceptions.APIException('存在不可入库半成品') 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) is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark)
# 创建入库明细 # 创建入库明细
for i in wproducts_a: for i in wproducts_a:
spi = SubProductionPlan.objects.get(pk=i['subproduction_plan']) spi = i['subproduction_plan']
fifoitem = FIFOItem() fifoitem = FIFOItem()
fifoitem.is_tested = True fifoitem.is_tested = True
fifoitem.is_testok = True fifoitem.is_testok = True
fifoitem.warehouse = warehouse fifoitem.warehouse = warehouse
fifoitem.material = Material.objects.get(pk=i['material']) fifoitem.material = i['material']
fifoitem.count = i['total'] fifoitem.count = i['total']
fifoitem.batch = spi.number fifoitem.batch = spi.number
fifoitem.fifo = fifo fifoitem.fifo = fifo
@ -303,9 +303,9 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
""" """
serializer= WproductPutInSerializer(data=request.data) serializer= WproductPutInSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.validated_data
wproduct = self.get_object() wproduct = self.get_object()
warehouse = WareHouse.objects.get(id=vdata['warehouse']) warehouse = vdata['warehouse']
if wproduct.act_state != WProduct.WPR_ACT_STATE_OK: if wproduct.act_state != WProduct.WPR_ACT_STATE_OK:
raise exceptions.APIException('半成品不可入库') raise exceptions.APIException('半成品不可入库')
material = wproduct.material material = wproduct.material
@ -598,11 +598,11 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
def submit(self, request, pk=None): def submit(self, request, pk=None):
serializer = OperationRecordSubmitSerializer(data=request.data, context={'request':self.request}) serializer = OperationRecordSubmitSerializer(data=request.data, context={'request':self.request})
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
vdata = serializer.data vdata = serializer.validated_data
opr = self.get_object() opr = self.get_object()
wrds = [] wrds = []
for m in vdata['record_data']: # 保存记录详情 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['form_field'] = form_field
m['field_name'] = form_field.field_name m['field_name'] = form_field.field_name
m['field_key'] = form_field.field_key m['field_key'] = form_field.field_key