107 lines
4.2 KiB
Go
107 lines
4.2 KiB
Go
|
|
// 功能描述:向用户本人提供供气订单的配送人员、配送点、资质与交付状态;版本: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
|
|||
|
|
}
|