120 lines
3.8 KiB
Go
120 lines
3.8 KiB
Go
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
"hyapp/pkg/appcode"
|
|
"hyapp/services/wallet-service/internal/domain/ledger"
|
|
"strings"
|
|
)
|
|
|
|
func giftDebitBizType(command ledger.DebitGiftCommand) string {
|
|
if command.RobotGift {
|
|
return bizTypeRobotGiftDebit
|
|
}
|
|
if command.DirectGift {
|
|
return bizTypeDirectGiftDebit
|
|
}
|
|
return bizTypeGiftDebit
|
|
}
|
|
|
|
func aggregateGiftReceipts(targets []ledger.BatchGiftTargetReceipt) (ledger.Receipt, error) {
|
|
aggregate := ledger.Receipt{}
|
|
billingReceiptIDs := make([]string, 0, len(targets))
|
|
transactionIDs := make([]string, 0, len(targets))
|
|
for _, target := range targets {
|
|
receipt := target.Receipt
|
|
if receipt.BillingReceiptID != "" {
|
|
billingReceiptIDs = append(billingReceiptIDs, receipt.BillingReceiptID)
|
|
}
|
|
if receipt.TransactionID != "" {
|
|
transactionIDs = append(transactionIDs, receipt.TransactionID)
|
|
}
|
|
var err error
|
|
if aggregate.CoinSpent, err = checkedAdd(aggregate.CoinSpent, receipt.CoinSpent); err != nil {
|
|
return ledger.Receipt{}, err
|
|
}
|
|
if aggregate.ChargeAmount, err = checkedAdd(aggregate.ChargeAmount, receipt.ChargeAmount); err != nil {
|
|
return ledger.Receipt{}, err
|
|
}
|
|
if aggregate.HeatValue, err = checkedAdd(aggregate.HeatValue, receipt.HeatValue); err != nil {
|
|
return ledger.Receipt{}, err
|
|
}
|
|
if aggregate.HostPeriodDiamondAdded, err = checkedAdd(aggregate.HostPeriodDiamondAdded, receipt.HostPeriodDiamondAdded); err != nil {
|
|
return ledger.Receipt{}, err
|
|
}
|
|
if aggregate.ChargeAssetType == "" {
|
|
aggregate.ChargeAssetType = receipt.ChargeAssetType
|
|
} else if receipt.ChargeAssetType != "" && aggregate.ChargeAssetType != receipt.ChargeAssetType {
|
|
aggregate.ChargeAssetType = giftWallChargeAssetMixed
|
|
}
|
|
if aggregate.GiftTypeCode == "" {
|
|
aggregate.GiftTypeCode = receipt.GiftTypeCode
|
|
}
|
|
if aggregate.CPRelationType == "" {
|
|
aggregate.CPRelationType = receipt.CPRelationType
|
|
}
|
|
if aggregate.GiftName == "" {
|
|
aggregate.GiftName = receipt.GiftName
|
|
}
|
|
if aggregate.GiftIconURL == "" {
|
|
aggregate.GiftIconURL = receipt.GiftIconURL
|
|
}
|
|
if aggregate.GiftAnimationURL == "" {
|
|
aggregate.GiftAnimationURL = receipt.GiftAnimationURL
|
|
}
|
|
if aggregate.PriceVersion == "" {
|
|
aggregate.PriceVersion = receipt.PriceVersion
|
|
}
|
|
if aggregate.HostPeriodCycleKey == "" {
|
|
aggregate.HostPeriodCycleKey = receipt.HostPeriodCycleKey
|
|
}
|
|
|
|
aggregate.BalanceAfter = receipt.BalanceAfter
|
|
}
|
|
aggregate.BillingReceiptID = strings.Join(billingReceiptIDs, ",")
|
|
aggregate.TransactionID = strings.Join(transactionIDs, ",")
|
|
return aggregate, nil
|
|
}
|
|
|
|
func debitRequestHash(command ledger.DebitGiftCommand) string {
|
|
|
|
if command.DirectGift {
|
|
// direct gift 没有 Room Cell 命令,必须把场景写进幂等摘要,避免和空 room_id 的内部兼容调用互相复用。
|
|
return stableHash(fmt.Sprintf("direct_gift|%s|%s|%d|%d|%s|%d|%s|%d|%d|%t|%d|%d|%t|%s|%s",
|
|
appcode.Normalize(command.AppCode),
|
|
command.RoomID,
|
|
command.SenderUserID,
|
|
command.TargetUserID,
|
|
command.GiftID,
|
|
command.GiftCount,
|
|
strings.TrimSpace(command.PriceVersion),
|
|
command.RegionID,
|
|
command.SenderRegionID,
|
|
command.TargetIsHost,
|
|
command.TargetHostRegionID,
|
|
command.TargetAgencyOwnerUserID,
|
|
command.RobotGift,
|
|
strings.TrimSpace(command.EntitlementID),
|
|
normalizeGiftChargeSource(command.ChargeSource, command.EntitlementID),
|
|
))
|
|
}
|
|
|
|
return stableHash(fmt.Sprintf("gift|%s|%s|%d|%d|%s|%d|%s|%d|%d|%t|%d|%d|%t|%s|%s",
|
|
appcode.Normalize(command.AppCode),
|
|
command.RoomID,
|
|
command.SenderUserID,
|
|
command.TargetUserID,
|
|
command.GiftID,
|
|
command.GiftCount,
|
|
strings.TrimSpace(command.PriceVersion),
|
|
command.RegionID,
|
|
command.SenderRegionID,
|
|
command.TargetIsHost,
|
|
command.TargetHostRegionID,
|
|
command.TargetAgencyOwnerUserID,
|
|
command.RobotGift,
|
|
strings.TrimSpace(command.EntitlementID),
|
|
normalizeGiftChargeSource(command.ChargeSource, command.EntitlementID),
|
|
))
|
|
}
|