优化配送订单收货地址联动显示

This commit is contained in:
czl231
2026-08-13 22:50:37 +08:00
parent 457bcfb450
commit 029724a46c
12 changed files with 367 additions and 116 deletions

View File

@@ -4,6 +4,7 @@ package user
import (
"errors"
"strings"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/infra"
@@ -28,6 +29,7 @@ func ListUserAddress(ctx *gin.Context) {
var list []models.UserAddress
var total int64
query := common.ApplyKeywordFilter(ctx, common.ActiveRecords(impl.DBService.Model(&models.UserAddress{})), &models.UserAddress{})
query = filterUserAddressByContract(query, ctx.Query("gasorder_contract_identity"))
if err := query.Count(&total).Error; err != nil {
infra.Response.Error(ctx, err)
return
@@ -45,6 +47,17 @@ func ListUserAddress(ctx *gin.Context) {
infra.Response.Success(ctx, gin.H{"total": total, "list": restoreUserAddressLocations(protected, list)})
}
// filterUserAddressByContract 仅返回指定配送合同签约用户的地址,避免后台下单时跨用户选择。
func filterUserAddressByContract(query *gorm.DB, contractIdentity string) *gorm.DB {
contractIdentity = strings.TrimSpace(contractIdentity)
if contractIdentity == "" {
return query
}
contractUser := common.ActiveRecords(impl.DBService.Model(&models.GasorderContract{})).
Select("user_account_id").Where("identity = ?", contractIdentity)
return query.Where("user_account_id = (?)", contractUser)
}
// GetUserAddress 查询用户地址详情,并返回详情与编辑页需要的地址和坐标。
func GetUserAddress(ctx *gin.Context) {
var address models.UserAddress

View File

@@ -3,11 +3,45 @@
package user
import (
"strings"
"testing"
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
"github.com/DATA-DOG/go-sqlmock"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
// TestFilterUserAddressByContract 验证下单地址候选通过合同签约用户进行服务端精确过滤。
func TestFilterUserAddressByContract(t *testing.T) {
sqlDatabase, _, err := sqlmock.New()
if err != nil {
t.Fatalf("创建模拟数据库失败:%v", err)
}
defer sqlDatabase.Close()
database, err := gorm.Open(postgres.New(postgres.Config{Conn: sqlDatabase}), &gorm.Config{})
if err != nil {
t.Fatalf("创建 GORM 数据库失败:%v", err)
}
previous := impl.DBService
impl.DBService = database
defer func() { impl.DBService = previous }()
statement := database.ToSQL(func(tx *gorm.DB) *gorm.DB {
var addresses []models.UserAddress
return filterUserAddressByContract(
tx.Model(&models.UserAddress{}),
" contract-1 ",
).Find(&addresses)
})
if !strings.Contains(statement, `"gasorder_contract"`) ||
!strings.Contains(statement, `identity = 'contract-1'`) ||
!strings.Contains(statement, `user_account_id = (`) {
t.Fatalf("合同用户地址过滤 SQL 不完整:%s", statement)
}
}
// TestRestoreUserAddressLocations 验证用户地址列表按原顺序恢复地址与坐标。
func TestRestoreUserAddressLocations(t *testing.T) {
response := []any{