Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop
This commit is contained in:
commit
769456c926
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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='物品编号'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -69,9 +69,6 @@ class Order(CommonAModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)),
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
@ -90,8 +93,28 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C
|
||||||
elif self.action == 'retrieve':
|
elif self.action == 'retrieve':
|
||||||
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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue