出入库详情带仓库
This commit is contained in:
parent
9b402fcaf3
commit
487c8fac28
|
@ -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='存量'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -7,6 +7,7 @@ from utils.model import SoftModel, BaseModel
|
||||||
from simple_history.models import HistoricalRecords
|
from simple_history.models import HistoricalRecords
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
from apps.pm.models import SubProductionPlan
|
from apps.pm.models import SubProductionPlan
|
||||||
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
|
|
||||||
|
|
||||||
class WareHouse(CommonAModel):
|
class WareHouse(CommonAModel):
|
||||||
|
@ -28,7 +29,7 @@ class Inventory(BaseModel):
|
||||||
库存物料
|
库存物料
|
||||||
"""
|
"""
|
||||||
material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
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='所在仓库')
|
warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '库存表'
|
verbose_name = '库存表'
|
||||||
|
@ -40,7 +41,7 @@ class MaterialBatch(BaseModel):
|
||||||
"""
|
"""
|
||||||
material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
||||||
warehouse = models.ForeignKey(WareHouse, 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='')
|
batch = models.CharField('批次号', max_length=100, default='')
|
||||||
expiration_date = models.DateField('有效期', null=True, blank=True)
|
expiration_date = models.DateField('有效期', null=True, blank=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -65,7 +66,6 @@ class FIFO(CommonAModel):
|
||||||
)
|
)
|
||||||
type = models.IntegerField('出入库类型', default=1)
|
type = models.IntegerField('出入库类型', default=1)
|
||||||
is_audited = models.BooleanField('是否审核', default=False)
|
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)
|
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)
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.DO_NOTHING, null=True, blank=True)
|
||||||
inout_date = models.DateField('出入库日期')
|
inout_date = models.DateField('出入库日期')
|
||||||
|
@ -78,8 +78,9 @@ class FIFOItem(BaseModel):
|
||||||
"""
|
"""
|
||||||
is_tested = models.BooleanField('是否已检测', default=False)
|
is_tested = models.BooleanField('是否已检测', default=False)
|
||||||
is_testok = 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)
|
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='')
|
batch = models.CharField('批次号', max_length=100, default='')
|
||||||
fifo = models.ForeignKey(FIFO, verbose_name='关联出入库', on_delete=models.CASCADE)
|
fifo = models.ForeignKey(FIFO, verbose_name='关联出入库', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
|
@ -37,13 +37,13 @@ class MaterialBatchSerializer(serializers. ModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class FIFOListSerializer(serializers.ModelSerializer):
|
class FIFOListSerializer(serializers.ModelSerializer):
|
||||||
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
|
||||||
operator_ = UserSimpleSerializer(source='operator', read_only=True)
|
operator_ = UserSimpleSerializer(source='operator', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model=FIFO
|
model=FIFO
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class FIFOItemSerializer(serializers.ModelSerializer):
|
class FIFOItemSerializer(serializers.ModelSerializer):
|
||||||
|
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
||||||
material_= MaterialSimpleSerializer(source='material', read_only=True)
|
material_= MaterialSimpleSerializer(source='material', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model= FIFOItem
|
model= FIFOItem
|
||||||
|
@ -58,7 +58,7 @@ class FIFODetailInPurSerializer(serializers.ModelSerializer):
|
||||||
details = IProductInPurSerializer(many=True, required=False)
|
details = IProductInPurSerializer(many=True, required=False)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFOItem
|
model = FIFOItem
|
||||||
fields = ['material', 'count', 'batch', 'details']
|
fields = ['material', 'count', 'batch', 'details', 'warehouse']
|
||||||
|
|
||||||
class MaterialBatchQuerySerializer(serializers.Serializer):
|
class MaterialBatchQuerySerializer(serializers.Serializer):
|
||||||
warehouse = serializers.IntegerField(label="仓库ID", required=False)
|
warehouse = serializers.IntegerField(label="仓库ID", required=False)
|
||||||
|
@ -72,7 +72,7 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
|
||||||
details = FIFODetailInPurSerializer(many=True)
|
details = FIFODetailInPurSerializer(many=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFO
|
model = FIFO
|
||||||
fields = ['warehouse', 'operator', 'details', 'inout_date']
|
fields = ['operator', 'details', 'inout_date']
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
details = validated_data.pop('details')
|
details = validated_data.pop('details')
|
||||||
|
@ -81,15 +81,15 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
|
||||||
else:
|
else:
|
||||||
raise serializers.ValidationError('没有入库内容')
|
raise serializers.ValidationError('没有入库内容')
|
||||||
|
|
||||||
for i in details:
|
# for i in details:
|
||||||
# 校验批次
|
# # 校验批次
|
||||||
try:
|
# try:
|
||||||
if i['batch']:
|
# if i['batch']:
|
||||||
obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material'])
|
# obj = MaterialBatch.objects.get(batch=i['batch'], material=i['material'])
|
||||||
if obj.warehouse != validated_data['warehouse']:
|
# if obj.warehouse != validated_data['warehouse']:
|
||||||
raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch']))
|
# raise serializers.ValidationError('批次号{}在其他仓库已存在'.format(i['batch']))
|
||||||
except:
|
# except:
|
||||||
pass
|
# pass
|
||||||
|
|
||||||
# 创建采购入库
|
# 创建采购入库
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
|
|
|
@ -8,11 +8,11 @@ def update_inm(instance:FIFO, type:int=1):
|
||||||
"""
|
"""
|
||||||
更新库存(正反)
|
更新库存(正反)
|
||||||
"""
|
"""
|
||||||
warehouse = instance.warehouse
|
|
||||||
if instance.type in [FIFO.FIFO_TYPE_PUR_IN]: # 采购入库
|
if instance.type in [FIFO.FIFO_TYPE_PUR_IN]: # 采购入库
|
||||||
# 更新相关表
|
# 更新相关表
|
||||||
for i in FIFOItem.objects.filter(fifo=instance):
|
for i in FIFOItem.objects.filter(fifo=instance):
|
||||||
material = i.material
|
material = i.material
|
||||||
|
warehouse = i.warehouse
|
||||||
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})
|
defaults={'material':material, 'warehouse':warehouse, 'count':0})
|
||||||
o1.count = o1.count + i.count
|
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):
|
for i in FIFOItem.objects.filter(fifo=instance):
|
||||||
material = i.material
|
material = i.material
|
||||||
|
warehouse = i.warehouse
|
||||||
o1 = Inventory.objects.get(material=material, warehouse=warehouse)
|
o1 = Inventory.objects.get(material=material, warehouse=warehouse)
|
||||||
o1.count = o1.count - i.count
|
o1.count = o1.count - i.count
|
||||||
o1.save()
|
o1.save()
|
||||||
|
|
|
@ -171,7 +171,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo
|
||||||
materials = []
|
materials = []
|
||||||
for i in need:
|
for i in need:
|
||||||
materials.append(i['material'])
|
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
|
have = MaterialBatchSerializer(instance=objs, many=True).data
|
||||||
return Response({'need':need, 'have':have})
|
return Response({'need':need, 'have':have})
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,11 @@ from django.db import transaction
|
||||||
class PickDetailSerializer(serializers.Serializer):
|
class PickDetailSerializer(serializers.Serializer):
|
||||||
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
|
material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID")
|
||||||
batch = serializers.CharField(label='物料批次', allow_blank=True)
|
batch = serializers.CharField(label='物料批次', allow_blank=True)
|
||||||
|
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
||||||
pick_count = serializers.IntegerField(label="领料数量")
|
pick_count = serializers.IntegerField(label="领料数量")
|
||||||
|
|
||||||
class PickSerializer(serializers.Serializer):
|
class PickSerializer(serializers.Serializer):
|
||||||
subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
|
subproduction_plan=serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID")
|
||||||
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
|
||||||
picks = PickDetailSerializer(many=True)
|
picks = PickDetailSerializer(many=True)
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
|
|
Loading…
Reference in New Issue