1
0
forked from erp-dev/erp

feat: shipment_delivery

This commit is contained in:
2026-04-03 16:55:22 +08:00
parent 371cd796e7
commit 76b30cf4f4
16 changed files with 2513 additions and 9 deletions

View File

@@ -29,6 +29,14 @@ class ShipmentStatus(models.IntegerChoices):
APPROVED = 5, '已审核'
class ShipmentDeliveryStatus(models.IntegerChoices):
"""送货单状态"""
PENDING = 1, '待送货'
IN_TRANSIT = 2, '送货中'
DELIVERED = 3, '已送达'
CANCELLED = 4, '已取消'
class ExternalFinishedProduct(ModelBase):
"""
外部成品表
@@ -111,6 +119,15 @@ class Shipment(ModelBase):
verbose_name='审核人',
)
delivery = models.ForeignKey(
'ShipmentDelivery',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='shipments',
verbose_name='送货单',
)
external_id = models.CharField(
max_length=120,
null=True,
@@ -138,6 +155,27 @@ class Shipment(ModelBase):
help_text='实际出货日期'
)
address = models.CharField(
max_length=255,
blank=True,
default='',
verbose_name='地址',
)
contact_name = models.CharField(
max_length=100,
blank=True,
default='',
verbose_name='联系人',
)
contact_phone = models.CharField(
max_length=50,
blank=True,
default='',
verbose_name='联系电话',
)
area = models.CharField(
max_length=30,
blank=True,
@@ -302,3 +340,121 @@ class SalesItem(ModelBase):
return basic_models.Customer.objects.get(id=self.customer_id)
except basic_models.Customer.DoesNotExist:
return None
class ShipmentDelivery(ModelBase):
"""
送货单
记录一次具体送货行为,可关联多个出货单。
"""
status = models.IntegerField(
choices=ShipmentDeliveryStatus.choices,
default=ShipmentDeliveryStatus.PENDING,
db_index=True,
verbose_name='状态',
)
merchant = models.ForeignKey(
basic_models.Merchant,
on_delete=models.PROTECT,
related_name='shipment_deliveries',
verbose_name='所属商户',
)
driver_name = models.CharField(
max_length=100,
db_index=True,
verbose_name='司机名',
)
vehicle_trip = models.CharField(
max_length=100,
db_index=True,
verbose_name='车次',
)
contact_phone = models.CharField(
max_length=50,
blank=True,
default='',
verbose_name='联系电话',
)
vehicle_capacity = models.CharField(
max_length=100,
blank=True,
default='',
verbose_name='车辆容量',
)
remark = models.CharField(
max_length=200,
blank=True,
default='',
verbose_name='备注',
)
internal_remark = models.CharField(
max_length=200,
blank=True,
default='',
verbose_name='内部备注',
)
started_at = models.DateTimeField(
null=True,
blank=True,
verbose_name='开始送货时间',
)
delivered_at = models.DateTimeField(
null=True,
blank=True,
verbose_name='送达时间',
)
cancelled_at = models.DateTimeField(
null=True,
blank=True,
verbose_name='取消时间',
)
created_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name='created_shipment_deliveries',
verbose_name='创建人',
)
operator = models.ForeignKey(
basic_models.Employee,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='operated_shipment_deliveries',
verbose_name='操作人',
)
cancelled_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='cancelled_shipment_deliveries',
verbose_name='取消人',
)
class Meta:
db_table = 'shipment_delivery'
verbose_name = '送货单'
verbose_name_plural = '送货单'
ordering = ['-created_at', '-id']
permissions = [
('cancel_shipmentdelivery', 'Can cancel shipment delivery'),
]
def __str__(self) -> str:
return f'送货单 #{self.id} - {self.driver_name} / {self.vehicle_trip}'