1
0
forked from erp-dev/erp

feat: shipment patch

This commit is contained in:
2026-04-02 18:07:06 +08:00
parent d36d9c1d9c
commit 1be840a8c2
14 changed files with 979 additions and 72 deletions

View File

@@ -3,7 +3,6 @@ from typing import TYPE_CHECKING
from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone
from flower.common import ModelBase
from basic_info import models as basic_models
@@ -23,9 +22,11 @@ class UnitChoices(models.IntegerChoices):
class ShipmentStatus(models.IntegerChoices):
"""出货单状态"""
PENDING_DELIVERY = 1, '待送货'
DELIVERED = 2, '交付'
DRAFT = 1, '草稿(未发布)'
PUBLISHED = 2, '发布'
CANCELLED = 3, '已取消'
REJECTED = 4, '已驳回'
APPROVED = 5, '已审核'
class ExternalFinishedProduct(ModelBase):
@@ -82,14 +83,14 @@ class Shipment(ModelBase):
"""
status = models.IntegerField(
choices=ShipmentStatus.choices,
default=ShipmentStatus.PENDING_DELIVERY,
default=ShipmentStatus.DRAFT,
verbose_name='状态',
)
cancelled_at = models.DateTimeField(
status_modified_at = models.DateTimeField(
null=True,
blank=True,
verbose_name='取消时间',
verbose_name='状态修改时间',
)
cancelled_by = models.ForeignKey(
@@ -101,6 +102,15 @@ class Shipment(ModelBase):
verbose_name='取消人',
)
approved_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='approved_shipments',
verbose_name='审核人',
)
external_id = models.CharField(
max_length=120,
null=True,
@@ -161,15 +171,18 @@ class Shipment(ModelBase):
def cancel(self, operator: User | None) -> None:
"""
取消出货单(记录取消时间与操作者
取消出货单(委托给 service 处理状态机与时间记录)
Args:
operator: 操作者(通常为 request.user可为空
"""
self.status = ShipmentStatus.CANCELLED
self.cancelled_at = timezone.now()
self.cancelled_by = operator
self.save(update_fields=['status', 'cancelled_at', 'cancelled_by', 'updated_at'])
from shipment.services import modify_status
modify_status(
self,
target_status=ShipmentStatus.CANCELLED,
operator=operator,
)
class SalesItem(ModelBase):