micro-bundle/internal/dao/orderGateDao.go

144 lines
4.6 KiB
Go

package dao
import (
"micro-bundle/internal/model"
"micro-bundle/pkg/app"
"time"
)
// ExistsOverduePayLaterBundle 是否存在「套餐 + 先用后付 + 到期未付」订单
// 命中即应拦截后续套餐下单(增值仍允许「无限续杯」)。
func ExistsOverduePayLaterBundle(customerID string) (bool, error) {
if customerID == "" {
return false, nil
}
var cnt int64
err := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where("customer_id = ? AND order_mode = ? AND (status = ? OR pay_later_status = ?)",
customerID,
model.OrderModePayLater,
model.BundleStatusOverdue,
model.PayLaterStatusOverdue,
).Count(&cnt).Error
if err != nil {
return false, err
}
return cnt > 0, nil
}
// ExistsUnpaidNormalBundle 是否存在「套餐 + 普通支付 + 未支付」订单
// 命中即应拦截普通支付类型的套餐下单。
func ExistsUnpaidNormalBundle(customerID string) (bool, error) {
if customerID == "" {
return false, nil
}
var cnt int64
err := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where("customer_id = ? AND order_mode = ? AND status IN (?, ?)",
customerID,
model.OrderModeNormal,
model.BundleStatusSignedUnpaid,
model.BundleStatusOverdue,
).Count(&cnt).Error
if err != nil {
return false, err
}
return cnt > 0, nil
}
// ExistsPendingPayLaterBundle 是否存在「套餐 + 先用后付 + 待付款(未逾期)」订单。
// 命中即提示用户去支付,避免同时存在多个先用后付未支付套餐订单。
func ExistsPendingPayLaterBundle(customerID string) (bool, error) {
if customerID == "" {
return false, nil
}
var cnt int64
err := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where("customer_id = ? AND order_mode = ? AND pay_later_status = ? AND status = ?",
customerID,
model.OrderModePayLater,
model.PayLaterStatusPending,
model.BundleStatusSignedUnpaid,
).Count(&cnt).Error
if err != nil {
return false, err
}
return cnt > 0, nil
}
// ExistsActiveBundle 是否存在有效期内的套餐订单(已签未付 / 已签已付)
// 用于保证:套餐有效期内只存在一笔订单。
func ExistsActiveBundle(customerID string) (bool, error) {
if customerID == "" {
return false, nil
}
now := time.Now().Format("2006-01-02 15:04:05")
var cnt int64
err := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where("customer_id = ? AND status IN (?,?) AND (expiration_time = '' OR expiration_time IS NULL OR expiration_time >= ?)",
customerID,
model.BundleStatusSignedUnpaid,
model.BundleStatusPaid,
now,
).Count(&cnt).Error
if err != nil {
return false, err
}
return cnt > 0, nil
}
// ExistsValidBundleForValueAdd 是否存在有效的套餐订单可用于增值服务下单
// 规则:普通已支付 或 先用后付未逾期未支付
func ExistsValidBundleForValueAdd(customerID string) (bool, error) {
if customerID == "" {
return false, nil
}
var cnt int64
err := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where(`customer_id = ? AND (
(order_mode = ? AND status = ?) OR
(order_mode = ? AND pay_later_status IN (?, ?) AND status != ?)
)`,
customerID,
model.OrderModeNormal, model.BundleStatusPaid,
model.OrderModePayLater, model.PayLaterStatusPending, model.PayLaterStatusPaid, model.BundleStatusOverdue,
).Count(&cnt).Error
if err != nil {
return false, err
}
return cnt > 0, nil
}
// MarkBundleOverdue 套餐先用后付到期扫描:将到期且未付的订单置为 Overdue
func MarkBundleOverdue(now time.Time) (int64, error) {
t := now.Format("2006-01-02 15:04:05")
r := app.ModuleClients.BundleDB.
Model(&model.BundleOrderRecords{}).
Where("order_mode = ? AND pay_later_status = ? AND due_time <> '' AND due_time <= ?",
model.OrderModePayLater, model.PayLaterStatusPending, t).
Updates(map[string]interface{}{
"pay_later_status": model.PayLaterStatusOverdue,
"status": model.BundleStatusOverdue,
})
return r.RowsAffected, r.Error
}
// MarkValueAddExpiredByDue 增值服务到期扫描:到期未付 → pay_later_status=逾期未付。
// 注意:余量是否作废由余量模块依据 pay_later_status 判定,订单侧不写入余量字段(is_expired)。
func MarkValueAddExpiredByDue(now time.Time) (int64, error) {
t := now.Format("2006-01-02 15:04:05")
r := app.ModuleClients.BundleDB.
Model(&model.BundleOrderValueAdd{}).
Where("order_mode = ? AND pay_later_status = ? AND due_time <> '' AND due_time <= ?",
model.OrderModePayLater, model.PayLaterStatusPending, t).
Updates(map[string]interface{}{
"pay_later_status": model.PayLaterStatusOverdue,
})
return r.RowsAffected, r.Error
}