优化配送订单详情关联与参数展示

This commit is contained in:
czl231
2026-08-15 20:32:43 +08:00
parent 42a4fc2f41
commit a20e228296
14 changed files with 584 additions and 55 deletions

View File

@@ -1,5 +1,5 @@
// 功能描述:实现平台配送合同、配送订单及履约状态动作。
// 版本v1.2.0
// 版本v1.3.0
package gasorder
import (
@@ -171,12 +171,13 @@ func getGasorderBasic(ctx *gin.Context) {
infra.Response.Error(ctx, err)
return
}
displayOrder := gasorderDetailDisplay{
GasorderBasic: order,
ContractDisplayName: contractDisplayName(contractNames[order.GasorderContractID]),
displayOrder, displayAssignments, err := buildGasorderDetailDisplays(order, assignments, contractNames[order.GasorderContractID])
if err != nil {
infra.Response.Error(ctx, err)
return
}
response, err := common.PublicResourceResponse(gin.H{
"order": displayOrder, "items": items, "assignments": assignments, "statuses": statuses,
"order": displayOrder, "items": items, "assignments": displayAssignments, "statuses": statuses,
"tracks": tracks, "confirmations": confirmations, "payments": payments,
})
if err != nil {
@@ -685,7 +686,7 @@ func CreateGasorderBasic(ctx *gin.Context) {
return err
}
}
return tx.Create(gasorderStatusRecord(order.ID, common.StatusDraft, common.StatusCreated, "order created", operatorIdentity, operatorName)).Error
return tx.Create(gasorderStatusRecord(order.ID, common.StatusDraft, common.StatusCreated, "订单创建", operatorIdentity, operatorName)).Error
})
if err != nil {
if lookupErr := impl.DBService.Where("request_no = ?", request.RequestNo).First(&order).Error; lookupErr == nil {

View File

@@ -1,5 +1,5 @@
// 功能描述:为平台配送订单列表补充创建方名称、收货地址和合同气瓶摘要。
// 版本v1.0.0
// 功能描述:为平台配送订单列表与详情补充关联名称、地址和合同气瓶摘要。
// 版本v1.1.0
package gasorder
import (
@@ -21,10 +21,31 @@ type gasorderListDisplay struct {
ContractProductsSummary string `json:"contract_products_summary"`
}
// gasorderDetailDisplay 为订单详情补充合同当前标题和编号,不改变订单持久化快照。
// gasorderDetailDisplay 为订单详情补充当前关联对象的可读名称,不改变订单持久化快照。
type gasorderDetailDisplay struct {
models.GasorderBasic
ContractDisplayName string `json:"contract_display_name"`
ContractDisplayName string `json:"contract_display_name"`
CreatorDisplayName string `json:"creator_display_name"`
UserAccountDisplayName string `json:"user_account_display_name"`
GasBasicDisplayName string `json:"gas_basic_display_name"`
DeliveryDisplayName string `json:"delivery_basic_display_name"`
StaffAccountDisplayName string `json:"staff_account_display_name"`
}
// gasorderAssignmentDisplay 为不可变分配事实补充当前机构和人员名称。
type gasorderAssignmentDisplay struct {
models.GasorderAssign
GasBasicDisplayName string `json:"gas_basic_display_name"`
DeliveryDisplayName string `json:"delivery_basic_display_name"`
StaffAccountDisplayName string `json:"staff_account_display_name"`
}
// gasorderRelationDisplayNames 保存订单详情所需的当前关联名称索引。
type gasorderRelationDisplayNames struct {
gas map[uint64]string
delivery map[uint64]string
staff map[uint64]string
user map[uint64]string
}
// ListGasorderBasic 返回平台订单分页列表,并补充只用于管理端展示的可读摘要。
@@ -178,6 +199,114 @@ func firstReadableName(values ...string) string {
return ""
}
// buildGasorderDetailDisplays 统一组装订单主体和分配记录的可读名称。
func buildGasorderDetailDisplays(order models.GasorderBasic, assignments []models.GasorderAssign, contract models.GasorderContract) (gasorderDetailDisplay, []gasorderAssignmentDisplay, error) {
creatorNames, err := loadGasorderCreatorNames([]models.GasorderBasic{order})
if err != nil {
return gasorderDetailDisplay{}, nil, err
}
names, err := loadGasorderRelationDisplayNames(order, assignments)
if err != nil {
return gasorderDetailDisplay{}, nil, err
}
detail := gasorderDetailDisplay{
GasorderBasic: order,
ContractDisplayName: contractDisplayName(contract),
CreatorDisplayName: readableRelationName(creatorNames, creatorLookupKey(order.CreatorType, order.CreatorID), order.CreatorID, "记录已失效"),
UserAccountDisplayName: readableRelationName(names.user, order.UserAccountID, order.UserAccountID, "记录已失效"),
GasBasicDisplayName: readableRelationName(names.gas, order.GasBasicID, order.GasBasicID, "记录已失效"),
DeliveryDisplayName: readableRelationName(names.delivery, order.DeliveryBasicID, order.DeliveryBasicID, "暂未分配"),
StaffAccountDisplayName: readableRelationName(names.staff, order.StaffAccountID, order.StaffAccountID, "暂未分配"),
}
displays := make([]gasorderAssignmentDisplay, 0, len(assignments))
for _, assignment := range assignments {
displays = append(displays, gasorderAssignmentDisplay{
GasorderAssign: assignment,
GasBasicDisplayName: readableRelationName(names.gas, assignment.GasBasicID, assignment.GasBasicID, "记录已失效"),
DeliveryDisplayName: readableRelationName(names.delivery, assignment.DeliveryBasicID, assignment.DeliveryBasicID, "记录已失效"),
StaffAccountDisplayName: readableRelationName(names.staff, assignment.StaffAccountID, assignment.StaffAccountID, "记录已失效"),
})
}
return detail, displays, nil
}
// readableRelationName 按关联主键读取名称,并为未分配或失效记录提供稳定文案。
func readableRelationName[K comparable](names map[K]string, key K, id uint64, emptyText string) string {
if id == 0 {
return emptyText
}
if name := strings.TrimSpace(names[key]); name != "" {
return name
}
return "记录已失效"
}
// loadGasorderRelationDisplayNames 批量读取订单主体与全部分配历史引用的机构和人员名称。
func loadGasorderRelationDisplayNames(order models.GasorderBasic, assignments []models.GasorderAssign) (gasorderRelationDisplayNames, error) {
gasIDs := map[uint64]struct{}{order.GasBasicID: {}}
deliveryIDs := map[uint64]struct{}{}
staffIDs := map[uint64]struct{}{}
userIDs := map[uint64]struct{}{order.UserAccountID: {}}
if order.DeliveryBasicID > 0 {
deliveryIDs[order.DeliveryBasicID] = struct{}{}
}
if order.StaffAccountID > 0 {
staffIDs[order.StaffAccountID] = struct{}{}
}
for _, assignment := range assignments {
gasIDs[assignment.GasBasicID] = struct{}{}
deliveryIDs[assignment.DeliveryBasicID] = struct{}{}
staffIDs[assignment.StaffAccountID] = struct{}{}
}
names := gasorderRelationDisplayNames{
gas: map[uint64]string{}, delivery: map[uint64]string{},
staff: map[uint64]string{}, user: map[uint64]string{},
}
var stations []models.GasBasic
if err := loadGasorderDisplayRecords(gasIDs, &stations); err != nil {
return names, err
}
for _, item := range stations {
names.gas[item.ID] = firstReadableName(item.Name, item.Code)
}
var deliveries []models.DeliveryBasic
if err := loadGasorderDisplayRecords(deliveryIDs, &deliveries); err != nil {
return names, err
}
for _, item := range deliveries {
names.delivery[item.ID] = firstReadableName(item.Name, item.DeliveryCode)
}
var staff []models.StaffAccount
if err := loadGasorderDisplayRecords(staffIDs, &staff); err != nil {
return names, err
}
for _, item := range staff {
names.staff[item.ID] = firstReadableName(item.Name, item.Username)
}
var users []models.UserAccount
if err := loadGasorderDisplayRecords(userIDs, &users); err != nil {
return names, err
}
for _, item := range users {
names.user[item.ID] = firstReadableName(item.Name, item.RealName, item.Username)
}
return names, nil
}
// loadGasorderDisplayRecords 按去重主键读取可读档案;零值主键不发起查询。
func loadGasorderDisplayRecords(ids map[uint64]struct{}, records any) error {
values := make([]uint64, 0, len(ids))
for id := range ids {
if id > 0 {
values = append(values, id)
}
}
if len(values) == 0 {
return nil
}
return impl.DBService.Where("id IN ?", values).Find(records).Error
}
// loadGasorderProductSummaries 生成“名称(类型)”或“名称(类型)等 N 个”的订单气瓶摘要。
func loadGasorderProductSummaries(orders []models.GasorderBasic) (map[uint64]string, error) {
orderIDs := make([]uint64, 0, len(orders))

View File

@@ -1,5 +1,5 @@
// 功能描述:验证平台配送订单列表的可读名称、地址恢复和空值兜底规则。
// 版本v1.0.0
// 版本v1.1.0
package gasorder
import (
@@ -56,3 +56,25 @@ func TestContractDisplayName(t *testing.T) {
})
}
}
// TestReadableRelationName 验证详情关联名称区分正常、未分配和关联失效三种状态。
func TestReadableRelationName(t *testing.T) {
names := map[uint64]string{1: " 和气一站 "}
tests := []struct {
name string
key uint64
id uint64
want string
}{
{name: "正常名称", key: 1, id: 1, want: "和气一站"},
{name: "尚未分配", key: 0, id: 0, want: "暂未分配"},
{name: "关联失效", key: 2, id: 2, want: "记录已失效"},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
if got := readableRelationName(names, test.key, test.id, "暂未分配"); got != test.want {
t.Fatalf("关联展示名称 = %q期望 %q", got, test.want)
}
})
}
}