2026-07-30 14:16:58 +08:00
|
|
|
package gas
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"git.apinb.com/bsm-sdk/core/errcode"
|
|
|
|
|
"git.apinb.com/bsm-sdk/core/infra"
|
|
|
|
|
"git.apinb.com/heqiapp/platforms/backend/api/internal/impl"
|
|
|
|
|
"git.apinb.com/heqiapp/platforms/backend/api/internal/logic/common"
|
|
|
|
|
"git.apinb.com/heqiapp/platforms/backend/api/internal/models"
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func currentGas(ctx *gin.Context) (models.GasBasic, bool) {
|
|
|
|
|
_, station, ok := CurrentGasAccount(ctx)
|
|
|
|
|
return station, ok
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func respondList(ctx *gin.Context, list any, total int64) {
|
|
|
|
|
response, err := common.PublicResourceResponse(list)
|
|
|
|
|
if err != nil {
|
|
|
|
|
infra.Response.Error(ctx, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
infra.Response.Success(ctx, gin.H{"total": total, "list": response})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func respondScopedRecord(ctx *gin.Context, query *gorm.DB, model any) {
|
|
|
|
|
if err := query.First(model).Error; err != nil {
|
|
|
|
|
common.RespondRecordError(ctx, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
response, err := common.PublicResourceResponse(model)
|
|
|
|
|
if err != nil {
|
|
|
|
|
infra.Response.Error(ctx, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
infra.Response.Success(ctx, response)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func requireDelivery(ctx *gin.Context, identity string, gasID uint64) (models.DeliveryBasic, bool) {
|
|
|
|
|
var delivery models.DeliveryBasic
|
|
|
|
|
if err := common.ActiveRecords(impl.DBService).
|
|
|
|
|
Where("identity = ? AND gas_basic_id = ?", identity, gasID).First(&delivery).Error; err != nil {
|
|
|
|
|
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
|
|
|
|
return models.DeliveryBasic{}, false
|
|
|
|
|
}
|
|
|
|
|
return delivery, true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func requireStaff(ctx *gin.Context, identity string, gasID uint64) (models.StaffAccount, bool) {
|
|
|
|
|
var staff models.StaffAccount
|
|
|
|
|
if err := common.ActiveRecords(impl.DBService).
|
|
|
|
|
Where("identity = ? AND gas_basic_id = ?", identity, gasID).First(&staff).Error; err != nil {
|
|
|
|
|
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
|
|
|
|
return models.StaffAccount{}, false
|
|
|
|
|
}
|
|
|
|
|
return staff, true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func requireUser(ctx *gin.Context, identity string, gasID uint64) (models.UserAccount, models.UserServiceRelation, bool) {
|
2026-08-18 22:49:14 +08:00
|
|
|
user, relation, err := findCurrentGasUser(impl.DBService, identity, gasID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
|
|
|
|
|
return models.UserAccount{}, models.UserServiceRelation{}, false
|
|
|
|
|
}
|
|
|
|
|
return user, relation, true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// findCurrentGasUser 查询当前气站有效服务关系内的用户,不直接写入 HTTP 响应,供只读合同兜底复用。
|
|
|
|
|
func findCurrentGasUser(databaseService *gorm.DB, identity string, gasID uint64) (models.UserAccount, models.UserServiceRelation, error) {
|
2026-07-30 14:16:58 +08:00
|
|
|
var user models.UserAccount
|
|
|
|
|
var relation models.UserServiceRelation
|
2026-08-18 22:49:14 +08:00
|
|
|
err := common.ActiveRecords(databaseService.Model(&models.UserAccount{})).
|
2026-07-30 14:16:58 +08:00
|
|
|
Select("user_account.*").
|
|
|
|
|
Joins("JOIN user_service_relation ON user_service_relation.user_account_id = user_account.id AND user_service_relation.status <> ?",
|
|
|
|
|
common.StatusArchived).
|
|
|
|
|
Where("user_account.identity = ? AND user_service_relation.gas_basic_id = ?", identity, gasID).
|
|
|
|
|
First(&user).Error
|
|
|
|
|
if err != nil {
|
2026-08-18 22:49:14 +08:00
|
|
|
return models.UserAccount{}, models.UserServiceRelation{}, err
|
2026-07-30 14:16:58 +08:00
|
|
|
}
|
2026-08-18 22:49:14 +08:00
|
|
|
if err := common.ActiveRecords(databaseService).
|
2026-07-30 14:16:58 +08:00
|
|
|
Where("user_account_id = ? AND gas_basic_id = ?", user.ID, gasID).First(&relation).Error; err != nil {
|
2026-08-18 22:49:14 +08:00
|
|
|
return models.UserAccount{}, models.UserServiceRelation{}, err
|
2026-07-30 14:16:58 +08:00
|
|
|
}
|
2026-08-18 22:49:14 +08:00
|
|
|
return user, relation, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// contractScopedUserRecord 带出合同保存的默认配送点,供无服务关系用户只读展示本站合同上下文。
|
|
|
|
|
type contractScopedUserRecord struct {
|
|
|
|
|
models.UserAccount
|
|
|
|
|
ContractDeliveryBasicID uint64 `gorm:"column:contract_delivery_basic_id"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// findContractScopedUser 仅查询当前气站合同中实际引用的用户,禁止借详情接口枚举全局用户。
|
|
|
|
|
func findContractScopedUser(databaseService *gorm.DB, identity string, gasID uint64, contractIdentity string) (contractScopedUserRecord, error) {
|
|
|
|
|
var record contractScopedUserRecord
|
|
|
|
|
err := contractScopedUserQuery(databaseService, identity, gasID, contractIdentity).
|
|
|
|
|
First(&record).Error
|
|
|
|
|
return record, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// contractScopedUserQuery 统一合同用户只读详情与头像的气站范围查询条件。
|
|
|
|
|
func contractScopedUserQuery(databaseService *gorm.DB, identity string, gasID uint64, contractIdentity string) *gorm.DB {
|
|
|
|
|
query := common.ActiveRecords(databaseService.Model(&models.UserAccount{})).
|
|
|
|
|
Select("user_account.*, gasorder_contract.delivery_basic_id AS contract_delivery_basic_id").
|
|
|
|
|
Joins("JOIN gasorder_contract ON gasorder_contract.user_account_id = user_account.id AND gasorder_contract.status <> ?", common.StatusArchived).
|
|
|
|
|
Where("user_account.identity = ? AND gasorder_contract.gas_basic_id = ?", identity, gasID)
|
|
|
|
|
if contractIdentity != "" {
|
|
|
|
|
query = query.Where("gasorder_contract.identity = ?", contractIdentity)
|
|
|
|
|
}
|
|
|
|
|
return query.Order("gasorder_contract.created_at DESC")
|
2026-07-30 14:16:58 +08:00
|
|
|
}
|