forked from erp-dev/erp
feat: salesitem delete guard service
This commit is contained in:
@@ -32,6 +32,24 @@ def _resolve_user_employee(user):
|
||||
return getattr(user, "employee", None)
|
||||
|
||||
|
||||
def get_active_sales_items_queryset() -> QuerySet[SalesItem]:
|
||||
"""
|
||||
返回未软删除的销售品查询集。
|
||||
"""
|
||||
return SalesItem.objects.filter(delete_at__isnull=True)
|
||||
|
||||
|
||||
def ensure_sales_item_can_be_soft_deleted(sales_item: SalesItem) -> None:
|
||||
"""
|
||||
校验销售品是否允许软删除。
|
||||
|
||||
当前规则:
|
||||
- 已关联出货单的销售品不允许删除
|
||||
"""
|
||||
if sales_item.shipment_id is not None:
|
||||
raise ValueError("已关联出货单的销售品不允许删除")
|
||||
|
||||
|
||||
def _resolve_delivery_shipments(
|
||||
*,
|
||||
shipment_ids: list[int],
|
||||
@@ -81,10 +99,9 @@ def get_customers_with_unshipped_sales_items(*, merchant) -> QuerySet:
|
||||
"""
|
||||
from basic_info.models import Customer
|
||||
|
||||
base_sales_items = SalesItem.objects.filter(
|
||||
base_sales_items = get_active_sales_items_queryset().filter(
|
||||
merchant=merchant,
|
||||
shipment__isnull=True,
|
||||
delete_at__isnull=True,
|
||||
customer_id=OuterRef("pk"),
|
||||
)
|
||||
count_subquery = (
|
||||
@@ -155,8 +172,9 @@ def get_sales_items_by_printing_order(
|
||||
).values_list("id", flat=True)
|
||||
|
||||
# 2. 查询 SalesItem,过滤 printing_job_id 在这些 job_ids 中
|
||||
queryset = SalesItem.objects.filter(printing_job_id__in=list(job_ids))
|
||||
queryset = queryset.filter(delete_at__isnull=True)
|
||||
queryset = get_active_sales_items_queryset().filter(
|
||||
printing_job_id__in=list(job_ids)
|
||||
)
|
||||
|
||||
# 3. 根据参数决定是否过滤已出货的销售品
|
||||
if not include_already_has_shipment:
|
||||
@@ -177,10 +195,9 @@ def get_sales_items_by_customer(
|
||||
|
||||
仅返回当前商户下、customer_id 匹配的销售品。
|
||||
"""
|
||||
queryset = SalesItem.objects.filter(
|
||||
queryset = get_active_sales_items_queryset().filter(
|
||||
merchant=merchant,
|
||||
customer_id=customer_id,
|
||||
delete_at__isnull=True,
|
||||
)
|
||||
|
||||
if external_order_id:
|
||||
@@ -277,6 +294,8 @@ def delete_sales_item(
|
||||
if sales_item.delete_at is not None:
|
||||
return sales_item
|
||||
|
||||
ensure_sales_item_can_be_soft_deleted(sales_item)
|
||||
|
||||
sales_item.delete_at = timezone.now()
|
||||
sales_item.delete_by = deleted_by
|
||||
sales_item.save(update_fields=["delete_at", "delete_by", "updated_at"])
|
||||
@@ -669,7 +688,7 @@ def create_shipment(
|
||||
from printing.models import PrintingJob
|
||||
|
||||
# 查询销售品
|
||||
sales_items = SalesItem.objects.filter(id__in=sales_item_ids, delete_at__isnull=True)
|
||||
sales_items = get_active_sales_items_queryset().filter(id__in=sales_item_ids)
|
||||
found_ids = set(sales_items.values_list("id", flat=True))
|
||||
missing_ids = set(sales_item_ids) - found_ids
|
||||
|
||||
@@ -731,8 +750,8 @@ def create_shipment(
|
||||
|
||||
# 关联销售品
|
||||
if sales_item_ids:
|
||||
updated = SalesItem.objects.filter(
|
||||
id__in=sales_item_ids, merchant=merchant, delete_at__isnull=True
|
||||
updated = get_active_sales_items_queryset().filter(
|
||||
id__in=sales_item_ids, merchant=merchant
|
||||
).update(shipment=shipment)
|
||||
if updated != len(sales_item_ids):
|
||||
raise ValueError("存在不属于当前商户的销售品,无法关联到出货单")
|
||||
|
||||
Reference in New Issue
Block a user