订单生成排产计划
This commit is contained in:
parent
33efd80d99
commit
ccabd5a701
|
|
@ -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': '生产计划',
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -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='生产数量'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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('计划完工日期')
|
||||
|
||||
|
|
|
|||
|
|
@ -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__'
|
||||
|
||||
class CustomerCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
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
|
||||
model = ProductionPlan
|
||||
fields = ['order', 'number', 'count', 'start_date', 'end_date']
|
||||
|
||||
class ProductionPlanSerializer(serializers.ModelSerializer):
|
||||
order_ = OrderSerializer(source='order', read_only=True)
|
||||
class Meta:
|
||||
model = ProductionPlan
|
||||
fields ='__all__'
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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()
|
||||
|
|
@ -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='已排数量'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -54,7 +54,8 @@ INSTALLED_APPS = [
|
|||
'apps.mtm',
|
||||
'apps.inm',
|
||||
'apps.sam',
|
||||
'apps.qm'
|
||||
'apps.qm',
|
||||
'apps.pm'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
|
|
|||
|
|
@ -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()),
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue