后台,添加定时任务
This commit is contained in:
		
							parent
							
								
									fb5c0e458b
								
							
						
					
					
						commit
						490e2fa15f
					
				| 
						 | 
					@ -4,10 +4,17 @@ import (
 | 
				
			||||||
	"PaymentCenter/app/constants/common"
 | 
						"PaymentCenter/app/constants/common"
 | 
				
			||||||
	"PaymentCenter/app/data"
 | 
						"PaymentCenter/app/data"
 | 
				
			||||||
	"PaymentCenter/app/http/entities"
 | 
						"PaymentCenter/app/http/entities"
 | 
				
			||||||
 | 
						"PaymentCenter/app/models/orderlogmodel"
 | 
				
			||||||
	"PaymentCenter/app/models/ordersmodel"
 | 
						"PaymentCenter/app/models/ordersmodel"
 | 
				
			||||||
 | 
						"PaymentCenter/app/third/paymentService"
 | 
				
			||||||
 | 
						"PaymentCenter/app/third/paymentService/payCommon"
 | 
				
			||||||
	"PaymentCenter/app/utils"
 | 
						"PaymentCenter/app/utils"
 | 
				
			||||||
 | 
						"PaymentCenter/config"
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/qit-team/snow-core/command"
 | 
						"github.com/qit-team/snow-core/command"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
	"xorm.io/builder"
 | 
						"xorm.io/builder"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -25,7 +32,7 @@ func closeOrder() {
 | 
				
			||||||
	repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
 | 
						repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
 | 
				
			||||||
	// 拼接条件
 | 
						// 拼接条件
 | 
				
			||||||
	cond := builder.NewCond()
 | 
						cond := builder.NewCond()
 | 
				
			||||||
	cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Lt{"create_time": time.Now().Add(-time.Hour)})
 | 
						cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Lt{"create_time": time.Now().Add(-time.Second * time.Duration(config.GetConf().CronConfig.CloseOrderTime))})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	order := make([]ordersmodel.Orders, 0)
 | 
						order := make([]ordersmodel.Orders, 0)
 | 
				
			||||||
	total, err := repo.OrderList(cond, entities.PageRequest{}, &order)
 | 
						total, err := repo.OrderList(cond, entities.PageRequest{}, &order)
 | 
				
			||||||
| 
						 | 
					@ -48,31 +55,119 @@ func closeOrder() {
 | 
				
			||||||
	utils.Log(nil, "关闭订单,修改订单状态成功", "count="+strconv.Itoa(len(order)))
 | 
						utils.Log(nil, "关闭订单,修改订单状态成功", "count="+strconv.Itoa(len(order)))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 定时查询支付中的订单, 主动查询订单支付状态
 | 
					// 主动查询订单支付状态
 | 
				
			||||||
func queryOrder() {
 | 
					func queryOrder() {
 | 
				
			||||||
	var now = time.Now().Format(time.DateTime)
 | 
						var now = time.Now().Format(time.DateTime)
 | 
				
			||||||
	utils.Log(nil, "主动查询订单支付状态", now)
 | 
						utils.Log(nil, "主动查询订单支付状态", now)
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
	// 查询未支付的订单
 | 
						// 查询未支付的订单
 | 
				
			||||||
	repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
 | 
						repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
 | 
				
			||||||
	// 拼接条件
 | 
						// 拼接条件
 | 
				
			||||||
	cond := builder.NewCond()
 | 
						cond := builder.NewCond()
 | 
				
			||||||
	cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Gt{"create_time": time.Now().Add(-time.Second)})
 | 
						config.GetConf()
 | 
				
			||||||
	order := make([]ordersmodel.Orders, 0)
 | 
						cond = cond.And(builder.Eq{"status": common.ORDER_STATUS_PAYING}, builder.Gt{"orders.create_time": time.Now().Add(-time.Second * time.Duration(config.GetConf().CronConfig.QueryOrderTime))})
 | 
				
			||||||
	total, err := repo.OrderList(cond, entities.PageRequest{}, &order)
 | 
						order := make([]ordersmodel.OrdersLeftPayChannelList, 0)
 | 
				
			||||||
 | 
						err := repo.OrdersLeftPayChannelList(cond, entities.PageRequest{}, &order)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		utils.Log(nil, "主动查询订单支付状态,查询未付中订单失败", err)
 | 
							utils.Log(nil, "主动查询订单支付状态,查询未付中订单失败", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	} else if total > 0 {
 | 
						} else if len(order) > 0 {
 | 
				
			||||||
		// 发起查询上游支付
 | 
							ch := make(chan struct{}, config.GetConf().CronConfig.ConcurrentNumber)
 | 
				
			||||||
		for _, v := range order {
 | 
							wg := sync.WaitGroup{}
 | 
				
			||||||
			go func(order ordersmodel.Orders) {
 | 
					 | 
				
			||||||
				// 发起查询
 | 
					 | 
				
			||||||
				utils.Log(nil, "主动查询订单支付状态,发起查询", order.Id)
 | 
					 | 
				
			||||||
				// 解析上游结果
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// 修改订单状态
 | 
							for index := range order {
 | 
				
			||||||
			}(v)
 | 
								ch <- struct{}{}
 | 
				
			||||||
 | 
								wg.Add(1)
 | 
				
			||||||
 | 
								orderInfo := order[index]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// 发起查询上游支付
 | 
				
			||||||
 | 
								go func(orderInfo ordersmodel.OrdersLeftPayChannelList) {
 | 
				
			||||||
 | 
									defer func() {
 | 
				
			||||||
 | 
										<-ch
 | 
				
			||||||
 | 
										wg.Done()
 | 
				
			||||||
 | 
									}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									query := paymentService.PayOrderQueryRequest{
 | 
				
			||||||
 | 
										OrderId: orderInfo.Id,
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									switch orderInfo.ChannelType {
 | 
				
			||||||
 | 
									case common.PAY_CHANNEL_WECHAT_H5, common.PAY_CHANNEL_WECHAT_JSAPI, common.PAY_CHANNEL_WECHAT_NATIVE, common.PAY_CHANNEL_WECHAT_APP, common.PAY_CHANNEL_WECHAT_MINI:
 | 
				
			||||||
 | 
										_ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Wx)
 | 
				
			||||||
 | 
										query.PayChannel = payCommon.PAY_CHANNLE_TYPE_WECHAT
 | 
				
			||||||
 | 
									case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
 | 
				
			||||||
 | 
										query.PayChannel = payCommon.PAY_CHANNLE_TYPE_ZFB
 | 
				
			||||||
 | 
										_ = json.Unmarshal([]byte(orderInfo.ExtJson), &query.Ali)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// 发起查询
 | 
				
			||||||
 | 
									result := paymentService.PayOrderQuery(ctx, query)
 | 
				
			||||||
 | 
									utils.Log(nil, "主动查询订单支付状态,上游返回数据", result)
 | 
				
			||||||
 | 
									// 查询成功,校验状态
 | 
				
			||||||
 | 
									var status int
 | 
				
			||||||
 | 
									if result.Code == payCommon.PAY_SUCCESS_CODE {
 | 
				
			||||||
 | 
										switch result.Result.TradeState {
 | 
				
			||||||
 | 
										case "SUCCESS":
 | 
				
			||||||
 | 
											// 成功
 | 
				
			||||||
 | 
											status = common.ORDER_STATUS_PAYED
 | 
				
			||||||
 | 
										case "REFUND":
 | 
				
			||||||
 | 
											// 退款
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										case "NOTPAY":
 | 
				
			||||||
 | 
											// 未支付
 | 
				
			||||||
 | 
											return
 | 
				
			||||||
 | 
										case "CLOSED":
 | 
				
			||||||
 | 
											// 关闭
 | 
				
			||||||
 | 
											status = common.ORDER_STATUS_CLOSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										// 回调通知下游	todo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										// 更新订单状态 todo
 | 
				
			||||||
 | 
										orderUpdate := ordersmodel.Orders{
 | 
				
			||||||
 | 
											Id:     orderInfo.Id,
 | 
				
			||||||
 | 
											Status: status,
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										session := ordersmodel.GetInstance().GetDb().NewSession()
 | 
				
			||||||
 | 
										if err = session.Begin(); err != nil {
 | 
				
			||||||
 | 
											utils.Log(nil, "主动查询订单支付状态,更新订单状态失败", err)
 | 
				
			||||||
 | 
											return
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										defer func() {
 | 
				
			||||||
 | 
											if err != nil {
 | 
				
			||||||
 | 
												session.Rollback()
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												err = session.Commit()
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}()
 | 
				
			||||||
 | 
										orderLogRepo := data.NewOrderLogRepo(session)
 | 
				
			||||||
 | 
										orderRepo := data.NewOrderRepo(session)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										conn := builder.NewCond()
 | 
				
			||||||
 | 
										conn = conn.And(builder.Eq{"id": orderInfo.Id})
 | 
				
			||||||
 | 
										_, err = orderRepo.OrderUpdate(&orderUpdate, conn)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											utils.Log(nil, "主动查询订单支付状态,更新订单状态失败", err)
 | 
				
			||||||
 | 
											return
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										// 写入支付日志
 | 
				
			||||||
 | 
										log := orderlogmodel.OrderLog{
 | 
				
			||||||
 | 
											OrderId:          orderInfo.Id,
 | 
				
			||||||
 | 
											PayCallback:      "",
 | 
				
			||||||
 | 
											Status:           0,
 | 
				
			||||||
 | 
											MerchantParam:    "",
 | 
				
			||||||
 | 
											MerchantCallback: "",
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										_, err = orderLogRepo.OrderLogInsertOne(&log)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											utils.Log(nil, "主动查询订单支付状态,写入支付日志失败", err)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}(orderInfo)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							wg.Wait()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,8 @@
 | 
				
			||||||
package console
 | 
					package console
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"PaymentCenter/config"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"github.com/robfig/cron"
 | 
						"github.com/robfig/cron"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +11,7 @@ import (
 | 
				
			||||||
 * @wiki https://godoc.org/github.com/robfig/cron
 | 
					 * @wiki https://godoc.org/github.com/robfig/cron
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
func RegisterSchedule(c *cron.Cron) {
 | 
					func RegisterSchedule(c *cron.Cron) {
 | 
				
			||||||
 | 
						fmt.Println(config.GetConf().CronConfig)
 | 
				
			||||||
	//c.AddFunc("0 30 * * * *", test)
 | 
						//c.AddFunc("0 30 * * * *", test)
 | 
				
			||||||
	//c.AddFunc("@hourly", test)
 | 
						//c.AddFunc("@hourly", test)
 | 
				
			||||||
	//c.AddFunc("@every 10s", test)
 | 
						//c.AddFunc("@every 10s", test)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ const (
 | 
				
			||||||
	ADMIN_USER_NAME         = "User-Name"
 | 
						ADMIN_USER_NAME         = "User-Name"
 | 
				
			||||||
	ADMIN_USER_INCLUDEUSERS = "Include-Users"
 | 
						ADMIN_USER_INCLUDEUSERS = "Include-Users"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// '订单状态,待支付、支付中、支付成功、支付失败、订单关闭',
 | 
						// '订单状态,1待支付、2支付中、3支付成功、4支付失败、5订单关闭',
 | 
				
			||||||
	ORDER_STATUS_WAITPAY = 1
 | 
						ORDER_STATUS_WAITPAY = 1
 | 
				
			||||||
	ORDER_STATUS_PAYING  = 2
 | 
						ORDER_STATUS_PAYING  = 2
 | 
				
			||||||
	ORDER_STATUS_PAYED   = 3
 | 
						ORDER_STATUS_PAYED   = 3
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,3 +49,13 @@ func (m *OrderRepo) OrdersBackendList(conn builder.Cond, pageFilter entities.Pag
 | 
				
			||||||
		Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
 | 
							Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
 | 
				
			||||||
	return repo.Desc("create_time").FindAndCount(orderList)
 | 
						return repo.Desc("create_time").FindAndCount(orderList)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersLeftPayChannelList) error {
 | 
				
			||||||
 | 
						repo := m.repo.Select(`orders.*,pay_channel.channel_type,pay_channel.app_id ,pay_channel.ext_json`).
 | 
				
			||||||
 | 
							Where(conn)
 | 
				
			||||||
 | 
						if pageFilter.Page > 0 {
 | 
				
			||||||
 | 
							repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_id")
 | 
				
			||||||
 | 
						return repo.Find(orderList)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ func (p *PayChannelResponse) ResponseFromDb(db paychannelmodel.PayChannel) {
 | 
				
			||||||
	p.ExpireTime = db.ExpireTime.Format("2006-01-02 15:04:05")
 | 
						p.ExpireTime = db.ExpireTime.Format("2006-01-02 15:04:05")
 | 
				
			||||||
	p.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05")
 | 
						p.CreateTime = db.CreateTime.Format("2006-01-02 15:04:05")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch p.ChannelType {
 | 
						switch db.ChannelType {
 | 
				
			||||||
	case common.PAY_CHANNEL_WECHAT_H5, common.PAY_CHANNEL_WECHAT_JSAPI, common.PAY_CHANNEL_WECHAT_NATIVE, common.PAY_CHANNEL_WECHAT_APP, common.PAY_CHANNEL_WECHAT_MINI:
 | 
						case common.PAY_CHANNEL_WECHAT_H5, common.PAY_CHANNEL_WECHAT_JSAPI, common.PAY_CHANNEL_WECHAT_NATIVE, common.PAY_CHANNEL_WECHAT_APP, common.PAY_CHANNEL_WECHAT_MINI:
 | 
				
			||||||
		_ = json.Unmarshal([]byte(db.ExtJson), &p.WechatPayChannel)
 | 
							_ = json.Unmarshal([]byte(db.ExtJson), &p.WechatPayChannel)
 | 
				
			||||||
	case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
 | 
						case common.PAY_CHANNEL_ALIPAY_JSAPI, common.PAY_CHANNEL_ALIPAY_WEB, common.PAY_CHANNEL_ALIPAY_MINI:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,12 @@ type OrdersBackendList struct {
 | 
				
			||||||
	PayName      string `xorm:"'pay_name' varchar(128)"`
 | 
						PayName      string `xorm:"'pay_name' varchar(128)"`
 | 
				
			||||||
	AppName      string `xorm:"'app_name' varchar(128)"`
 | 
						AppName      string `xorm:"'app_name' varchar(128)"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					type OrdersLeftPayChannelList struct {
 | 
				
			||||||
 | 
						Orders      `xorm:"extends"`
 | 
				
			||||||
 | 
						ChannelType int    `xorm:"'channel_type' int(11)"`
 | 
				
			||||||
 | 
						AppId       string `xorm:"'app_id' varchar(255)"`
 | 
				
			||||||
 | 
						ExtJson     string `xorm:"'ext_json' JSON"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 表名
 | 
					// 表名
 | 
				
			||||||
func (m *Orders) TableName() string {
 | 
					func (m *Orders) TableName() string {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ type Config struct {
 | 
				
			||||||
	Jwt                     Jwt                `toml:"Jwt"`
 | 
						Jwt                     Jwt                `toml:"Jwt"`
 | 
				
			||||||
	AliOss                  AliOss             `toml:"AliOss"`
 | 
						AliOss                  AliOss             `toml:"AliOss"`
 | 
				
			||||||
	AdminGate               []string           `toml:"AdminGate"`
 | 
						AdminGate               []string           `toml:"AdminGate"`
 | 
				
			||||||
 | 
						CronConfig              CronConfig         `toml:"CronConfig"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AliOss struct {
 | 
					type AliOss struct {
 | 
				
			||||||
| 
						 | 
					@ -83,6 +84,12 @@ type Nacos struct {
 | 
				
			||||||
	Port int64
 | 
						Port int64
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CronConfig struct {
 | 
				
			||||||
 | 
						CloseOrderTime   int `toml:"CloseOrderTime"`
 | 
				
			||||||
 | 
						QueryOrderTime   int `toml:"QueryOrderTime"`
 | 
				
			||||||
 | 
						ConcurrentNumber int `toml:"ConcurrentNumber"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newConfig() *Config {
 | 
					func newConfig() *Config {
 | 
				
			||||||
	return new(Config)
 | 
						return new(Config)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue