1
0
forked from erp-dev/erp

feat: red flush

This commit is contained in:
2026-06-12 13:57:21 +08:00
parent 80db7867f4
commit 0bcaa2db44
33 changed files with 2997 additions and 17 deletions

View 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'),
),
]

View File

@@ -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):

View File

@@ -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(