forked from erp-dev/erp
fix: rebuild stock change record
This commit is contained in:
@@ -2,6 +2,7 @@ from django.db import models
|
||||
from django.core.exceptions import ValidationError
|
||||
from flower.common import ModelBase
|
||||
from basic_info import models as basic_info_models
|
||||
from functools import reduce
|
||||
import decimal
|
||||
|
||||
|
||||
@@ -48,12 +49,6 @@ class StockChangeRecord(ModelBase):
|
||||
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
type = models.IntegerField(choices=StockChangeTypeEnum.choices, verbose_name='变动类型')
|
||||
product = models.ForeignKey(
|
||||
basic_info_models.Product,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='stock_change_records',
|
||||
verbose_name='产品',
|
||||
)
|
||||
warehouse = models.ForeignKey(
|
||||
basic_info_models.WareHouse,
|
||||
on_delete=models.PROTECT,
|
||||
@@ -64,14 +59,6 @@ class StockChangeRecord(ModelBase):
|
||||
choices=StockChangeSourceEnum.choices,
|
||||
verbose_name='变动来源',
|
||||
)
|
||||
unit = models.IntegerField(
|
||||
verbose_name='单位',
|
||||
choices=basic_info_models.ProductUnitEnum.choices,
|
||||
)
|
||||
num_of_rolls = models.IntegerField(
|
||||
default=1,
|
||||
verbose_name='匹数',
|
||||
)
|
||||
created_by = models.ForeignKey(
|
||||
'auth.User',
|
||||
on_delete=models.PROTECT,
|
||||
@@ -79,14 +66,13 @@ class StockChangeRecord(ModelBase):
|
||||
blank=True,
|
||||
verbose_name='操作人',
|
||||
)
|
||||
quantity = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='数量')
|
||||
source_id = models.BigIntegerField(null=True, blank=True, verbose_name='来源单据ID')
|
||||
is_finished = models.BooleanField(default=False, verbose_name='完成出入库')
|
||||
finished_at = models.DateTimeField(null=True, blank=True, verbose_name='完成时间')
|
||||
remarks = models.TextField(blank=True, null=True, verbose_name='备注')
|
||||
|
||||
def __str__(self):
|
||||
return f'出入库记录 {self.id} - 仓库:{self.warehouse.name} - 产品: {self.product.name}'
|
||||
return f'出入库记录 {self.id} - 仓库:{self.warehouse.name}'
|
||||
|
||||
class Meta:
|
||||
verbose_name = '出入库记录'
|
||||
@@ -115,17 +101,57 @@ class StockChangeRecord(ModelBase):
|
||||
return self.type == StockChangeTypeEnum.REMOVE
|
||||
|
||||
@property
|
||||
def delta(self) -> decimal.Decimal:
|
||||
"""计算库存变动的数量增减"""
|
||||
def num_of_rolls(self) -> int:
|
||||
"""获取匹数"""
|
||||
self.details.count()
|
||||
return self.details.count()
|
||||
|
||||
@property
|
||||
def delta_num_of_rolls(self) -> int:
|
||||
"""计算库存变动的匹数增减"""
|
||||
|
||||
# 入库为正,出库为负
|
||||
if self.type == StockChangeTypeEnum.ADD:
|
||||
return self.quantity
|
||||
return self.num_of_rolls
|
||||
elif self.type == StockChangeTypeEnum.REMOVE:
|
||||
return -self.quantity
|
||||
return self.num_of_rolls * -1
|
||||
else:
|
||||
raise ValueError("未知的库存变动类型")
|
||||
|
||||
|
||||
class StockChangeDetail(ModelBase):
|
||||
"""库存变动明细模型"""
|
||||
|
||||
id = models.BigAutoField(primary_key=True)
|
||||
product = models.ForeignKey(
|
||||
basic_info_models.Product,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='stock_change_details',
|
||||
verbose_name='产品',
|
||||
)
|
||||
unit = models.IntegerField(
|
||||
verbose_name='单位',
|
||||
choices=basic_info_models.ProductUnitEnum.choices,
|
||||
)
|
||||
stock_change_record = models.ForeignKey(
|
||||
StockChangeRecord,
|
||||
on_delete=models.CASCADE,
|
||||
related_name='details',
|
||||
verbose_name='库存变动记录',
|
||||
)
|
||||
quantity = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='数量')
|
||||
unit = models.IntegerField(
|
||||
verbose_name='单位',
|
||||
choices=basic_info_models.ProductUnitEnum.choices,
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f'库存变动明细 {self.id} - 记录ID: {self.stock_change_record.id}'
|
||||
|
||||
class Meta:
|
||||
verbose_name = '库存变动明细'
|
||||
verbose_name_plural = '库存变动明细'
|
||||
|
||||
|
||||
class Inventory(ModelBase):
|
||||
"""库存模型"""
|
||||
@@ -217,7 +243,7 @@ class StockSnapshot(ModelBase):
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f'库存快照 {self.id} - 日期: {self.snapshot_date} - 产品: {self.product.name}'
|
||||
return f'库存快照 {self.id} - 产品: {self.product.name}'
|
||||
|
||||
class Meta:
|
||||
verbose_name = '库存快照'
|
||||
|
||||
Reference in New Issue
Block a user