diff --git a/api/core/types/config.go b/api/core/types/config.go
index fdf6b9a0..54add0d1 100644
--- a/api/core/types/config.go
+++ b/api/core/types/config.go
@@ -139,11 +139,12 @@ type SystemConfig struct {
InitImgCalls int `json:"init_img_calls"`
VipMonthCalls int `json:"vip_month_calls"` // 会员每个赠送的调用次数
EnabledRegister bool `json:"enabled_register"`
- EnabledMsg bool `json:"enabled_msg"` // 启用短信验证码服务
- EnabledDraw bool `json:"enabled_draw"` // 启动 AI 绘画功能
- RewardImg string `json:"reward_img"` // 众筹收款二维码地址
- EnabledFunction bool `json:"enabled_function"` // 启用 API 函数功能
- EnabledReward bool `json:"enabled_reward"` // 启用众筹功能
- EnabledAlipay bool `json:"enabled_alipay"` // 是否启用支付宝支付通道
- DefaultModels []string `json:"default_models"` // 默认开通的 AI 模型
+ EnabledMsg bool `json:"enabled_msg"` // 启用短信验证码服务
+ EnabledDraw bool `json:"enabled_draw"` // 启动 AI 绘画功能
+ RewardImg string `json:"reward_img"` // 众筹收款二维码地址
+ EnabledFunction bool `json:"enabled_function"` // 启用 API 函数功能
+ EnabledReward bool `json:"enabled_reward"` // 启用众筹功能
+ EnabledAlipay bool `json:"enabled_alipay"` // 是否启用支付宝支付通道
+ OrderPayTimeout int `json:"order_pay_timeout"` //订单支付超时时间
+ DefaultModels []string `json:"default_models"` // 默认开通的 AI 模型
}
diff --git a/api/service/xxl_job_service.go b/api/service/xxl_job_service.go
index 1822429b..f112ae40 100644
--- a/api/service/xxl_job_service.go
+++ b/api/service/xxl_job_service.go
@@ -40,9 +40,25 @@ func (e *XXLJobExecutor) Run() error {
// ClearOrder 清理未支付的订单,如果没有抛出异常则表示执行成功
func (e *XXLJobExecutor) ClearOrder(cxt context.Context, param *xxl.RunReq) (msg string) {
- timeout := time.Now().Unix() - 600
+ logger.Debug("执行清理未支付订单...")
+ var sysConfig model.Config
+ res := e.db.Where("marker", "system").First(&sysConfig)
+ if res.Error != nil {
+ return "error with get system config: " + res.Error.Error()
+ }
+
+ var config types.SystemConfig
+ err := utils.JsonDecode(sysConfig.Config, &config)
+ if err != nil {
+ return "error with decode system config: " + err.Error()
+ }
+
+ if config.OrderPayTimeout == 0 { // 默认未支付订单的生命周期为 30 分钟
+ config.OrderPayTimeout = 1800
+ }
+ timeout := time.Now().Unix() - int64(config.OrderPayTimeout)
start := utils.Stamp2str(timeout)
- res := e.db.Where("status != ? AND created_at < ?", types.OrderPaidSuccess, start).Delete(&model.Order{})
+ res = e.db.Where("status != ? AND created_at < ?", types.OrderPaidSuccess, start).Delete(&model.Order{})
return fmt.Sprintf("Clear order successfully, affect rows: %d", res.RowsAffected)
}
@@ -58,13 +74,13 @@ func (e *XXLJobExecutor) ResetVipCalls(cxt context.Context, param *xxl.RunReq) (
var sysConfig model.Config
res = e.db.Where("marker", "system").First(&sysConfig)
if res.Error != nil {
- panic(res.Error)
+ return "error with get system config: " + res.Error.Error()
}
var config types.SystemConfig
err := utils.JsonDecode(sysConfig.Config, &config)
if err != nil {
- panic(err)
+ return "error with decode system config: " + err.Error()
}
// 获取本月月初时间
@@ -115,9 +131,9 @@ func (e *XXLJobExecutor) ResetVipCalls(cxt context.Context, param *xxl.RunReq) (
type customLogger struct{}
func (l *customLogger) Info(format string, a ...interface{}) {
- logger.Debug(format, a)
+ logger.Debugf(format, a...)
}
func (l *customLogger) Error(format string, a ...interface{}) {
- logger.Error(format, a)
+ logger.Errorf(format, a...)
}
diff --git a/web/src/components/CountDown.vue b/web/src/components/CountDown.vue
new file mode 100644
index 00000000..f21a31b4
--- /dev/null
+++ b/web/src/components/CountDown.vue
@@ -0,0 +1,97 @@
+
+
+