Files
platforms/backend/api/internal/logic/client/user/delivery_detail.go

107 lines
4.2 KiB
Go
Raw Normal View History

// 功能描述向用户本人提供供气订单的配送人员、配送点、资质与交付状态版本1.0.0。
package user
import (
"time"
"git.apinb.com/bsm-sdk/core/infra"
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
common "git.apinb.com/heqiapp/platforms/backend/api/internal/logic/common"
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
"github.com/gin-gonic/gin"
)
// GetGasOrderDelivery 先按当前用户限定订单,再读取关联履约事实;不下发员工手机号或内部账号。
func GetGasOrderDelivery(ctx *gin.Context) {
account, ok := common.UserAccount(ctx)
if !ok {
return
}
var order models.GasorderBasic
if err := impl.DBService.Where("identity = ? AND user_account_id = ? AND status <> ?", ctx.Param("identity"), account.ID, common.StatusArchived).First(&order).Error; err != nil {
gasDetailError(ctx, err)
return
}
var station models.GasBasic
if order.GasBasicID != 0 {
if err := impl.DBService.Where("id = ? AND status = ?", order.GasBasicID, common.StatusEnable).Find(&station).Error; err != nil {
gasDetailError(ctx, err)
return
}
}
var delivery models.DeliveryBasic
if order.DeliveryBasicID != 0 {
if err := impl.DBService.Where("id = ? AND status = ?", order.DeliveryBasicID, common.StatusEnable).Find(&delivery).Error; err != nil {
gasDetailError(ctx, err)
return
}
}
var staff models.StaffAccount
if order.StaffAccountID != 0 {
if err := impl.DBService.Where("id = ? AND role_code = ? AND status = ?", order.StaffAccountID, "delivery", common.StatusEnable).Find(&staff).Error; err != nil {
gasDetailError(ctx, err)
return
}
}
var credential models.StaffCredential
if staff.ID != 0 {
if err := impl.DBService.Where("staff_account_id = ? AND status = ? AND (expired_at IS NULL OR expired_at > ?)", staff.ID, common.StatusEnable, time.Now()).Order("expired_at desc nulls first, id desc").Limit(1).Find(&credential).Error; err != nil {
gasDetailError(ctx, err)
return
}
}
var track models.GasorderTrack
if err := impl.DBService.Where("gasorder_basic_id = ? AND status <> ?", order.ID, common.StatusArchived).Order("attempt_no desc, id desc").Limit(1).Find(&track).Error; err != nil {
gasDetailError(ctx, err)
return
}
var items []models.GasorderItem
if err := impl.DBService.Where("gasorder_basic_id = ?", order.ID).Order("created_at, id").Find(&items).Error; err != nil {
gasDetailError(ctx, err)
return
}
products := make([]gin.H, 0, len(items))
for _, item := range items {
products = append(products, gin.H{"name": item.ProductTypeName, "quantity": 1})
}
response := gin.H{
"identity": order.Identity, "order_no": order.OrderNo, "status_code": order.OrderStatus,
"status_name": gasOrderStatusName(order.OrderStatus), "status_message": deliveryStatusMessage(order.OrderStatus),
"appointment_at": order.AppointmentAt, "address": order.Address, "contact_name": order.ContactName,
"contact_phone_masked": common.MaskPhone(order.ContactPhone), "station_name": station.Name,
"delivery_name": delivery.Name, "delivery_address": delivery.Address, "staff_name": staff.Name,
"staff_avatar": "",
"staff_assigned": staff.ID != 0, "staff_avatar_available": staff.Avatar != "",
"credential_verified": credential.ID != 0, "credential_type": credential.CredentialType,
"track_available": track.ID != 0, "track_started_at": nullableTrackTime(track.ID != 0, track.StartedAt),
"track_updated_at": nullableTrackTime(track.ID != 0, track.UpdatedAt), "products": products,
"controlled_call_available": false, "message_available": false, "vehicle_configured": false,
}
infra.Response.Success(ctx, response)
}
// deliveryStatusMessage 只解释已有订单状态,不推断实时位置或预计到达时间。
func deliveryStatusMessage(status int) string {
switch status {
case 18, 19, 20, 35:
return "订单正在准备配送"
case 33:
return "配送员正在履约,请留意订单状态更新"
case 34:
return "商品已到达,请核对后确认签收"
case 23:
return "本次配送已完成"
case 21:
return "配送出现异常,请联系平台处理"
default:
return "当前订单尚未进入配送阶段"
}
}
func nullableTrackTime(available bool, value time.Time) any {
if !available || value.IsZero() {
return nil
}
return value
}