feat: 业务逻辑补全 — 佣金待审记录、C端订单重构、支付抽象、富友支付、卡设备状态联动
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
F-1: 佣金链断裂时创建 status=99 零额待审记录,新增修正接口 POST /commission-records/:id/resolve F-4: C端订单查询从 Handler 迁移至 Service 层,移除 SkipPermissionCtx J-1: 富友支付 JSAPI/MiniApp 预下单实现,回调补全签名验证 J-2: 平台钱包代购支持(buyerType 为空时使用资产所属代理钱包) J-3: 套餐激活后自动更新卡/设备 status=3,最后套餐过期后更新 status=4 支付抽象: 引入 PaymentProvider 接口 + 微信/富友适配器,CreateOrder 支持多支付渠道 修复: 设备/IoT卡响应 DTO 移除 omitempty,空值字段返回 null 而非省略
This commit is contained in:
@@ -138,6 +138,13 @@ func (h *PackageActivationHandler) processExpiredPackage(ctx context.Context, pk
|
||||
zap.Error(err))
|
||||
// 不返回错误,继续处理
|
||||
}
|
||||
|
||||
if err := h.updateCarrierSuspendedStatus(ctx, tx, carrierType, carrierID); err != nil {
|
||||
h.logger.Warn("更新载体停用状态失败",
|
||||
zap.String("carrier_type", carrierType),
|
||||
zap.Uint("carrier_id", carrierID),
|
||||
zap.Error(err))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -169,6 +176,91 @@ func (h *PackageActivationHandler) invalidateAddons(ctx context.Context, tx *gor
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *PackageActivationHandler) updateCarrierSuspendedStatus(ctx context.Context, tx *gorm.DB, carrierType string, carrierID uint) error {
|
||||
if carrierType == constants.AssetTypeIotCard {
|
||||
return h.updateIotCardSuspendedStatus(ctx, tx, carrierID)
|
||||
}
|
||||
if carrierType == constants.AssetTypeDevice {
|
||||
return h.updateDeviceSuspendedStatus(ctx, tx, carrierID)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *PackageActivationHandler) updateIotCardSuspendedStatus(ctx context.Context, tx *gorm.DB, cardID uint) error {
|
||||
var activeCount int64
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.PackageUsage{}).
|
||||
Where("iot_card_id = ?", cardID).
|
||||
Where("status = ?", constants.PackageUsageStatusActive).
|
||||
Count(&activeCount).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if activeCount > 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return tx.WithContext(ctx).
|
||||
Model(&model.IotCard{}).
|
||||
Where("id = ?", cardID).
|
||||
Update("status", constants.IotCardStatusSuspended).Error
|
||||
}
|
||||
|
||||
func (h *PackageActivationHandler) updateDeviceSuspendedStatus(ctx context.Context, tx *gorm.DB, deviceID uint) error {
|
||||
var activeCount int64
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.PackageUsage{}).
|
||||
Where("device_id = ?", deviceID).
|
||||
Where("status = ?", constants.PackageUsageStatusActive).
|
||||
Count(&activeCount).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if activeCount > 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
var cardIDs []uint
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.DeviceSimBinding{}).
|
||||
Where("device_id = ?", deviceID).
|
||||
Where("bind_status = ?", constants.BindStatusBound).
|
||||
Pluck("iot_card_id", &cardIDs).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(cardIDs) > 0 {
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.PackageUsage{}).
|
||||
Where("iot_card_id IN ?", cardIDs).
|
||||
Where("status = ?", constants.PackageUsageStatusActive).
|
||||
Count(&activeCount).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if activeCount > 0 {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.Device{}).
|
||||
Where("id = ?", deviceID).
|
||||
Update("status", constants.DeviceStatusSuspended).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(cardIDs) > 0 {
|
||||
if err := tx.WithContext(ctx).
|
||||
Model(&model.IotCard{}).
|
||||
Where("id IN ?", cardIDs).
|
||||
Update("status", constants.IotCardStatusSuspended).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getCarrierInfo 获取载体信息
|
||||
func (h *PackageActivationHandler) getCarrierInfo(pkg *model.PackageUsage) (string, uint) {
|
||||
if pkg.IotCardID > 0 {
|
||||
|
||||
Reference in New Issue
Block a user