fix platform authorization and workflow integrity

This commit is contained in:
david
2026-07-29 15:54:20 +08:00
parent a7d318a013
commit 969d7271f9
26 changed files with 566 additions and 161 deletions

View File

@@ -2,6 +2,7 @@ package gasorder
import (
"errors"
"math"
"strings"
"time"
@@ -53,7 +54,7 @@ func GetGasorderPayment(ctx *gin.Context) { common.GetResource(ctx, &models.
func getGasorderContract(ctx *gin.Context) {
var contract models.GasorderContract
if err := impl.DBService.Where("identity = ?", ctx.Param("identity")).First(&contract).Error; err != nil {
if err := common.ActiveRecords(impl.DBService).Where("identity = ?", ctx.Param("identity")).First(&contract).Error; err != nil {
common.RespondRecordError(ctx, err)
return
}
@@ -77,7 +78,7 @@ func getGasorderContract(ctx *gin.Context) {
func getGasorderBasic(ctx *gin.Context) {
var order models.GasorderBasic
if err := impl.DBService.Where("identity = ?", ctx.Param("identity")).First(&order).Error; err != nil {
if err := common.ActiveRecords(impl.DBService).Where("identity = ?", ctx.Param("identity")).First(&order).Error; err != nil {
common.RespondRecordError(ctx, err)
return
}
@@ -422,12 +423,19 @@ func CreateGasorderBasic(ctx *gin.Context) {
product.Status != common.StatusEnable || product.ProductStatus == common.StatusScrapped || product.UserAccountID != contract.UserAccountID {
return errors.New("contract product is no longer eligible")
}
if binding.UnitPrice <= 0 || productAmount > math.MaxInt64-binding.UnitPrice {
return errors.New("product amount overflow")
}
productAmount += binding.UnitPrice
}
payable := productAmount + contract.DefaultDeliveryFee - request.DiscountAmount
if payable <= 0 {
if contract.DefaultDeliveryFee < 0 || productAmount > math.MaxInt64-contract.DefaultDeliveryFee {
return errors.New("order amount overflow")
}
subtotal := productAmount + contract.DefaultDeliveryFee
if request.DiscountAmount >= subtotal {
return errors.New("invalid payable amount")
}
payable := subtotal - request.DiscountAmount
order = models.GasorderBasic{
Entity: models.Entity{Identity: models.NewIdentity(), Status: common.StatusEnable}, OrderStatus: common.StatusCreated,
OrderNo: models.NewIdentity(), RequestNo: request.RequestNo, GasorderContractID: contract.ID,
@@ -477,19 +485,20 @@ func AssignGasorderBasic(ctx *gin.Context) {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
var delivery models.DeliveryBasic
if err := impl.DBService.Where("identity = ?", request.DeliveryIdentity).First(&delivery).Error; err != nil || delivery.Status != common.StatusEnable {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
var staff models.StaffAccount
if err := impl.DBService.Where("identity = ?", request.StaffIdentity).First(&staff).Error; err != nil ||
staff.Status != common.StatusEnable || staff.WorkStatus == "off_duty" {
infra.Response.Error(ctx, errcode.ErrInvalidArgument)
return
}
operatorIdentity, operatorName := common.PlatformOperator(ctx)
err := impl.DBService.Transaction(func(tx *gorm.DB) error {
var delivery models.DeliveryBasic
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
Where("identity = ? AND status = ?", request.DeliveryIdentity, common.StatusEnable).
First(&delivery).Error; err != nil {
return err
}
var staff models.StaffAccount
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
Where("identity = ? AND status = ? AND work_status = ?", request.StaffIdentity, common.StatusEnable, "on_duty").
First(&staff).Error; err != nil {
return err
}
var order models.GasorderBasic
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).Where("identity = ?", ctx.Param("identity")).First(&order).Error; err != nil {
return err
@@ -743,7 +752,7 @@ func gasorderStatusRecord(orderID uint64, from, to int, reason, operatorIdentity
func getGasorderTrack(ctx *gin.Context) {
var track models.GasorderTrack
if err := impl.DBService.Where("identity = ?", ctx.Param("identity")).First(&track).Error; err != nil {
if err := common.ActiveRecords(impl.DBService).Where("identity = ?", ctx.Param("identity")).First(&track).Error; err != nil {
common.RespondRecordError(ctx, err)
return
}