From 487c8fac281b8872d7e128c13c2447a1f4e306ed Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 11 Nov 2021 09:22:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E5=B8=A6=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_client/src/styles/index.scss | 2 +- .../inm/migrations/0014_auto_20211111_0918.py | 40 +++++++++++++++++++ hb_server/apps/inm/models.py | 9 +++-- hb_server/apps/inm/serializers.py | 26 ++++++------ hb_server/apps/inm/signals.py | 3 +- hb_server/apps/pm/views.py | 2 +- hb_server/apps/wpm/serializers.py | 2 +- 7 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 hb_server/apps/inm/migrations/0014_auto_20211111_0918.py diff --git a/hb_client/src/styles/index.scss b/hb_client/src/styles/index.scss index 73e86dd..a585f9a 100644 --- a/hb_client/src/styles/index.scss +++ b/hb_client/src/styles/index.scss @@ -122,4 +122,4 @@ body .el-table th.gutter{ } .el-dialog__footer{ padding: 6px 6px 6px; -} +} \ No newline at end of file diff --git a/hb_server/apps/inm/migrations/0014_auto_20211111_0918.py b/hb_server/apps/inm/migrations/0014_auto_20211111_0918.py new file mode 100644 index 0000000..3487086 --- /dev/null +++ b/hb_server/apps/inm/migrations/0014_auto_20211111_0918.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.6 on 2021-11-11 01:18 + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('inm', '0013_alter_materialbatch_batch'), + ] + + operations = [ + migrations.RemoveField( + model_name='fifo', + name='warehouse', + ), + migrations.AddField( + model_name='fifoitem', + name='warehouse', + field=models.ForeignKey(default=2, on_delete=django.db.models.deletion.CASCADE, to='inm.warehouse', verbose_name='仓库'), + preserve_default=False, + ), + migrations.AlterField( + model_name='fifoitem', + name='count', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='数量'), + ), + migrations.AlterField( + model_name='inventory', + name='count', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='仓库物料存量'), + ), + migrations.AlterField( + model_name='materialbatch', + name='count', + field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='存量'), + ), + ] diff --git a/hb_server/apps/inm/models.py b/hb_server/apps/inm/models.py index 40da0d2..619d16e 100644 --- a/hb_server/apps/inm/models.py +++ b/hb_server/apps/inm/models.py @@ -7,6 +7,7 @@ from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material from apps.pm.models import SubProductionPlan +from django.core.validators import MinValueValidator, MaxValueValidator class WareHouse(CommonAModel): @@ -28,7 +29,7 @@ class Inventory(BaseModel): 库存物料 """ material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息') - count = models.IntegerField('仓库物料存量', default=0) + count = models.IntegerField('仓库物料存量', default=0, validators=[MinValueValidator(0)]) warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库') class Meta: verbose_name = '库存表' @@ -40,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) + count = models.IntegerField('存量', default=0, validators=[MinValueValidator(0)]) batch = models.CharField('批次号', max_length=100, default='') expiration_date = models.DateField('有效期', null=True, blank=True) class Meta: @@ -65,7 +66,6 @@ class FIFO(CommonAModel): ) type = models.IntegerField('出入库类型', default=1) is_audited = models.BooleanField('是否审核', default=False) - 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('出入库日期') @@ -78,8 +78,9 @@ class FIFOItem(BaseModel): """ is_tested = models.BooleanField('是否已检测', default=False) is_testok = models.BooleanField('是否检测合格', default=False) + warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='仓库') material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE) - count = models.IntegerField('数量', default=0) + count = models.IntegerField('数量', default=0, validators=[MinValueValidator(0)]) batch = models.CharField('批次号', max_length=100, default='') fifo = models.ForeignKey(FIFO, verbose_name='关联出入库', on_delete=models.CASCADE) diff --git a/hb_server/apps/inm/serializers.py b/hb_server/apps/inm/serializers.py index 2f444d6..61eb04b 100644 --- a/hb_server/apps/inm/serializers.py +++ b/hb_server/apps/inm/serializers.py @@ -37,13 +37,13 @@ class MaterialBatchSerializer(serializers. ModelSerializer): 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 FIFOItemSerializer(serializers.ModelSerializer): + warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True) material_= MaterialSimpleSerializer(source='material', read_only=True) class Meta: model= FIFOItem @@ -58,7 +58,7 @@ class FIFODetailInPurSerializer(serializers.ModelSerializer): details = IProductInPurSerializer(many=True, required=False) class Meta: model = FIFOItem - fields = ['material', 'count', 'batch', 'details'] + fields = ['material', 'count', 'batch', 'details', 'warehouse'] class MaterialBatchQuerySerializer(serializers.Serializer): warehouse = serializers.IntegerField(label="仓库ID", required=False) @@ -72,7 +72,7 @@ class FIFOInPurSerializer(serializers.ModelSerializer): details = FIFODetailInPurSerializer(many=True) class Meta: model = FIFO - fields = ['warehouse', 'operator', 'details', 'inout_date'] + fields = ['operator', 'details', 'inout_date'] def create(self, validated_data): details = validated_data.pop('details') @@ -80,16 +80,16 @@ class FIFOInPurSerializer(serializers.ModelSerializer): pass else: raise serializers.ValidationError('没有入库内容') - - for i in details: - # 校验批次 - try: - if i['batch']: - obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material']) - if obj.warehouse != validated_data['warehouse']: - raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch'])) - except: - pass + + # for i in details: + # # 校验批次 + # try: + # if i['batch']: + # obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material']) + # if obj.warehouse != validated_data['warehouse']: + # raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch'])) + # except: + # pass # 创建采购入库 with transaction.atomic(): diff --git a/hb_server/apps/inm/signals.py b/hb_server/apps/inm/signals.py index 57235a6..83c28f5 100644 --- a/hb_server/apps/inm/signals.py +++ b/hb_server/apps/inm/signals.py @@ -8,11 +8,11 @@ def update_inm(instance:FIFO, type:int=1): """ 更新库存(正反) """ - warehouse = instance.warehouse if instance.type in [FIFO.FIFO_TYPE_PUR_IN]: # 采购入库 # 更新相关表 for i in FIFOItem.objects.filter(fifo=instance): material = i.material + warehouse = i.warehouse o1, _ = Inventory.objects.get_or_create(material=material, warehouse=warehouse, \ defaults={'material':material, 'warehouse':warehouse, 'count':0}) o1.count = o1.count + i.count @@ -27,6 +27,7 @@ def update_inm(instance:FIFO, type:int=1): # 更新相关表 for i in FIFOItem.objects.filter(fifo=instance): material = i.material + warehouse = i.warehouse o1 = Inventory.objects.get(material=material, warehouse=warehouse) o1.count = o1.count - i.count o1.save() diff --git a/hb_server/apps/pm/views.py b/hb_server/apps/pm/views.py index 682e59d..0a42efd 100644 --- a/hb_server/apps/pm/views.py +++ b/hb_server/apps/pm/views.py @@ -171,7 +171,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo materials = [] for i in need: materials.append(i['material']) - objs = MaterialBatch.objects.filter(warehouse=request.data['warehouse'], material__id__in=materials) + objs = MaterialBatch.objects.filter(material__id__in=materials) have = MaterialBatchSerializer(instance=objs, many=True).data return Response({'need':need, 'have':have}) diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 0e27b56..f55020f 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -15,11 +15,11 @@ from django.db import transaction class PickDetailSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID") batch = serializers.CharField(label='物料批次', allow_blank=True) + warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") pick_count = serializers.IntegerField(label="领料数量") class PickSerializer(serializers.Serializer): subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") - warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID") picks = PickDetailSerializer(many=True) def create(self, validated_data):