1
0
forked from erp-dev/erp
Files
erpnew/shipment/admin.py
2026-04-03 16:55:22 +08:00

171 lines
5.4 KiB
Python

from django.contrib import admin
from .models import ExternalFinishedProduct, Shipment, SalesItem, ShipmentDelivery
class SalesItemInline(admin.TabularInline):
model = SalesItem
extra = 1
fields = ['name', 'quantity', 'unit', 'position', 'remark', 'printing_job_id', 'customer_id', 'created_by']
readonly_fields = ['created_by']
class ExternalFinishedProductInline(admin.TabularInline):
model = ExternalFinishedProduct
extra = 1
fields = ['style_name', 'num_of_rolls', 'remark', 'created_by', 'created_at']
readonly_fields = ['created_by', 'created_at']
@admin.register(Shipment)
class ShipmentAdmin(admin.ModelAdmin):
list_display = [
'id',
'merchant',
'customer',
'shipment_date',
'status',
'delivery',
'external_id',
'items_count',
'created_by',
'created_at',
]
list_filter = ['merchant', 'status', 'shipment_date', 'created_at']
search_fields = [
'customer__name',
'remark',
'external_id',
'address',
'contact_name',
'contact_phone',
]
readonly_fields = ['created_at', 'updated_at', 'created_by']
raw_id_fields = ['delivery']
date_hierarchy = 'shipment_date'
inlines = [SalesItemInline, ExternalFinishedProductInline]
def items_count(self, obj):
return obj.items.count()
items_count.short_description = '销售品数量'
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
super().save_model(request, obj, form, change)
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
if isinstance(instance, (SalesItem, ExternalFinishedProduct)) and not instance.pk:
instance.created_by = request.user
instance.save()
formset.save_m2m()
@admin.register(SalesItem)
class SalesItemAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'quantity', 'unit', 'position', 'shipment_status', 'printing_job_id', 'customer_id', 'created_by', 'created_at']
list_filter = ['unit', 'created_at', ('shipment', admin.EmptyFieldListFilter)]
search_fields = ['name', 'shipment__customer__name', 'position', 'remark']
readonly_fields = ['created_at', 'updated_at', 'created_by']
raw_id_fields = ['shipment']
def shipment_status(self, obj):
if obj.shipment:
return f'出货单 #{obj.shipment.id}'
return '待分配'
shipment_status.short_description = '出货单'
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
super().save_model(request, obj, form, change)
@admin.register(ExternalFinishedProduct)
class ExternalFinishedProductAdmin(admin.ModelAdmin):
list_display = ['id', 'shipment', 'style_name', 'num_of_rolls', 'remark', 'created_by', 'created_at']
list_filter = ['created_at', ('shipment', admin.EmptyFieldListFilter)]
search_fields = ['style_name', 'remark', 'shipment__external_id', 'shipment__customer__name']
readonly_fields = ['created_at', 'updated_at', 'created_by']
raw_id_fields = ['shipment']
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
super().save_model(request, obj, form, change)
@admin.register(ShipmentDelivery)
class ShipmentDeliveryAdmin(admin.ModelAdmin):
list_display = [
'id',
'merchant',
'driver_name',
'vehicle_trip',
'contact_phone',
'vehicle_capacity',
'status',
'shipments_count',
'operator',
'cancelled_by',
'created_by',
'started_at',
'delivered_at',
'cancelled_at',
'created_at',
]
list_filter = ['merchant', 'status', 'created_at', 'started_at', 'delivered_at', 'cancelled_at']
search_fields = [
'driver_name',
'vehicle_trip',
'contact_phone',
'vehicle_capacity',
'remark',
'internal_remark',
'operator__name',
'cancelled_by__username',
'created_by__username',
]
readonly_fields = ['created_at', 'updated_at', 'created_by', 'operator', 'cancelled_by', 'cancelled_at', 'shipments_summary']
fields = [
'merchant',
'driver_name',
'vehicle_trip',
'contact_phone',
'vehicle_capacity',
'remark',
'internal_remark',
'status',
'started_at',
'delivered_at',
'cancelled_at',
'operator',
'cancelled_by',
'created_by',
'shipments_summary',
'created_at',
'updated_at',
]
def shipments_count(self, obj):
return obj.shipments.count()
shipments_count.short_description = '出货单数量'
def shipments_summary(self, obj):
ids = list(obj.shipments.order_by('id').values_list('id', flat=True))
if not ids:
return ''
return ', '.join(str(item_id) for item_id in ids)
shipments_summary.short_description = '关联出货单'
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
employee = getattr(request.user, 'employee', None)
if employee:
obj.operator = employee
super().save_model(request, obj, form, change)