forked from erp-dev/erp
feat: red flush
This commit is contained in:
16
stock/migrations/0010_stockchangerecord_red_flush_id.py
Normal file
16
stock/migrations/0010_stockchangerecord_red_flush_id.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('stock', '0009_alter_stockchangedetail_unit_alter_stockfreeze_unit_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='stockchangerecord',
|
||||
name='red_flush_id',
|
||||
field=models.UUIDField(blank=True, db_index=True, null=True, verbose_name='红冲批次ID'),
|
||||
),
|
||||
]
|
||||
@@ -96,6 +96,7 @@ class StockChangeRecord(ModelBase):
|
||||
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='完成时间')
|
||||
red_flush_id = models.UUIDField(null=True, blank=True, db_index=True, verbose_name='红冲批次ID')
|
||||
remarks = models.TextField(blank=True, null=True, verbose_name='备注')
|
||||
|
||||
def __str__(self):
|
||||
|
||||
@@ -428,6 +428,7 @@ class StockFlowService:
|
||||
items: List[Dict[str, Any]] | None = None,
|
||||
request_id: str | None = None,
|
||||
extra_meta: Dict[str, Any] | None = None,
|
||||
red_flush_id=None,
|
||||
) -> Tuple[models.StockChangeRecord, List[models.StockChangeDetail], int]:
|
||||
"""
|
||||
创建针对既有库存变动记录的红冲(对冲)占位接口。
|
||||
@@ -438,6 +439,7 @@ class StockFlowService:
|
||||
items: 可选的部分红冲明细(支持宽进/严进等结构);为空时表示全量对冲。
|
||||
request_id: 幂等键;同一 request_id 的请求应视为一次操作。
|
||||
extra_meta: 额外的上下文信息(触发来源、操作者备注等)。
|
||||
red_flush_id: 业务红冲批次 ID,用于跨模块审计追踪。
|
||||
|
||||
Returns:
|
||||
新生成的反向 `StockChangeRecord`、其明细列表以及明细数量。
|
||||
@@ -452,6 +454,7 @@ class StockFlowService:
|
||||
reason=reason.strip(),
|
||||
request_id=request_id,
|
||||
extra_meta=extra_meta or {},
|
||||
red_flush_id=red_flush_id,
|
||||
)
|
||||
return offset_record, created_details, len(created_details)
|
||||
|
||||
@@ -462,6 +465,7 @@ class StockFlowService:
|
||||
reason: str,
|
||||
request_id: str | None,
|
||||
extra_meta: Dict[str, Any],
|
||||
red_flush_id,
|
||||
) -> Tuple[models.StockChangeRecord, List[models.StockChangeDetail]]:
|
||||
with transaction.atomic():
|
||||
source_record = (
|
||||
@@ -503,9 +507,14 @@ class StockFlowService:
|
||||
source_type=models.StockChangeSourceEnum.OFFSET,
|
||||
source_id=source_record.id,
|
||||
created_by=self.created_by,
|
||||
red_flush_id=red_flush_id,
|
||||
remarks=remarks[:500],
|
||||
)
|
||||
|
||||
if red_flush_id and source_record.red_flush_id is None:
|
||||
source_record.red_flush_id = red_flush_id
|
||||
source_record.save(update_fields=['red_flush_id', 'updated_at'])
|
||||
|
||||
created_details: List[models.StockChangeDetail] = []
|
||||
for detail in source_details:
|
||||
new_detail = models.StockChangeDetail.objects.create(
|
||||
|
||||
Reference in New Issue
Block a user