From ccabd5a701a5b96ec53989c40b31ac7622bdda14 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 8 Oct 2021 16:31:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=94=9F=E6=88=90=E6=8E=92?= =?UTF-8?q?=E4=BA=A7=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/pm/migrations/0001_initial.py | 41 +++++++++ .../0002_alter_productionplan_count.py | 18 ++++ hb_server/apps/pm/migrations/__init__.py | 0 hb_server/apps/pm/models.py | 2 +- hb_server/apps/pm/serializers.py | 53 ++--------- hb_server/apps/pm/urls.py | 6 +- hb_server/apps/pm/views.py | 92 +++++++++---------- .../sam/migrations/0004_order_planed_count.py | 18 ++++ hb_server/apps/sam/views.py | 2 +- hb_server/server/settings.py | 3 +- hb_server/server/urls.py | 2 +- 11 files changed, 136 insertions(+), 101 deletions(-) create mode 100644 hb_server/apps/pm/migrations/0001_initial.py create mode 100644 hb_server/apps/pm/migrations/0002_alter_productionplan_count.py create mode 100644 hb_server/apps/pm/migrations/__init__.py create mode 100644 hb_server/apps/sam/migrations/0004_order_planed_count.py diff --git a/hb_server/apps/pm/migrations/0001_initial.py b/hb_server/apps/pm/migrations/0001_initial.py new file mode 100644 index 0000000..7f16d5a --- /dev/null +++ b/hb_server/apps/pm/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.6 on 2021-10-08 08:02 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0018_material_count'), + ('sam', '0004_order_planed_count'), + ] + + operations = [ + migrations.CreateModel( + name='ProductionPlan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.CharField(max_length=50, unique=True, verbose_name='编号')), + ('count', models.IntegerField(default=0, verbose_name='生产数量')), + ('start_date', models.DateField(verbose_name='计划开工日期')), + ('end_date', models.DateField(verbose_name='计划完工日期')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='productionplan_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('order', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sam.order', verbose_name='关联订单')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='生产产品')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='productionplan_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '生产计划', + 'verbose_name_plural': '生产计划', + }, + ), + ] diff --git a/hb_server/apps/pm/migrations/0002_alter_productionplan_count.py b/hb_server/apps/pm/migrations/0002_alter_productionplan_count.py new file mode 100644 index 0000000..6a41103 --- /dev/null +++ b/hb_server/apps/pm/migrations/0002_alter_productionplan_count.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-10-08 08:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='productionplan', + name='count', + field=models.IntegerField(default=1, verbose_name='生产数量'), + ), + ] diff --git a/hb_server/apps/pm/migrations/__init__.py b/hb_server/apps/pm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index ec6c77f..062e0f1 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -17,7 +17,7 @@ class ProductionPlan(CommonAModel): number = models.CharField('编号', max_length=50, unique=True) order = models.ForeignKey(Order, verbose_name='关联订单', null=True, blank=True, on_delete=models.SET_NULL) product = models.ForeignKey(Material, verbose_name='生产产品', on_delete=models.CASCADE) - count = models.IntegerField('生产数量', default=0) + count = models.IntegerField('生产数量', default=1) start_date = models.DateField('计划开工日期') end_date = models.DateField('计划完工日期') diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index 00efa54..6fc6e31 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -1,50 +1,15 @@ +from apps.pm.models import ProductionPlan from rest_framework import serializers +from apps.sam.serializers import OrderSerializer -from .models import Contract, Customer, Order -from apps.mtm.serializers import MaterialSimpleSerializer - -class CustomerSerializer(serializers.ModelSerializer): +class ProductionPlanCreateFromOrderSerializer(serializers.ModelSerializer): class Meta: - model = Customer - fields = '__all__' + model = ProductionPlan + fields = ['order', 'number', 'count', 'start_date', 'end_date'] -class CustomerCreateUpdateSerializer(serializers.ModelSerializer): +class ProductionPlanSerializer(serializers.ModelSerializer): + order_ = OrderSerializer(source='order', read_only=True) class Meta: - model = Customer - fields = ['name', 'address', 'contact', 'contact_phone', 'description'] - -class CustomerSimpleSerializer(serializers.ModelSerializer): - class Meta: - model = Customer - fields = ['id', 'name'] - -class ContractSerializer(serializers.ModelSerializer): - customer_ = CustomerSimpleSerializer(source='customer', read_only=True) - class Meta: - model = Contract - fields = '__all__' - -class ContractSimpleSerializer(serializers.ModelSerializer): - class Meta: - model = Contract - fields = ['id', 'name', 'number'] - -class ContractCreateUpdateSerializer(serializers.ModelSerializer): - class Meta: - model = Contract - fields = ['name', 'number', 'amount', 'customer', 'sign_date', 'description'] - - -class OrderCreateUpdateSerializer(serializers.ModelSerializer): - class Meta: - model = Order - fields = ['number', 'customer', 'contract', 'product', 'count', 'delivery_date'] - -class OrderSerializer(serializers.ModelSerializer): - contract_ = ContractSimpleSerializer(source='contract', read_only=True) - customer_ = CustomerSimpleSerializer(source='customer', read_only=True) - product_ = MaterialSimpleSerializer(source='product', read_only=True) - class Meta: - model = Order - fields = '__all__' + model = ProductionPlan + fields ='__all__' diff --git a/hb_server/apps/pm/urls.py b/hb_server/apps/pm/urls.py index 4aa607f..69e52f0 100644 --- a/hb_server/apps/pm/urls.py +++ b/hb_server/apps/pm/urls.py @@ -1,13 +1,11 @@ +from apps.pm.views import ProductionPlanViewSet from django.db.models import base from rest_framework import urlpatterns -from apps.sam.views import CustomerViewSet,ContractViewSet,OrderViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() -router.register('customer', CustomerViewSet, basename='customer') -router.register('contract', ContractViewSet, basename='contract') -router.register('order', OrderViewSet, basename='order') +router.register('productionplan', ProductionPlanViewSet, basename='productionplan') urlpatterns = [ path('', include(router.urls)), diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 8f66873..4745835 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -1,58 +1,52 @@ -from apps.sam.serializers import ContractCreateUpdateSerializer, ContractSerializer, CustomerCreateUpdateSerializer, CustomerSerializer, OrderCreateUpdateSerializer, OrderSerializer -from apps.sam.models import Contract, Customer, Order -from rest_framework.viewsets import ModelViewSet -from apps.system.mixins import CreateUpdateCustomMixin +from apps.system.mixins import CreateUpdateModelAMixin +from apps.pm.serializers import ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer +from rest_framework.mixins import CreateModelMixin, ListModelMixin +from apps.pm.models import ProductionPlan +from rest_framework.viewsets import GenericViewSet, ModelViewSet from django.shortcuts import render - +from apps.sam.models import Order +from rest_framework.exceptions import APIException +from rest_framework.response import Response # Create your views here. -class CustomerViewSet(CreateUpdateCustomMixin, ModelViewSet): + +def updateOrderPlanedCount(order): """ - 客户-增删改查 + 更新订单已排数量 + """ + planed_count = 0 + plans = ProductionPlan.objects.filter(order=order) + for i in plans: + planed_count = planed_count + i.count + order.planed_count = planed_count + order.save() + +class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModelMixin, GenericViewSet): + """ + 生产计划 """ perms_map = {'*': '*'} - queryset = Customer.objects.all() - serializer_class = CustomerSerializer - search_fields = ['name', 'contact'] + queryset = ProductionPlan.objects.select_related('order', 'order__contract') + serializer_class = ProductionPlanSerializer + search_fields = ['number'] filterset_fields = [] - ordering_fields = ['create_time'] - ordering = ['-create_time'] + ordering_fields = ['id'] + ordering = ['-id'] def get_serializer_class(self): - if self.action in ['create', 'update']: - return CustomerCreateUpdateSerializer - return CustomerSerializer + if self.action in ['create']: + return ProductionPlanCreateFromOrderSerializer + return ProductionPlanSerializer - -class ContractViewSet(CreateUpdateCustomMixin, ModelViewSet): - """ - 合同-增删改查 - """ - perms_map = {'*': '*'} - queryset = Contract.objects.select_related('customer').all() - serializer_class = ContractSerializer - search_fields = ['name'] - filterset_fields = [] - ordering_fields = ['create_time'] - ordering = ['-create_time'] - - def get_serializer_class(self): - if self.action in ['create', 'update']: - return ContractCreateUpdateSerializer - return ContractSerializer - -class OrderViewSet(CreateUpdateCustomMixin, ModelViewSet): - """ - 订单-增删改查 - """ - perms_map = {'*': '*'} - queryset = Order.objects.select_related('contract', 'customer').all() - serializer_class = OrderSerializer - search_fields = ['number', 'product'] - filterset_fields = [] - ordering_fields = ['create_time'] - ordering = ['-create_time'] - - def get_serializer_class(self): - if self.action in ['create', 'update']: - return OrderCreateUpdateSerializer - return OrderSerializer \ No newline at end of file + def create(self, request, *args, **kwargs): + data = request.data + serializer = self.get_serializer(data=data) + serializer.is_valid(raise_exception=True) + if data.get('order', None): + order = Order.objects.get(pk=data['order']) + if order.planed_count >= data['count'] or data['count'] > 0: + pass + else: + raise APIException('排产数量错误') + instance = serializer.save() + updateOrderPlanedCount(instance.order) + return Response() \ No newline at end of file diff --git a/hb_server/apps/sam/migrations/0004_order_planed_count.py b/hb_server/apps/sam/migrations/0004_order_planed_count.py new file mode 100644 index 0000000..df4b48a --- /dev/null +++ b/hb_server/apps/sam/migrations/0004_order_planed_count.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-10-08 07:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sam', '0003_contract_invoice'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='planed_count', + field=models.IntegerField(default=0, verbose_name='已排数量'), + ), + ] diff --git a/hb_server/apps/sam/views.py b/hb_server/apps/sam/views.py index d6fc571..f1f4be7 100644 --- a/hb_server/apps/sam/views.py +++ b/hb_server/apps/sam/views.py @@ -61,7 +61,7 @@ class OrderViewSet(CreateUpdateCustomMixin, ModelViewSet): @action(methods=['get'], detail=False, perms_map={'get':'*'}) def toplan(self, request, pk=None): - queryset = Order.objects.filter(count__gt=F('planed_count')) + queryset = Order.objects.filter(count__gt=F('planed_count')).order_by('-id') page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index 652d71e..b2e7755 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -54,7 +54,8 @@ INSTALLED_APPS = [ 'apps.mtm', 'apps.inm', 'apps.sam', - 'apps.qm' + 'apps.qm', + 'apps.pm' ] MIDDLEWARE = [ diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py index e27e660..af315af 100644 --- a/hb_server/server/urls.py +++ b/hb_server/server/urls.py @@ -67,7 +67,7 @@ urlpatterns = [ path('api/inm/', include('apps.inm.urls')), path('api/sam/', include('apps.sam.urls')), path('api/qm/', include('apps.qm.urls')), - + path('api/pm/', include('apps.pm.urls')), # 工具 path('api/utils/signature/', GenSignature.as_view()),