forked from erp-dev/erp
fix: rebuild stock change record
This commit is contained in:
@@ -19,13 +19,14 @@ def find_inventory(product_id: int, warehouse_id: int) -> models.Inventory | Non
|
||||
return None
|
||||
|
||||
|
||||
def create_stock_snapshot(stock_change_record: models.StockChangeRecord, inventory: models.Inventory) -> models.StockSnapshot:
|
||||
def create_stock_snapshot(stock_change_detail: models.StockChangeDetail, inventory: models.Inventory) -> models.StockSnapshot:
|
||||
"""创建库存快照记录"""
|
||||
|
||||
if not stock_change_record or stock_change_record.id is None:
|
||||
raise ValueError("无效的库存变动记录")
|
||||
if not stock_change_detail or stock_change_detail.id is None:
|
||||
raise ValueError("无效的库存变动明细记录")
|
||||
|
||||
delta = stock_change_record.delta
|
||||
delta = stock_change_detail.quantity if stock_change_detail.stock_change_record.is_incoming else -stock_change_detail.quantity
|
||||
rolls_delta = 1 if stock_change_detail.stock_change_record.is_incoming else -1
|
||||
|
||||
# 必须在库存变动发生后创建快照
|
||||
snapshot = models.StockSnapshot(
|
||||
@@ -34,9 +35,9 @@ def create_stock_snapshot(stock_change_record: models.StockChangeRecord, invento
|
||||
delta=delta,
|
||||
quantity_before=inventory.quantity - delta,
|
||||
quantity_after=inventory.quantity,
|
||||
stock_change_record_id=stock_change_record.id,
|
||||
unit=stock_change_record.unit,
|
||||
num_of_rolls=stock_change_record.num_of_rolls or 1,
|
||||
stock_change_record_id=stock_change_detail.stock_change_record.id,
|
||||
unit=stock_change_detail.unit,
|
||||
num_of_rolls=inventory.num_of_rolls + rolls_delta,
|
||||
)
|
||||
snapshot.save()
|
||||
logger.info(
|
||||
@@ -47,7 +48,7 @@ def create_stock_snapshot(stock_change_record: models.StockChangeRecord, invento
|
||||
|
||||
|
||||
def make_stock_change_completed(stock_change_record: models.StockChangeRecord) -> bool:
|
||||
"""处理库存变动完成后的逻辑"""
|
||||
"""处理库存变动完成后的逻辑, 实际扣减库存也在这里发生"""
|
||||
# TODO: 这里可以添加事务处理以确保数据一致性
|
||||
|
||||
if not stock_change_record or stock_change_record.id is None:
|
||||
@@ -57,44 +58,55 @@ def make_stock_change_completed(stock_change_record: models.StockChangeRecord) -
|
||||
if stock_change_record.is_finished:
|
||||
return True
|
||||
|
||||
inventory_record = find_inventory(
|
||||
product_id=stock_change_record.product_id,
|
||||
warehouse_id=stock_change_record.warehouse_id,
|
||||
)
|
||||
|
||||
if not inventory_record:
|
||||
# TODO: 逻辑更改 = 出入库单现在不记录库存总量了
|
||||
# 需要根据产品分别统计变动数量(要考虑不同单位)
|
||||
|
||||
for detail in stock_change_record.details.all():
|
||||
detail: models.StockChangeDetail
|
||||
|
||||
logger.info(
|
||||
f'库存记录未找到,产品ID: {stock_change_record.product_id}, '
|
||||
f'仓库ID: {stock_change_record.warehouse_id},正在创建新的库存记录。'
|
||||
f'处理库存变动明细,产品ID: {detail.product_id}, '
|
||||
f'数量: {detail.quantity}, 单位: {detail.get_unit_display()}'
|
||||
)
|
||||
|
||||
# 如果没有找到库存记录且为入库,则创建一个新的库存记录
|
||||
|
||||
inventory_record = models.Inventory(
|
||||
product_id=stock_change_record.product_id,
|
||||
inventory_record = find_inventory(
|
||||
product_id=detail.product_id,
|
||||
warehouse_id=stock_change_record.warehouse_id,
|
||||
quantity=stock_change_record.delta,
|
||||
num_of_rolls=stock_change_record.num_of_rolls or 0,
|
||||
minimum_quantity=0,
|
||||
)
|
||||
logger.info(
|
||||
f'创建新的库存记录,产品ID: {inventory_record.product_id}, '
|
||||
f'仓库ID: {inventory_record.warehouse_id}, 数量: {inventory_record.quantity},'
|
||||
f'匹数: {inventory_record.num_of_rolls}'
|
||||
)
|
||||
else:
|
||||
# 更新现有库存记录
|
||||
inventory_record.quantity += stock_change_record.delta
|
||||
if stock_change_record.num_of_rolls:
|
||||
inventory_record.num_of_rolls += stock_change_record.num_of_rolls
|
||||
|
||||
logger.info(
|
||||
f'更新库存记录 {inventory_record.id},新数量: {inventory_record.quantity}, '
|
||||
f'新匹数: {inventory_record.num_of_rolls}'
|
||||
)
|
||||
|
||||
inventory_record.save()
|
||||
create_stock_snapshot(stock_change_record, inventory_record)
|
||||
# 确定方向
|
||||
positive = 1 if stock_change_record.is_incoming else -1
|
||||
|
||||
if inventory_record:
|
||||
# 更新现有库存记录
|
||||
inventory_record.quantity += detail.quantity * positive
|
||||
inventory_record.num_of_rolls += positive
|
||||
|
||||
logger.info(
|
||||
f'更新库存记录 {inventory_record.id},新数量: {inventory_record.quantity}, '
|
||||
f'新匹数: {inventory_record.num_of_rolls}'
|
||||
)
|
||||
|
||||
inventory_record.save()
|
||||
else:
|
||||
# 创建新库存记录
|
||||
inventory_record = models.Inventory(
|
||||
product_id=detail.product_id,
|
||||
warehouse_id=stock_change_record.warehouse_id,
|
||||
quantity=detail.quantity * positive,
|
||||
num_of_rolls=1 if stock_change_record.is_incoming else -1,
|
||||
)
|
||||
inventory_record.save()
|
||||
logger.info(
|
||||
f'创建新库存记录 {inventory_record.id},数量: {inventory_record.quantity}, '
|
||||
f'匹数: {inventory_record.num_of_rolls}'
|
||||
)
|
||||
|
||||
# 无论库存记录原本是否存在都创建库存快照
|
||||
create_stock_snapshot(detail, inventory_record)
|
||||
|
||||
# 所有明细处理完毕,标记库存变动记录为已完成
|
||||
stock_change_record.is_finished = True
|
||||
stock_change_record.finished_at = timezone.now()
|
||||
stock_change_record.save()
|
||||
|
||||
Reference in New Issue
Block a user