Files
platforms/backend/api/internal/logic/client/user/delivery_detail.go
czl231 3ef33b531d 已完成用户APP首期功能开发
交付用户端首期页面、配套接口、后台资源及测试文档。用户APP构建、静态分析和三个管理后台构建通过;完整测试仍有2项失败,后端模型注释检查未通过,详见交付记录。
2026-09-13 00:57:32 +08:00

107 lines
4.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 功能描述向用户本人提供供气订单的配送人员、配送点、资质与交付状态版本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
}