144 lines
4.6 KiB
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
|
|
}
|