From 3bd4cb014e67cb17f79be0078a06539c61ea3ada Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 27 Oct 2021 13:17:01 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0005_auto_20211025_1533.py | 86 +++++++++++++++++++ .../inm/migrations/0006_auto_20211027_0941.py | 26 ++++++ hb_server/apps/inm/models.py | 29 +++++-- hb_server/apps/inm/serializers.py | 52 ++++++++++- hb_server/apps/inm/urls.py | 3 +- hb_server/apps/inm/views.py | 23 ++++- .../pm/migrations/0007_auto_20211025_1533.py | 23 +++++ hb_server/server/settings.py | 2 +- 8 files changed, 231 insertions(+), 13 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0005_auto_20211025_1533.py create mode 100644 hb_server/apps/inm/migrations/0006_auto_20211027_0941.py create mode 100644 hb_server/apps/pm/migrations/0007_auto_20211025_1533.py diff --git a/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py b/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py new file mode 100644 index 0000000..be966a8 --- /dev/null +++ b/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py @@ -0,0 +1,86 @@ +# Generated by Django 3.2.6 on 2021-10-25 07:33 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wpm', '__first__'), + ('mtm', '0025_outputmaterial_is_main'), + ('pm', '0007_auto_20211025_1533'), + ('inm', '0004_auto_20210929_0842'), + ] + + operations = [ + migrations.AddField( + model_name='fifo', + name='inout_date', + field=models.DateField(default=django.utils.timezone.now, verbose_name='出入库日期'), + preserve_default=False, + ), + migrations.AddField( + model_name='fifo', + name='operator', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='system.user', verbose_name='操作人'), + preserve_default=False, + ), + migrations.AddField( + model_name='fifo', + name='subproduction_plan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='pm.subproductionplan', verbose_name='关联子生产计划'), + ), + migrations.AddField( + model_name='fifo', + name='warehouse', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='inm.warehouse', verbose_name='仓库'), + preserve_default=False, + ), + migrations.AlterField( + model_name='materialbatch', + name='batch', + field=models.CharField(blank=True, max_length=100, null=True, unique=True, verbose_name='批次号'), + ), + migrations.CreateModel( + name='IProduct', + 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='删除标记')), + ('state', models.IntegerField(default=1, verbose_name='物品状态')), + ('number', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='物品编号')), + ('batch', models.CharField(blank=True, max_length=100, null=True, verbose_name='所属批次号')), + ('fifos', models.JSONField(blank=True, default=list, verbose_name='关联出入库记录')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='iproduct_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('d_product', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='wpm.product', verbose_name='关联的动态产品')), + ('material', 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='iproduct_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ('warehouse', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inm.warehouse', verbose_name='所在仓库')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='FIFODetail', + 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='删除标记')), + ('count', models.IntegerField(default=0, verbose_name='数量')), + ('batch', models.CharField(blank=True, max_length=100, null=True, verbose_name='批次号')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fifodetail_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('material', 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='fifodetail_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py b/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py new file mode 100644 index 0000000..d637e16 --- /dev/null +++ b/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.6 on 2021-10-27 01:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('wpm', '__first__'), + ('inm', '0005_auto_20211025_1533'), + ] + + operations = [ + migrations.AddField( + model_name='fifodetail', + name='fifo', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='inm.fifo', verbose_name='关联出入库'), + preserve_default=False, + ), + migrations.AlterField( + model_name='iproduct', + name='d_product', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.product', verbose_name='关联的动态产品'), + ), + ] diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 767745b..d2c6472 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -41,7 +41,7 @@ class MaterialBatch(BaseModel): material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息') warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') count = models.IntegerField('存量', default=0) - batch = models.CharField('批次号', max_length=100, null=True, blank=True) + batch = models.CharField('批次号', max_length=100, null=True, blank=True, unique=True) expiration_date = models.DateField('有效期', null=True, blank=True) class Meta: verbose_name = '库存表' @@ -60,22 +60,37 @@ class FIFO(CommonAModel): (4, '生产入库') ) type = models.IntegerField('出入库类型', default=1) + warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='仓库') operator = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.DO_NOTHING, null=True, blank=True) + inout_date = models.DateField('出入库日期') -# class FIFODetail(CommonAModel): -# """ -# 领料详细记录 -# """ -class Product(CommonAModel): +class FIFODetail(BaseModel): """ - 具体产品 + 出入库详细记录 """ + material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) + count = models.IntegerField('数量', default=0) + batch = models.CharField('批次号', max_length=100, null=True, blank=True) + fifo = models.ForeignKey(FIFO, verbose_name='关联出入库', on_delete=models.CASCADE) + + +class IProduct(BaseModel): + """ + 具体产品条目 + """ + inm_product_state_choices = ( + (1, '可用'), + (2, '锁定'), + (3, '已消耗') + ) + state = models.IntegerField('物品状态', default=1) number = models.CharField('物品编号', unique=True, null=True, blank=True, max_length=50) material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') batch = models.CharField('所属批次号', max_length=100, null=True, blank=True) + d_product = models.ForeignKey('wpm.product', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False, null=True, blank=True) fifos = models.JSONField('关联出入库记录', default=list, blank=True) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 808f470..926d19c 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from apps.inm.models import WareHouse,Inventory +from apps.inm.models import FIFO, FIFODetail, IProduct, WareHouse,Inventory from apps.system.serializers import UserSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer @@ -32,3 +32,53 @@ class InventoryCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = Inventory fields = ['material', 'count', 'warehouse'] + +class IProductInPurSerializer(serializers.ModelSerializer): + class Meta: + model = IProduct + fields = ['number'] + +class FIFODetailInPurSerializer(serializers.ModelSerializer): + details = IProductInPurSerializer(many=True, required=False) + class Meta: + model = FIFODetail + fields = ['material', 'count', 'batch', 'details'] + +class FIFOInPurSerializer(serializers.ModelSerializer): + """ + 采购入库序列化 + """ + details = FIFODetailInPurSerializer(many=True) + class Meta: + model = FIFO + fields = ['warehouse', 'operator', 'details', 'inout_date'] + + def create(self, validated_data): + details = validated_data.pop('details') + if len(details)>0: + pass + else: + raise serializers.ValidationError('没有入库内容') + validated_data['type'] = 3 + obj = FIFO(**validated_data) + obj.save() + for i in details: + if 'details' in i: + p_details = i.pop('details') + if len(p_details) != i['count']: + raise serializers.ValidationError('数目对不上') + else: + serialier = FIFODetailInPurSerializer(data=i) + fifod = serialier.save(fifo=obj) + p_list = [] + for x in p_details: + x['state'] = 1 + x['material'] = i['material'] + x['warehouse'] = validated_data['warehouse'] + x['batch'] = i['batch'] + x['fifos'] = [fifod.id] + p_list.append(IProduct(**x)) + IProduct.objects.bulk_create(p_list) + else: + serialier = FIFODetailInPurSerializer(data=i) + serialier.save(fifo=obj) \ No newline at end of file diff --git a/hb_server/apps/inm/urls.py b/hb_server/apps/inm/urls.py index d680958..851ccc8 100644 --- a/hb_server/apps/inm/urls.py +++ b/hb_server/apps/inm/urls.py @@ -1,12 +1,13 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.inm.views import WarehouseViewSet,InventoryViewSet +from apps.inm.views import FIFOViewSet, WarehouseViewSet,InventoryViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('warehouse', WarehouseViewSet, basename='warehouse') router.register('inventory', InventoryViewSet, basename='inventory') +router.register('fifo', FIFOViewSet, basename='fifo') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index e8e8754..3e292b1 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -1,11 +1,12 @@ from django.shortcuts import render +from rest_framework import serializers from rest_framework.mixins import ListModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.models import WareHouse,Inventory -from apps.inm.serializers import WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer,InventoryCreateUpdateSerializer +from apps.inm.serializers import FIFOInPurSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer,InventoryCreateUpdateSerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin - +from rest_framework.decorators import action # Create your views here. class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet): @@ -27,11 +28,27 @@ class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet): class InventoryViewSet(ListModelMixin, GenericViewSet): """ - 物料基本信息-增删改查 + 仓库物料表 """ perms_map = {'*': '*'} queryset = Inventory.objects.select_related('create_by').all() serializer_class = InventorySerializer filterset_fields = [] + search_fields = ['material', 'warehouse'] ordering_fields = ['create_time'] ordering = ['-create_time'] + +class FIFOViewSet(GenericViewSet): + """ + 出入库记录 + """ + perms_map = {'*': '*'} + @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=FIFOInPurSerializer) + def in_pur(self, request, pk=None): + """ + 采购入库 + """ + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + \ No newline at end of file diff --git a/hb_server/apps/pm/migrations/0007_auto_20211025_1533.py b/hb_server/apps/pm/migrations/0007_auto_20211025_1533.py new file mode 100644 index 0000000..8676cdb --- /dev/null +++ b/hb_server/apps/pm/migrations/0007_auto_20211025_1533.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-10-25 07:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0006_alter_subproductionprogress_count_real'), + ] + + operations = [ + migrations.AddField( + model_name='subproductionplan', + name='end_date_real', + field=models.DateField(blank=True, null=True, verbose_name='实际完工日期'), + ), + migrations.AddField( + model_name='subproductionplan', + name='start_date_real', + field=models.DateField(blank=True, null=True, verbose_name='实际开工日期'), + ), + ] diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index 7d1174e..f2e54e5 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -57,7 +57,7 @@ INSTALLED_APPS = [ 'apps.sam', 'apps.qm', 'apps.pm', - # 'apps.wpm' + 'apps.wpm' ] MIDDLEWARE = [ From 616ebdac4ef4347b8ca2b8511d8882500717249a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 09:46:26 +0800 Subject: [PATCH 02/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/apps.py | 3 ++- hb_server/apps/inm/models.py | 1 + hb_server/apps/inm/serializers.py | 3 ++- hb_server/apps/inm/signals.py | 24 ++++++++++++++++++++++++ hb_server/apps/pm/models.py | 3 ++- hb_server/apps/pm/serializers.py | 2 +- hb_server/apps/pm/views.py | 10 ++++++++++ hb_server/apps/wpm/models.py | 2 ++ hb_server/apps/wpm/serializers.py | 2 ++ 9 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 hb_server/apps/inm/signals.py diff --git a/hb_server/apps/inm/apps.py b/hb_server/apps/inm/apps.py index d3d3680..25c889c 100644 --- a/hb_server/apps/inm/apps.py +++ b/hb_server/apps/inm/apps.py @@ -4,4 +4,5 @@ class InmConfig(AppConfig): name = 'apps.inm' verbose_name = '库存管理' - + def ready(self): + import apps.inm.signals diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index d2c6472..03d6b72 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -64,6 +64,7 @@ class FIFO(CommonAModel): operator = models.ForeignKey(User, verbose_name='操作人', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.DO_NOTHING, null=True, blank=True) inout_date = models.DateField('出入库日期') + remark = models.CharField('备注', max_length=1000, default='') class FIFODetail(BaseModel): diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 926d19c..9e48e5c 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -81,4 +81,5 @@ class FIFOInPurSerializer(serializers.ModelSerializer): IProduct.objects.bulk_create(p_list) else: serialier = FIFODetailInPurSerializer(data=i) - serialier.save(fifo=obj) \ No newline at end of file + fifod = serialier.save(fifo=obj) + diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py new file mode 100644 index 0000000..26809eb --- /dev/null +++ b/hb_server/apps/inm/signals.py @@ -0,0 +1,24 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from apps.inm.models import FIFODetail, Inventory, MaterialBatch + + +@receiver(post_save, sender=FIFODetail) +def create_user(sender, instance, created, **kwargs): + if created: + fifo = instance.fifo + material = instance.material + warehouse = fifo.warehouse + if fifo.type in [3]: # 采购入库 + # 更新相关表 + o1 = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ + defaults={'material':material, 'warehouse':warehouse, 'count':0}) + o1.count = o1.count + instance.count + o1.save() + o2 = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=instance.batch,\ + defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':instance.batch}) + o2.save() + material.count = material.count + 1 + material.save() + diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index cdfb9bc..55a53c5 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -54,7 +54,7 @@ class SubProductionPlan(CommonAModel): class SubProductionProgress(BaseModel): """ - 子计划生产进度统计表 + 子计划生产进度统计表/物料消耗 """ type_choices=( (1, '输入物料'), @@ -65,3 +65,4 @@ class SubProductionProgress(BaseModel): type = models.IntegerField('物料应用类型', default=1) count = models.IntegerField('应出入数') count_real = models.IntegerField('实际出入数', default=0) + count_current = models.IntegerField('当前数量', default=0) diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index e117b8b..85d1286 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -43,4 +43,4 @@ class SubProductionProgressSerializer(serializers.ModelSerializer): material_ = MaterialSimpleSerializer(source='material', read_only=True) class Meta: model = SubProductionProgress - fields = '__all__' \ No newline at end of file + fields = '__all__' diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index a7a21f0..054b113 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -136,6 +136,16 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo obj.save() return Response() raise APIException('计划状态有误') + + @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer) + def pick_need(self, request, pk=None): + """ + 领料需求清单 + """ + obj = self.get_object() + instance = SubProductionProgress.objects.filter(subproduction_plan=obj, type=1) + serializer = SubProductionProgressSerializer(instance=instance, many=True) + return Response(serializer.data) class ResourceViewSet(GenericViewSet): diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 18a95f5..c3e2c6e 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -2,6 +2,7 @@ from django.db import models from django.db.models.base import Model import django.utils.timezone as timezone from django.db.models.query import QuerySet +from apps.pm.models import SubProductionPlan from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords @@ -22,6 +23,7 @@ class Product(CommonAModel): act_state = models.IntegerField('进行状态', default=0) parent = models.ForeignKey('self', verbose_name='上一级', on_delete=models.CASCADE, db_constraint=False) remark = models.CharField('备注', max_length=200, null=True, blank=True) + subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE) class ProductForm(CommonAModel): """ diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 697569a..4636454 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -1,2 +1,4 @@ +from rest_framework import serializers from rest_framework.serializers import ModelSerializer + From 189e9de67f88454fd377b78e353429c76bebe7b8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 10:36:30 +0800 Subject: [PATCH 03/27] inventory bug --- hb_server/apps/inm/serializers.py | 4 ---- hb_server/apps/inm/views.py | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 9e48e5c..88b1e49 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -28,10 +28,6 @@ class InventorySerializer(serializers. ModelSerializer): model = Inventory fields = '__all__' -class InventoryCreateUpdateSerializer(serializers.ModelSerializer): - class Meta: - model = Inventory - fields = ['material', 'count', 'warehouse'] class IProductInPurSerializer(serializers.ModelSerializer): class Meta: diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 3e292b1..85b1ace 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -4,7 +4,7 @@ from rest_framework.mixins import ListModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.inm.models import WareHouse,Inventory -from apps.inm.serializers import FIFOInPurSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer,InventoryCreateUpdateSerializer +from apps.inm.serializers import FIFOInPurSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action @@ -31,7 +31,7 @@ class InventoryViewSet(ListModelMixin, GenericViewSet): 仓库物料表 """ perms_map = {'*': '*'} - queryset = Inventory.objects.select_related('create_by').all() + queryset = Inventory.objects.select_related('material', 'warehouse').all() serializer_class = InventorySerializer filterset_fields = [] search_fields = ['material', 'warehouse'] From c33418f7f5e33077fddbee418a5e74a3341e9531 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:35:15 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inm/migrations/0007_auto_20211028_1331.py | 34 +++++++++++++++++++ hb_server/apps/inm/serializers.py | 2 ++ hb_server/apps/wpm/models.py | 4 +++ 3 files changed, 40 insertions(+) create mode 100644 hb_server/apps/inm/migrations/0007_auto_20211028_1331.py diff --git a/hb_server/apps/inm/migrations/0007_auto_20211028_1331.py b/hb_server/apps/inm/migrations/0007_auto_20211028_1331.py new file mode 100644 index 0000000..d1df175 --- /dev/null +++ b/hb_server/apps/inm/migrations/0007_auto_20211028_1331.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.6 on 2021-10-28 05:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0006_auto_20211027_0941'), + ] + + operations = [ + migrations.RemoveField( + model_name='fifodetail', + name='create_by', + ), + migrations.RemoveField( + model_name='fifodetail', + name='update_by', + ), + migrations.RemoveField( + model_name='iproduct', + name='create_by', + ), + migrations.RemoveField( + model_name='iproduct', + name='update_by', + ), + migrations.AddField( + model_name='fifo', + name='remark', + field=models.CharField(default='', max_length=1000, verbose_name='备注'), + ), + ] diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 88b1e49..f2b3b25 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -65,6 +65,7 @@ class FIFOInPurSerializer(serializers.ModelSerializer): raise serializers.ValidationError('数目对不上') else: serialier = FIFODetailInPurSerializer(data=i) + serialier.is_valid(raise_exception=True) fifod = serialier.save(fifo=obj) p_list = [] for x in p_details: @@ -77,5 +78,6 @@ class FIFOInPurSerializer(serializers.ModelSerializer): IProduct.objects.bulk_create(p_list) else: serialier = FIFODetailInPurSerializer(data=i) + serialier.is_valid(raise_exception=True) fifod = serialier.save(fifo=obj) diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index c3e2c6e..d4d0ab3 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -8,6 +8,10 @@ from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material, Step, RecordForm +class WorkshopInm(): + """ + 车间库存 + """ class Product(CommonAModel): """ 产品(所有生产过程中出现过的) From 2999ebb5f0dcf3823d7f4d88b93cd9a9b5bca3ec Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:41:42 +0800 Subject: [PATCH 05/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/serializers.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index f2b3b25..40bf3f9 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -64,9 +64,8 @@ class FIFOInPurSerializer(serializers.ModelSerializer): if len(p_details) != i['count']: raise serializers.ValidationError('数目对不上') else: - serialier = FIFODetailInPurSerializer(data=i) - serialier.is_valid(raise_exception=True) - fifod = serialier.save(fifo=obj) + i['fifo'] = obj + FIFODetail.objects.create(**i) p_list = [] for x in p_details: x['state'] = 1 @@ -77,7 +76,6 @@ class FIFOInPurSerializer(serializers.ModelSerializer): p_list.append(IProduct(**x)) IProduct.objects.bulk_create(p_list) else: - serialier = FIFODetailInPurSerializer(data=i) - serialier.is_valid(raise_exception=True) - fifod = serialier.save(fifo=obj) + i['fifo'] = obj + FIFODetail.objects.create(**i) From 1ab3b4eb7adffd7bbc08a8ba744b7addcc7c6a74 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:44:29 +0800 Subject: [PATCH 06/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/signals.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 26809eb..bbc9ec3 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -5,14 +5,14 @@ from apps.inm.models import FIFODetail, Inventory, MaterialBatch @receiver(post_save, sender=FIFODetail) -def create_user(sender, instance, created, **kwargs): +def update_by_fifodetail(sender, instance, created, **kwargs): if created: fifo = instance.fifo material = instance.material warehouse = fifo.warehouse if fifo.type in [3]: # 采购入库 # 更新相关表 - o1 = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ + o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ defaults={'material':material, 'warehouse':warehouse, 'count':0}) o1.count = o1.count + instance.count o1.save() From b6d97a1be178afa58a63dea4d7c7957796d7ecfe Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:44:57 +0800 Subject: [PATCH 07/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index bbc9ec3..b96b416 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -16,7 +16,7 @@ def update_by_fifodetail(sender, instance, created, **kwargs): defaults={'material':material, 'warehouse':warehouse, 'count':0}) o1.count = o1.count + instance.count o1.save() - o2 = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=instance.batch,\ + o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=instance.batch,\ defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':instance.batch}) o2.save() material.count = material.count + 1 From c40dfa7647531f1cd062ee08b941671bf469617f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:47:36 +0800 Subject: [PATCH 08/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 85b1ace..b15896b 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -50,5 +50,5 @@ class FIFOViewSet(GenericViewSet): """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) - serializer.save() + serializer.save(create_by=request.user) \ No newline at end of file From f7df60e7b5ef4aa78e945818965393eb639d0e80 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 13:50:06 +0800 Subject: [PATCH 09/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/serializers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 40bf3f9..4bb23a2 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -65,7 +65,7 @@ class FIFOInPurSerializer(serializers.ModelSerializer): raise serializers.ValidationError('数目对不上') else: i['fifo'] = obj - FIFODetail.objects.create(**i) + fifod = FIFODetail.objects.create(**i) p_list = [] for x in p_details: x['state'] = 1 @@ -78,4 +78,5 @@ class FIFOInPurSerializer(serializers.ModelSerializer): else: i['fifo'] = obj FIFODetail.objects.create(**i) + return obj From 1d7faaa34e3fdb2b2f5ddccab2a56cf72bcea638 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 15:16:11 +0800 Subject: [PATCH 10/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/views.py | 2 ++ ...0008_subproductionprogress_count_current.py | 18 ++++++++++++++++++ hb_server/apps/pm/models.py | 1 + hb_server/apps/pm/views.py | 3 ++- hb_server/apps/wpm/models.py | 4 ---- hb_server/apps/wpm/serializers.py | 2 ++ hb_server/apps/wpm/views.py | 10 ++++++++-- 7 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 hb_server/apps/pm/migrations/0008_subproductionprogress_count_current.py diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index b15896b..f3bc619 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -7,6 +7,7 @@ from apps.inm.models import WareHouse,Inventory from apps.inm.serializers import FIFOInPurSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action +from rest_framework.response import Response # Create your views here. class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet): @@ -51,4 +52,5 @@ class FIFOViewSet(GenericViewSet): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save(create_by=request.user) + return Response() \ No newline at end of file diff --git a/hb_server/apps/pm/migrations/0008_subproductionprogress_count_current.py b/hb_server/apps/pm/migrations/0008_subproductionprogress_count_current.py new file mode 100644 index 0000000..03dbd87 --- /dev/null +++ b/hb_server/apps/pm/migrations/0008_subproductionprogress_count_current.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-10-28 06:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0007_auto_20211025_1533'), + ] + + operations = [ + migrations.AddField( + model_name='subproductionprogress', + name='count_current', + field=models.IntegerField(default=0, verbose_name='当前数量'), + ), + ] diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index 55a53c5..d2025f5 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -1,3 +1,4 @@ +from io import open_code from apps.system.models import CommonAModel, Organization from django.db import models from django.contrib.auth.models import AbstractUser diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 054b113..4515c00 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -137,7 +137,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo return Response() raise APIException('计划状态有误') - @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer) + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) def pick_need(self, request, pk=None): """ 领料需求清单 @@ -147,6 +147,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo serializer = SubProductionProgressSerializer(instance=instance, many=True) return Response(serializer.data) + class ResourceViewSet(GenericViewSet): perms_map = {'*': '*'} diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index d4d0ab3..c3e2c6e 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -8,10 +8,6 @@ from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material, Step, RecordForm -class WorkshopInm(): - """ - 车间库存 - """ class Product(CommonAModel): """ 产品(所有生产过程中出现过的) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 4636454..204c1eb 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -2,3 +2,5 @@ from rest_framework import serializers from rest_framework.serializers import ModelSerializer +class PickSerializer(serializers.Serializer): + pass \ No newline at end of file diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index bb114b1..b9c6679 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -1,6 +1,12 @@ from django.shortcuts import render -from rest_framework.viewsets import ModelViewSet +from rest_framework.generics import CreateAPIView, GenericAPIView +from rest_framework.viewsets import GenericViewSet, ModelViewSet from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin -# Create your views here. \ No newline at end of file +# Create your views here. +class WpmPickView(CreateUpdateModelAMixin, CreateAPIView): + """ + 领料 + """ + pass \ No newline at end of file From 4453b4789f86efae1b73cca75b8a25c9e2b322df Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 15:19:55 +0800 Subject: [PATCH 11/27] inventory bug --- hb_server/apps/inm/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 4bb23a2..3ed6c01 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -23,7 +23,7 @@ class WareHouseSimpleSerializer(serializers.ModelSerializer): class InventorySerializer(serializers. ModelSerializer): material_= MaterialSimpleSerializer(source='material', read_only=True) - warehouse_ = WareHouseSimpleSerializer(source='material', read_only=True) + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) class Meta: model = Inventory fields = '__all__' From 4ac2698ba5e3615d1cbb647bb08be412d0eeb8b9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 15:40:26 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/serializers.py | 15 ++++++++++++++- hb_server/apps/inm/urls.py | 3 ++- hb_server/apps/inm/views.py | 21 ++++++++++++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 3ed6c01..958e620 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from apps.inm.models import FIFO, FIFODetail, IProduct, WareHouse,Inventory +from apps.inm.models import FIFO, FIFODetail, IProduct, MaterialBatch, WareHouse,Inventory from apps.system.serializers import UserSimpleSerializer from apps.mtm.serializers import MaterialSimpleSerializer @@ -28,6 +28,19 @@ class InventorySerializer(serializers. ModelSerializer): model = Inventory fields = '__all__' +class MaterialBatchSerializer(serializers. ModelSerializer): + material_= MaterialSimpleSerializer(source='material', read_only=True) + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) + class Meta: + model = MaterialBatch + fields = '__all__' + +class FIFOListSerializer(serializers.ModelSerializer): + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) + operator_ = UserSimpleSerializer(source='operator', read_only=True) + class Meta: + model=FIFO + fields = '__all__' class IProductInPurSerializer(serializers.ModelSerializer): class Meta: diff --git a/hb_server/apps/inm/urls.py b/hb_server/apps/inm/urls.py index 851ccc8..e963137 100644 --- a/hb_server/apps/inm/urls.py +++ b/hb_server/apps/inm/urls.py @@ -1,12 +1,13 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.inm.views import FIFOViewSet, WarehouseViewSet,InventoryViewSet +from apps.inm.views import FIFOViewSet, MaterialBatchViewSet, WarehouseViewSet,InventoryViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('warehouse', WarehouseViewSet, basename='warehouse') router.register('inventory', InventoryViewSet, basename='inventory') +router.register('materialbatch', MaterialBatchViewSet, basename='materialbatch') router.register('fifo', FIFOViewSet, basename='fifo') urlpatterns = [ path('', include(router.urls)), diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index f3bc619..feb9263 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -3,8 +3,8 @@ from rest_framework import serializers from rest_framework.mixins import ListModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet -from apps.inm.models import WareHouse,Inventory -from apps.inm.serializers import FIFOInPurSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer +from apps.inm.models import FIFO, MaterialBatch, WareHouse,Inventory +from apps.inm.serializers import FIFOInPurSerializer, FIFOListSerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -39,11 +39,26 @@ class InventoryViewSet(ListModelMixin, GenericViewSet): ordering_fields = ['create_time'] ordering = ['-create_time'] -class FIFOViewSet(GenericViewSet): +class MaterialBatchViewSet(ListModelMixin, GenericViewSet): + perms_map = {'*': '*'} + queryset = MaterialBatch.objects.select_related('material', 'warehouse').all() + serializer_class = MaterialBatchSerializer + filterset_fields = [] + search_fields = ['material', 'warehouse'] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + +class FIFOViewSet(ListModelMixin, GenericViewSet): """ 出入库记录 """ perms_map = {'*': '*'} + queryset = FIFO.objects.all() + + def get_serializer_class(self): + if self.action == 'list': + return FIFOListSerializer + @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=FIFOInPurSerializer) def in_pur(self, request, pk=None): """ From 396050be25e2c687ae64f4fa2222b163140d7d91 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 15:44:02 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/views.py | 8 ++++---- hb_server/apps/wpm/serializers.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index feb9263..2f316d7 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -34,8 +34,8 @@ class InventoryViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = Inventory.objects.select_related('material', 'warehouse').all() serializer_class = InventorySerializer - filterset_fields = [] - search_fields = ['material', 'warehouse'] + filterset_fields = ['material', 'warehouse'] + search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] @@ -43,8 +43,8 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = MaterialBatch.objects.select_related('material', 'warehouse').all() serializer_class = MaterialBatchSerializer - filterset_fields = [] - search_fields = ['material', 'warehouse'] + filterset_fields = ['material', 'warehouse'] + search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 204c1eb..401a24f 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -3,4 +3,4 @@ from rest_framework.serializers import ModelSerializer class PickSerializer(serializers.Serializer): - pass \ No newline at end of file + warehouse = serializers.IntegerField() \ No newline at end of file From 2a79fa9f2bde383824225be35faced87f51f5e92 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 16:04:15 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E8=AF=A6=E6=83=85=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/serializers.py | 6 ++++++ hb_server/apps/inm/urls.py | 5 +++-- hb_server/apps/inm/views.py | 21 +++++++++++++++++---- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 958e620..9bce6f5 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -42,6 +42,12 @@ class FIFOListSerializer(serializers.ModelSerializer): model=FIFO fields = '__all__' +class FIFODetailSerializer(serializers.ModelSerializer): + material_= MaterialSimpleSerializer(source='material', read_only=True) + class Meta: + model=FIFODetail + fields = '__all__' + class IProductInPurSerializer(serializers.ModelSerializer): class Meta: model = IProduct diff --git a/hb_server/apps/inm/urls.py b/hb_server/apps/inm/urls.py index e963137..4b968ff 100644 --- a/hb_server/apps/inm/urls.py +++ b/hb_server/apps/inm/urls.py @@ -1,6 +1,6 @@ from django.db.models import base from rest_framework import urlpatterns -from apps.inm.views import FIFOViewSet, MaterialBatchViewSet, WarehouseViewSet,InventoryViewSet +from apps.inm.views import FIFODetailViewSet, FIFOViewSet, MaterialBatchViewSet, WarehouseViewSet,InventoryViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -8,7 +8,8 @@ router = DefaultRouter() router.register('warehouse', WarehouseViewSet, basename='warehouse') router.register('inventory', InventoryViewSet, basename='inventory') router.register('materialbatch', MaterialBatchViewSet, basename='materialbatch') -router.register('fifo', FIFOViewSet, basename='fifo') +router.register('fifo', FIFOViewSet, basename='fifo'), +router.register('fifodetail', FIFODetailViewSet, basename='fifodetail') urlpatterns = [ path('', include(router.urls)), ] diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 2f316d7..531be66 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -1,10 +1,10 @@ from django.shortcuts import render from rest_framework import serializers -from rest_framework.mixins import ListModelMixin +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet -from apps.inm.models import FIFO, MaterialBatch, WareHouse,Inventory -from apps.inm.serializers import FIFOInPurSerializer, FIFOListSerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer +from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse,Inventory +from apps.inm.serializers import FIFODetailSerializer, FIFOInPurSerializer, FIFOListSerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -48,12 +48,25 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet): ordering_fields = ['create_time'] ordering = ['-create_time'] +class FIFODetailViewSet(ListModelMixin, GenericViewSet): + """ + 出入库记录详情表 + """ + perms_map = {'*': '*'} + queryset = FIFODetail.objects.select_related('material', 'fifo').all() + serializer_class = FIFODetailSerializer + filterset_fields = ['material', 'fifo'] + search_fields = [] + ordering_fields = ['create_time'] + ordering = ['-create_time'] + class FIFOViewSet(ListModelMixin, GenericViewSet): """ 出入库记录 """ perms_map = {'*': '*'} - queryset = FIFO.objects.all() + queryset = FIFO.objects.select_related('warehouse', 'operator') + filterset_fields = ['warehouse'] def get_serializer_class(self): if self.action == 'list': From 7b066bd0c6716a620f22be22d8d58cd07ca30171 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 28 Oct 2021 16:23:18 +0800 Subject: [PATCH 15/27] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E8=AF=A6=E6=83=85=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/views.py | 2 +- hb_server/apps/wpm/serializers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 531be66..be9da10 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -55,7 +55,7 @@ class FIFODetailViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = FIFODetail.objects.select_related('material', 'fifo').all() serializer_class = FIFODetailSerializer - filterset_fields = ['material', 'fifo'] + filterset_fields = ['material', 'fifo', 'warehouse'] search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 401a24f..ff6ea9f 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -3,4 +3,4 @@ from rest_framework.serializers import ModelSerializer class PickSerializer(serializers.Serializer): - warehouse = serializers.IntegerField() \ No newline at end of file + warehouse = serializers.IntegerField(label="仓库ID") \ No newline at end of file From 1e361b5a6a4b50b907608aba5e7c12d74d40ef1a Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 29 Oct 2021 10:26:56 +0800 Subject: [PATCH 16/27] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=85=A5=E5=BA=93bug,?= =?UTF-8?q?=E9=A2=86=E6=96=99=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/inm/filters.py | 9 ++ .../inm/migrations/0005_auto_20211025_1533.py | 2 - .../inm/migrations/0006_auto_20211027_0941.py | 6 -- hb_server/apps/inm/models.py | 2 +- hb_server/apps/inm/serializers.py | 5 ++ hb_server/apps/inm/signals.py | 1 + hb_server/apps/inm/views.py | 18 +++- .../pm/migrations/0009_auto_20211029_1017.py | 27 ++++++ hb_server/apps/pm/models.py | 4 +- hb_server/apps/pm/serializers.py | 3 + hb_server/apps/pm/views.py | 23 +++-- hb_server/apps/wpm/migrations/0001_initial.py | 86 +++++++++++++++++++ hb_server/apps/wpm/migrations/__init__.py | 0 hb_server/apps/wpm/models.py | 19 ++-- hb_server/apps/wpm/serializers.py | 6 +- 15 files changed, 185 insertions(+), 26 deletions(-) create mode 100644 hb_server/apps/inm/filters.py create mode 100644 hb_server/apps/pm/migrations/0009_auto_20211029_1017.py create mode 100644 hb_server/apps/wpm/migrations/0001_initial.py create mode 100644 hb_server/apps/wpm/migrations/__init__.py diff --git a/hb_server/apps/inm/filters.py b/hb_server/apps/inm/filters.py new file mode 100644 index 0000000..c71c4fb --- /dev/null +++ b/hb_server/apps/inm/filters.py @@ -0,0 +1,9 @@ +from django_filters import rest_framework as filters + +from apps.mtm.models import Material +from .models import MaterialBatch +class MbFilterSet(filters.FilterSet): + material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all()) + class Meta: + model = MaterialBatch + fields = ['material', 'warehouse'] \ No newline at end of file diff --git a/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py b/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py index be966a8..4a25c15 100644 --- a/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py +++ b/hb_server/apps/inm/migrations/0005_auto_20211025_1533.py @@ -10,7 +10,6 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('wpm', '__first__'), ('mtm', '0025_outputmaterial_is_main'), ('pm', '0007_auto_20211025_1533'), ('inm', '0004_auto_20210929_0842'), @@ -57,7 +56,6 @@ class Migration(migrations.Migration): ('batch', models.CharField(blank=True, max_length=100, null=True, verbose_name='所属批次号')), ('fifos', models.JSONField(blank=True, default=list, verbose_name='关联出入库记录')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='iproduct_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), - ('d_product', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='wpm.product', verbose_name='关联的动态产品')), ('material', 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='iproduct_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), ('warehouse', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inm.warehouse', verbose_name='所在仓库')), diff --git a/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py b/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py index d637e16..8598dc5 100644 --- a/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py +++ b/hb_server/apps/inm/migrations/0006_auto_20211027_0941.py @@ -7,7 +7,6 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('wpm', '__first__'), ('inm', '0005_auto_20211025_1533'), ] @@ -18,9 +17,4 @@ class Migration(migrations.Migration): field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='inm.fifo', verbose_name='关联出入库'), preserve_default=False, ), - migrations.AlterField( - model_name='iproduct', - name='d_product', - field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='wpm.product', verbose_name='关联的动态产品'), - ), ] diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 03d6b72..9a2ac61 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -91,7 +91,7 @@ class IProduct(BaseModel): material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') batch = models.CharField('所属批次号', max_length=100, null=True, blank=True) - d_product = models.ForeignKey('wpm.product', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False, null=True, blank=True) + wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False, null=True, blank=True) fifos = models.JSONField('关联出入库记录', default=list, blank=True) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 9bce6f5..b0945ef 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -59,6 +59,11 @@ class FIFODetailInPurSerializer(serializers.ModelSerializer): model = FIFODetail fields = ['material', 'count', 'batch', 'details'] +class MaterialBatchQuerySerializer(serializers.Serializer): + warehouse = serializers.IntegerField(label="仓库ID", required=False) + materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False) + + class FIFOInPurSerializer(serializers.ModelSerializer): """ 采购入库序列化 diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index b96b416..e638fd1 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -18,6 +18,7 @@ def update_by_fifodetail(sender, instance, created, **kwargs): o1.save() o2, _ = MaterialBatch.objects.get_or_create(material=material, warehouse=warehouse, batch=instance.batch,\ defaults={'material':material, 'warehouse':warehouse, 'count':0, 'batch':instance.batch}) + o2.count = o2.count + instance.count o2.save() material.count = material.count + 1 material.save() diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 531be66..6bc66af 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -2,9 +2,10 @@ from django.shortcuts import render from rest_framework import serializers from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.viewsets import GenericViewSet, ModelViewSet +from apps.inm.filters import MbFilterSet from apps.inm.models import FIFO, FIFODetail, MaterialBatch, WareHouse,Inventory -from apps.inm.serializers import FIFODetailSerializer, FIFOInPurSerializer, FIFOListSerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer +from apps.inm.serializers import FIFODetailSerializer, FIFOInPurSerializer, FIFOListSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from rest_framework.response import Response @@ -43,11 +44,22 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = MaterialBatch.objects.select_related('material', 'warehouse').all() serializer_class = MaterialBatchSerializer - filterset_fields = ['material', 'warehouse'] + # filterset_fields = ['material', 'warehouse'] + filterset_class = MbFilterSet search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] + # @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=MaterialBatchQuerySerializer) + # def query(self, request, pk=None): + # """ + # 复杂查询 + # """ + # serializer = MaterialBatchQuerySerializer(data=request.data) + # serializer.is_valid(raise_exception=True) + # queryset = self.queryset.filter() + # return Response() + class FIFODetailViewSet(ListModelMixin, GenericViewSet): """ 出入库记录详情表 @@ -66,11 +78,13 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): """ perms_map = {'*': '*'} queryset = FIFO.objects.select_related('warehouse', 'operator') + serializer_class = FIFOListSerializer filterset_fields = ['warehouse'] def get_serializer_class(self): if self.action == 'list': return FIFOListSerializer + return super().get_serializer_class() @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=FIFOInPurSerializer) def in_pur(self, request, pk=None): diff --git a/hb_server/apps/pm/migrations/0009_auto_20211029_1017.py b/hb_server/apps/pm/migrations/0009_auto_20211029_1017.py new file mode 100644 index 0000000..4dccffd --- /dev/null +++ b/hb_server/apps/pm/migrations/0009_auto_20211029_1017.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.6 on 2021-10-29 02:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pm', '0008_subproductionprogress_count_current'), + ] + + operations = [ + migrations.RemoveField( + model_name='subproductionprogress', + name='count_current', + ), + migrations.AddField( + model_name='subproductionplan', + name='is_picked', + field=models.BooleanField(default=False, verbose_name='是否已领料'), + ), + migrations.AlterField( + model_name='subproductionprogress', + name='count', + field=models.FloatField(verbose_name='应出入数'), + ), + ] diff --git a/hb_server/apps/pm/models.py b/hb_server/apps/pm/models.py index d2025f5..94939b3 100644 --- a/hb_server/apps/pm/models.py +++ b/hb_server/apps/pm/models.py @@ -49,6 +49,7 @@ class SubProductionPlan(CommonAModel): state = models.IntegerField('状态', default=0) start_date_real = models.DateField('实际开工日期', null=True, blank=True) end_date_real = models.DateField('实际完工日期', null=True, blank=True) + is_picked = models.BooleanField('是否已领料', default=False) class Meta: verbose_name = '子生产计划' verbose_name_plural = verbose_name @@ -64,6 +65,5 @@ class SubProductionProgress(BaseModel): subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE, related_name='progress_subplan') material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE) type = models.IntegerField('物料应用类型', default=1) - count = models.IntegerField('应出入数') + count = models.FloatField('应出入数') count_real = models.IntegerField('实际出入数', default=0) - count_current = models.IntegerField('当前数量', default=0) diff --git a/hb_server/apps/pm/serializers.py b/hb_server/apps/pm/serializers.py index 85d1286..51821b9 100644 --- a/hb_server/apps/pm/serializers.py +++ b/hb_server/apps/pm/serializers.py @@ -44,3 +44,6 @@ class SubProductionProgressSerializer(serializers.ModelSerializer): class Meta: model = SubProductionProgress fields = '__all__' + +class PickNeedSerializer(serializers.Serializer): + warehouse = serializers.IntegerField(label="仓库ID") diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 4515c00..6e3f340 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -3,9 +3,11 @@ from rest_framework import serializers from rest_framework.views import APIView from apps.em.models import Equipment from apps.em.serializers import EquipmentSerializer +from apps.inm.models import MaterialBatch +from apps.inm.serializers import MaterialBatchSerializer from apps.mtm.models import InputMaterial, OutputMaterial, Step, SubProduction, UsedStep from apps.system.mixins import CreateUpdateModelAMixin -from apps.pm.serializers import GenSubPlanSerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer +from apps.pm.serializers import GenSubPlanSerializer, PickNeedSerializer, ProductionPlanCreateFromOrderSerializer, ProductionPlanSerializer, ResourceCalListSerializer, ResourceCalSerializer, SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin from apps.pm.models import ProductionPlan, SubProductionProgress, SubProductionPlan from rest_framework.viewsets import GenericViewSet, ModelViewSet @@ -78,9 +80,9 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel workshop=i.process.workshop, process=i.process, create_by=request.user, steps = list(steps)) for m in InputMaterial.objects.filter(subproduction=i, is_deleted=False).order_by('sort'): - SubProductionProgress.objects.create(material=m.material, type=1, count=m.count, subproduction_plan=instance) + SubProductionProgress.objects.create(material=m.material, type=1, count=m.count*production_plan.count, subproduction_plan=instance) for m in OutputMaterial.objects.filter(subproduction=i, is_deleted=False).order_by('sort'): - SubProductionProgress.objects.create(material=m.material, type=2, count=m.count, subproduction_plan=instance) + SubProductionProgress.objects.create(material=m.material, type=2, count=m.count*production_plan.count, subproduction_plan=instance) production_plan.is_planed=True production_plan.save() return Response() @@ -92,6 +94,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo perms_map = {'*': '*'} queryset = SubProductionPlan.objects.select_related('process', 'workshop') search_fields = [] + serializer_class = SubProductionPlanListSerializer filterset_fields = ['production_plan'] ordering_fields = ['process__number'] ordering = ['process__number'] @@ -101,7 +104,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo return SubProductionPlanListSerializer elif self.action == 'update': return SubProductionPlanUpdateSerializer - return SubProductionPlanListSerializer + return super().get_serializer_class() @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=SubProductionProgressSerializer) def progress(self, request, pk=None): @@ -137,15 +140,21 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo return Response() raise APIException('计划状态有误') - @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=serializers.Serializer) + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=PickNeedSerializer) def pick_need(self, request, pk=None): """ - 领料需求清单 + 领料需求清单/库存数 """ obj = self.get_object() instance = SubProductionProgress.objects.filter(subproduction_plan=obj, type=1) serializer = SubProductionProgressSerializer(instance=instance, many=True) - return Response(serializer.data) + need = serializer.data + materials = [] + for i in need: + materials.append(i['material']) + objs = MaterialBatch.objects.filter(warehouse=request.data['warehouse'], material__id__in=materials) + have = MaterialBatchSerializer(instance=objs, many=True).data + return Response({'need':need, 'have':have}) class ResourceViewSet(GenericViewSet): diff --git a/hb_server/apps/wpm/migrations/0001_initial.py b/hb_server/apps/wpm/migrations/0001_initial.py new file mode 100644 index 0000000..596bbed --- /dev/null +++ b/hb_server/apps/wpm/migrations/0001_initial.py @@ -0,0 +1,86 @@ +# Generated by Django 3.2.6 on 2021-10-29 02:19 + +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 = [ + ('pm', '0009_auto_20211029_1017'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('mtm', '0025_outputmaterial_is_main'), + ] + + operations = [ + migrations.CreateModel( + name='WProduct', + 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(blank=True, max_length=50, null=True, unique=True, verbose_name='物品编号')), + ('act_state', models.IntegerField(default=0, verbose_name='进行状态')), + ('remark', models.CharField(blank=True, max_length=200, null=True, verbose_name='备注')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproduct_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('m_state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='所属物料状态')), + ('p_state', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.step', verbose_name='所在步骤')), + ('parent', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='wpm.wproduct', verbose_name='上一级')), + ('subproduction_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pm.subproductionplan', verbose_name='关联子生产计划')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproduct_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='WProductForm', + 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='删除标记')), + ('data', models.JSONField(blank=True, default=dict, verbose_name='记录的数据')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproductform_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('record_form', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.recordform', verbose_name='所用表格')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='wproductform_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='WProductFlow', + 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='删除标记')), + ('wproduct', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wpm.wproduct', verbose_name='产品')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='WMaterial', + 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='删除标记')), + ('batch', models.CharField(blank=True, max_length=100, null=True, verbose_name='批次号')), + ('count', models.IntegerField(default=0, verbose_name='当前数量')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联物料')), + ('subproduction_plan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pm.subproductionplan', verbose_name='关联子计划')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/hb_server/apps/wpm/migrations/__init__.py b/hb_server/apps/wpm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index c3e2c6e..af2de44 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -8,9 +8,18 @@ from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material, Step, RecordForm -class Product(CommonAModel): +class WMaterial(BaseModel): """ - 产品(所有生产过程中出现过的) + 车间生产物料 + """ + subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子计划', on_delete=models.CASCADE) + material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE) + batch = models.CharField('批次号', max_length=100, null=True, blank=True) + count = models.IntegerField('当前数量', default=0) + +class WProduct(CommonAModel): + """ + 半成品/成品 """ act_state_choices=( (0, '待执行'), @@ -25,7 +34,7 @@ class Product(CommonAModel): remark = models.CharField('备注', max_length=200, null=True, blank=True) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE) -class ProductForm(CommonAModel): +class WProductForm(CommonAModel): """ 记录表格 """ @@ -33,8 +42,8 @@ class ProductForm(CommonAModel): data = models.JSONField('记录的数据', default=dict, blank=True) -class ProductFlow(BaseModel): +class WProductFlow(BaseModel): """ 产品流转日志 """ - product = models.ForeignKey(Product, verbose_name='产品', on_delete=models.CASCADE) \ No newline at end of file + wproduct = models.ForeignKey(WProduct, verbose_name='产品', on_delete=models.CASCADE) \ No newline at end of file diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 401a24f..39a4542 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -1,6 +1,10 @@ from rest_framework import serializers from rest_framework.serializers import ModelSerializer +class PickDetailSerializer(serializers.Serializer): + material = serializers.IntegerField(label='物料ID') + batch = serializers.CharField(label='物料批次') + pick_count = serializers.IntegerField(label="领料数量") class PickSerializer(serializers.Serializer): - warehouse = serializers.IntegerField() \ No newline at end of file + warehouse = serializers.IntegerField(label="仓库ID") \ No newline at end of file From 10e0aa6706e243498464e36b420d9bfdcc672850 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 29 Oct 2021 10:34:00 +0800 Subject: [PATCH 17/27] fifo detail --- hb_server/apps/inm/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hb_server/apps/inm/views.py b/hb_server/apps/inm/views.py index 3f4d330..cae03de 100644 --- a/hb_server/apps/inm/views.py +++ b/hb_server/apps/inm/views.py @@ -67,7 +67,7 @@ class FIFODetailViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = FIFODetail.objects.select_related('material', 'fifo').all() serializer_class = FIFODetailSerializer - filterset_fields = ['material', 'fifo', 'warehouse'] + filterset_fields = ['material', 'fifo'] search_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] @@ -79,7 +79,7 @@ class FIFOViewSet(ListModelMixin, GenericViewSet): perms_map = {'*': '*'} queryset = FIFO.objects.select_related('warehouse', 'operator') serializer_class = FIFOListSerializer - filterset_fields = ['warehouse'] + filterset_fields = ['warehouse', 'type'] def get_serializer_class(self): if self.action == 'list': From 3481e13e44f4a56134e4bdfe073adc1030e85939 Mon Sep 17 00:00:00 2001 From: shilixia <2309368887@qq.com> Date: Fri, 29 Oct 2021 11:10:31 +0800 Subject: [PATCH 18/27] cangku --- hb_client/src/api/inm.js | 30 +- hb_client/src/router/index.js | 36 +-- hb_client/src/views/inm/fifo.vue | 324 ++++++++++++++++++++++ hb_client/src/views/inm/fifodetail.vue | 131 +++++++++ hb_client/src/views/inm/inventory.vue | 137 +++++++++ hb_client/src/views/inm/materialbatch.vue | 118 +++----- hb_client/src/views/inm/warehouse.vue | 2 +- hb_client/src/views/pm/resources.vue | 29 +- hb_client/src/views/wpm/worktask.vue | 12 +- 9 files changed, 696 insertions(+), 123 deletions(-) create mode 100644 hb_client/src/views/inm/fifo.vue create mode 100644 hb_client/src/views/inm/fifodetail.vue create mode 100644 hb_client/src/views/inm/inventory.vue diff --git a/hb_client/src/api/inm.js b/hb_client/src/api/inm.js index 354861a..54cb63f 100644 --- a/hb_client/src/api/inm.js +++ b/hb_client/src/api/inm.js @@ -38,22 +38,34 @@ export function getInventoryList(query) { } export function createInventory(data) { return request({ - url: '/inm/inventory/', + url: '/inm/fifo/in_pur/', method: 'post', data }) } -export function updateInventory(id, data) { +//仓库对应的物料 +export function getfifodetailList(query) { return request({ - url: `/inm/inventory/${id}/`, - method: 'put', - data + url: '/inm/fifodetail/', + method: 'get', + params: query }) } -export function deleteInventory(id, data) { + +//出入库记录 +export function getfifoList(query) { return request({ - url: `/inm/inventory/${id}/`, - method: 'delete', - data + url: '/inm/fifo/', + method: 'get', + params: query + }) +} + +//物料批次 +export function getmaterialbatchList(query) { + return request({ + url: '/inm/materialbatch/', + method: 'get', + params: query }) } diff --git a/hb_client/src/router/index.js b/hb_client/src/router/index.js index e7da4f0..160a4d8 100644 --- a/hb_client/src/router/index.js +++ b/hb_client/src/router/index.js @@ -293,32 +293,34 @@ export const asyncRoutes = [ meta: { title: '仓库', icon: 'example', perms: ['index_manage'] } }, { - path: 'materialbatch/:id', - name: 'MaterialBatch', - component: () => import('@/views/inm/materialbatch'), + path: 'inventory/:id', + name: 'inventory', + component: () => import('@/views/inm/inventory'), meta: { title: '仓库物料', perms: ['vendor_manage'] }, hidden: true } , { - path: 'warehouse', - name: 'warehouse', - component: () => import('@/views/inm/warehouse'), - meta: { title: '物料库存', icon: 'example', perms: ['index_manage'] } + path: 'materialbatch', + name: 'materialbatch', + component: () => import('@/views/inm/materialbatch'), + meta: { title: '物料批次', icon: 'example', perms: ['index_manage'] } }, { - path: 'warehouse', - name: 'warehouse', - component: () => import('@/views/inm/warehouse'), - meta: { title: '半成品库存', icon: 'example', perms: ['index_manage'] } - } - , + path: 'fifo', + name: 'fifo', + component: () => import('@/views/inm/fifo'), + meta: { title: '出入库记录', icon: 'example', perms: ['index_manage'] } + }, { - path: 'warehouse', - name: 'warehouse', - component: () => import('@/views/inm/warehouse'), - meta: { title: '成品库存', icon: 'example', perms: ['index_manage'] } + path: 'fifodetail/:id', + name: 'fifodetail', + component: () => import('@/views/inm/fifodetail'), + meta: { title: '仓库物料', perms: ['vendor_manage'] }, + hidden: true } + + ] }, diff --git a/hb_client/src/views/inm/fifo.vue b/hb_client/src/views/inm/fifo.vue new file mode 100644 index 0000000..982bb4b --- /dev/null +++ b/hb_client/src/views/inm/fifo.vue @@ -0,0 +1,324 @@ + + diff --git a/hb_client/src/views/inm/fifodetail.vue b/hb_client/src/views/inm/fifodetail.vue new file mode 100644 index 0000000..3f1a7aa --- /dev/null +++ b/hb_client/src/views/inm/fifodetail.vue @@ -0,0 +1,131 @@ + + diff --git a/hb_client/src/views/inm/inventory.vue b/hb_client/src/views/inm/inventory.vue new file mode 100644 index 0000000..77e1f60 --- /dev/null +++ b/hb_client/src/views/inm/inventory.vue @@ -0,0 +1,137 @@ + + diff --git a/hb_client/src/views/inm/materialbatch.vue b/hb_client/src/views/inm/materialbatch.vue index 939f3dc..4585950 100644 --- a/hb_client/src/views/inm/materialbatch.vue +++ b/hb_client/src/views/inm/materialbatch.vue @@ -26,124 +26,106 @@ + + + + + + - + - - + + - - + + - - + + - - - - - + + + + + + - +