From 45cb29d9a01dd40ac034e32e7dfb9629047a4bcb Mon Sep 17 00:00:00 2001 From: RockYang Date: Fri, 15 Dec 2023 16:56:56 +0800 Subject: [PATCH] feat: add img_calls field for recharge products --- api/core/types/config.go | 3 +- api/core/types/order.go | 7 ++-- api/handler/admin/product_handler.go | 10 ++++- api/handler/payment_handler.go | 7 ++++ api/service/mj/pool.go | 2 +- api/service/mj/service.go | 4 +- api/service/xxl_job_service.go | 55 ++++++++++++++++------------ api/store/model/product.go | 1 + api/store/vo/product.go | 1 + database/update-v3.2.3.sql | 1 + web/src/components/UserOrder.vue | 7 +++- web/src/views/admin/Product.vue | 23 +++++++----- web/src/views/admin/SysConfig.vue | 3 ++ 13 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 database/update-v3.2.3.sql diff --git a/api/core/types/config.go b/api/core/types/config.go index ebb69708..99dc4838 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -150,7 +150,8 @@ type SystemConfig struct { Models []string `json:"models"` InitChatCalls int `json:"init_chat_calls"` // 新用户注册赠送对话次数 InitImgCalls int `json:"init_img_calls"` // 新用户注册赠送绘图次数 - VipMonthCalls int `json:"vip_month_calls"` // 会员每个赠送的调用次数 + VipMonthCalls int `json:"vip_month_calls"` // VIP 会员每月赠送的对话次数 + VipMonthImgCalls int `json:"vip_month_img_calls"` // VIP 会员每月赠送绘图次数 EnabledRegister bool `json:"enabled_register"` // 是否启用注册功能,关闭注册功能之后将无法注册 EnabledMsg bool `json:"enabled_msg"` // 是否启用短信验证码服务 RewardImg string `json:"reward_img"` // 众筹收款二维码地址 diff --git a/api/core/types/order.go b/api/core/types/order.go index 433580a1..55c19a1c 100644 --- a/api/core/types/order.go +++ b/api/core/types/order.go @@ -9,9 +9,10 @@ const ( ) type OrderRemark struct { - Days int `json:"days"` // 有效期 - Calls int `json:"calls"` // 增加调用次数 - Name string `json:"name"` // 产品名称 + Days int `json:"days"` // 有效期 + Calls int `json:"calls"` // 增加对话次数 + ImgCalls int `json:"img_calls"` // 增加绘图次数 + Name string `json:"name"` // 产品名称 Price float64 `json:"price"` Discount float64 `json:"discount"` } diff --git a/api/handler/admin/product_handler.go b/api/handler/admin/product_handler.go index 2c6d8df4..11fa66e5 100644 --- a/api/handler/admin/product_handler.go +++ b/api/handler/admin/product_handler.go @@ -33,6 +33,7 @@ func (h *ProductHandler) Save(c *gin.Context) { Enabled bool `json:"enabled"` Days int `json:"days"` Calls int `json:"calls"` + ImgCalls int `json:"img_calls"` CreatedAt int64 `json:"created_at"` } if err := c.ShouldBindJSON(&data); err != nil { @@ -40,7 +41,14 @@ func (h *ProductHandler) Save(c *gin.Context) { return } - item := model.Product{Name: data.Name, Price: data.Price, Discount: data.Discount, Days: data.Days, Calls: data.Calls, Enabled: data.Enabled} + item := model.Product{ + Name: data.Name, + Price: data.Price, + Discount: data.Discount, + Days: data.Days, + Calls: data.Calls, + ImgCalls: data.ImgCalls, + Enabled: data.Enabled} item.Id = data.Id if item.Id > 0 { item.CreatedAt = time.Unix(data.CreatedAt, 0) diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go index 1b819024..a7561a8d 100644 --- a/api/handler/payment_handler.go +++ b/api/handler/payment_handler.go @@ -196,6 +196,7 @@ func (h *PaymentHandler) PayQrcode(c *gin.Context) { remark := types.OrderRemark{ Days: product.Days, Calls: product.Calls, + ImgCalls: product.ImgCalls, Name: product.Name, Price: product.Price, Discount: product.Discount, @@ -330,6 +331,12 @@ func (h *PaymentHandler) notify(orderNo string) error { user.Calls += h.App.SysConfig.VipMonthCalls } + if remark.ImgCalls > 0 { + user.ImgCalls += remark.ImgCalls + } else { + user.ImgCalls += h.App.SysConfig.VipMonthImgCalls + } + // 更新用户信息 res = h.db.Updates(&user) if res.Error != nil { diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go index efcd853e..179373d6 100644 --- a/api/service/mj/pool.go +++ b/api/service/mj/pool.go @@ -28,7 +28,7 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa name := fmt.Sprintf("MjService-%d", k) // create mj service - service := NewService(name, queue, 4, 600, db, client, manager, appConfig) + service := NewService(name, queue, 4, 600, db, client, manager, appConfig.ProxyURL) botName := fmt.Sprintf("MjBot-%d", k) bot, err := NewBot(botName, appConfig.ProxyURL, &config, service) if err != nil { diff --git a/api/service/mj/service.go b/api/service/mj/service.go index 754966e5..c3437a88 100644 --- a/api/service/mj/service.go +++ b/api/service/mj/service.go @@ -25,7 +25,7 @@ type Service struct { taskTimeout int64 } -func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client, manager *oss.UploaderManager, config *types.AppConfig) *Service { +func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout int64, db *gorm.DB, client *Client, manager *oss.UploaderManager, proxy string) *Service { return &Service{ name: name, db: db, @@ -34,7 +34,7 @@ func NewService(name string, queue *store.RedisQueue, maxTaskNum int32, timeout uploadManager: manager, taskTimeout: timeout, maxHandleTaskNum: maxTaskNum, - proxyURL: config.ProxyURL, + proxyURL: proxy, taskStartTimes: make(map[int]time.Time, 0), } } diff --git a/api/service/xxl_job_service.go b/api/service/xxl_job_service.go index b8982053..5ff11462 100644 --- a/api/service/xxl_job_service.go +++ b/api/service/xxl_job_service.go @@ -101,30 +101,39 @@ func (e *XXLJobExecutor) ResetVipCalls(cxt context.Context, param *xxl.RunReq) ( u.Vip = false } else { if u.Calls <= 0 { - u.Calls = config.VipMonthCalls - } else { - // 如果该用户当月有充值点卡,则将点卡中未用完的点数结余到下个月 - var orders []model.Order - e.db.Debug().Where("user_id = ? AND pay_time > ?", u.Id, firstOfMonth).Find(&orders) - var calls = 0 - for _, o := range orders { - var remark types.OrderRemark - err = utils.JsonDecode(o.Remark, &remark) - if err != nil { - continue - } - if remark.Days > 0 { // 会员续费 - continue - } - calls += remark.Calls - } - if u.Calls > calls { // 本月套餐没有用完 - u.Calls = calls + config.VipMonthCalls - } else { - u.Calls = u.Calls + config.VipMonthCalls - } - logger.Infof("%s 点卡结余:%d", u.Mobile, calls) + u.Calls = 0 } + if u.ImgCalls <= 0 { + u.ImgCalls = 0 + } + // 如果该用户当月有充值点卡,则将点卡中未用完的点数结余到下个月 + var orders []model.Order + e.db.Debug().Where("user_id = ? AND pay_time > ?", u.Id, firstOfMonth).Find(&orders) + var calls = 0 + var imgCalls = 0 + for _, o := range orders { + var remark types.OrderRemark + err = utils.JsonDecode(o.Remark, &remark) + if err != nil { + continue + } + if remark.Days > 0 { // 会员续费 + continue + } + calls += remark.Calls + imgCalls += remark.ImgCalls + } + if u.Calls > calls { // 本月套餐没有用完 + u.Calls = calls + config.VipMonthCalls + } else { + u.Calls = u.Calls + config.VipMonthCalls + } + if u.ImgCalls > imgCalls { // 本月套餐没有用完 + u.ImgCalls = imgCalls + config.VipMonthImgCalls + } else { + u.ImgCalls = u.ImgCalls + config.VipMonthImgCalls + } + logger.Infof("%s 点卡结余:%d", u.Mobile, calls) } u.Tokens = 0 // update user diff --git a/api/store/model/product.go b/api/store/model/product.go index 040f715a..b89c4db6 100644 --- a/api/store/model/product.go +++ b/api/store/model/product.go @@ -8,6 +8,7 @@ type Product struct { Discount float64 Days int Calls int + ImgCalls int Enabled bool Sales int SortNum int diff --git a/api/store/vo/product.go b/api/store/vo/product.go index b0a867d3..83b40df1 100644 --- a/api/store/vo/product.go +++ b/api/store/vo/product.go @@ -7,6 +7,7 @@ type Product struct { Discount float64 `json:"discount"` Days int `json:"days"` Calls int `json:"calls"` + ImgCalls int `json:"img_calls"` Enabled bool `json:"enabled"` Sales int `json:"sales"` SortNum int `json:"sort_num"` diff --git a/database/update-v3.2.3.sql b/database/update-v3.2.3.sql new file mode 100644 index 00000000..addb50a0 --- /dev/null +++ b/database/update-v3.2.3.sql @@ -0,0 +1 @@ +ALTER TABLE `chatgpt_products` ADD `img_calls` INT(11) NOT NULL DEFAULT '0' COMMENT '绘图次数' AFTER `calls`; \ No newline at end of file diff --git a/web/src/components/UserOrder.vue b/web/src/components/UserOrder.vue index b715da76..5a195104 100644 --- a/web/src/components/UserOrder.vue +++ b/web/src/components/UserOrder.vue @@ -17,11 +17,16 @@ - + + + +