优化配送订单详情关联与参数展示
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user