fix platform authorization and workflow integrity
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user