🎉初次代码上传
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
9
.idea/gateway.iml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="Go" enabled="true" />
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/gateway.iml" filepath="$PROJECT_DIR$/.idea/gateway.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
1
build.sh
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
|
||||||
21
conf/app.conf
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
appname = jhgateway
|
||||||
|
HTTPAddr = localhost
|
||||||
|
httpport = 12309
|
||||||
|
RemoteAddr = localhost
|
||||||
|
RemotePort = 12309
|
||||||
|
runmode = dev
|
||||||
|
HTTPAddr = localhost
|
||||||
|
sessionon = true
|
||||||
|
|
||||||
|
[mysql]
|
||||||
|
dbhost = localhost
|
||||||
|
dbport = 3306
|
||||||
|
dbuser = root
|
||||||
|
dbpasswd = 123456
|
||||||
|
dbbase = juhe_pay
|
||||||
|
|
||||||
|
[mf]
|
||||||
|
; 提交卡密接口
|
||||||
|
submit_card_url = http://test.shop.center.mf178.cn/userapi/card/submit_card
|
||||||
|
; url = https://shop.task.mf178.cn/userapi/card/submit_card
|
||||||
|
query_card_url = http://test.shop.center.mf178.cn/userapi/card/order_info
|
||||||
14
conf/cfg_model.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package conf
|
||||||
|
|
||||||
|
import "github.com/beego/beego/v2/server/web"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) GetMFCardSubmitUrl() (string, error) {
|
||||||
|
return web.AppConfig.String("mf::submit_card_url")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) GetMFCardQueryUrl() (string, error) {
|
||||||
|
return web.AppConfig.String("mf::query_card_url")
|
||||||
|
}
|
||||||
104
conf/config.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package conf
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/26 15:30
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : conf_pro
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/26 15:30
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
const (
|
||||||
|
ACTIVE = "active"
|
||||||
|
UNACTIVE = "unactive"
|
||||||
|
DELETE = "delete"
|
||||||
|
REFUND = "refund"
|
||||||
|
ORDERROLL = "order_roll"
|
||||||
|
WAIT = "wait"
|
||||||
|
SUCCESS = "success"
|
||||||
|
FAIL = "fail"
|
||||||
|
YES = "yes"
|
||||||
|
NO = "no"
|
||||||
|
ZERO = 0.0 //0元手续费
|
||||||
|
VERIFY_CODE_LEN = 4 //验证码的长度
|
||||||
|
PAYFOR_FEE = 2.00 //代付手续费
|
||||||
|
PAYFOR_INTERVAL = 5 //每过5分钟执行一次代付
|
||||||
|
|
||||||
|
PLUS_AMOUNT = "plus_amount" //加款操作
|
||||||
|
SUB_AMOUNT = "sub_amount" //减款操作
|
||||||
|
FREEZE_AMOUNT = "freeze_amount" //冻结操作
|
||||||
|
UNFREEZE_AMOUNT = "unfreeze_amount" //解冻操作
|
||||||
|
|
||||||
|
PAYFOR_COMFRIM = "payfor_confirm" //下发带审核
|
||||||
|
PAYFOR_SOLVING = "payfor_solving" //发下处理中
|
||||||
|
PAYFOR_HANDING = "payfor_handing" //手动打款中
|
||||||
|
PAYFOR_BANKING = "payfor_banking" //银行处理中
|
||||||
|
PAYFOR_FAIL = "payfor_fail" //代付失败
|
||||||
|
PAYFOR_SUCCESS = "payfor_success" //代付成功
|
||||||
|
|
||||||
|
PAYFOR_ROAD = "payfor_road" //通道打款
|
||||||
|
PAYFOR_HAND = "payfor_hand" //手动打款
|
||||||
|
PAYFOR_REFUSE = "payfor_refuse" // 拒绝打款
|
||||||
|
|
||||||
|
SELF_API = "self_api" //自助api系统下发
|
||||||
|
SELF_MERCHANT = "self_merchant" //管理手动处理商户下发
|
||||||
|
SELF_HELP = "self_help" //管理自己提现
|
||||||
|
|
||||||
|
PUBLIC = "public" //对公卡
|
||||||
|
PRIVATE = "private" //对私卡
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ICBC = "ICBC"
|
||||||
|
ABC = "ABC"
|
||||||
|
BOC = "BOC"
|
||||||
|
CCB = "CCB"
|
||||||
|
BOCOM = "BOCOM"
|
||||||
|
CNCB = "CNCB"
|
||||||
|
CEB = "CEB"
|
||||||
|
HXB = "HXB"
|
||||||
|
CMBC = "CMBC"
|
||||||
|
GDB = "GDB"
|
||||||
|
CMB = "CMB"
|
||||||
|
CIB = "CIB"
|
||||||
|
SPDB = "SPDB"
|
||||||
|
PSBC = "PSBC"
|
||||||
|
PAB = "PAB"
|
||||||
|
NJCB = "NJCB"
|
||||||
|
NBCB = "NBCB"
|
||||||
|
WZCB = "WZCB"
|
||||||
|
CSCB = "CSCB"
|
||||||
|
CZCB = "CZCB"
|
||||||
|
CCQTGB = "CCQTGB"
|
||||||
|
SHRCB = "SHRCB"
|
||||||
|
BJRCB = "BJRCB"
|
||||||
|
SDB = "SDB"
|
||||||
|
)
|
||||||
|
|
||||||
|
var bankInfo = map[string]string{
|
||||||
|
ICBC: "中国工商银行",
|
||||||
|
ABC: "中国农业银行",
|
||||||
|
BOC: "中国银行",
|
||||||
|
CCB: "中国建设银行",
|
||||||
|
BOCOM: "交通银行",
|
||||||
|
CNCB: "中信银行",
|
||||||
|
CEB: "中国光大银行",
|
||||||
|
HXB: "华夏银行",
|
||||||
|
CMBC: "中国民生银行",
|
||||||
|
GDB: "广发银行",
|
||||||
|
CMB: "招商银行",
|
||||||
|
CIB: "兴业银行",
|
||||||
|
SPDB: "浦发银行",
|
||||||
|
PSBC: "中国邮政储蓄银行",
|
||||||
|
PAB: "平安银行",
|
||||||
|
NJCB: "南京银行",
|
||||||
|
NBCB: "宁波银行",
|
||||||
|
WZCB: "温州市商业银行",
|
||||||
|
CSCB: "长沙银行",
|
||||||
|
CZCB: "浙江稠州商业银行",
|
||||||
|
CCQTGB: "重庆三峡银行",
|
||||||
|
SHRCB: "上海农村商业银行",
|
||||||
|
BJRCB: "北京农商行",
|
||||||
|
SDB: "深圳发展银行",
|
||||||
|
}
|
||||||
17
conf/mq_config.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// Package conf /***************************************************
|
||||||
|
package conf
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
|
const (
|
||||||
|
mqHost = "127.0.0.1"
|
||||||
|
mqPort = "61613"
|
||||||
|
|
||||||
|
MqOrderQuery = "order_query"
|
||||||
|
MQ_PAYFOR_QUERY = "payfor_query" //代付
|
||||||
|
MqOrderNotify = "order_notify" //订单通知
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetMQAddress() string {
|
||||||
|
return net.JoinHostPort(mqHost, mqPort)
|
||||||
|
}
|
||||||
102
conf/pay_way_code.go
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/29 15:01
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : pay_way_code
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/29 15:01
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package conf
|
||||||
|
|
||||||
|
var ScanPayWayCodes = []string{
|
||||||
|
"WEIXIN_SCAN",
|
||||||
|
"UNION_SCAN",
|
||||||
|
"ALI_SCAN",
|
||||||
|
"BAIDU_SCAN",
|
||||||
|
"JD_SCAN",
|
||||||
|
"QQ_SCAN",
|
||||||
|
"CARD_DH",
|
||||||
|
}
|
||||||
|
|
||||||
|
var H5PayWayCodes = []string{
|
||||||
|
"WEIXIN_H5",
|
||||||
|
"ALI_H5",
|
||||||
|
"QQ_H5",
|
||||||
|
"UNION_H5",
|
||||||
|
"BAIDU_H5",
|
||||||
|
"JD_H5",
|
||||||
|
}
|
||||||
|
|
||||||
|
var SytPayWayCodes = []string{
|
||||||
|
"WEIXIN_SYT",
|
||||||
|
"ALI_SYT",
|
||||||
|
"QQ_SYT",
|
||||||
|
"UNION_SYT",
|
||||||
|
"BAIDU_SYT",
|
||||||
|
"JD_SYT",
|
||||||
|
}
|
||||||
|
|
||||||
|
var FastPayWayCodes = []string{
|
||||||
|
"UNION-FAST",
|
||||||
|
}
|
||||||
|
|
||||||
|
var WebPayWayCode = []string{
|
||||||
|
"UNION-WAP",
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetScanPayWayCodes() []string {
|
||||||
|
return ScanPayWayCodes
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNameByPayWayCode(code string) string {
|
||||||
|
switch code {
|
||||||
|
case "WEIXIN_SCAN":
|
||||||
|
return "微信扫码"
|
||||||
|
case "UNION_SCAN":
|
||||||
|
return "银联扫码"
|
||||||
|
case "ALI_SCAN":
|
||||||
|
return "支付宝扫码"
|
||||||
|
case "BAIDU_SCAN":
|
||||||
|
return "百度扫码"
|
||||||
|
case "JD_SCAN":
|
||||||
|
return "京东扫码"
|
||||||
|
case "QQ_SCAN":
|
||||||
|
return "QQ扫码"
|
||||||
|
|
||||||
|
case "WEIXIN_H5":
|
||||||
|
return "微信H5"
|
||||||
|
case "UNION_H5":
|
||||||
|
return "银联H5"
|
||||||
|
case "ALI_H5":
|
||||||
|
return "支付宝H5"
|
||||||
|
case "BAIDU_H5":
|
||||||
|
return "百度H5"
|
||||||
|
case "JD_H5":
|
||||||
|
return "京东H5"
|
||||||
|
case "QQ_H5":
|
||||||
|
return "QQ-H5"
|
||||||
|
|
||||||
|
case "WEIXIN_SYT":
|
||||||
|
return "微信收银台"
|
||||||
|
case "UNION_SYT":
|
||||||
|
return "银联收银台"
|
||||||
|
case "ALI_SYT":
|
||||||
|
return "支付宝收银台"
|
||||||
|
case "BAIDU_SYT":
|
||||||
|
return "百度收银台"
|
||||||
|
case "JD_SYT":
|
||||||
|
return "京东收银台"
|
||||||
|
case "QQ_SYT":
|
||||||
|
return "QQ-收银台"
|
||||||
|
|
||||||
|
case "UNION_FAST":
|
||||||
|
return "银联快捷"
|
||||||
|
case "UNION_WAP":
|
||||||
|
return "银联web"
|
||||||
|
case "CARD_DH":
|
||||||
|
return "卡密兑换"
|
||||||
|
default:
|
||||||
|
return "未知"
|
||||||
|
}
|
||||||
|
}
|
||||||
49
controllers/gateway/base_controller.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package gateway
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : 处理下游请求的一些公用的逻辑
|
||||||
|
** @Time : 2019/10/28 18:09
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : base_gateway
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/28 18:09
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
import (
|
||||||
|
"gateway/response"
|
||||||
|
"gateway/service"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BaseGateway struct {
|
||||||
|
web.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
// PayPrepare 获取商户请求过来的基本参数参数
|
||||||
|
func (c *BaseGateway) PayPrepare() *response.PayBaseResp {
|
||||||
|
params := make(map[string]string)
|
||||||
|
//获取客户端的ip
|
||||||
|
clientIP := c.Ctx.Input.IP()
|
||||||
|
params["exValue"] = strings.TrimSpace(c.GetString("exValue"))
|
||||||
|
params["orderNo"] = strings.TrimSpace(c.GetString("orderNo"))
|
||||||
|
params["productName"] = strings.TrimSpace(c.GetString("productName"))
|
||||||
|
params["orderPeriod"] = strings.TrimSpace(c.GetString("orderPeriod"))
|
||||||
|
params["orderPrice"] = strings.TrimSpace(c.GetString("orderPrice"))
|
||||||
|
params["payWayCode"] = strings.TrimSpace(c.GetString("payWayCode"))
|
||||||
|
params["osType"] = strings.TrimSpace(c.GetString("osType"))
|
||||||
|
params["notifyUrl"] = strings.TrimSpace(c.GetString("notifyUrl"))
|
||||||
|
//c.Params["returnUrl"] = strings.TrimSpace(c.GetString("returnUrl"))
|
||||||
|
params["payKey"] = strings.TrimSpace(c.GetString("payKey"))
|
||||||
|
params["sign"] = strings.TrimSpace(c.GetString("sign"))
|
||||||
|
|
||||||
|
p := service.GetMerchantInfo(params)
|
||||||
|
p.ClientIP = clientIP
|
||||||
|
p = service.JudgeParams(p)
|
||||||
|
|
||||||
|
if p.Code != -1 {
|
||||||
|
p.Code = 200
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
23
controllers/gateway/error_controller.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/26 16:56
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : error_gateway
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/26 16:56
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package gateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ErrorGatewayController struct {
|
||||||
|
web.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ErrorGatewayController) ErrorParams() {
|
||||||
|
web.ReadFromRequest(&c.Controller)
|
||||||
|
c.TplName = "err/params.html"
|
||||||
|
}
|
||||||
273
controllers/gateway/order_controller.go
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
package gateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/query"
|
||||||
|
"gateway/service"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/astaxie/beego/logs"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderController struct {
|
||||||
|
web.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OrderController) ShowErr(string2 string) {
|
||||||
|
web.ReadFromRequest(&c.Controller)
|
||||||
|
c.Data["flash"] = map[string]string{"error": string2}
|
||||||
|
c.TplName = "err/params.html"
|
||||||
|
}
|
||||||
|
|
||||||
|
type JsonResponse struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CardSuit 卡片提交
|
||||||
|
func (c *OrderController) CardSuit() {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["orderNo"] = strings.TrimSpace(c.GetString("orderid"))
|
||||||
|
params["exValue"] = strings.TrimSpace(c.GetString("card"))
|
||||||
|
orderInfo := order.GetOrderByMerchantOrderId(params["orderNo"])
|
||||||
|
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: "订单已被处理或者不存在。",
|
||||||
|
}
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if orderInfo.ExValue != "" {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: "你已提交过卡密信息,无需重复提交。",
|
||||||
|
}
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderInfo.Status != "wait" {
|
||||||
|
logs.Error("阿达达,订单号=", orderInfo.BankOrderId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
if orderInfo.Status != "wait" {
|
||||||
|
logs.Error("是否收到,订单号=", orderInfo.BankOrderId)
|
||||||
|
return errors.New(fmt.Sprintf("该订单已经处理,订单号= %s", orderInfo.BankOrderId))
|
||||||
|
}
|
||||||
|
|
||||||
|
//{"card_type":"171","data":"111111","face_type":"10","recovery_type":"2"}
|
||||||
|
cdata := third_party.CardInfo{
|
||||||
|
CardType: "171",
|
||||||
|
FaceType: fmt.Sprintf("%f", orderInfo.OrderAmount),
|
||||||
|
RecoveryType: "2",
|
||||||
|
Data: params["exValue"],
|
||||||
|
}
|
||||||
|
marshal, err := json.Marshal(cdata)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo.ExValue = string(marshal)
|
||||||
|
orderInfo.CardData = params["exValue"]
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, update order info fail: %s, bankOrderId = %s", err, orderInfo.BankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
params["MerchantUid"] = orderInfo.MerchantUid
|
||||||
|
params["payWayCode"] = orderInfo.PayTypeCode
|
||||||
|
|
||||||
|
p := service.GetMerchantInfoByUID(params)
|
||||||
|
if p.Code == -1 {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: p.Msg,
|
||||||
|
}
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.OrderAmount = orderInfo.OrderAmount
|
||||||
|
//选择通道
|
||||||
|
p = service.ChooseRoad(p)
|
||||||
|
if p.Code == -1 {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: p.Msg,
|
||||||
|
}
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
supplierCode := "MF178"
|
||||||
|
supplier := third_party.GetPaySupplierByCode(supplierCode)
|
||||||
|
sdata := supplier.Syt(orderInfo, p.RoadInfo, p.MerchantInfo)
|
||||||
|
if sdata.Status == "-1" {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: sdata.Msg,
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 1,
|
||||||
|
Msg: "提交成功,系统核对成功后,将返回原系统处理。",
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
} else {
|
||||||
|
jsonResponse := JsonResponse{
|
||||||
|
Code: 0,
|
||||||
|
Msg: err.Error(),
|
||||||
|
}
|
||||||
|
c.Data["json"] = &jsonResponse
|
||||||
|
c.ServeJSON()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrderCreate 订单创建
|
||||||
|
func (c *OrderController) OrderCreate() {
|
||||||
|
//客户传递过来对参数 订单ID 支付类型 卡类型 卡面值
|
||||||
|
//判断订单是否存在 是否关闭 是否支付成功
|
||||||
|
//c.Data["flash"] = map[string]string{"error": string2}
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
//获取客户端的ip
|
||||||
|
//clientIp := c.Ctx.Input.IP()
|
||||||
|
params["payWayCode"] = strings.TrimSpace(c.GetString("paycode"))
|
||||||
|
params["orderPrice"] = strings.TrimSpace(c.GetString("price"))
|
||||||
|
params["orderNo"] = strings.TrimSpace(c.GetString("orderid"))
|
||||||
|
params["notifyUrl"] = strings.TrimSpace(c.GetString("notifyurl"))
|
||||||
|
params["returnUrl"] = strings.TrimSpace(c.GetString("returnurl"))
|
||||||
|
|
||||||
|
params["orderPeriod"] = "1" //订单有效时间
|
||||||
|
params["PayTypeCode"] = "CARD_DH" //类型
|
||||||
|
//商户ID
|
||||||
|
params["payKey"] = strings.TrimSpace(c.GetString("paykey"))
|
||||||
|
|
||||||
|
if params["payWayCode"] == "" || params["orderPrice"] == "" || params["orderNo"] == "" {
|
||||||
|
c.ShowErr("参数有误,请检查再试试。")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
p := service.GetMerchantInfo(params)
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.ShowErr(p.Msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.PayWayCode = params["payWayCode"]
|
||||||
|
p = service.OrderPriceIsValid(p)
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.ShowErr(p.Msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo := order.GetOrderByMerchantOrderId(params["orderNo"])
|
||||||
|
p = service.ChooseRoad(p)
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.ShowErr(p.Msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||||
|
//生成订单记录
|
||||||
|
orderInfo, _ = service.GenerateRecord(p)
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.ShowErr(p.Msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["Status"] = orderInfo.Status
|
||||||
|
c.Data["orderNo"] = params["orderNo"]
|
||||||
|
c.Data["price"] = params["orderPrice"]
|
||||||
|
c.TplName = "scan.html"
|
||||||
|
if orderInfo.Status == conf.WAIT {
|
||||||
|
c.Data["qrCode"] = "../static/new/febs/images/public/jx.png"
|
||||||
|
} else if orderInfo.Status == conf.SUCCESS || orderInfo.Status == conf.FAIL {
|
||||||
|
if orderInfo.Status == conf.SUCCESS {
|
||||||
|
c.Data["price"] = orderInfo.FactAmount
|
||||||
|
}
|
||||||
|
c.Data["UpdateTime"] = orderInfo.UpdateTime
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OrderController) OrderQuery() {
|
||||||
|
bankOrderId := c.GetString("bankOrderId")
|
||||||
|
logs.Debug(fmt.Sprintf("获取到boss后台的银行id = %s", bankOrderId))
|
||||||
|
|
||||||
|
qy := query.SupplierOrderQueryResult(bankOrderId)
|
||||||
|
|
||||||
|
if qy {
|
||||||
|
c.Ctx.WriteString("success")
|
||||||
|
} else {
|
||||||
|
c.Ctx.WriteString("fail")
|
||||||
|
}
|
||||||
|
c.StopRun()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *OrderController) OrderUpdate() {
|
||||||
|
bankOrderId := c.GetString("bankOrderId")
|
||||||
|
solveType := c.GetString("solveType")
|
||||||
|
|
||||||
|
orderInfo := order.GetOrderByBankOrderId(bankOrderId)
|
||||||
|
|
||||||
|
orderInfo.Operator = c.GetString("operator")
|
||||||
|
|
||||||
|
flag := false
|
||||||
|
if orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error("该订单不存在,bankOrderId=", bankOrderId)
|
||||||
|
} else {
|
||||||
|
switch solveType {
|
||||||
|
case conf.SUCCESS:
|
||||||
|
flag = service.SolvePaySuccess(bankOrderId, orderInfo.FactAmount, orderInfo.BankTransId)
|
||||||
|
case conf.FAIL:
|
||||||
|
flag = service.SolvePayFail(bankOrderId, orderInfo.BankTransId)
|
||||||
|
case conf.FREEZE_AMOUNT:
|
||||||
|
//将这笔订单进行冻结
|
||||||
|
flag = service.SolveOrderFreeze(bankOrderId)
|
||||||
|
case conf.UNFREEZE_AMOUNT:
|
||||||
|
//将这笔订单金额解冻
|
||||||
|
flag = service.SolveOrderUnfreeze(bankOrderId)
|
||||||
|
case conf.REFUND:
|
||||||
|
if orderInfo.Status == conf.SUCCESS {
|
||||||
|
flag = service.SolveRefund(bankOrderId)
|
||||||
|
}
|
||||||
|
case conf.ORDERROLL:
|
||||||
|
if orderInfo.Status == conf.SUCCESS {
|
||||||
|
flag = service.SolveOrderRoll(bankOrderId)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
logs.Error("不存在这样的处理类型")
|
||||||
|
}
|
||||||
|
if flag {
|
||||||
|
c.Ctx.WriteString(conf.SUCCESS)
|
||||||
|
} else {
|
||||||
|
c.Ctx.WriteString(conf.FAIL)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.StopRun()
|
||||||
|
}
|
||||||
133
controllers/gateway/payfor_controller.go
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
package gateway
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : 代付、下发金额处理逻辑
|
||||||
|
** @Time : 2019/12/5 14:05
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : payfor_gateway
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/12/5 14:05
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/payfor"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/pay_for"
|
||||||
|
"gateway/response"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"github.com/astaxie/beego/logs"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PayForGateway struct {
|
||||||
|
web.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
// PayFor 接受下游商户的代付请求
|
||||||
|
func (c *PayForGateway) PayFor() {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||||
|
params["realname"] = strings.TrimSpace(c.GetString("realname"))
|
||||||
|
params["cardNo"] = strings.TrimSpace(c.GetString("cardNo"))
|
||||||
|
//params["bankCode"] = strings.TrimSpace(c.GetString("bankCode"))
|
||||||
|
params["accType"] = strings.TrimSpace(c.GetString("accType"))
|
||||||
|
//params["province"] = strings.TrimSpace(c.GetString("province"))
|
||||||
|
//params["city"] = strings.TrimSpace(c.GetString("city"))
|
||||||
|
//params["bankAccountAddress"] = strings.TrimSpace(c.GetString("bankAccountAddress"))
|
||||||
|
params["amount"] = strings.TrimSpace(c.GetString("amount"))
|
||||||
|
//params["mobileNo"] = strings.TrimSpace(c.GetString("mobileNo"))
|
||||||
|
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
|
||||||
|
params["sign"] = strings.TrimSpace(c.GetString("sign"))
|
||||||
|
|
||||||
|
payForResponse := new(response.PayForResponse)
|
||||||
|
res, msg := checkParams(params)
|
||||||
|
if !res {
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
payForResponse.ResultMsg = msg
|
||||||
|
} else {
|
||||||
|
|
||||||
|
payForResponse = pay_for.AutoPayFor(params, conf.SELF_API)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["json"] = payForResponse
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// PayForQuery 代付结果查询,
|
||||||
|
func (c *PayForGateway) PayForQuery() {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||||
|
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
|
||||||
|
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
|
||||||
|
params["sign"] = strings.TrimSpace(c.GetString("sign"))
|
||||||
|
|
||||||
|
c.Data["json"] = pay_for.PayForResultQuery(params)
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
}
|
||||||
|
|
||||||
|
// QuerySupplierPayForResult 查询上游的代付结果
|
||||||
|
func (c *PayForGateway) QuerySupplierPayForResult() {
|
||||||
|
bankOrderId := strings.TrimSpace(c.GetString("bankOrderId"))
|
||||||
|
p := payfor.GetPayForByBankOrderId(bankOrderId)
|
||||||
|
if p.RoadUid == "" {
|
||||||
|
c.Ctx.WriteString("fail")
|
||||||
|
} else {
|
||||||
|
roadInfo := road.GetRoadInfoByRoadUid(p.RoadUid)
|
||||||
|
supplierCode := roadInfo.ProductUid
|
||||||
|
supplier := third_party.GetPaySupplierByCode(supplierCode)
|
||||||
|
res := supplier.PayFor(p)
|
||||||
|
logs.Debug("代付查询结果:", res)
|
||||||
|
c.Ctx.WriteString("success")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SolvePayForResult 接收boss发送过来的代付手动处理结果
|
||||||
|
func (c *PayForGateway) SolvePayForResult() {
|
||||||
|
resultType := strings.TrimSpace(c.GetString("resultType"))
|
||||||
|
bankOrderId := strings.TrimSpace(c.GetString("bankOrderId"))
|
||||||
|
|
||||||
|
p := payfor.GetPayForByBankOrderId(bankOrderId)
|
||||||
|
if p.BankOrderId == "" {
|
||||||
|
c.Ctx.WriteString(conf.FAIL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resultType == conf.PAYFOR_FAIL {
|
||||||
|
pay_for.PayForFail(p)
|
||||||
|
} else if resultType == conf.PAYFOR_SUCCESS {
|
||||||
|
pay_for.PayForSuccess(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Ctx.WriteString(conf.SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Balance 商户查找余额
|
||||||
|
func (c *PayForGateway) Balance() {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
|
||||||
|
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
|
||||||
|
params["sign"] = strings.TrimSpace(c.GetString("sign"))
|
||||||
|
|
||||||
|
balanceResponse := new(response.BalanceResponse)
|
||||||
|
res, msg := checkParams(params)
|
||||||
|
if !res {
|
||||||
|
balanceResponse.ResultCode = "-1"
|
||||||
|
balanceResponse.ResultMsg = msg
|
||||||
|
c.Data["json"] = balanceResponse
|
||||||
|
} else {
|
||||||
|
c.Data["json"] = pay_for.BalanceQuery(params)
|
||||||
|
}
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkParams(params map[string]string) (bool, string) {
|
||||||
|
for k, v := range params {
|
||||||
|
if v == "" || len(v) == 0 {
|
||||||
|
return false, fmt.Sprintf("字段: %s 为必填!", k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, ""
|
||||||
|
}
|
||||||
74
controllers/gateway/payfor_controller_test.go
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
package gateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"gateway/utils"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"math/rand"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPayFor(t *testing.T) {
|
||||||
|
u := "http://127.0.0.1:12309/gateway/payfor"
|
||||||
|
m := make(map[string]string)
|
||||||
|
m["merchantKey"] = "kkkkc254gk8isf001cqrj6p0"
|
||||||
|
m["realname"] = "11"
|
||||||
|
m["cardNo"] = "123"
|
||||||
|
m["accType"] = "private"
|
||||||
|
m["amount"] = "0.1"
|
||||||
|
merchantOrderId := GenerateOrderNo()
|
||||||
|
m["merchantOrderId"] = merchantOrderId
|
||||||
|
sec := "ssssc254gk8isf001cqrj6pg"
|
||||||
|
keys := utils.SortMap(m)
|
||||||
|
sign := utils.GetMD5Sign(m, keys, sec)
|
||||||
|
m["sign"] = sign
|
||||||
|
|
||||||
|
m1 := make(map[string]interface{})
|
||||||
|
marshal, _ := json.Marshal(m)
|
||||||
|
json.Unmarshal(marshal, &m1)
|
||||||
|
req := new(utils.Request)
|
||||||
|
req.SetParams(m1)
|
||||||
|
req.SetURL(u)
|
||||||
|
resp, err := req.GET()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal("err------>", err.Error())
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
b, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
t.Fatal("返回的http状态码不是200,body:", string(b))
|
||||||
|
}
|
||||||
|
b, _ := ioutil.ReadAll(resp.Body)
|
||||||
|
log.Println("result--------->", string(b))
|
||||||
|
/**
|
||||||
|
result---------> {
|
||||||
|
"resultCode": "00",
|
||||||
|
"resultMsg": "银行处理中",
|
||||||
|
"settAmount": "0.1"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTimeTick64() int64 {
|
||||||
|
return time.Now().UnixNano() / 1e6
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetFormatTime(time time.Time) string {
|
||||||
|
return time.Format("20060102")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 基础做法 日期20191025时间戳1571987125435+3位随机数
|
||||||
|
func GenerateOrderNo() string {
|
||||||
|
date := GetFormatTime(time.Now())
|
||||||
|
r := rand.Intn(1000)
|
||||||
|
code := fmt.Sprintf("%s%d%03d", date, GetTimeTick64(), r)
|
||||||
|
return code
|
||||||
|
}
|
||||||
|
func TestGenerateCode(t *testing.T) {
|
||||||
|
GenerateOrderNo()
|
||||||
|
}
|
||||||
69
controllers/gateway/scan_controller.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Package gateway /
|
||||||
|
package gateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gateway/response"
|
||||||
|
"gateway/service"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"gateway/utils"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ScanController struct {
|
||||||
|
BaseGateway
|
||||||
|
}
|
||||||
|
|
||||||
|
// SolveFailJSON 处理错误的返回
|
||||||
|
func (c *ScanController) SolveFailJSON(p *response.PayBaseResp) {
|
||||||
|
scanFailJSON := new(response.ScanFailData)
|
||||||
|
scanFailJSON.StatusCode = "01"
|
||||||
|
scanFailJSON.PayKey = p.Params["payKey"]
|
||||||
|
scanFailJSON.Msg = p.Msg
|
||||||
|
c.Data["json"] = scanFailJSON
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
c.StopRun()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan 处理扫码的请求
|
||||||
|
func (c *ScanController) Scan() {
|
||||||
|
p := c.PayPrepare()
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.SolveFailJSON(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 签名验证
|
||||||
|
p.Params["returnUrl"] = strings.TrimSpace(c.GetString("returnUrl"))
|
||||||
|
paySecret := p.MerchantInfo.MerchantSecret
|
||||||
|
|
||||||
|
if !utils.Md5Verify(p.Params, paySecret) {
|
||||||
|
p.Code = -1
|
||||||
|
p.Msg = "签名异常"
|
||||||
|
c.SolveFailJSON(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
//选择通道
|
||||||
|
p = service.ChooseRoad(p)
|
||||||
|
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.SolveFailJSON(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
//生成订单记录
|
||||||
|
orderInfo, _ := service.GenerateRecord(p)
|
||||||
|
if p.Code == -1 {
|
||||||
|
c.SolveFailJSON(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取到对应的上游
|
||||||
|
supplierCode := p.RoadInfo.ProductUid
|
||||||
|
supplier := third_party.GetPaySupplierByCode(supplierCode)
|
||||||
|
scanData := supplier.Scan(orderInfo, p.RoadInfo, p.MerchantInfo)
|
||||||
|
if scanData.Status == "00" {
|
||||||
|
scanSuccessData := service.GenerateSuccessData(scanData, p)
|
||||||
|
c.Data["json"] = scanSuccessData
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
} else {
|
||||||
|
p.Msg = scanData.Msg
|
||||||
|
c.SolveFailJSON(p)
|
||||||
|
}
|
||||||
|
}
|
||||||
12
data/demo.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"order_id": 22122801000268,
|
||||||
|
"card_no": "2326990900087836031",
|
||||||
|
"card_pwd": "249132",
|
||||||
|
"status": 3,
|
||||||
|
"rsp_info": "",
|
||||||
|
"face_val": 100,
|
||||||
|
"amount": 0,
|
||||||
|
"discount": "950.00"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
go.mod
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
module gateway
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
|
require github.com/beego/beego/v2 v2.0.3
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/astaxie/beego v1.12.3
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0
|
||||||
|
github.com/go-stomp/stomp v2.1.4+incompatible
|
||||||
|
github.com/rs/xid v1.3.0
|
||||||
|
github.com/widuu/gojson v0.0.0-20170212122013-7da9d2cd949b
|
||||||
|
)
|
||||||
816
go.sum
Normal file
@@ -0,0 +1,816 @@
|
|||||||
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||||
|
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||||
|
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||||
|
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||||
|
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||||
|
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||||
|
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||||
|
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||||
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||||
|
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||||
|
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||||
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
|
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||||
|
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||||
|
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||||
|
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||||
|
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||||
|
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||||
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||||
|
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
|
||||||
|
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
||||||
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
|
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||||
|
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||||
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
|
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||||
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
|
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
|
||||||
|
github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
|
||||||
|
github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
|
||||||
|
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||||
|
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
|
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
|
||||||
|
github.com/beego/beego/v2 v2.0.3 h1:vLrjDsn3JcxvIUqduDs4i0BdWuu5v7YN2FRKQcTWIDI=
|
||||||
|
github.com/beego/beego/v2 v2.0.3/go.mod h1:svcOCy6uDaGYHwcO3nppzKwFigeXm8WHkZfgnvemYNM=
|
||||||
|
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
|
||||||
|
github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
|
||||||
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
|
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
|
||||||
|
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
|
||||||
|
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
|
||||||
|
github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog=
|
||||||
|
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||||
|
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||||
|
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||||
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||||
|
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
||||||
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
|
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||||
|
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||||
|
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
|
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
|
github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
|
||||||
|
github.com/couchbase/go-couchbase v0.1.0/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
|
||||||
|
github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
|
||||||
|
github.com/couchbase/gomemcached v0.1.3/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
|
||||||
|
github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
|
||||||
|
github.com/couchbase/goutils v0.1.0/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
|
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
|
||||||
|
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||||
|
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||||
|
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||||
|
github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
|
||||||
|
github.com/elastic/go-elasticsearch/v6 v6.8.10/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||||
|
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
||||||
|
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||||
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
|
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||||
|
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
|
||||||
|
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
|
github.com/go-stomp/stomp v2.1.4+incompatible h1:D3SheUVDOz9RsjVWkoh/1iCOwD0qWjyeTZMUZ0EXg2Y=
|
||||||
|
github.com/go-stomp/stomp v2.1.4+incompatible/go.mod h1:VqCtqNZv1226A1/79yh+rMiFUcfY3R109np+7ke4n0c=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||||
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
|
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
|
||||||
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
|
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
|
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||||
|
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
|
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||||
|
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||||
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
|
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||||
|
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
|
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||||
|
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||||
|
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||||
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||||
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
|
||||||
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
|
github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
|
||||||
|
github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||||
|
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||||
|
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||||
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||||
|
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
|
||||||
|
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
||||||
|
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||||
|
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||||
|
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
|
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
|
||||||
|
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
|
||||||
|
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
|
||||||
|
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
||||||
|
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||||
|
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||||
|
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||||
|
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
|
||||||
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
|
||||||
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||||
|
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||||
|
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||||
|
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
|
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
|
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
|
||||||
|
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||||
|
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||||
|
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||||
|
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||||
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
|
github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
|
github.com/pelletier/go-toml v1.9.2/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
|
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||||
|
github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
|
||||||
|
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
||||||
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||||
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
|
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
|
||||||
|
github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
|
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||||
|
github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||||
|
github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
|
||||||
|
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||||
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
|
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
|
||||||
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
|
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||||
|
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
|
||||||
|
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||||
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
|
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
|
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
|
||||||
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
|
github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4=
|
||||||
|
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
|
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||||
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
|
||||||
|
github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
|
github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
|
||||||
|
github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
|
||||||
|
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
|
||||||
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
|
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
||||||
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
|
||||||
|
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
|
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
|
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
|
github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
||||||
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
|
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||||
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
|
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
|
github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
|
||||||
|
github.com/widuu/gojson v0.0.0-20170212122013-7da9d2cd949b h1:ieRJ8K7QAPWWltEOv7rzMruuPd7gbeAqTaBFhUECIy0=
|
||||||
|
github.com/widuu/gojson v0.0.0-20170212122013-7da9d2cd949b/go.mod h1:9W1pyetRkwXqjR9tjOSrSuhGHBK0EqXoQSwWbhBHHwA=
|
||||||
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
|
||||||
|
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
|
||||||
|
go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
|
||||||
|
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||||
|
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||||
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
|
||||||
|
go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
|
||||||
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
|
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||||
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||||
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
|
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||||
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
|
||||||
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||||
|
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||||
|
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
|
||||||
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
|
||||||
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||||
|
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
|
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||||
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
|
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
|
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||||
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
|
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||||
|
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||||
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||||
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||||
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
|
||||||
49
main.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "gateway/message"
|
||||||
|
_ "gateway/models"
|
||||||
|
"gateway/notify"
|
||||||
|
"gateway/query"
|
||||||
|
_ "gateway/routers"
|
||||||
|
"gateway/service"
|
||||||
|
_ "gateway/supplier/third_party"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
)
|
||||||
|
|
||||||
|
// /网关 处理下单 支付扽
|
||||||
|
func main() {
|
||||||
|
RegisterLogs()
|
||||||
|
web.BConfig.WebConfig.Session.SessionOn = true
|
||||||
|
|
||||||
|
go notify.CreateOrderNotifyConsumer()
|
||||||
|
//go pay_for.PayForInit()
|
||||||
|
go query.CreatePayForQueryConsumer()
|
||||||
|
go service.OrderSettleInit()
|
||||||
|
go query.CreateSupplierOrderQueryCuConsumer()
|
||||||
|
|
||||||
|
web.Run()
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterLogs /
|
||||||
|
func RegisterLogs() {
|
||||||
|
_ = logs.SetLogger(logs.AdapterFile,
|
||||||
|
`{
|
||||||
|
"filename":"../logs/legend.log",
|
||||||
|
"level":4,
|
||||||
|
"maxlines":0,
|
||||||
|
"maxsize":0,
|
||||||
|
"daily":true,
|
||||||
|
"maxdays":10,
|
||||||
|
"color":true
|
||||||
|
}`)
|
||||||
|
|
||||||
|
f := &logs.PatternLogFormatter{
|
||||||
|
Pattern: "%F:%n|%w%t>> %m",
|
||||||
|
WhenFormat: "2006-01-02",
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.RegisterFormatter("pattern", f)
|
||||||
|
_ = logs.SetGlobalFormatter("pattern")
|
||||||
|
}
|
||||||
44
message/init.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package message
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/11/6 11:43
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : active_mq
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/6 11:43
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gateway/conf"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/go-stomp/stomp"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 解决第一个问题的代码
|
||||||
|
var activeConn *stomp.Conn
|
||||||
|
|
||||||
|
var options = []func(*stomp.Conn) error{
|
||||||
|
//设置读写超时,超时时间为1个小时
|
||||||
|
stomp.ConnOpt.HeartBeat(7200*time.Second, 7200*time.Second),
|
||||||
|
stomp.ConnOpt.HeartBeatError(360 * time.Second),
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
address := conf.GetMQAddress()
|
||||||
|
conn, err := stomp.Dial("tcp", address, options...)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("链接active mq 失败:", err.Error())
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
activeConn = conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetActiveMQConn() *stomp.Conn {
|
||||||
|
return activeConn
|
||||||
|
}
|
||||||
33
message/send_message.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package message
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/11/21 15:53
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : send_message
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/21 15:53
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SendMessage(topic, message string) {
|
||||||
|
conn := GetActiveMQConn()
|
||||||
|
|
||||||
|
if conn == nil {
|
||||||
|
logs.Error("send message get Active mq fail")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
err := conn.Send(topic, "text/plain", []byte(message))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("发送消息给activeMQ失败, message=", message)
|
||||||
|
} else {
|
||||||
|
logs.Info("发送消息给activeMQ成功,message=", message)
|
||||||
|
}
|
||||||
|
}
|
||||||
119
models/accounts/account.go
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/16 11:11
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : account
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/16 11:11
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package accounts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AccountInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
AccountUid string
|
||||||
|
AccountName string
|
||||||
|
Balance float64 //账户总余额
|
||||||
|
SettleAmount float64 //已经结算的金额
|
||||||
|
LoanAmount float64 //账户押款金额
|
||||||
|
FreezeAmount float64 //账户冻结金额
|
||||||
|
WaitAmount float64 //待结算资金
|
||||||
|
PayforAmount float64 //代付在途金额
|
||||||
|
//AbleBalance float64 //账户可用金额
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ACCOUNT_INFO = "account_info"
|
||||||
|
|
||||||
|
func InsetAcount(account AccountInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&account)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert account fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAccountByUid(accountUid string) AccountInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var account AccountInfo
|
||||||
|
_, err := o.QueryTable(ACCOUNT_INFO).Filter("account_uid", accountUid).Limit(1).All(&account)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get account by uid fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return account
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAccountLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ACCOUNT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).OrderBy("-update_time").Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get account len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAccountByMap(params map[string]string, displayCount, offset int) []AccountInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var accountList []AccountInfo
|
||||||
|
qs := o.QueryTable(ACCOUNT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&accountList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get account by map fail: ", err)
|
||||||
|
}
|
||||||
|
return accountList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllAccount() []AccountInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var accountList []AccountInfo
|
||||||
|
|
||||||
|
_, err := o.QueryTable(ACCOUNT_INFO).Limit(-1).All(&accountList)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all account fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return accountList
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateAccount(account AccountInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&account)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update account fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteAccountByUid(accountUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(ACCOUNT_INFO).Filter("account_uid", accountUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete account fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
69
models/accounts/account_history_info.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/19 14:56
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : account_history_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/19 14:56
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package accounts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AccountHistoryInfo struct {
|
||||||
|
Id int
|
||||||
|
AccountUid string
|
||||||
|
AccountName string
|
||||||
|
Type string
|
||||||
|
Amount float64
|
||||||
|
Balance float64
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ACCOUNT_HISTORY_INFO = "account_history_info"
|
||||||
|
|
||||||
|
func InsertAccountHistory(accountHistory AccountHistoryInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(accountHistory)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert account history fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAccountHistoryLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ACCOUNT_HISTORY_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get account history len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAccountHistoryByMap(params map[string]string, displayCount, offset int) []AccountHistoryInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ACCOUNT_HISTORY_INFO)
|
||||||
|
var accountHistoryList []AccountHistoryInfo
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&accountHistoryList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get account history by map fail: ", err)
|
||||||
|
}
|
||||||
|
return accountHistoryList
|
||||||
|
}
|
||||||
162
models/agent/agent_info.go
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/9/19 14:41
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : agent_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/9/19 14:41
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AgentInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
AgentName string
|
||||||
|
AgentPassword string
|
||||||
|
PayPassword string
|
||||||
|
AgentRemark string
|
||||||
|
AgentUid string
|
||||||
|
AgentPhone string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const AGENT_INFO = "agent_info"
|
||||||
|
|
||||||
|
func IsEixstByAgentName(agentName string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(AGENT_INFO).Filter("agent_name", agentName).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistByAgentUid(uid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(AGENT_INFO).Filter("agent_uid", uid).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsEixstByAgentPhone(agentPhone string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(AGENT_INFO).Filter("agent_phone", agentPhone).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertAgentInfo(agentInfo AgentInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&agentInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert agent info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAgentInfoByAgentUid(agentUid string) AgentInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var agentInfo AgentInfo
|
||||||
|
_, err := o.QueryTable(AGENT_INFO).Filter("agent_uid", agentUid).Limit(1).All(&agentInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get agent info by agentUid fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return agentInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAgentInfoByPhone(phone string) AgentInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var agentInfo AgentInfo
|
||||||
|
_, err := o.QueryTable(AGENT_INFO).Filter("agent_phone", phone).Limit(1).All(&agentInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get agent info by phone fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return agentInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAgentInfoLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(AGENT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get agentinfo len by map fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAgentInfoByMap(params map[string]string, displayCount, offset int) []AgentInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var agentInfoList []AgentInfo
|
||||||
|
|
||||||
|
qs := o.QueryTable(AGENT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&agentInfoList)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get agentInfo by map fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return agentInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllAgentByMap(parmas map[string]string) []AgentInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var agentList []AgentInfo
|
||||||
|
|
||||||
|
qs := o.QueryTable(AGENT_INFO)
|
||||||
|
for k, v := range parmas {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := qs.Limit(-1).All(&agentList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all agent by map fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return agentList
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateAgentInfo(agentInfo AgentInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&agentInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update agentinfo fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteAgentByAgentUid(agentUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(AGENT_INFO).Filter("agent_uid", agentUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete agent by agent uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
13
models/agent/agent_profit.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/12/17 17:50
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : agent_profit
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/12/17 17:50
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package agent
|
||||||
|
|
||||||
|
type AgentProfit struct {
|
||||||
|
}
|
||||||
62
models/init.go
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/9 13:48
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : init
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/9 13:48
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/models/accounts"
|
||||||
|
"gateway/models/agent"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/notify"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/models/payfor"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/models/system"
|
||||||
|
"gateway/models/user"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
dbHost, _ := web.AppConfig.String("mysql::dbhost")
|
||||||
|
dbUser, _ := web.AppConfig.String("mysql::dbuser")
|
||||||
|
dbPassword, _ := web.AppConfig.String("mysql::dbpasswd")
|
||||||
|
dbBase, _ := web.AppConfig.String("mysql::dbbase")
|
||||||
|
dbPort, _ := web.AppConfig.String("mysql::dbport")
|
||||||
|
|
||||||
|
link := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", dbUser, dbPassword, dbHost, dbPort, dbBase)
|
||||||
|
|
||||||
|
logs.Info("mysql init.....", link)
|
||||||
|
|
||||||
|
orm.RegisterDriver("mysql", orm.DRMySQL)
|
||||||
|
orm.RegisterDataBase("default", "mysql", link)
|
||||||
|
orm.RegisterModel(new(user.UserInfo),
|
||||||
|
new(system.MenuInfo),
|
||||||
|
new(system.SecondMenuInfo),
|
||||||
|
new(system.PowerInfo),
|
||||||
|
new(system.RoleInfo),
|
||||||
|
new(system.BankCardInfo),
|
||||||
|
new(road.RoadInfo),
|
||||||
|
new(road.RoadPoolInfo),
|
||||||
|
new(agent.AgentInfo),
|
||||||
|
new(merchant.MerchantInfo),
|
||||||
|
new(merchant.MerchantDeployInfo),
|
||||||
|
new(accounts.AccountInfo),
|
||||||
|
new(accounts.AccountHistoryInfo),
|
||||||
|
new(order.OrderInfo),
|
||||||
|
new(order.OrderProfitInfo),
|
||||||
|
new(order.OrderSettleInfo),
|
||||||
|
new(notify.NotifyInfo),
|
||||||
|
new(merchant.MerchantLoadInfo),
|
||||||
|
new(payfor.PayforInfo),
|
||||||
|
)
|
||||||
|
}
|
||||||
66
models/merchant/merchant_deploy_info.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/7 11:52
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : merchant_deploy_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/7 11:52
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package merchant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MerchantDeployInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
MerchantUid string
|
||||||
|
PayType string
|
||||||
|
SingleRoadUid string
|
||||||
|
SingleRoadName string
|
||||||
|
SingleRoadPlatformRate float64
|
||||||
|
SingleRoadAgentRate float64
|
||||||
|
RollRoadCode string
|
||||||
|
RollRoadName string
|
||||||
|
RollRoadPlatformRate float64
|
||||||
|
RollRoadAgentRate float64
|
||||||
|
IsLoan string
|
||||||
|
LoanRate float64
|
||||||
|
LoanDays int
|
||||||
|
UnfreezeHour int
|
||||||
|
WaitUnfreezeAmount float64
|
||||||
|
LoanAmount float64
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const MERCHANT_DEPLOY_INFO = "merchant_deploy_info"
|
||||||
|
|
||||||
|
func GetMerchantDeployByUidAndPayType(uid, payType string) MerchantDeployInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantDeployInfo MerchantDeployInfo
|
||||||
|
|
||||||
|
_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).
|
||||||
|
Filter("merchant_uid", uid).Filter("pay_type", payType).
|
||||||
|
Limit(1).
|
||||||
|
All(&merchantDeployInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant deploy by uid and paytype fail:", err)
|
||||||
|
}
|
||||||
|
return merchantDeployInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantDeployByHour(hour int) []MerchantDeployInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantDeployList []MerchantDeployInfo
|
||||||
|
_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("unfreeze_hour", hour).Filter("status", "active").Limit(-1).All(&merchantDeployList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant deploy list fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return merchantDeployList
|
||||||
|
}
|
||||||
205
models/merchant/merchant_info.go
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/9/28 16:47
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : merchant_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/9/28 16:47
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package merchant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MerchantInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
BelongAgentUid string
|
||||||
|
BelongAgentName string
|
||||||
|
MerchantName string
|
||||||
|
MerchantUid string
|
||||||
|
MerchantKey string
|
||||||
|
MerchantSecret string
|
||||||
|
LoginPassword string
|
||||||
|
LoginAccount string
|
||||||
|
AutoSettle string
|
||||||
|
AutoPayFor string
|
||||||
|
WhiteIps string
|
||||||
|
Remark string
|
||||||
|
SinglePayForRoadUid string
|
||||||
|
SinglePayForRoadName string
|
||||||
|
RollPayForRoadCode string
|
||||||
|
RollPayForRoadName string
|
||||||
|
PayforFee float64
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const MERCHANT_INFO = "merchant_info"
|
||||||
|
|
||||||
|
func IsExistByMerchantName(merchantName string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_name", merchantName).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistByMerchantUid(uid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", uid).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistMerchantByAgentUid(uid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistByMerchantPhone(phone string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MERCHANT_INFO).Filter("LoginAccount", phone).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantByPhone(phone string) (m MerchantInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, e := o.QueryTable(MERCHANT_INFO).Filter("LoginAccount", phone).Limit(1).All(&m)
|
||||||
|
if e != nil {
|
||||||
|
logs.Error("GetMerchantByPhone merchant fail: ", e)
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertMerchantInfo(merchantInfo MerchantInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&merchantInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert merchant fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MERCHANT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantListByMap(params map[string]string, displayCount, offset int) []MerchantInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MERCHANT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var merchantList []MerchantInfo
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&merchantList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant list by map fail: ", err)
|
||||||
|
}
|
||||||
|
return merchantList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllMerchant() []MerchantInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantList []MerchantInfo
|
||||||
|
|
||||||
|
_, err := o.QueryTable(MERCHANT_INFO).Limit(-1).All(&merchantList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all merchant fail:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return merchantList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantByParams(params map[string]string, displayCount, offset int) []MerchantInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantList []MerchantInfo
|
||||||
|
qs := o.QueryTable(MERCHANT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qs.Limit(displayCount, offset).All(&merchantList)
|
||||||
|
|
||||||
|
return merchantList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantLenByParams(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MERCHANT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant len by params fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantByUid(merchantUid string) MerchantInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantInfo MerchantInfo
|
||||||
|
_, err := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", merchantUid).Limit(1).All(&merchantInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant info fail: ", err)
|
||||||
|
}
|
||||||
|
return merchantInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMerchantByPasskey(payKey string) MerchantInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var merchantInfo MerchantInfo
|
||||||
|
_, err := o.QueryTable(MERCHANT_INFO).Filter("merchant_key", payKey).Limit(1).All(&merchantInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant by merchantKey fail: ", err)
|
||||||
|
}
|
||||||
|
return merchantInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateMerchant(merchantInfo MerchantInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&merchantInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update merchant fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteMerchantByUid(merchantUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", merchantUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete merchant fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
56
models/merchant/merchant_load_info.go
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/11/22 13:07
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : merchant_load_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/22 13:07
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package merchant
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MerchantLoadInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
MerchantUid string
|
||||||
|
RoadUid string
|
||||||
|
LoadDate string
|
||||||
|
LoadAmount float64
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const MERCHANT_LOAD_INFO = "merchant_load_info"
|
||||||
|
|
||||||
|
func GetMerchantLoadInfoByMap(params map[string]string) []MerchantLoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MERCHANT_LOAD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var merchantLoadList []MerchantLoadInfo
|
||||||
|
_, err := qs.Limit(-11).All(&merchantLoadList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get merchant load info fail: ", err)
|
||||||
|
}
|
||||||
|
return merchantLoadList
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistMerchantLoadByParams(params map[string]string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MERCHANT_LOAD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return qs.Exist()
|
||||||
|
}
|
||||||
84
models/notify/notify_info.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/11/20 13:13
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : notify_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/20 13:13
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NotifyInfo struct {
|
||||||
|
Id int
|
||||||
|
Type string //订单-order,代付-payfor
|
||||||
|
BankOrderId string
|
||||||
|
MerchantOrderId string
|
||||||
|
Status string
|
||||||
|
Times int
|
||||||
|
Url string
|
||||||
|
Response string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const NOTIFYINFO = "notify_info"
|
||||||
|
|
||||||
|
func InsertNotifyInfo(notifyInfo NotifyInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(¬ifyInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert notify fail:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyInfoExistByBankOrderId(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(NOTIFYINFO).Filter("bank_order_id", bankOrderId).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNotifyInfoByBankOrderId(bankOrderId string) NotifyInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var notifyInfo NotifyInfo
|
||||||
|
_, err := o.QueryTable(NOTIFYINFO).Filter("bank_order_id", bankOrderId).All(¬ifyInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get notify info by bankOrderId fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifyInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNotifyInfosNotSuccess(params map[string]interface{}) []NotifyInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var notifyInfoList []NotifyInfo
|
||||||
|
qs := o.QueryTable(NOTIFYINFO)
|
||||||
|
for k, v := range params {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
qs = qs.Exclude("status", "success")
|
||||||
|
_, err := qs.Limit(-1).All(¬ifyInfoList)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get notifyinfos fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return notifyInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateNotifyInfo(notifyInfo NotifyInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(¬ifyInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update notify info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
235
models/order/order_info.go
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/28 10:15
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/28 10:15
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package order
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderInfo struct {
|
||||||
|
Id int
|
||||||
|
ShopName string //商品名称
|
||||||
|
OrderPeriod string //订单有效时间
|
||||||
|
MerchantOrderId string //商户订单id
|
||||||
|
BankOrderId string //本系统订单id
|
||||||
|
BankTransId string //上游流水id
|
||||||
|
OrderAmount float64 //订单提交的金额
|
||||||
|
ShowAmount float64 //待支付的金额
|
||||||
|
FactAmount float64 //用户实际支付金额
|
||||||
|
RollPoolCode string //轮询池编码
|
||||||
|
RollPoolName string //轮询池名称
|
||||||
|
RoadUid string //通道标识
|
||||||
|
RoadName string //通道名称
|
||||||
|
PayProductName string //上游支付公司的名称
|
||||||
|
PayProductCode string //上游支付公司的编码代号
|
||||||
|
PayTypeCode string //支付产品编码
|
||||||
|
PayTypeName string //支付产品名称
|
||||||
|
OsType string //操作系统类型
|
||||||
|
Status string //订单支付状态
|
||||||
|
Refund string //退款状态
|
||||||
|
RefundTime string //退款操作时间
|
||||||
|
Freeze string //冻结状态
|
||||||
|
FreezeTime string //冻结时间
|
||||||
|
Unfreeze string //是否已经解冻
|
||||||
|
UnfreezeTime string //解冻时间
|
||||||
|
ReturnUrl string //支付完跳转地址
|
||||||
|
NotifyUrl string //下游回调地址
|
||||||
|
MerchantUid string //商户id
|
||||||
|
MerchantName string //商户名称
|
||||||
|
AgentUid string //该商户所属代理
|
||||||
|
AgentName string //该商户所属代理名称
|
||||||
|
ExValue string //扩展属性
|
||||||
|
CardData string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
Operator string // 操作人
|
||||||
|
}
|
||||||
|
|
||||||
|
const ORDER_INFO = "order_info"
|
||||||
|
|
||||||
|
func InsertOrder(orderInfo OrderInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&orderInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert order info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func OrderNoIsEixst(orderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exits := o.QueryTable(ORDER_INFO).Filter("merchant_order_id", orderId).Exist()
|
||||||
|
return exits
|
||||||
|
}
|
||||||
|
|
||||||
|
func BankOrderIdIsEixst(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exists := o.QueryTable(ORDER_INFO).Filter("bank_order_id", bankOrderId).Exist()
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ORDER_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, _ := qs.Limit(-1).Count()
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderByMap(params map[string]string, display, offset int) []OrderInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderInfoList []OrderInfo
|
||||||
|
qs := o.QueryTable(ORDER_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(display, offset).OrderBy("-update_time").All(&orderInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get order by map fail: ", err)
|
||||||
|
}
|
||||||
|
return orderInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSuccessRateByMap(params map[string]string) string {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ORDER_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
successRate := "0%"
|
||||||
|
allCount, _ := qs.Limit(-1).Count()
|
||||||
|
successCount, _ := qs.Filter("status", "success").Limit(-1).Count()
|
||||||
|
if allCount == 0 {
|
||||||
|
return successRate
|
||||||
|
}
|
||||||
|
tmp := float64(successCount) / float64(allCount) * 100
|
||||||
|
successRate = fmt.Sprintf("%.1f", tmp)
|
||||||
|
return successRate + "%"
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllAmountByMap(params map[string]string) float64 {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
condition := "select sum(order_amount) as allAmount from order_info "
|
||||||
|
for _, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
condition = condition + "where "
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flag := false
|
||||||
|
if params["create_time__gte"] != "" {
|
||||||
|
flag = true
|
||||||
|
condition = condition + " create_time >= '" + params["create_time__gte"] + "'"
|
||||||
|
}
|
||||||
|
if params["create_time__lte"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + " create_time <= '" + params["create_time__lte"] + "'"
|
||||||
|
}
|
||||||
|
if params["merchant_name__icontains"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + "merchant_name like %'" + params["merchant_name__icontains"] + "'% "
|
||||||
|
}
|
||||||
|
if params["merchant_order_id"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + " merchant_order_id = '" + params["merchant_order_id"] + "'"
|
||||||
|
}
|
||||||
|
if params["bank_order_id"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + " bank_order_id = '" + params["bank_order_id"] + "'"
|
||||||
|
}
|
||||||
|
if params["status"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + "status = '" + params["status"] + "'"
|
||||||
|
}
|
||||||
|
if params["pay_product_code"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + "pay_product_code = " + params["pay_product_code"] + "'"
|
||||||
|
}
|
||||||
|
if params["pay_type_code"] != "" {
|
||||||
|
if flag {
|
||||||
|
condition = condition + " and "
|
||||||
|
}
|
||||||
|
condition = condition + "pay_type_code = " + params["pay_type_code"]
|
||||||
|
}
|
||||||
|
logs.Info("get order amount str = ", condition)
|
||||||
|
var maps []orm.Params
|
||||||
|
allAmount := 0.00
|
||||||
|
num, err := o.Raw(condition).Values(&maps)
|
||||||
|
if err == nil && num > 0 {
|
||||||
|
allAmount, _ = strconv.ParseFloat(maps[0]["allAmount"].(string), 64)
|
||||||
|
}
|
||||||
|
return allAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderByBankOrderId(bankOrderId string) OrderInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderInfo OrderInfo
|
||||||
|
_, err := o.QueryTable(ORDER_INFO).Filter("bank_order_id", bankOrderId).Limit(1).All(&orderInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get order info by bankOrderId fail: ", err)
|
||||||
|
}
|
||||||
|
return orderInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderByBankTransId(BankTransId string) OrderInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderInfo OrderInfo
|
||||||
|
_, err := o.QueryTable(ORDER_INFO).Filter("bank_trans_id", BankTransId).Limit(1).All(&orderInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get order info by bankOrderId fail: ", err)
|
||||||
|
}
|
||||||
|
return orderInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderByMerchantOrderId(merchantOrderId string) OrderInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderInfo OrderInfo
|
||||||
|
_, err := o.QueryTable(ORDER_INFO).Filter("merchant_order_id", merchantOrderId).Limit(1).All(&orderInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get order by merchant_order_id: ", err.Error())
|
||||||
|
}
|
||||||
|
return orderInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOneOrder(bankOrderId string) OrderInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderInfo OrderInfo
|
||||||
|
_, err := o.QueryTable(ORDER_INFO).Filter("bank_order_id", bankOrderId).Limit(1).All(&orderInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get one order fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return orderInfo
|
||||||
|
}
|
||||||
120
models/order/order_profit_info.go
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/30 11:44
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_profit_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/30 11:44
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package order
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderProfitInfo struct {
|
||||||
|
Id int
|
||||||
|
MerchantName string
|
||||||
|
MerchantUid string
|
||||||
|
AgentName string
|
||||||
|
AgentUid string
|
||||||
|
PayProductCode string
|
||||||
|
PayProductName string
|
||||||
|
PayTypeCode string
|
||||||
|
PayTypeName string
|
||||||
|
Status string
|
||||||
|
MerchantOrderId string
|
||||||
|
BankOrderId string
|
||||||
|
BankTransId string
|
||||||
|
OrderAmount float64
|
||||||
|
ShowAmount float64
|
||||||
|
FactAmount float64
|
||||||
|
UserInAmount float64
|
||||||
|
SupplierRate float64
|
||||||
|
PlatformRate float64
|
||||||
|
AgentRate float64
|
||||||
|
AllProfit float64
|
||||||
|
SupplierProfit float64
|
||||||
|
PlatformProfit float64
|
||||||
|
AgentProfit float64
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ORDER_PROFIT_INFO = "order_profit_info"
|
||||||
|
|
||||||
|
func GetOrderProfitByBankOrderId(bankOrderId string) OrderProfitInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderProfit OrderProfitInfo
|
||||||
|
_, err := o.QueryTable(ORDER_PROFIT_INFO).Filter("bank_order_id", bankOrderId).Limit(1).All(&orderProfit)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("GetOrderProfitByBankOrderId fail:", err)
|
||||||
|
}
|
||||||
|
return orderProfit
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderProfitLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ORDER_PROFIT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, _ := qs.Limit(-1).Count()
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderProfitByMap(params map[string]string, display, offset int) []OrderProfitInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var orderProfitInfoList []OrderProfitInfo
|
||||||
|
qs := o.QueryTable(ORDER_PROFIT_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(display, offset).OrderBy("-update_time").All(&orderProfitInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get order by map fail: ", err)
|
||||||
|
}
|
||||||
|
return orderProfitInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func GetPlatformProfitByMap(params map[string]string) []models.PlatformProfit {
|
||||||
|
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
cond := "select merchant_name, agent_name, pay_product_name as supplier_name, pay_type_name, sum(fact_amount) as order_amount, count(1) as order_count, " +
|
||||||
|
"sum(platform_profit) as platform_profit, sum(agent_profit) as agent_profit from " + ORDER_PROFIT_INFO + " where status='success' "
|
||||||
|
flag := false
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
if flag {
|
||||||
|
cond += " and"
|
||||||
|
}
|
||||||
|
if strings.Contains(k, "create_time__gte") {
|
||||||
|
cond = cond + " create_time>='" + v + "'"
|
||||||
|
} else if strings.Contains(k, "create_time__lte") {
|
||||||
|
cond = cond + " create_time<='" + v + "'"
|
||||||
|
} else {
|
||||||
|
cond = cond + " " + k + "='" + v + "'"
|
||||||
|
}
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cond += " group by merchant_uid, agent_uid, pay_product_code, pay_type_code"
|
||||||
|
|
||||||
|
var platformProfitList []models.PlatformProfit
|
||||||
|
_, err := o.Raw(cond).QueryRows(&platformProfitList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get platform profit by map fail:", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return platformProfitList
|
||||||
|
}
|
||||||
|
*/
|
||||||
51
models/order/order_settle_info.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/10/30 11:41
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_settle_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/10/30 11:41
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package order
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderSettleInfo struct {
|
||||||
|
Id int
|
||||||
|
PayProductCode string
|
||||||
|
PayProductName string
|
||||||
|
PayTypeCode string
|
||||||
|
RoadUid string
|
||||||
|
PayTypeName string
|
||||||
|
MerchantUid string
|
||||||
|
MerchantName string
|
||||||
|
MerchantOrderId string
|
||||||
|
BankOrderId string
|
||||||
|
SettleAmount float64
|
||||||
|
IsAllowSettle string
|
||||||
|
IsCompleteSettle string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ORDER_SETTLE_INFO = "order_settle_info"
|
||||||
|
|
||||||
|
func GetOrderSettleListByParams(params map[string]string) []OrderSettleInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ORDER_SETTLE_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var orderSettleList []OrderSettleInfo
|
||||||
|
if _, err := qs.Limit(-1).All(&orderSettleList); err != nil {
|
||||||
|
logs.Error("get order settle list fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return orderSettleList
|
||||||
|
}
|
||||||
21
models/order/platform_profit.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/12/17 17:50
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : platform_profit
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/12/17 17:50
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package order
|
||||||
|
|
||||||
|
type PlatformProfit struct {
|
||||||
|
MerchantName string
|
||||||
|
AgentName string
|
||||||
|
SupplierName string
|
||||||
|
PayTypeName string
|
||||||
|
OrderAmount float64
|
||||||
|
OrderCount int
|
||||||
|
PlatformProfit float64
|
||||||
|
AgentProfit float64
|
||||||
|
}
|
||||||
116
models/payfor/payfor_info.go
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/11/25 14:32
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : payfor_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/25 14:32
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package payfor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PayforInfo struct {
|
||||||
|
Id int
|
||||||
|
PayforUid string
|
||||||
|
MerchantUid string
|
||||||
|
MerchantName string
|
||||||
|
MerchantOrderId string
|
||||||
|
BankOrderId string
|
||||||
|
BankTransId string
|
||||||
|
RoadUid string
|
||||||
|
RoadName string
|
||||||
|
RollPoolCode string
|
||||||
|
RollPoolName string
|
||||||
|
PayforFee float64
|
||||||
|
PayforAmount float64
|
||||||
|
PayforTotalAmount float64
|
||||||
|
BankCode string
|
||||||
|
BankName string
|
||||||
|
BankAccountName string
|
||||||
|
BankAccountNo string
|
||||||
|
BankAccountType string
|
||||||
|
Country string
|
||||||
|
City string
|
||||||
|
Ares string
|
||||||
|
BankAccountAddress string
|
||||||
|
PhoneNo string
|
||||||
|
GiveType string
|
||||||
|
Type string
|
||||||
|
NotifyUrl string
|
||||||
|
Status string
|
||||||
|
IsSend string
|
||||||
|
RequestTime string
|
||||||
|
ResponseTime string
|
||||||
|
ResponseContent string
|
||||||
|
Remark string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const PAYFORINFO = "payfor_info"
|
||||||
|
|
||||||
|
func InsertPayfor(payFor PayforInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&payFor)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert payfor fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistPayForByBankOrderId(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(PAYFORINFO).Filter("bank_order_id", bankOrderId).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsExistPayForByMerchantOrderId(merchantOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(PAYFORINFO).Filter("merchant_order_id", merchantOrderId).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPayForByBankOrderId(bankOrderId string) PayforInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var payFor PayforInfo
|
||||||
|
_, err := o.QueryTable(PAYFORINFO).Filter("bank_order_id", bankOrderId).Limit(1).All(&payFor)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get pay for by bank_order_id fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return payFor
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPayForByMerchantOrderId(merchantOrderId string) PayforInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var payFor PayforInfo
|
||||||
|
|
||||||
|
_, err := o.QueryTable(PAYFORINFO).Filter("merchant_order_id", merchantOrderId).Limit(1).All(&payFor)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return payFor
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdatePayFor(payFor PayforInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&payFor)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update pay for fail:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
166
models/road/road_info.go
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/9/8 12:09
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : road_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/9/8 12:09
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package road
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RoadInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
RoadName string
|
||||||
|
RoadUid string
|
||||||
|
Remark string
|
||||||
|
ProductName string
|
||||||
|
ProductUid string
|
||||||
|
PayType string
|
||||||
|
BasicFee float64
|
||||||
|
SettleFee float64
|
||||||
|
TotalLimit float64
|
||||||
|
TodayLimit float64
|
||||||
|
SingleMinLimit float64
|
||||||
|
SingleMaxLimit float64
|
||||||
|
StarHour int
|
||||||
|
EndHour int
|
||||||
|
Params string
|
||||||
|
TodayIncome float64
|
||||||
|
TotalIncome float64
|
||||||
|
TodayProfit float64
|
||||||
|
TotalProfit float64
|
||||||
|
Balance float64
|
||||||
|
RequestAll int
|
||||||
|
RequestSuccess int
|
||||||
|
|
||||||
|
TodayRequestAll int `json:"TodayRequestAll" orm:"today_request_all"`
|
||||||
|
TodayRequestSuccess int
|
||||||
|
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ROAD_INFO = "road_info"
|
||||||
|
|
||||||
|
func GetRoadInfoByRoadUid(roadUid string) RoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadInfo RoadInfo
|
||||||
|
_, err := o.QueryTable(ROAD_INFO).Exclude("status", "delete").Filter("road_uid", roadUid).Limit(1).All(&roadInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road info by road uid fail: ", err)
|
||||||
|
}
|
||||||
|
return roadInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadInfosByRoadUids(roadUids []string) []RoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadInfoList []RoadInfo
|
||||||
|
_, err := o.QueryTable(ROAD_INFO).Filter("road_uid__in", roadUids).OrderBy("update_time").All(&roadInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get roadInfos by roadUids fail: ", err)
|
||||||
|
}
|
||||||
|
return roadInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadInfoByName(roadName string) RoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadInfo RoadInfo
|
||||||
|
_, err := o.QueryTable(ROAD_INFO).Exclude("status", "delete").Filter("road_name", roadName).Limit(1).All(&roadInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road info by name fail: ", err)
|
||||||
|
}
|
||||||
|
return roadInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ROAD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Exclude("status", "delete").Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadInfoByMap(params map[string]string, displayCount, offset int) []RoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadInfoList []RoadInfo
|
||||||
|
qs := o.QueryTable(ROAD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := qs.Exclude("status", "delete").Limit(displayCount, offset).OrderBy("-update_time").All(&roadInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road info by map fail: ", err)
|
||||||
|
}
|
||||||
|
return roadInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllRoad(params map[string]string) []RoadInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadInfoList []RoadInfo
|
||||||
|
qs := o.QueryTable(ROAD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(-1).All(&roadInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all road fail: ", err)
|
||||||
|
}
|
||||||
|
return roadInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertRoadInfo(roadInfo RoadInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&roadInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert road info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func RoadInfoExistByRoadUid(roadUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(ROAD_INFO).Filter("status", "active").Filter("road_uid", roadUid).Exist()
|
||||||
|
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateRoadInfo(roadInfo RoadInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&roadInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update road info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteRoadByRoadUid(roadUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(ROAD_INFO).Filter("road_uid", roadUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete road by road uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
127
models/road/road_pool_info.go
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/9/9 16:35
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : road_pool_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/9/9 16:35
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package road
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RoadPoolInfo struct {
|
||||||
|
Id int
|
||||||
|
Status string
|
||||||
|
RoadPoolName string
|
||||||
|
RoadPoolCode string
|
||||||
|
RoadUidPool string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ROAD_POOL_INFO = "road_pool_info"
|
||||||
|
|
||||||
|
func InsertRoadPool(roadPool RoadPoolInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&roadPool)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert road pool fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadPoolLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ROAD_POOL_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road pool len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadPoolByMap(params map[string]string, displayCount, offset int) []RoadPoolInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadPoolList []RoadPoolInfo
|
||||||
|
qs := o.QueryTable(ROAD_POOL_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&roadPoolList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road pool by map fail: ", err)
|
||||||
|
}
|
||||||
|
return roadPoolList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadPoolByRoadPoolCode(roadPoolCode string) RoadPoolInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadPoolInfo RoadPoolInfo
|
||||||
|
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_code", roadPoolCode).Limit(1).All(&roadPoolInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road pool info by road pool code fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return roadPoolInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAllRollPool(params map[string]string) []RoadPoolInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadPoolList []RoadPoolInfo
|
||||||
|
qs := o.QueryTable(ROAD_POOL_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(-1).All(&roadPoolList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all roll pool fail: ", err)
|
||||||
|
}
|
||||||
|
return roadPoolList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoadPoolByName(roadPoolName string) RoadPoolInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roadPoolInfo RoadPoolInfo
|
||||||
|
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_name", roadPoolName).Limit(1).All(&roadPoolInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get road pool by name fail: ", err)
|
||||||
|
}
|
||||||
|
return roadPoolInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteRoadPoolByCode(roadPoolCode string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_code", roadPoolCode).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete road pool by code fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateRoadPool(roadPool RoadPoolInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&roadPool)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update road pool fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
106
models/system/bank_card_info.go
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/9/6 10:19
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : bank_card_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/9/6 10:19
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BankCardInfo struct {
|
||||||
|
Id int
|
||||||
|
Uid string
|
||||||
|
UserName string
|
||||||
|
BankName string
|
||||||
|
BankCode string
|
||||||
|
BankAccountType string
|
||||||
|
AccountName string
|
||||||
|
BankNo string
|
||||||
|
IdentifyCard string
|
||||||
|
CertificateNo string
|
||||||
|
PhoneNo string
|
||||||
|
BankAddress string
|
||||||
|
UpdateTime string
|
||||||
|
CreateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const BANK_CARD_INFO = "bank_card_info"
|
||||||
|
|
||||||
|
func InsertBankCardInfo(bankCardInfo BankCardInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&bankCardInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert bank card info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBankCardLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(BANK_CARD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get bank card len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBankCardByMap(params map[string]string, displayCount, offset int) []BankCardInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var bankCardList []BankCardInfo
|
||||||
|
qs := o.QueryTable(BANK_CARD_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&bankCardList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get bank card by map fail: ", err)
|
||||||
|
}
|
||||||
|
return bankCardList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBankCardByUid(uid string) BankCardInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var bankCardInfo BankCardInfo
|
||||||
|
_, err := o.QueryTable(bankCardInfo).Filter("uid", uid).Limit(1).All(&bankCardInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get bank card by uid fail: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bankCardInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteBankCardByUid(uid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(BANK_CARD_INFO).Filter("uid", uid).Delete()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete bank card by uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateBankCard(bankCard BankCardInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&bankCard)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update bank card fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
179
models/system/menu_info.go
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/21 9:33
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : menu_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/21 9:33
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MenuInfo struct {
|
||||||
|
Id int
|
||||||
|
MenuOrder int
|
||||||
|
MenuUid string
|
||||||
|
FirstMenu string
|
||||||
|
SecondMenu string
|
||||||
|
Creater string
|
||||||
|
Status string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
// 实现排序的三个接口函数
|
||||||
|
type MenuInfoSlice []MenuInfo
|
||||||
|
|
||||||
|
func (m MenuInfoSlice) Len() int {
|
||||||
|
return len(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m MenuInfoSlice) Swap(i, j int) {
|
||||||
|
m[i], m[j] = m[j], m[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m MenuInfoSlice) Less(i, j int) bool {
|
||||||
|
return m[i].MenuOrder < m[j].MenuOrder //从小到大排序
|
||||||
|
}
|
||||||
|
|
||||||
|
const MENUINFO = "menu_info"
|
||||||
|
|
||||||
|
func InsertMenu(menuInfo MenuInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&menuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert new menu info fail:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func FirstMenuIsExists(firstMenu string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MENUINFO).Filter("first_menu", firstMenu).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func FirstMenuUidIsExists(firstMenUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MENUINFO).Filter("menu_uid", firstMenUid).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func MenuOrderIsExists(menuOrder int) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(MENUINFO).Filter("menu_order", menuOrder).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuLen() int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
cnt, err := o.QueryTable(MENUINFO).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu info len length fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuInfoByMenuUid(menuUid string) MenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var menuInfo MenuInfo
|
||||||
|
_, err := o.QueryTable(MENUINFO).Filter("menu_uid", menuUid).Limit(1).All(&menuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu info by menuUid fail: ", err)
|
||||||
|
}
|
||||||
|
return menuInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuInfosByMenuUids(menuUids []string) []MenuInfo {
|
||||||
|
menuInfoList := make([]MenuInfo, 0)
|
||||||
|
for _, v := range menuUids {
|
||||||
|
m := GetMenuInfoByMenuUid(v)
|
||||||
|
menuInfoList = append(menuInfoList, m)
|
||||||
|
}
|
||||||
|
return menuInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuInfoByMenuOrder(menuOrder int) MenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var menuInfo MenuInfo
|
||||||
|
_, err := o.QueryTable(MENUINFO).Filter("menu_order", menuOrder).Limit(1).All(&menuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu info by menu order fail: ", err)
|
||||||
|
}
|
||||||
|
return menuInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuAll() []MenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var menuInfoList []MenuInfo
|
||||||
|
_, err := o.QueryTable(MENUINFO).OrderBy("-update_time").All(&menuInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all menu list fail:", err)
|
||||||
|
}
|
||||||
|
return menuInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuOffset(displayCount, offset int) []MenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var menuInfoList []MenuInfo
|
||||||
|
_, err := o.QueryTable(MENUINFO).Limit(displayCount, offset).All(&menuInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu offset fail: ", err)
|
||||||
|
}
|
||||||
|
return menuInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuOffsetByMap(params map[string]string, displayCount, offset int) []MenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var menuInfoList []MenuInfo
|
||||||
|
qs := o.QueryTable(MENUINFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&menuInfoList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu offset by map fail: ", err)
|
||||||
|
}
|
||||||
|
return menuInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(MENUINFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get menu len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateMenuInfo(menuInfo MenuInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
cnt, err := o.Update(&menuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update menu info fail: ", err)
|
||||||
|
}
|
||||||
|
logs.Info("update menu info success, num: ", cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteMenuInfo(menuUid string) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
cnt, err := o.QueryTable(MENUINFO).Filter("menu_uid", menuUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete menu info fail: ", err)
|
||||||
|
}
|
||||||
|
logs.Info("delete menu info num: ", cnt)
|
||||||
|
}
|
||||||
143
models/system/power_info.go
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/28 17:59
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : power_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/28 17:59
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PowerInfo struct {
|
||||||
|
Id int
|
||||||
|
FirstMenuUid string
|
||||||
|
SecondMenuUid string
|
||||||
|
SecondMenu string
|
||||||
|
PowerId string
|
||||||
|
PowerItem string
|
||||||
|
Creater string
|
||||||
|
Status string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const POWER_INFO = "power_info"
|
||||||
|
|
||||||
|
type PowerInfoSlice []PowerInfo
|
||||||
|
|
||||||
|
func (sm PowerInfoSlice) Len() int {
|
||||||
|
return len(sm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm PowerInfoSlice) Swap(i, j int) {
|
||||||
|
sm[i], sm[j] = sm[j], sm[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm PowerInfoSlice) Less(i, j int) bool {
|
||||||
|
return sm[i].SecondMenuUid < sm[j].SecondMenuUid
|
||||||
|
}
|
||||||
|
|
||||||
|
func PowerUidExists(powerUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exists := o.QueryTable(POWER_INFO).Filter("power_id", powerUid).Exist()
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertPowerInfo(powerInfo PowerInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&powerInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert power info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPower() []PowerInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var powerInfo []PowerInfo
|
||||||
|
_, err := o.QueryTable(POWER_INFO).Limit(-1).All(&powerInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get power fail: ", err)
|
||||||
|
}
|
||||||
|
return powerInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPowerById(powerId string) PowerInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var powerInfo PowerInfo
|
||||||
|
_, err := o.QueryTable(POWER_INFO).Filter("power_id", powerId).Limit(1).All(&powerInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get power by id fail: ", err)
|
||||||
|
}
|
||||||
|
return powerInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPowerByIds(powerIds []string) []PowerInfo {
|
||||||
|
var powerInfoList []PowerInfo
|
||||||
|
for _, v := range powerIds {
|
||||||
|
m := GetPowerById(v)
|
||||||
|
powerInfoList = append(powerInfoList, m)
|
||||||
|
}
|
||||||
|
return powerInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPowerItemLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(POWER_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get power item len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPowerItemByMap(params map[string]string, displpay, offset int) []PowerInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var powerItemList []PowerInfo
|
||||||
|
qs := o.QueryTable(POWER_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := qs.Limit(displpay, offset).OrderBy("-update_time").All(&powerItemList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get power item by map fail: ", err)
|
||||||
|
}
|
||||||
|
return powerItemList
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeletePowerItemByPowerID(powerID string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(POWER_INFO).Filter("power_id", powerID).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete power item by powerID fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeletePowerBySecondUid(secondUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(POWER_INFO).Filter("second_menu_uid", secondUid).Delete()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete power by second menu uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
123
models/system/role_info.go
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/29 14:43
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : role_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/29 14:43
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RoleInfo struct {
|
||||||
|
Id int
|
||||||
|
RoleName string
|
||||||
|
RoleUid string
|
||||||
|
ShowFirstMenu string
|
||||||
|
ShowFirstUid string
|
||||||
|
ShowSecondMenu string
|
||||||
|
ShowSecondUid string
|
||||||
|
ShowPower string
|
||||||
|
ShowPowerUid string
|
||||||
|
Creater string
|
||||||
|
Status string
|
||||||
|
Remark string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ROLE_INFO = "role_info"
|
||||||
|
|
||||||
|
func GetRoleLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(ROLE_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cnt, err := qs.Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get role len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRole() []RoleInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roleInfo []RoleInfo
|
||||||
|
_, err := o.QueryTable(ROLE_INFO).Limit(-1).OrderBy("-update_time").All(&roleInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get all role fail: ", err)
|
||||||
|
}
|
||||||
|
return roleInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoleByMap(params map[string]string, display, offset int) []RoleInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roleInfo []RoleInfo
|
||||||
|
qs := o.QueryTable(ROLE_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(display, offset).OrderBy("-update_time").All(&roleInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get role by map fail: ", err)
|
||||||
|
}
|
||||||
|
return roleInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoleByRoleUid(roleUid string) RoleInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var roleInfo RoleInfo
|
||||||
|
_, err := o.QueryTable(ROLE_INFO).Filter("role_uid", roleUid).Limit(1).All(&roleInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get role by role uid fail: ", err)
|
||||||
|
}
|
||||||
|
return roleInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func RoleNameExists(roleName string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exists := o.QueryTable(ROLE_INFO).Filter("role_name", roleName).Exist()
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertRole(roleInfo RoleInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&roleInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert role fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteRoleByRoleUid(roleUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(ROLE_INFO).Filter("role_uid", roleUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete role by role uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateRoleInfo(roleInfo RoleInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&roleInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update role info fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
216
models/system/second_menu_info.go
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/26 9:33
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : second_menu_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/26 9:33
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const SECOND_MENU_INFO = "second_menu_info"
|
||||||
|
|
||||||
|
type SecondMenuInfo struct {
|
||||||
|
Id int
|
||||||
|
FirstMenuOrder int
|
||||||
|
FirstMenuUid string
|
||||||
|
FirstMenu string
|
||||||
|
MenuOrder int
|
||||||
|
SecondMenuUid string
|
||||||
|
SecondMenu string
|
||||||
|
SecondRouter string
|
||||||
|
Creater string
|
||||||
|
Status string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
type SecondMenuSlice []SecondMenuInfo
|
||||||
|
|
||||||
|
func (sm SecondMenuSlice) Len() int {
|
||||||
|
return len(sm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm SecondMenuSlice) Swap(i, j int) {
|
||||||
|
sm[i], sm[j] = sm[j], sm[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm SecondMenuSlice) Less(i, j int) bool {
|
||||||
|
if sm[i].FirstMenuOrder == sm[j].FirstMenuOrder {
|
||||||
|
return sm[i].MenuOrder < sm[j].MenuOrder
|
||||||
|
}
|
||||||
|
return sm[i].FirstMenuOrder < sm[j].FirstMenuOrder
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuLen() int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
cnt, err := o.QueryTable(SECOND_MENU_INFO).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second meun len fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuInfoByMenuOrder(menuOrder int, firstMenuUid string) SecondMenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var secondMenuInfo SecondMenuInfo
|
||||||
|
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Filter("menu_order", menuOrder).Limit(1).All(&secondMenuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu info by menu order fail: ", err)
|
||||||
|
}
|
||||||
|
return secondMenuInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuLenByFirstMenuUid(firstMenuUid string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
cnt, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu len by first menu uid fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuList() []SecondMenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var secondMenuList []SecondMenuInfo
|
||||||
|
_, err := o.QueryTable(SECOND_MENU_INFO).Limit(-1).OrderBy("-update_time").All(&secondMenuList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu list fail: ", err)
|
||||||
|
}
|
||||||
|
return secondMenuList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuInfoBySecondMenuUid(secondMenuUid string) SecondMenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var secondMenuInfo SecondMenuInfo
|
||||||
|
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Limit(1).All(&secondMenuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get scond menu info by second menu uid fail: ", err)
|
||||||
|
}
|
||||||
|
return secondMenuInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuInfoBySecondMenuUids(secondMenuUids []string) []SecondMenuInfo {
|
||||||
|
secondMenuInfoList := make([]SecondMenuInfo, 0)
|
||||||
|
for _, v := range secondMenuUids {
|
||||||
|
sm := GetSecondMenuInfoBySecondMenuUid(v)
|
||||||
|
secondMenuInfoList = append(secondMenuInfoList, sm)
|
||||||
|
}
|
||||||
|
return secondMenuInfoList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuListByFirstMenuUid(firstMenuUid string) []SecondMenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var secondMenuList []SecondMenuInfo
|
||||||
|
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Limit(-1).OrderBy("-update_time").All(&secondMenuList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu list by first menu uid fail: ", err)
|
||||||
|
}
|
||||||
|
return secondMenuList
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(SECOND_MENU_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
cnt, err := qs.Limit(-1).Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSecondMenuByMap(params map[string]string, displayCount, offset int) []SecondMenuInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var secondMenuList []SecondMenuInfo
|
||||||
|
qs := o.QueryTable(SECOND_MENU_INFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&secondMenuList)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get second menu by map fail: ", err)
|
||||||
|
}
|
||||||
|
return secondMenuList
|
||||||
|
}
|
||||||
|
func InsertSecondMenu(secondMenuInfo SecondMenuInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&secondMenuInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert second menu fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func SecondMenuIsExists(seconfMenu string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu", seconfMenu).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func SecondMenuUidIsExists(secondMenuUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func SecondRouterExists(secondRouter string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_router", secondRouter).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteSecondMenuByFirstMenuUid(firstMenuUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
num, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete second menu by first menu uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
logs.Info("delete second menu by first menu uid success, num: ", num)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteSecondMenuBySecondMenuUid(secondMenuUid string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
num, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Delete()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete second menu by second menu uid fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
logs.Info("delete second menu by second menu uid success, num: ", num)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateSecondMenuOrderBySecondUid(secondUid string, order int) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondUid).Update(orm.Params{"menu_order": order})
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update second menu order by second menu uid fail: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateSecondMenu(secondMenu SecondMenuInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Update(&secondMenu)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update second menu for first order fail: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SecondMenuExistByMenuOrder(menuOrder int) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(SECOND_MENU_INFO).Filter("menu_order", menuOrder).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
146
models/user/user_info.go
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : This file for ...
|
||||||
|
** @Time : 2019/8/9 14:02
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : user_info
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/8/9 14:02
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
USERINFO = "user_info"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UserInfo struct {
|
||||||
|
Id int
|
||||||
|
UserId string
|
||||||
|
Passwd string
|
||||||
|
Nick string
|
||||||
|
Remark string
|
||||||
|
Ip string
|
||||||
|
Status string
|
||||||
|
Role string
|
||||||
|
RoleName string
|
||||||
|
CreateTime string
|
||||||
|
UpdateTime string
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserInfoByUserID(userID string) UserInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var userInfo UserInfo
|
||||||
|
err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userID).One(&userInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get user info fail: ", err)
|
||||||
|
}
|
||||||
|
return userInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOperatorByMap(params map[string]string, displayCount, offset int) []UserInfo {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
var userInfo []UserInfo
|
||||||
|
qs := o.QueryTable(USERINFO)
|
||||||
|
for k, v := range params {
|
||||||
|
if len(v) > 0 {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err := qs.Exclude("status", "delete").Limit(displayCount, offset).OrderBy("-update_time").All(&userInfo)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get operator by map fail: ", err)
|
||||||
|
}
|
||||||
|
return userInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOperatorLenByMap(params map[string]string) int {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
qs := o.QueryTable(USERINFO)
|
||||||
|
for k, v := range params {
|
||||||
|
qs = qs.Filter(k, v)
|
||||||
|
}
|
||||||
|
cnt, err := qs.Exclude("status", "delete").Count()
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("get operator len by map fail: ", err)
|
||||||
|
}
|
||||||
|
return int(cnt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateUserInfoIP(userInfo UserInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
num, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userInfo.UserId).Update(orm.Params{"ip": userInfo.Ip})
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("%s update user info ip fail: %v", userInfo.UserId, err)
|
||||||
|
} else {
|
||||||
|
logs.Info("%s update user info ip success, num: %d", userInfo.UserId, num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateUserInfoPassword(userInfo UserInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
num, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userInfo.UserId).Update(orm.Params{"passwd": userInfo.Passwd})
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("%s update user info password fail: %v", userInfo.UserId, err)
|
||||||
|
} else {
|
||||||
|
logs.Info("%s update user info password success, update num: %d", userInfo.UserId, num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateUserInfo(userInfo UserInfo) {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
if num, err := o.Update(&userInfo); err != nil {
|
||||||
|
logs.Error("update user info fail: ", err)
|
||||||
|
} else {
|
||||||
|
logs.Info("update user info success, num: ", num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateStauts(status, userId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(USERINFO).Filter("user_id", userId).Update(orm.Params{"status": status})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("update status fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func UserInfoExistByUserId(userId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userId).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func NickIsExist(nick string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
exist := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("nick", nick).Exist()
|
||||||
|
return exist
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertUser(userInfo UserInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.Insert(&userInfo)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("insert user fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteUserByUserId(userId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
_, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userId).Update(orm.Params{"status": "delete"})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("delete user by userId fail: ", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
170
notify/order_notify.go
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
package notify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/message"
|
||||||
|
"gateway/models/notify"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/client/httplib"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/go-stomp/stomp"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderNotifyTask struct {
|
||||||
|
Delay *time.Timer
|
||||||
|
MerchantOrderId string
|
||||||
|
BankOrderId string
|
||||||
|
FirstNotifyTime string
|
||||||
|
NotifyTimes int
|
||||||
|
LimitTimes int
|
||||||
|
Status string //success-通知成功,其余的为待通知或者通知未完成
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
LimitTimes = 5 //最多通知5次
|
||||||
|
)
|
||||||
|
|
||||||
|
// SendOrderNotify 给商户发送订单结果
|
||||||
|
func SendOrderNotify(bankOrderId string) {
|
||||||
|
if !notify.NotifyInfoExistByBankOrderId(bankOrderId) {
|
||||||
|
logs.Error("该订单不存在回调内容,bankOrderId= " + bankOrderId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyInfo := notify.GetNotifyInfoByBankOrderId(bankOrderId)
|
||||||
|
if notifyInfo.Status == "success" {
|
||||||
|
logs.Info(fmt.Sprintf("该订单= %s,已经回调", bankOrderId))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyInfo.Times += 1
|
||||||
|
notifyInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
req := httplib.Post(notifyInfo.Url)
|
||||||
|
response, err := req.String()
|
||||||
|
|
||||||
|
if err == nil && ("success" == response || "SUCCESS" == response) {
|
||||||
|
if strings.Contains(strings.ToLower(response), "success") {
|
||||||
|
notifyInfo.Status = "success"
|
||||||
|
if notify.UpdateNotifyInfo(notifyInfo) {
|
||||||
|
logs.Info("订单回调成功, bankOrderId=", bankOrderId)
|
||||||
|
} else {
|
||||||
|
logs.Error("订单回调成功,但是更新数据库失败, bankOrderId=", bankOrderId)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logs.Notice("订单已经回调,商户已经收到了回调通知,但是返回值错误: ", response)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if notifyInfo.Times > LimitTimes {
|
||||||
|
logs.Notice(fmt.Sprintf("该订单= %s,已经超过了回调次数", bankOrderId))
|
||||||
|
} else {
|
||||||
|
minute := GetOrderNotifyMinute(notifyInfo.Times)
|
||||||
|
logs.Info(fmt.Sprintf("bankOrderId = %s, 进行第 %d 次回调,本次延时时间为:%d", notifyInfo.BankOrderId, notifyInfo.Times, minute))
|
||||||
|
task := OrderNotifyTask{Delay: time.NewTimer(time.Duration(minute) * time.Minute),
|
||||||
|
MerchantOrderId: notifyInfo.MerchantOrderId, BankOrderId: notifyInfo.BankOrderId, FirstNotifyTime: notifyInfo.CreateTime,
|
||||||
|
NotifyTimes: notifyInfo.Times, LimitTimes: LimitTimes, Status: notifyInfo.Status}
|
||||||
|
go OrderNotifyTimer(task)
|
||||||
|
if !notify.UpdateNotifyInfo(notifyInfo) {
|
||||||
|
logs.Error("订单回调失败,数据库更新失败:" + bankOrderId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderNotifyMinute(times int) int {
|
||||||
|
cur := 0
|
||||||
|
switch times {
|
||||||
|
case 0:
|
||||||
|
cur = 0
|
||||||
|
break
|
||||||
|
case 1:
|
||||||
|
cur = 1
|
||||||
|
break
|
||||||
|
case 2:
|
||||||
|
cur = 2
|
||||||
|
break
|
||||||
|
case 3:
|
||||||
|
cur = 5
|
||||||
|
break
|
||||||
|
case 4:
|
||||||
|
cur = 15
|
||||||
|
break
|
||||||
|
case 5:
|
||||||
|
cur = 30
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
cur = 45
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return cur
|
||||||
|
}
|
||||||
|
|
||||||
|
func OrderNotifyTimer(task OrderNotifyTask) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-task.Delay.C:
|
||||||
|
SendOrderNotify(task.BankOrderId)
|
||||||
|
return
|
||||||
|
case <-time.After(time.Minute * 70):
|
||||||
|
logs.Notice("订单回调延时执行,70分钟没有执行")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrderDelayQueue 读取一小时之内,未发送成功,并且还没有到达回调限制次数的记录读取,存入延迟队列
|
||||||
|
func CreateOrderDelayQueue() {
|
||||||
|
params := make(map[string]interface{})
|
||||||
|
params["times__lte"] = LimitTimes
|
||||||
|
params["create_time__gte"] = utils.GetDateTimeBeforeHours(48)
|
||||||
|
notifyList := notify.GetNotifyInfosNotSuccess(params)
|
||||||
|
for _, nf := range notifyList {
|
||||||
|
minute := GetOrderNotifyMinute(nf.Times)
|
||||||
|
task := OrderNotifyTask{
|
||||||
|
Delay: time.NewTimer(time.Duration(minute) * time.Minute),
|
||||||
|
MerchantOrderId: nf.MerchantOrderId,
|
||||||
|
BankOrderId: nf.BankOrderId,
|
||||||
|
FirstNotifyTime: nf.CreateTime,
|
||||||
|
NotifyTimes: nf.Times,
|
||||||
|
LimitTimes: LimitTimes,
|
||||||
|
Status: nf.Status,
|
||||||
|
}
|
||||||
|
go OrderNotifyTimer(task)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOrderNotifyConsumer 创建订单回调消费者
|
||||||
|
func CreateOrderNotifyConsumer() {
|
||||||
|
CreateOrderDelayQueue()
|
||||||
|
//启动定时任务
|
||||||
|
conn := message.GetActiveMQConn()
|
||||||
|
if conn == nil {
|
||||||
|
logs.Error("启动消息队列消费者失败....")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.Notice("订单回调消息队列启动成功......")
|
||||||
|
orderNotify, err := conn.Subscribe(conf.MqOrderNotify, stomp.AckClient)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("订阅订单回调失败......")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case v := <-orderNotify.C:
|
||||||
|
if v != nil {
|
||||||
|
bankOrderId := string(v.Body)
|
||||||
|
go SendOrderNotify(bankOrderId)
|
||||||
|
//应答,重要
|
||||||
|
err := conn.Ack(v)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("消息应答失败!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
notify/payfor_notify.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package notify
|
||||||
370
pay_for/payfor_service.go
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : 代付处理
|
||||||
|
** @Time : 2019/11/28 18:52
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : payfor_service
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/28 18:52
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package pay_for
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/message"
|
||||||
|
"gateway/models/accounts"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/payfor"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/response"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/rs/xid"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 程序自动代付
|
||||||
|
*/
|
||||||
|
func AutoPayFor(params map[string]string, giveType string) *response.PayForResponse {
|
||||||
|
|
||||||
|
payForResponse := new(response.PayForResponse)
|
||||||
|
|
||||||
|
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||||
|
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||||
|
logs.Error(fmt.Sprintf("下游商户代付请求,签名失败,商户信息: %+v", merchantInfo))
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
payForResponse.ResultMsg = "下游商户代付请求,签名失败。"
|
||||||
|
return payForResponse
|
||||||
|
} else {
|
||||||
|
res, msg := checkSettAmount(params["amount"])
|
||||||
|
if !res {
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
payForResponse.ResultMsg = msg
|
||||||
|
|
||||||
|
return payForResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
exist := payfor.IsExistPayForByMerchantOrderId(params["merchantOrderId"])
|
||||||
|
if exist {
|
||||||
|
logs.Error(fmt.Sprintf("代付订单号重复:merchantOrderId = %s", params["merchantOrderId"]))
|
||||||
|
payForResponse.ResultMsg = "商户订单号重复"
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
|
||||||
|
return payForResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
settAmount, err := strconv.ParseFloat(params["amount"], 64)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("代付的金额错误:", err)
|
||||||
|
payForResponse.ResultMsg = "代付金额错误"
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
return payForResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
p := payfor.PayforInfo{
|
||||||
|
PayforUid: "pppp" + xid.New().String(),
|
||||||
|
MerchantUid: merchantInfo.MerchantUid,
|
||||||
|
MerchantName: merchantInfo.MerchantName,
|
||||||
|
MerchantOrderId: params["merchantOrderId"],
|
||||||
|
BankOrderId: "4444" + xid.New().String(),
|
||||||
|
PayforAmount: settAmount,
|
||||||
|
Status: conf.PAYFOR_COMFRIM,
|
||||||
|
BankAccountName: params["realname"],
|
||||||
|
BankAccountNo: params["cardNo"],
|
||||||
|
BankAccountType: params["accType"],
|
||||||
|
City: params["city"],
|
||||||
|
Ares: params["province"] + params["city"],
|
||||||
|
PhoneNo: params["mobileNo"],
|
||||||
|
GiveType: giveType,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
RequestTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取银行编码和银行名称
|
||||||
|
p.BankCode = utils.GetBankCodeByBankCardNo(p.BankAccountNo)
|
||||||
|
p.BankName = utils.GetBankNameByCode(p.BankCode)
|
||||||
|
|
||||||
|
if !payfor.InsertPayfor(p) {
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
payForResponse.ResultMsg = "代付记录插入失败"
|
||||||
|
} else {
|
||||||
|
payForResponse.ResultMsg = "代付订单已生成"
|
||||||
|
payForResponse.ResultCode = "00"
|
||||||
|
payForResponse.SettAmount = params["amount"]
|
||||||
|
payForResponse.MerchantOrderId = params["MerchantOrderId"]
|
||||||
|
|
||||||
|
p = payfor.GetPayForByBankOrderId(p.BankOrderId)
|
||||||
|
|
||||||
|
if findPayForRoad(p) {
|
||||||
|
payForResponse.ResultCode = "00"
|
||||||
|
payForResponse.ResultMsg = "银行处理中"
|
||||||
|
} else {
|
||||||
|
payForResponse.ResultCode = "01"
|
||||||
|
payForResponse.ResultMsg = "系统处理失败"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return payForResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回1表示需要手动打款,返回0表示银行已经受理,-1表示系统处理失败
|
||||||
|
*/
|
||||||
|
func findPayForRoad(p payfor.PayforInfo) bool {
|
||||||
|
|
||||||
|
m := merchant.GetMerchantByUid(p.MerchantUid)
|
||||||
|
// 检查商户是否设置了自动代付
|
||||||
|
if m.AutoPayFor == conf.NO || m.AutoPayFor == "" {
|
||||||
|
logs.Notice(fmt.Sprintf("该商户uid=%s, 没有开通自动代付功能", p.MerchantUid))
|
||||||
|
p.Type = conf.PAYFOR_HAND
|
||||||
|
payfor.UpdatePayFor(p)
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if m.SinglePayForRoadUid != "" {
|
||||||
|
p.RoadUid = m.SinglePayForRoadUid
|
||||||
|
p.RoadName = m.SinglePayForRoadName
|
||||||
|
} else {
|
||||||
|
roadPoolInfo := road.GetRoadPoolByRoadPoolCode(m.RollPayForRoadCode)
|
||||||
|
roadUids := strings.Split(roadPoolInfo.RoadUidPool, "||")
|
||||||
|
roadInfoList := road.GetRoadInfosByRoadUids(roadUids)
|
||||||
|
if len(roadUids) == 0 || len(roadInfoList) == 0 {
|
||||||
|
logs.Error(fmt.Sprintf("通道轮询池=%s, 没有配置通道", m.RollPayForRoadCode))
|
||||||
|
} else {
|
||||||
|
p.RoadUid = roadInfoList[0].RoadUid
|
||||||
|
p.RoadName = roadInfoList[0].RoadName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !payfor.UpdatePayFor(p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(p.RoadUid) > 0 {
|
||||||
|
roadInfo := road.GetRoadInfoByRoadUid(p.RoadUid)
|
||||||
|
p.PayforFee = roadInfo.SettleFee
|
||||||
|
p.PayforTotalAmount = p.PayforFee + p.PayforAmount
|
||||||
|
|
||||||
|
if m.PayforFee > conf.ZERO {
|
||||||
|
logs.Info(fmt.Sprintf("商户uid=%s,有单独的代付手续费。", m.MerchantUid))
|
||||||
|
p.PayforFee = m.PayforFee
|
||||||
|
p.PayforTotalAmount = p.PayforFee + p.PayforAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
if !payfor.UpdatePayFor(p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.GiveType == conf.SELF_HELP {
|
||||||
|
if !MerchantSelf(p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if !SendPayFor(p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p.Status = conf.PAYFOR_FAIL
|
||||||
|
if !payfor.UpdatePayFor(p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
p.ResponseContent = "没有设置代付通道"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 商户自己体现
|
||||||
|
*/
|
||||||
|
func MerchantSelf(p payfor.PayforInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
p.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
p.Status = conf.PAYFOR_BANKING
|
||||||
|
p.RequestTime = utils.GetBasicDateTime()
|
||||||
|
p.IsSend = conf.YES
|
||||||
|
if _, err := txOrm.Update(&p); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestPayFor(p)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendPayFor(p payfor.PayforInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
var account accounts.AccountInfo
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", p.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" {
|
||||||
|
logs.Error("send payfor select account fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//支付金额不足,将直接判定为失败,不往下面邹逻辑了
|
||||||
|
if account.SettleAmount-account.PayforAmount < p.PayforAmount+p.PayforFee {
|
||||||
|
p.Status = conf.PAYFOR_FAIL
|
||||||
|
p.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(&p); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
account.PayforAmount = account.PayforAmount + p.PayforAmount + p.PayforFee
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(&account); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更新账户表出错, err: %s", p.MerchantUid, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
p.IsSend = conf.YES
|
||||||
|
p.Status = conf.PAYFOR_BANKING //变为银行处理中
|
||||||
|
p.GiveType = conf.PAYFOR_ROAD
|
||||||
|
p.RequestTime = utils.GetBasicDateTime()
|
||||||
|
p.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(&p); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更代付列表出错, err:%s", p.MerchantUid, err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestPayFor(p)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func RequestPayFor(p payfor.PayforInfo) {
|
||||||
|
if p.RoadUid == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Type = conf.PAYFOR_ROAD
|
||||||
|
roadInfo := road.GetRoadInfoByRoadUid(p.RoadUid)
|
||||||
|
supplierCode := roadInfo.ProductUid
|
||||||
|
supplier := third_party.GetPaySupplierByCode(supplierCode)
|
||||||
|
res := supplier.PayFor(p)
|
||||||
|
logs.Info(fmt.Sprintf("代付uid=%s,上游处理结果为:%s", p.PayforUid, res))
|
||||||
|
//将代付订单号发送到消息队列
|
||||||
|
message.SendMessage(conf.MQ_PAYFOR_QUERY, p.BankOrderId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代付结果查询
|
||||||
|
*/
|
||||||
|
func PayForResultQuery(params map[string]string) string {
|
||||||
|
|
||||||
|
query := make(map[string]string)
|
||||||
|
query["merchantOrderId"] = params["merchantOrderId"]
|
||||||
|
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||||
|
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||||
|
query["resultMsg"] = "签名错误"
|
||||||
|
query["settStatus"] = "03"
|
||||||
|
query["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret)
|
||||||
|
} else {
|
||||||
|
payForInfo := payfor.GetPayForByMerchantOrderId(params["merchantOrderId"])
|
||||||
|
if payForInfo.BankOrderId == "" {
|
||||||
|
query["resultMsg"] = "不存在这样的代付订单"
|
||||||
|
query["settStatus"] = "03"
|
||||||
|
query["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret)
|
||||||
|
} else {
|
||||||
|
switch payForInfo.Status {
|
||||||
|
case conf.PAYFOR_BANKING:
|
||||||
|
query["resultMsg"] = "打款中"
|
||||||
|
query["settStatus"] = "02"
|
||||||
|
case conf.PAYFOR_SOLVING:
|
||||||
|
query["resultMsg"] = "打款中"
|
||||||
|
query["settStatus"] = "02"
|
||||||
|
case conf.PAYFOR_COMFRIM:
|
||||||
|
query["resultMsg"] = "打款中"
|
||||||
|
query["settStatus"] = "02"
|
||||||
|
case conf.PAYFOR_SUCCESS:
|
||||||
|
query["resultMsg"] = "打款成功"
|
||||||
|
query["settStatus"] = "00"
|
||||||
|
query["settAmount"] = strconv.FormatFloat(payForInfo.PayforAmount, 'f', 2, 64)
|
||||||
|
query["settFee"] = strconv.FormatFloat(payForInfo.PayforFee, 'f', 2, 64)
|
||||||
|
case conf.PAYFOR_FAIL:
|
||||||
|
query["resultMsg"] = "打款失败"
|
||||||
|
query["settStatus"] = "01"
|
||||||
|
}
|
||||||
|
query["sign"] = utils.GetMD5Sign(query, utils.SortMap(query), merchantInfo.MerchantSecret)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mJson, err := json.Marshal(query)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("PayForQuery json marshal fail:", err)
|
||||||
|
return fmt.Sprintf("PayForQuery json marshal fail:%s", err.Error())
|
||||||
|
} else {
|
||||||
|
return string(mJson)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商户查询余额
|
||||||
|
*/
|
||||||
|
func BalanceQuery(params map[string]string) string {
|
||||||
|
|
||||||
|
balanceResponse := new(response.BalanceResponse)
|
||||||
|
str := ""
|
||||||
|
merchantInfo := merchant.GetMerchantByPasskey(params["merchantKey"])
|
||||||
|
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
|
||||||
|
balanceResponse.ResultCode = "-1"
|
||||||
|
balanceResponse.ResultMsg = "签名错误"
|
||||||
|
mJson, _ := json.Marshal(balanceResponse)
|
||||||
|
str = string(mJson)
|
||||||
|
} else {
|
||||||
|
accountInfo := accounts.GetAccountByUid(merchantInfo.MerchantUid)
|
||||||
|
tmp := make(map[string]string)
|
||||||
|
tmp["resultCode"] = "00"
|
||||||
|
tmp["balance"] = strconv.FormatFloat(accountInfo.Balance, 'f', 2, 64)
|
||||||
|
tmp["availableAmount"] = strconv.FormatFloat(accountInfo.SettleAmount, 'f', 2, 64)
|
||||||
|
tmp["freezeAmount"] = strconv.FormatFloat(accountInfo.FreezeAmount, 'f', 2, 64)
|
||||||
|
tmp["waitAmount"] = strconv.FormatFloat(accountInfo.WaitAmount, 'f', 2, 64)
|
||||||
|
tmp["loanAmount"] = strconv.FormatFloat(accountInfo.LoanAmount, 'f', 2, 64)
|
||||||
|
tmp["payforAmount"] = strconv.FormatFloat(accountInfo.PayforAmount, 'f', 2, 64)
|
||||||
|
tmp["resultMsg"] = "查询成功"
|
||||||
|
tmp["sign"] = utils.GetMD5Sign(tmp, utils.SortMap(tmp), merchantInfo.MerchantSecret)
|
||||||
|
mJson, _ := json.Marshal(tmp)
|
||||||
|
str = string(mJson)
|
||||||
|
}
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkSettAmount(settAmount string) (bool, string) {
|
||||||
|
_, err := strconv.ParseFloat(settAmount, 64)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("代付金额有误,settAmount = %s", settAmount))
|
||||||
|
return false, "代付金额有误"
|
||||||
|
}
|
||||||
|
return true, ""
|
||||||
|
}
|
||||||
135
pay_for/payfor_solve.go
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
package pay_for
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/accounts"
|
||||||
|
"gateway/models/payfor"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
)
|
||||||
|
|
||||||
|
func PayForFail(p payfor.PayforInfo) bool {
|
||||||
|
|
||||||
|
o := orm.NewOrm()
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
var tmpForPay payfor.PayforInfo
|
||||||
|
if err := txOrm.Raw("select * from payfor_info where bank_order_id = ? for update", p.BankOrderId).QueryRow(&tmpForPay); err != nil || tmpForPay.PayforUid == "" {
|
||||||
|
|
||||||
|
logs.Error("solve pay fail select fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if tmpForPay.Status == conf.PAYFOR_FAIL || tmpForPay.Status == conf.PAYFOR_SUCCESS {
|
||||||
|
logs.Error(fmt.Sprintf("该代付订单uid=%s,状态已经是最终结果", tmpForPay.PayforUid))
|
||||||
|
return errors.New("状态已经是最终结果")
|
||||||
|
}
|
||||||
|
//更新payfor记录的状态
|
||||||
|
tmpForPay.Status = conf.PAYFOR_FAIL
|
||||||
|
tmpForPay.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&tmpForPay); err != nil {
|
||||||
|
logs.Error("PayForFail update payfor_info fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var account accounts.AccountInfo
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", tmpForPay.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" {
|
||||||
|
|
||||||
|
logs.Error("payfor select account fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if account.PayforAmount < tmpForPay.PayforTotalAmount {
|
||||||
|
logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", tmpForPay.MerchantUid))
|
||||||
|
return errors.New("账户中待代付金额小于代付记录的金额")
|
||||||
|
}
|
||||||
|
//将正在打款中的金额减去
|
||||||
|
account.PayforAmount = account.PayforAmount - tmpForPay.PayforTotalAmount
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(&account); err != nil {
|
||||||
|
logs.Error("PayForFail update account fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func PayForSuccess(p payfor.PayforInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
var tmpPayFor payfor.PayforInfo
|
||||||
|
if err := txOrm.Raw("select * from payfor_info where bank_order_id = ? for update", p.BankOrderId).QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" {
|
||||||
|
logs.Error("payfor success select payfor fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if tmpPayFor.Status == conf.PAYFOR_FAIL || tmpPayFor.Status == conf.PAYFOR_SUCCESS {
|
||||||
|
logs.Error(fmt.Sprintf("该代付订单uid=#{payFor.PayforUid},已经是最终结果,不需要处理"))
|
||||||
|
return errors.New("已经是最终结果,不需要处理")
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
tmpPayFor.Status = conf.PAYFOR_SUCCESS
|
||||||
|
_, err := txOrm.Update(&tmpPayFor)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("PayForSuccess update payfor fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var account accounts.AccountInfo
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", tmpPayFor.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" {
|
||||||
|
logs.Error("payfor success select account fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if account.PayforAmount < tmpPayFor.PayforTotalAmount {
|
||||||
|
logs.Error(fmt.Sprintf("商户uid=#{payFor.MerchantUid},账户中待代付金额小于代付记录的金额"))
|
||||||
|
return errors.New("账户中待代付金额小于代付记录的金额")
|
||||||
|
}
|
||||||
|
|
||||||
|
//代付打款中的金额减去
|
||||||
|
account.PayforAmount = account.PayforAmount - tmpPayFor.PayforTotalAmount
|
||||||
|
//减去余额,减去可用金额
|
||||||
|
account.Balance = account.Balance - tmpPayFor.PayforTotalAmount
|
||||||
|
//已结算金额减去
|
||||||
|
account.SettleAmount = account.SettleAmount - tmpPayFor.PayforTotalAmount
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(&account); err != nil {
|
||||||
|
logs.Error("PayForSuccess update account fail:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//添加一条动账记录
|
||||||
|
accountHistory := accounts.AccountHistoryInfo{
|
||||||
|
AccountUid: tmpPayFor.MerchantUid,
|
||||||
|
AccountName: tmpPayFor.MerchantName,
|
||||||
|
Type: conf.SUB_AMOUNT,
|
||||||
|
Amount: tmpPayFor.PayforTotalAmount,
|
||||||
|
Balance: account.Balance,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&accountHistory); err != nil {
|
||||||
|
logs.Error("PayForSuccess insert account history fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
83
query/merchant_query.go
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : 供下游订单状态查询和代付结果查询
|
||||||
|
** @Time : 2019/11/6 13:59
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_query
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/6 13:59
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package query
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MerchantQueryController struct {
|
||||||
|
web.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
type OrderQueryFailData struct {
|
||||||
|
PayKey string `json:"payKey"`
|
||||||
|
StatusCode string `json:"statusCode"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** 改接口是为下游商户提供订单查询
|
||||||
|
*/
|
||||||
|
func (c *MerchantQueryController) OrderQuery() {
|
||||||
|
orderNo := strings.TrimSpace(c.GetString("orderNo"))
|
||||||
|
payKey := strings.TrimSpace(c.GetString("payKey"))
|
||||||
|
sign := strings.TrimSpace(c.GetString("sign"))
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["orderNo"] = orderNo
|
||||||
|
params["payKey"] = payKey
|
||||||
|
|
||||||
|
failData := new(OrderQueryFailData)
|
||||||
|
failData.StatusCode = "01"
|
||||||
|
failData.PayKey = payKey
|
||||||
|
|
||||||
|
merchantInfo := merchant.GetMerchantByPasskey(payKey)
|
||||||
|
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||||||
|
failData.Msg = "商户不存在,请核对payKey字段"
|
||||||
|
}
|
||||||
|
orderInfo := order.GetOrderByMerchantOrderId(orderNo)
|
||||||
|
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||||
|
failData.Msg = "不存在这样的订单,请核对orderNo字段"
|
||||||
|
}
|
||||||
|
keys := utils.SortMap(params)
|
||||||
|
paySercet := merchantInfo.MerchantSecret
|
||||||
|
tmpSign := utils.GetMD5Sign(params, keys, paySercet)
|
||||||
|
if tmpSign != sign {
|
||||||
|
failData.Msg = "签名错误"
|
||||||
|
}
|
||||||
|
if failData.Msg != "" {
|
||||||
|
c.Data["json"] = failData
|
||||||
|
_ = c.ServeJSON()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p := make(map[string]string)
|
||||||
|
p["orderNo"] = orderNo
|
||||||
|
p["orderTime"] = strings.TrimSpace(strings.Replace("-", "", orderInfo.UpdateTime, -1))
|
||||||
|
p["trxNo"] = orderInfo.BankOrderId
|
||||||
|
p["tradeStatus"] = orderInfo.Status
|
||||||
|
p["payKey"] = payKey
|
||||||
|
p["orderPrice"] = fmt.Sprintf("%.2f", orderInfo.OrderAmount)
|
||||||
|
p["factPrice"] = fmt.Sprintf("%.2f", orderInfo.FactAmount)
|
||||||
|
p["statusCode"] = "00"
|
||||||
|
keys = utils.SortMap(p)
|
||||||
|
p["sign"] = utils.GetMD5Sign(p, keys, paySercet)
|
||||||
|
s, err := json.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("json marshal fail: ", err)
|
||||||
|
}
|
||||||
|
c.Data["json"] = s
|
||||||
|
}
|
||||||
135
query/payfor_query.go
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : 处理代付查询功能
|
||||||
|
** @Time : 2019/12/3 15:07
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : pay_for_query
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/12/3 15:07
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package query
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/message"
|
||||||
|
"gateway/models/payfor"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/pay_for"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/go-stomp/stomp"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PayForQueryTask struct {
|
||||||
|
Delay *time.Timer
|
||||||
|
MerchantOrderId string
|
||||||
|
BankOrderId string
|
||||||
|
FirstNotifyTime string
|
||||||
|
QueryTimes int
|
||||||
|
LimitTimes int
|
||||||
|
Status string
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
PayForLimitTimes = 12 //最多查询次数
|
||||||
|
PayForQueryInterval = 5 //时间间隔为5分钟
|
||||||
|
)
|
||||||
|
|
||||||
|
func PayForQueryTimer(task PayForQueryTask) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-task.Delay.C:
|
||||||
|
PayForSupplier(task)
|
||||||
|
task.Delay.Stop()
|
||||||
|
return
|
||||||
|
//70分钟没有执行该协程,那么退出协程
|
||||||
|
case <-time.After(time.Minute * 70):
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func PayForSupplier(task PayForQueryTask) {
|
||||||
|
logs.Info(fmt.Sprintf("执行代付查询任务:%+v", task))
|
||||||
|
payFor := payfor.GetPayForByBankOrderId(task.BankOrderId)
|
||||||
|
roadInfo := road.GetRoadInfoByRoadUid(payFor.RoadUid)
|
||||||
|
supplier := third_party.GetPaySupplierByCode(roadInfo.ProductUid)
|
||||||
|
if supplier == nil {
|
||||||
|
logs.Error("代付查询返回supplier为空")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, _ := supplier.PayForQuery(payFor)
|
||||||
|
if res == conf.PAYFOR_SUCCESS {
|
||||||
|
//代付成功了
|
||||||
|
pay_for.PayForSuccess(payFor)
|
||||||
|
} else if res == conf.PAYFOR_FAIL {
|
||||||
|
//代付失败
|
||||||
|
pay_for.PayForFail(payFor)
|
||||||
|
} else if res == conf.PAYFOR_BANKING {
|
||||||
|
//银行处理中,那么就继续执行查询,直到次数超过最大次数
|
||||||
|
if task.QueryTimes <= task.LimitTimes {
|
||||||
|
task.QueryTimes += 1
|
||||||
|
task.Delay = time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute)
|
||||||
|
go PayForQueryTimer(task)
|
||||||
|
} else {
|
||||||
|
logs.Info(fmt.Sprintf("该代付订单已经超过最大查询次数,bankOrderId = %s", task.BankOrderId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func payForQueryConsumer(bankOrderId string) {
|
||||||
|
exist := payfor.IsExistPayForByBankOrderId(bankOrderId)
|
||||||
|
if !exist {
|
||||||
|
logs.Error(fmt.Sprintf("代付记录不存在,bankOrderId = %s", bankOrderId))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
payFor := payfor.GetPayForByBankOrderId(bankOrderId)
|
||||||
|
|
||||||
|
if payFor.Status != conf.PAYFOR_BANKING {
|
||||||
|
logs.Info(fmt.Sprintf("代付状态不是银行处理中,不需要去查询,bankOrderId = %s", bankOrderId))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
payForQueryTask := PayForQueryTask{Delay: time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute), MerchantOrderId: payFor.MerchantOrderId,
|
||||||
|
BankOrderId: payFor.BankOrderId, FirstNotifyTime: utils.GetBasicDateTime(), QueryTimes: 1, LimitTimes: PayForLimitTimes, Status: payFor.Status}
|
||||||
|
|
||||||
|
go PayForQueryTimer(payForQueryTask)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreatePayForQueryConsumer 创建代付查询的消费者
|
||||||
|
func CreatePayForQueryConsumer() {
|
||||||
|
//启动定时任务
|
||||||
|
conn := message.GetActiveMQConn()
|
||||||
|
if conn == nil {
|
||||||
|
logs.Error("启动消息队列消费者失败....")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.Notice("代付查询消费启动成功......")
|
||||||
|
|
||||||
|
payForQuery, err := conn.Subscribe(conf.MQ_PAYFOR_QUERY, stomp.AckClient)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("订阅代付查询失败......")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case v := <-payForQuery.C:
|
||||||
|
if v != nil {
|
||||||
|
bankOrderId := string(v.Body)
|
||||||
|
go payForQueryConsumer(bankOrderId)
|
||||||
|
//应答,重要
|
||||||
|
err := conn.Ack(v)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("消息应答失败!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
119
query/supplier_query.go
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
package query
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : 自动查询上游的支付结果
|
||||||
|
** @Time : 2019/11/22 23:02
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_query
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/22 23:02
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/message"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/go-stomp/stomp"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OrderQueryTask struct {
|
||||||
|
BankOrderId string
|
||||||
|
OrderQueryTimer *time.Timer
|
||||||
|
Times int
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
DelayTime = 5 //延时时间为5分钟查询一次
|
||||||
|
LimitTimes = 5 //最多查询5次
|
||||||
|
)
|
||||||
|
|
||||||
|
func SupplierOrderQueryResult(bankOrderId string) bool {
|
||||||
|
orderInfo := order.GetOrderByBankOrderId(bankOrderId)
|
||||||
|
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
||||||
|
logs.Error("不存在这样的订单,订单查询结束")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if orderInfo.Status != "" && orderInfo.Status != "wait" {
|
||||||
|
logs.Error(fmt.Sprintf("该订单=%s,已经处理完毕,", bankOrderId))
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
supplierCode := orderInfo.PayProductCode
|
||||||
|
supplier := third_party.GetPaySupplierByCode(supplierCode)
|
||||||
|
|
||||||
|
if supplier == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
flag := false
|
||||||
|
//flag = supplier.PayQuery(orderInfo)
|
||||||
|
|
||||||
|
return flag
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** 该接口是查询上游的订单
|
||||||
|
*/
|
||||||
|
func solveSupplierOrderQuery(task OrderQueryTask) {
|
||||||
|
bankOrderId := task.BankOrderId
|
||||||
|
|
||||||
|
flag := SupplierOrderQueryResult(bankOrderId)
|
||||||
|
if flag {
|
||||||
|
logs.Info("订单查询成功, bankOrderId:", bankOrderId)
|
||||||
|
} else {
|
||||||
|
if task.Times <= LimitTimes {
|
||||||
|
task.Times += 1
|
||||||
|
task.OrderQueryTimer = time.NewTimer(time.Duration(5) * time.Minute)
|
||||||
|
DelayOrderQueryQueue(task)
|
||||||
|
} else {
|
||||||
|
logs.Notice(fmt.Sprintf("订单id=%s, 已经查询超过次数", bankOrderId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelayOrderQueryQueue 延时队列
|
||||||
|
func DelayOrderQueryQueue(task OrderQueryTask) {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-task.OrderQueryTimer.C:
|
||||||
|
logs.Info(fmt.Sprintf("订单id=%s,执行第:%d 次查询", task.BankOrderId, task.Times))
|
||||||
|
solveSupplierOrderQuery(task)
|
||||||
|
return
|
||||||
|
case <-time.After(time.Duration(2*DelayTime) * time.Minute):
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateSupplierOrderQueryCuConsumer 启动消息订单查询的消息队列消费者
|
||||||
|
func CreateSupplierOrderQueryCuConsumer() {
|
||||||
|
conn := message.GetActiveMQConn()
|
||||||
|
if conn == nil {
|
||||||
|
logs.Error("supplier order query consumer fail")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
logs.Notice("启动订单查询的消费者成功.....")
|
||||||
|
orderQuerySub, _ := conn.Subscribe(conf.MqOrderQuery, stomp.AckClient)
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case v := <-orderQuerySub.C:
|
||||||
|
if v != nil {
|
||||||
|
bankOrderId := string(v.Body)
|
||||||
|
logs.Info("消费者正在处理订单查询: " + bankOrderId)
|
||||||
|
task := OrderQueryTask{BankOrderId: bankOrderId, OrderQueryTimer: time.NewTimer(time.Second * 1), Times: 1}
|
||||||
|
DelayOrderQueryQueue(task)
|
||||||
|
//应答,重要
|
||||||
|
err := conn.Ack(v)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("消息应答失败!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
response/pay_resp.go
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package response
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/road"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PayBaseResp struct {
|
||||||
|
Params map[string]string //请求的基本参数
|
||||||
|
ClientIP string //商户ip
|
||||||
|
MerchantInfo merchant.MerchantInfo //商户信息
|
||||||
|
Msg string //信息
|
||||||
|
Code int //状态码 200正常
|
||||||
|
RoadInfo road.RoadInfo
|
||||||
|
RoadPoolInfo road.RoadPoolInfo
|
||||||
|
OrderAmount float64
|
||||||
|
PayWayCode string
|
||||||
|
PlatformRate float64
|
||||||
|
AgentRate float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type ScanSuccessData struct {
|
||||||
|
OrderNo string `json:"orderNo"`
|
||||||
|
Sign string `json:"sign"`
|
||||||
|
OrderPrice string `json:"orderPrice"`
|
||||||
|
PayKey string `json:"payKey"`
|
||||||
|
PayUrl string `json:"payURL"`
|
||||||
|
StatusCode string `json:"statusCode"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ScanFailData struct {
|
||||||
|
PayKey string `json:"payKey"`
|
||||||
|
StatusCode string `json:"statusCode"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
40
response/payfor_resp.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package response
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回自动代付结果
|
||||||
|
*/
|
||||||
|
type PayForResponse struct {
|
||||||
|
ResultCode string `json:"resultCode,omitempty"`
|
||||||
|
ResultMsg string `json:"resultMsg,omitempty"`
|
||||||
|
MerchantOrderId string `json:"merchantOrderId,omitempty"`
|
||||||
|
SettAmount string `json:"settAmount,omitempty"`
|
||||||
|
SettFee string `json:"settFee,omitempty"`
|
||||||
|
Sign string `json:"sign,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回商户代付结果查询结果
|
||||||
|
*/
|
||||||
|
type PayForQueryResponse struct {
|
||||||
|
ResultMsg string `json:"resultMsg,omitempty"`
|
||||||
|
MerchantOrderId string `json:"merchantOrderId,omitempty"`
|
||||||
|
SettAmount string `json:"settAmount,omitempty"`
|
||||||
|
SettFee string `json:"settFee,omitempty"`
|
||||||
|
SettStatus string `json:"settStatus,omitempty"`
|
||||||
|
Sign string `json:"sign,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回商户查询余额结果
|
||||||
|
*/
|
||||||
|
type BalanceResponse struct {
|
||||||
|
ResultCode string `json:"resultCode,omitempty"`
|
||||||
|
Balance string `json:"balance,omitempty"`
|
||||||
|
AvailableAmount string `json:"availableAmount,omitempty"`
|
||||||
|
FreezeAmount string `json:"freezeAmount,omitempty"`
|
||||||
|
WaitAmount string `json:"waitAmount,omitempty"`
|
||||||
|
LoanAmount string `json:"loanAmount,omitempty"`
|
||||||
|
PayforAmount string `json:"payforAmount,omitempty"`
|
||||||
|
ResultMsg string `json:"resultMsg,omitempty"`
|
||||||
|
Sign string `json:"sign,omitempty"`
|
||||||
|
}
|
||||||
35
routers/router.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package routers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gateway/controllers/gateway"
|
||||||
|
"gateway/supplier/third_party"
|
||||||
|
"github.com/beego/beego/v2/server/web"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
//网关处理函数
|
||||||
|
web.Router("/gateway/scan", &gateway.ScanController{}, "*:Scan")
|
||||||
|
web.Router("/err/params", &gateway.ErrorGatewayController{}, "*:ErrorParams")
|
||||||
|
|
||||||
|
//代付相关的接口
|
||||||
|
web.Router("/gateway/payfor", &gateway.PayForGateway{}, "*:PayFor")
|
||||||
|
web.Router("/gateway/payfor/query", &gateway.PayForGateway{}, "*:PayForQuery")
|
||||||
|
web.Router("/gateway/balance", &gateway.PayForGateway{}, "*:Balance")
|
||||||
|
web.Router("/gateway/supplier/payfor/query", &gateway.PayForGateway{}, "*:QuerySupplierPayForResult")
|
||||||
|
web.Router("/solve/payfor/result", &gateway.PayForGateway{}, "*:SolvePayForResult")
|
||||||
|
|
||||||
|
// 接收回调
|
||||||
|
web.Router("/daili/notify", &third_party.DaiLiImpl{}, "*:PayNotify")
|
||||||
|
web.Router("/mfcard/notify", &third_party.MFCardImpl{}, "*:PayNotify")
|
||||||
|
web.Router("/mfcard/test", &third_party.MFCardImpl{}, "*:Test")
|
||||||
|
|
||||||
|
web.Router("/mfcard/notifyV2", &third_party.MFCardV2Impl{}, "*:PayNotify")
|
||||||
|
|
||||||
|
web.Router("/gateway/supplier/order/query", &gateway.OrderController{}, "*:OrderQuery")
|
||||||
|
web.Router("/gateway/update/order", &gateway.OrderController{}, "*:OrderUpdate")
|
||||||
|
|
||||||
|
//网关可视化
|
||||||
|
web.Router("/order/create", &gateway.OrderController{}, "*:OrderCreate")
|
||||||
|
web.Router("/order/cardsuit", &gateway.OrderController{}, "*:CardSuit")
|
||||||
|
|
||||||
|
}
|
||||||
210
service/base_service.go
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/response"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetMerchantInfoByUID 获取商户信息
|
||||||
|
func GetMerchantInfoByUID(params map[string]string) *response.PayBaseResp {
|
||||||
|
c := new(response.PayBaseResp)
|
||||||
|
c.Params = make(map[string]string)
|
||||||
|
c.Params = params
|
||||||
|
merchantInfo := merchant.GetMerchantByUid(params["MerchantUid"])
|
||||||
|
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户不存在,或者paykey有误,请联系管理员"
|
||||||
|
} else if merchantInfo.Status != conf.ACTIVE {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户状态已经被冻结或者被删除,请联系管理员!"
|
||||||
|
} else {
|
||||||
|
c.MerchantInfo = merchantInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMerchantInfo 获取商户信息
|
||||||
|
func GetMerchantInfo(params map[string]string) *response.PayBaseResp {
|
||||||
|
|
||||||
|
c := new(response.PayBaseResp)
|
||||||
|
c.Params = make(map[string]string)
|
||||||
|
c.Params = params
|
||||||
|
|
||||||
|
merchantInfo := merchant.GetMerchantByPasskey(params["payKey"])
|
||||||
|
|
||||||
|
if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户不存在,或者paykey有误,请联系管理员"
|
||||||
|
} else if merchantInfo.Status != conf.ACTIVE {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户状态已经被冻结或者被删除,请联系管理员!"
|
||||||
|
} else {
|
||||||
|
c.MerchantInfo = merchantInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func JudgeParams(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
//c.ReturnUrlIsValid()
|
||||||
|
c = OrderIsValid(c)
|
||||||
|
c = NotifyUrlIsValid(c)
|
||||||
|
c = OsTypeIsValid(c)
|
||||||
|
c = PayWayCodeIsValid(c)
|
||||||
|
c = ProductIsValid(c)
|
||||||
|
c = OrderPeriodIsValid(c)
|
||||||
|
//c = IpIsWhite()
|
||||||
|
c = OrderPriceIsValid(c)
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// InsertOrderAndOrderProfit 插入支付订单记录和订单利润记录,保证一致性
|
||||||
|
func InsertOrderAndOrderProfit(orderInfo order.OrderInfo, orderProfitInfo order.OrderProfitInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
if _, err := txOrm.Insert(&orderInfo); err != nil {
|
||||||
|
logs.Error("insert orderInfo fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := txOrm.Insert(&orderProfitInfo); err != nil {
|
||||||
|
logs.Error("insert orderProfit fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 判断跳转地址是否符合规则
|
||||||
|
*/
|
||||||
|
func ReturnUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["returnUrl"] == "" || len(c.Params["returnUrl"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "支付成功后跳转地址不能为空"
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 判断回调地址是否符合规则
|
||||||
|
*/
|
||||||
|
func NotifyUrlIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["notifyUrl"] == "" || len(c.Params["notifyUrl"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "支付成功订单回调地址不能空位"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 判断设备类型是否符合规则
|
||||||
|
*/
|
||||||
|
func OsTypeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["osType"] == "" || len(c.Params["osType"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "支付设备系统类型不能为空,默认填写\"1\"即可"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** 判断支付类型字段是否符合规则
|
||||||
|
*/
|
||||||
|
func PayWayCodeIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["payWayCode"] == "" || len(c.Params["payWayCode"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "支付类型字段不能为空"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
payWayCode := c.Params["payWayCode"]
|
||||||
|
if !(strings.Contains(payWayCode, "SCAN") || payWayCode == "CARD_DH") {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "扫码支付不支持这种支付类型"
|
||||||
|
} else {
|
||||||
|
scanPayWayCodes := conf.GetScanPayWayCodes()
|
||||||
|
for _, v := range scanPayWayCodes {
|
||||||
|
if c.Params["payWayCode"] == v {
|
||||||
|
c.PayWayCode = strings.Replace(c.Params["payWayCode"], "-", "_", -1)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "不存在这种支付类型,请仔细阅读对接文档"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProductIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["productName"] == "" || len(c.Params["productName"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商品描述信息字段不能为空"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func OrderPeriodIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["orderPeriod"] == "" || len(c.Params["orderPeriod"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "订单过期时间不能为空,默认填写\"1\"即可"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断订单金额
|
||||||
|
func OrderPriceIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["orderPrice"] == "" || len(c.Params["orderPrice"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "订单金额不能为空"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := strconv.ParseFloat(c.Params["orderPrice"], 64)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("order price is invalid: ", c.Params["orderPrice"])
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "订单金额非法"
|
||||||
|
}
|
||||||
|
c.OrderAmount = a
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断金额订单号是否为空或者有重复
|
||||||
|
func OrderIsValid(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
if c.Params["orderNo"] == "" || len(c.Params["orderNo"]) == 0 {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户订单号不能为空"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
if order.OrderNoIsEixst(c.Params["orderNo"]) {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "商户订单号重复"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断ip是否在白名单中
|
||||||
|
func IpIsWhite() bool {
|
||||||
|
//TODO
|
||||||
|
return true
|
||||||
|
}
|
||||||
254
service/pay_service.go
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
** @Desc : 处理网关模块的一些需要操作数据库的功能
|
||||||
|
** @Time : 2019/12/7 16:40
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : gateway_solve
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/12/7 16:40
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/response"
|
||||||
|
"gateway/supplier"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/rs/xid"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ChooseRoad 选择通道
|
||||||
|
func ChooseRoad(c *response.PayBaseResp) *response.PayBaseResp {
|
||||||
|
payWayCode := c.Params["payWayCode"]
|
||||||
|
merchantUid := c.MerchantInfo.MerchantUid
|
||||||
|
//通道配置信息
|
||||||
|
deployInfo := merchant.GetMerchantDeployByUidAndPayType(merchantUid, payWayCode)
|
||||||
|
|
||||||
|
if deployInfo.MerchantUid == "" {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "该商户没有配置通道信息"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
singleRoad := road.GetRoadInfoByRoadUid(deployInfo.SingleRoadUid)
|
||||||
|
c.RoadPoolInfo = road.GetRoadPoolByRoadPoolCode(deployInfo.RollRoadCode)
|
||||||
|
if msg, ok := RoadIsValid(singleRoad, c); ok {
|
||||||
|
c.RoadInfo = singleRoad
|
||||||
|
c.PlatformRate = deployInfo.SingleRoadPlatformRate
|
||||||
|
c.AgentRate = deployInfo.SingleRoadAgentRate
|
||||||
|
return c
|
||||||
|
} else {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = msg
|
||||||
|
}
|
||||||
|
//如果单通道没有有效的,那么寻找通道池里面的通道
|
||||||
|
if c.RoadPoolInfo.RoadPoolCode == "" {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "该商户没有配置通道"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
roadUids := strings.Split(c.RoadPoolInfo.RoadUidPool, "||")
|
||||||
|
roadInfos := road.GetRoadInfosByRoadUids(roadUids)
|
||||||
|
for _, roadInfo := range roadInfos {
|
||||||
|
if _, ok := RoadIsValid(roadInfo, c); ok {
|
||||||
|
c.RoadInfo = roadInfo
|
||||||
|
c.PlatformRate = deployInfo.RollRoadPlatformRate
|
||||||
|
c.AgentRate = deployInfo.RollRoadAgentRate
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if c.RoadInfo.RoadUid == "" {
|
||||||
|
c.Code = -1
|
||||||
|
c.Msg = "该商户没有配置通道或者通道不可用"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// RoadIsValid 判断通道是否是合法的
|
||||||
|
func RoadIsValid(roadInfo road.RoadInfo, c *response.PayBaseResp) (string, bool) {
|
||||||
|
if roadInfo.RoadUid == "" || len(roadInfo.RoadUid) == 0 {
|
||||||
|
return "参数缺失", false
|
||||||
|
}
|
||||||
|
FORMAT := fmt.Sprintf("该通道:%s;", roadInfo.RoadName)
|
||||||
|
if roadInfo.Status != "active" {
|
||||||
|
logs.Notice(FORMAT + "不是激活状态")
|
||||||
|
return "通道未激活", false
|
||||||
|
}
|
||||||
|
hour := time.Now().Hour()
|
||||||
|
s := roadInfo.StarHour
|
||||||
|
e := roadInfo.EndHour
|
||||||
|
if hour < s || hour > e {
|
||||||
|
logs.Notice(FORMAT)
|
||||||
|
return "当前未处在交易区间内", false
|
||||||
|
}
|
||||||
|
minAmount := roadInfo.SingleMinLimit
|
||||||
|
maxAmount := roadInfo.SingleMaxLimit
|
||||||
|
if minAmount > c.OrderAmount || maxAmount < c.OrderAmount {
|
||||||
|
logs.Error(FORMAT + "订单金额超限制")
|
||||||
|
return "订单金额超过交易限制", false
|
||||||
|
}
|
||||||
|
todayLimit := roadInfo.TodayLimit
|
||||||
|
totalLimit := roadInfo.TotalLimit
|
||||||
|
todayIncome := roadInfo.TodayIncome
|
||||||
|
totalIncome := roadInfo.TotalIncome
|
||||||
|
if (todayIncome + c.OrderAmount) > todayLimit {
|
||||||
|
logs.Error(FORMAT + "达到了每天金额上限")
|
||||||
|
return "订单金额超过金额限制", false
|
||||||
|
}
|
||||||
|
if (totalIncome + c.OrderAmount) > totalLimit {
|
||||||
|
logs.Error(FORMAT + "达到了总量限制")
|
||||||
|
return "订单金额达到总量限制", false
|
||||||
|
}
|
||||||
|
//如果通道被选中,那么总请求数+1
|
||||||
|
roadInfo.RequestAll = roadInfo.RequestAll + 1
|
||||||
|
roadInfo.TodayRequestAll = roadInfo.RequestAll + 1
|
||||||
|
roadInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
road.UpdateRoadInfo(roadInfo)
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取基本订单记录
|
||||||
|
func GenerateOrderInfo(c *response.PayBaseResp) order.OrderInfo {
|
||||||
|
//6666是自己系统订单号
|
||||||
|
bankOrderNo := "6666" + xid.New().String()
|
||||||
|
//获取支付类型的名称,例如支付宝扫码等
|
||||||
|
payTypeName := conf.GetNameByPayWayCode(c.Params["payWayCode"])
|
||||||
|
orderInfo := order.OrderInfo{
|
||||||
|
MerchantUid: c.MerchantInfo.MerchantUid,
|
||||||
|
MerchantName: c.MerchantInfo.MerchantName,
|
||||||
|
MerchantOrderId: c.Params["orderNo"],
|
||||||
|
BankOrderId: bankOrderNo,
|
||||||
|
OrderAmount: c.OrderAmount,
|
||||||
|
FactAmount: c.OrderAmount,
|
||||||
|
ShowAmount: c.OrderAmount,
|
||||||
|
RollPoolCode: c.RoadPoolInfo.RoadPoolCode,
|
||||||
|
RollPoolName: c.RoadPoolInfo.RoadPoolName,
|
||||||
|
RoadUid: c.RoadInfo.RoadUid,
|
||||||
|
RoadName: c.RoadInfo.RoadName,
|
||||||
|
PayProductName: c.RoadInfo.ProductName,
|
||||||
|
ShopName: c.Params["productName"],
|
||||||
|
Freeze: conf.NO,
|
||||||
|
Refund: conf.NO,
|
||||||
|
Unfreeze: conf.NO,
|
||||||
|
PayProductCode: c.RoadInfo.ProductUid,
|
||||||
|
PayTypeCode: c.PayWayCode,
|
||||||
|
PayTypeName: payTypeName,
|
||||||
|
OsType: c.Params["osType"],
|
||||||
|
Status: conf.WAIT,
|
||||||
|
NotifyUrl: c.Params["notifyUrl"],
|
||||||
|
ReturnUrl: c.Params["returnUrl"],
|
||||||
|
OrderPeriod: c.Params["orderPeriod"],
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
ExValue: c.Params["exValue"],
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.MerchantInfo.BelongAgentUid != "" || c.AgentRate > conf.ZERO {
|
||||||
|
orderInfo.AgentUid = c.MerchantInfo.BelongAgentUid
|
||||||
|
orderInfo.AgentName = c.MerchantInfo.BelongAgentName
|
||||||
|
}
|
||||||
|
return orderInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算收益,平台利润,代理利润
|
||||||
|
func GenerateOrderProfit(orderInfo order.OrderInfo, c *response.PayBaseResp) order.OrderProfitInfo {
|
||||||
|
//因为所有的手续费率都是百分率,所以需要除以100
|
||||||
|
payTypeName := conf.GetNameByPayWayCode(c.PayWayCode)
|
||||||
|
supplierProfit := c.OrderAmount / 100 * c.RoadInfo.BasicFee
|
||||||
|
platformProfit := c.OrderAmount / 100 * c.PlatformRate //平台费率
|
||||||
|
agentProfit := c.OrderAmount / 100 * c.AgentRate //代理费率
|
||||||
|
//如果用户没有设置代理,那么代理利润为0.000
|
||||||
|
if c.MerchantInfo.BelongAgentUid == "" || len(c.MerchantInfo.BelongAgentUid) == 0 {
|
||||||
|
agentProfit = conf.ZERO
|
||||||
|
}
|
||||||
|
|
||||||
|
allProfit := supplierProfit + platformProfit + agentProfit
|
||||||
|
|
||||||
|
if allProfit >= c.OrderAmount {
|
||||||
|
logs.Error("手续费已经超过订单金额,bankOrderId = %s", orderInfo.BankOrderId)
|
||||||
|
c.Msg = "手续费已经超过了订单金额"
|
||||||
|
c.Code = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
orderProfit := order.OrderProfitInfo{
|
||||||
|
PayProductCode: c.RoadInfo.ProductUid,
|
||||||
|
PayProductName: c.RoadInfo.ProductName,
|
||||||
|
PayTypeCode: c.PayWayCode,
|
||||||
|
PayTypeName: payTypeName,
|
||||||
|
Status: conf.WAIT,
|
||||||
|
MerchantOrderId: c.Params["orderNo"],
|
||||||
|
BankOrderId: orderInfo.BankOrderId,
|
||||||
|
OrderAmount: c.OrderAmount,
|
||||||
|
FactAmount: c.OrderAmount,
|
||||||
|
ShowAmount: c.OrderAmount,
|
||||||
|
AllProfit: allProfit,
|
||||||
|
UserInAmount: c.OrderAmount - allProfit,
|
||||||
|
SupplierProfit: supplierProfit,
|
||||||
|
PlatformProfit: platformProfit,
|
||||||
|
AgentProfit: agentProfit,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
MerchantUid: c.MerchantInfo.MerchantUid,
|
||||||
|
MerchantName: orderInfo.MerchantName,
|
||||||
|
SupplierRate: c.RoadInfo.BasicFee,
|
||||||
|
PlatformRate: c.PlatformRate,
|
||||||
|
AgentRate: c.AgentRate,
|
||||||
|
AgentName: orderInfo.AgentName,
|
||||||
|
AgentUid: orderInfo.AgentUid,
|
||||||
|
}
|
||||||
|
|
||||||
|
//如果该条订单设置了代理利率,并且设置了代理
|
||||||
|
if c.MerchantInfo.BelongAgentUid != "" || c.AgentRate > conf.ZERO {
|
||||||
|
orderProfit.AgentUid = c.MerchantInfo.BelongAgentUid
|
||||||
|
orderProfit.AgentName = c.MerchantInfo.BelongAgentName
|
||||||
|
}
|
||||||
|
return orderProfit
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenerateRecord 生成订单一系列的记录
|
||||||
|
func GenerateRecord(c *response.PayBaseResp) (order.OrderInfo, order.OrderProfitInfo) {
|
||||||
|
//生成订单记录,订单利润利润
|
||||||
|
orderInfo := GenerateOrderInfo(c)
|
||||||
|
orderProfit := GenerateOrderProfit(orderInfo, c)
|
||||||
|
if c.Code == -1 {
|
||||||
|
return orderInfo, orderProfit
|
||||||
|
}
|
||||||
|
if !InsertOrderAndOrderProfit(orderInfo, orderProfit) {
|
||||||
|
c.Code = -1
|
||||||
|
return orderInfo, orderProfit
|
||||||
|
}
|
||||||
|
logs.Info("插入支付订单记录和支付利润记录成功")
|
||||||
|
return orderInfo, orderProfit
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateSuccessData(scanData supplier.ScanData, c *response.PayBaseResp) *response.ScanSuccessData {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["orderNo"] = scanData.OrderNo
|
||||||
|
params["orderPrice"] = scanData.OrderPrice
|
||||||
|
params["payKey"] = c.MerchantInfo.MerchantKey
|
||||||
|
params["payURL"] = scanData.PayUrl
|
||||||
|
params["statusCode"] = "00"
|
||||||
|
|
||||||
|
keys := utils.SortMap(params)
|
||||||
|
sign := utils.GetMD5Sign(params, keys, c.MerchantInfo.MerchantSecret)
|
||||||
|
scanSuccessData := new(response.ScanSuccessData)
|
||||||
|
|
||||||
|
scanSuccessData.StatusCode = "00"
|
||||||
|
scanSuccessData.PayKey = c.MerchantInfo.MerchantKey
|
||||||
|
scanSuccessData.OrderNo = scanData.OrderNo
|
||||||
|
scanSuccessData.OrderPrice = scanData.OrderPrice
|
||||||
|
scanSuccessData.PayUrl = scanData.PayUrl
|
||||||
|
scanSuccessData.PayKey = c.MerchantInfo.MerchantKey
|
||||||
|
scanSuccessData.Msg = "请求成功"
|
||||||
|
scanSuccessData.Sign = sign
|
||||||
|
|
||||||
|
return scanSuccessData
|
||||||
|
}
|
||||||
510
service/pay_solve.go
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/message"
|
||||||
|
"gateway/models/accounts"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/notify"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/models/road"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SolvePaySuccess 处理支付成功的加款等各项操作
|
||||||
|
func SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
var orderInfo order.OrderInfo
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error("不存在该订单,或者select for update出错")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderInfo.Status != "wait" {
|
||||||
|
logs.Error("该订单已经处理,订单号=", bankOrderId)
|
||||||
|
return errors.New(fmt.Sprintf("该订单已经处理,订单号= %s", bankOrderId))
|
||||||
|
}
|
||||||
|
|
||||||
|
if factAmount <= conf.ZERO {
|
||||||
|
factAmount = orderInfo.OrderAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
//make
|
||||||
|
var orderProfitInfo order.OrderProfitInfo
|
||||||
|
if err := txOrm.Raw("select * from order_profit_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderProfitInfo); err != nil || orderProfitInfo.BankOrderId == "" {
|
||||||
|
logs.Error("select order_profit_info for update fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderProfitInfo.BankOrderId == "" {
|
||||||
|
logs.Error("solve pay success, get orderProfit fail, bankOrderId = ", bankOrderId)
|
||||||
|
return errors.New(fmt.Sprintf("solve pay success, get orderProfit fail, bankOrderId = %s", bankOrderId))
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo.Status = conf.SUCCESS
|
||||||
|
orderInfo.BankTransId = trxNo
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, update order info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
orderSettleInfo := order.OrderSettleInfo{
|
||||||
|
PayTypeCode: orderInfo.PayTypeCode,
|
||||||
|
PayProductCode: orderInfo.PayProductCode,
|
||||||
|
RoadUid: orderInfo.RoadUid,
|
||||||
|
PayProductName: orderInfo.PayProductName,
|
||||||
|
PayTypeName: orderInfo.PayTypeName,
|
||||||
|
MerchantUid: orderInfo.MerchantUid,
|
||||||
|
MerchantOrderId: orderInfo.MerchantOrderId,
|
||||||
|
MerchantName: orderInfo.MerchantName,
|
||||||
|
BankOrderId: bankOrderId,
|
||||||
|
SettleAmount: orderProfitInfo.UserInAmount,
|
||||||
|
IsAllowSettle: conf.YES,
|
||||||
|
IsCompleteSettle: conf.NO,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&orderSettleInfo); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success,insert order settle info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//做账户的加款操作,最重要的一部
|
||||||
|
var accountInfo accounts.AccountInfo
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(&accountInfo); err != nil || accountInfo.AccountUid == "" {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, raw account info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := txOrm.QueryTable(accounts.ACCOUNT_INFO).Filter("account_uid", orderInfo.MerchantUid).
|
||||||
|
Update((orm.Params{"balance": accountInfo.Balance + orderProfitInfo.UserInAmount, "wait_amount": accountInfo.WaitAmount + orderProfitInfo.UserInAmount})); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, update account info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//添加一条动账记录
|
||||||
|
accountHistory := accounts.AccountHistoryInfo{
|
||||||
|
AccountUid: orderInfo.MerchantUid,
|
||||||
|
AccountName: orderInfo.MerchantName,
|
||||||
|
Type: conf.PLUS_AMOUNT,
|
||||||
|
Amount: orderProfitInfo.UserInAmount,
|
||||||
|
Balance: accountInfo.Balance + orderProfitInfo.UserInAmount,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&accountHistory); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success,insert account history fail:%s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新通道信息
|
||||||
|
roadInfo := road.GetRoadInfoByRoadUid(orderInfo.RoadUid)
|
||||||
|
|
||||||
|
roadInfo.RequestSuccess += 1
|
||||||
|
roadInfo.TodayRequestSuccess += 1 //今日成功
|
||||||
|
roadInfo.TotalIncome += orderInfo.FactAmount
|
||||||
|
roadInfo.TodayIncome += orderInfo.FactAmount
|
||||||
|
roadInfo.TodayProfit += orderProfitInfo.PlatformProfit + orderProfitInfo.AgentProfit
|
||||||
|
roadInfo.TotalProfit += orderProfitInfo.PlatformProfit + orderProfitInfo.AgentProfit
|
||||||
|
roadInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&roadInfo); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, update road info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新订单利润表
|
||||||
|
orderProfitInfo.Status = conf.SUCCESS
|
||||||
|
orderProfitInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&orderProfitInfo); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay success, update order profit info fail: %s, bankOrderId = %s", err, bankOrderId))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 给下游发送回调通知
|
||||||
|
go CreateOrderNotifyInfo(orderInfo, conf.SUCCESS)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("SolvePaySuccess失败:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.Info("SolvePaySuccess处理成功")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理支付失败
|
||||||
|
func SolvePayFail(bankOrderId, transId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
var orderTmp order.OrderInfo
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ?", bankOrderId).QueryRow(&orderTmp); err != nil || orderTmp.BankOrderId == "" {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderTmp.Status != "wait" {
|
||||||
|
return errors.New("订单已经处理,不要重复加款")
|
||||||
|
}
|
||||||
|
if _, err := txOrm.QueryTable(order.ORDER_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": conf.FAIL, "bank_trans_id": transId}); err != nil {
|
||||||
|
logs.Error("更改订单状态失败:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := txOrm.QueryTable(order.ORDER_PROFIT_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": conf.FAIL, "bank_trans_id": transId}); err != nil {
|
||||||
|
logs.Error("更改订单状态失败:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
go CreateOrderNotifyInfo(orderTmp, conf.FAIL)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("SolvePayFail:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.Info("SolvePayFail成功")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理订单冻结
|
||||||
|
func SolveOrderFreeze(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
var orderInfo order.OrderInfo
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error("solve order freeze 不存在这样的订单记录,bankOrderId = ", bankOrderId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderInfo.Status != conf.SUCCESS {
|
||||||
|
logs.Error("非成功订单不能进行冻结")
|
||||||
|
return errors.New("非成功订单不能进行冻结")
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo.Freeze = conf.YES
|
||||||
|
orderInfo.FreezeTime = utils.GetBasicDateTime()
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(&orderInfo); err != nil {
|
||||||
|
logs.Error("solve order freeze fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//账户的冻结金额里面加入相应的金额
|
||||||
|
orderProfitInfo := order.GetOrderProfitByBankOrderId(bankOrderId)
|
||||||
|
|
||||||
|
var accountInfo accounts.AccountInfo
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(&accountInfo); err != nil || accountInfo.AccountUid == "" {
|
||||||
|
logs.Error(fmt.Sprintf("solve pay fail select acount fail:%s", err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
accountInfo.FreezeAmount = accountInfo.FreezeAmount + orderProfitInfo.UserInAmount
|
||||||
|
if _, err := txOrm.Update(&accountInfo); err != nil {
|
||||||
|
logs.Error("solve order freeze fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//插入一条动账记录
|
||||||
|
accountHistoryInfo := accounts.AccountHistoryInfo{
|
||||||
|
AccountName: accountInfo.AccountName,
|
||||||
|
AccountUid: accountInfo.AccountUid,
|
||||||
|
Type: conf.FREEZE_AMOUNT,
|
||||||
|
Amount: orderProfitInfo.UserInAmount,
|
||||||
|
Balance: accountInfo.Balance,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
if _, err := txOrm.Insert(&accountHistoryInfo); err != nil {
|
||||||
|
logs.Error("solve order freeze fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("SolveOrderFreeze:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.Info("SolveOrderFreeze")
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 订单解冻
|
||||||
|
func SolveOrderUnfreeze(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
orderInfo := new(order.OrderInfo)
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error("solve order unfreeze 不存在这样的订单记录,bankOrderId = ", bankOrderId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo.Freeze = ""
|
||||||
|
orderInfo.Unfreeze = conf.YES
|
||||||
|
orderInfo.UnfreezeTime = utils.GetBasicDateTime()
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if _, err := txOrm.Update(orderInfo); err != nil {
|
||||||
|
logs.Error("solve order unfreeze fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
orderProfitInfo := order.GetOrderProfitByBankOrderId(bankOrderId)
|
||||||
|
|
||||||
|
accountInfo := new(accounts.AccountInfo)
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(accountInfo); err != nil || accountInfo.AccountUid == "" {
|
||||||
|
logs.Error(fmt.Sprintf("unfreeze select account fail: %s", err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
accountInfo.FreezeAmount = accountInfo.FreezeAmount - orderProfitInfo.UserInAmount
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(accountInfo); err != nil {
|
||||||
|
logs.Error("solve order unfreeze fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountHistoryInfo := accounts.AccountHistoryInfo{
|
||||||
|
AccountUid: accountInfo.AccountUid,
|
||||||
|
AccountName: accountInfo.AccountName,
|
||||||
|
Type: conf.UNFREEZE_AMOUNT,
|
||||||
|
Amount: orderProfitInfo.UserInAmount,
|
||||||
|
Balance: accountInfo.Balance,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&accountHistoryInfo); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
logs.Error("SolveOrderUnfreeze失败:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func SolveRefund(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
orderInfo := new(order.OrderInfo)
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
||||||
|
logs.Error("solve refund 不存在这样的订单,bankOrderId = " + bankOrderId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
orderInfo.Refund = conf.YES
|
||||||
|
orderInfo.RefundTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
orderProfitInfo := order.GetOrderProfitByBankOrderId(bankOrderId)
|
||||||
|
account := new(accounts.AccountInfo)
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
account.SettleAmount = account.SettleAmount - orderProfitInfo.UserInAmount
|
||||||
|
account.Balance = account.Balance - orderProfitInfo.UserInAmount
|
||||||
|
|
||||||
|
if orderInfo.Freeze == conf.YES {
|
||||||
|
account.FreezeAmount = account.FreezeAmount - orderProfitInfo.UserInAmount
|
||||||
|
if account.FreezeAmount < 0 {
|
||||||
|
account.FreezeAmount = conf.ZERO
|
||||||
|
}
|
||||||
|
orderInfo.Freeze = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(orderInfo); err != nil {
|
||||||
|
logs.Error("solve order refund update order info fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := txOrm.Update(account); err != nil {
|
||||||
|
logs.Error("solve order refund update account fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountHistoryInfo := accounts.AccountHistoryInfo{
|
||||||
|
AccountName: account.AccountName,
|
||||||
|
AccountUid: account.AccountUid,
|
||||||
|
Type: conf.REFUND,
|
||||||
|
Amount: orderProfitInfo.UserInAmount,
|
||||||
|
Balance: account.Balance,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&accountHistoryInfo); err != nil {
|
||||||
|
logs.Error("solve order refund insert account history fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
logs.Error("SolveRefund 成功:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func SolveOrderRoll(bankOrderId string) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
|
||||||
|
orderInfo := new(order.OrderInfo)
|
||||||
|
|
||||||
|
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil {
|
||||||
|
logs.Error("solve order roll fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if orderInfo.Status != conf.SUCCESS {
|
||||||
|
logs.Error("solve order roll 订单不存在或者订单状态不是success, bankOrderId=", bankOrderId)
|
||||||
|
return errors.New("solve order roll failed")
|
||||||
|
}
|
||||||
|
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
orderProfitInfo := order.GetOrderProfitByBankOrderId(bankOrderId)
|
||||||
|
|
||||||
|
account := new(accounts.AccountInfo)
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if orderInfo.Refund == conf.YES {
|
||||||
|
account.Balance = account.Balance + orderProfitInfo.UserInAmount
|
||||||
|
account.SettleAmount = account.SettleAmount + orderProfitInfo.UserInAmount
|
||||||
|
orderInfo.Refund = conf.NO
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(orderInfo); err != nil {
|
||||||
|
logs.Error("solve order roll fail update order info fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := txOrm.Update(account); err != nil {
|
||||||
|
logs.Error("solve order roll update account fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountHistoryInfo := accounts.AccountHistoryInfo{
|
||||||
|
AccountUid: account.AccountUid,
|
||||||
|
AccountName: account.AccountName,
|
||||||
|
Type: conf.PLUS_AMOUNT,
|
||||||
|
Amount: orderProfitInfo.UserInAmount,
|
||||||
|
Balance: account.Balance,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(),
|
||||||
|
CreateTime: utils.GetBasicDateTime(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&accountHistoryInfo); err != nil {
|
||||||
|
logs.Error("solve order roll insert account history fail: ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}); err != nil {
|
||||||
|
logs.Error("SolveOrderRoll处理失败:", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 比较订单金额和实际支付金额的大小
|
||||||
|
func CompareOrderAndFactAmount(factAmount float64, orderInfo order.OrderInfo) int {
|
||||||
|
orderAmount := orderInfo.OrderAmount
|
||||||
|
//将金额放大1000倍
|
||||||
|
oa := int64(orderAmount * 1000)
|
||||||
|
fa := int64(factAmount * 1000)
|
||||||
|
if oa > fa {
|
||||||
|
//如果实际金额大,返回1
|
||||||
|
return 1
|
||||||
|
} else if oa == fa {
|
||||||
|
return 0
|
||||||
|
} else {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支付完成后,处理给商户的回调信息
|
||||||
|
func CreateOrderNotifyInfo(orderInfo order.OrderInfo, tradeStatus string) {
|
||||||
|
|
||||||
|
notifyInfo := new(notify.NotifyInfo)
|
||||||
|
notifyInfo.Type = "order"
|
||||||
|
notifyInfo.BankOrderId = orderInfo.BankOrderId
|
||||||
|
notifyInfo.MerchantOrderId = orderInfo.MerchantOrderId
|
||||||
|
notifyInfo.Status = "wait"
|
||||||
|
notifyInfo.Times = 0
|
||||||
|
notifyInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
notifyInfo.CreateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
merchantInfo := merchant.GetMerchantByUid(orderInfo.MerchantUid)
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["orderNo"] = orderInfo.MerchantOrderId
|
||||||
|
params["orderPrice"] = strconv.FormatFloat(orderInfo.OrderAmount, 'f', 2, 64)
|
||||||
|
params["factPrice"] = strconv.FormatFloat(orderInfo.FactAmount, 'f', 2, 64)
|
||||||
|
params["orderTime"] = utils.GetDateTimeNot()
|
||||||
|
|
||||||
|
if orderInfo.BankTransId != "" {
|
||||||
|
params["trxNo"] = orderInfo.BankTransId
|
||||||
|
} else {
|
||||||
|
params["trxNo"] = orderInfo.BankOrderId
|
||||||
|
}
|
||||||
|
|
||||||
|
if tradeStatus == "success" {
|
||||||
|
params["statusCode"] = "01"
|
||||||
|
} else {
|
||||||
|
params["statusCode"] = "00"
|
||||||
|
}
|
||||||
|
|
||||||
|
params["tradeStatus"] = tradeStatus
|
||||||
|
params["payKey"] = merchantInfo.MerchantKey
|
||||||
|
s := params["orderNo"] + params["orderPrice"] + params["factPrice"] + params["trxNo"] + params["statusCode"] + params["tradeStatus"] + params["payKey"] + merchantInfo.MerchantSecret
|
||||||
|
md5Str := utils.GetMD5LOWER(s)
|
||||||
|
params["sign"] = md5Str
|
||||||
|
|
||||||
|
u := url.Values{}
|
||||||
|
for k, v := range params {
|
||||||
|
u.Add(k, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyInfo.Url = orderInfo.NotifyUrl + "?" + u.Encode()
|
||||||
|
|
||||||
|
if notify.InsertNotifyInfo(*notifyInfo) {
|
||||||
|
logs.Info(fmt.Sprintf("订单bankOrderId=%s,已经将回调地址插入数据库", orderInfo.BankOrderId))
|
||||||
|
} else {
|
||||||
|
logs.Error(fmt.Sprintf("订单bankOrderId=%s,插入回调数据库失败", orderInfo.BankOrderId))
|
||||||
|
}
|
||||||
|
//将订单发送到消息队列,给下面的商户进行回调
|
||||||
|
go message.SendMessage(conf.MqOrderNotify, orderInfo.BankOrderId)
|
||||||
|
}
|
||||||
234
service/settle_service.go
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
/***************************************************
|
||||||
|
** @Desc : 订单结算,将订单上面的钱加入到账户余额中
|
||||||
|
** @Time : 2019/11/22 11:34
|
||||||
|
** @Author : yuebin
|
||||||
|
** @File : order_settle
|
||||||
|
** @Last Modified by : yuebin
|
||||||
|
** @Last Modified time: 2019/11/22 11:34
|
||||||
|
** @Software: GoLand
|
||||||
|
****************************************************/
|
||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"gateway/conf"
|
||||||
|
"gateway/models/accounts"
|
||||||
|
"gateway/models/merchant"
|
||||||
|
"gateway/models/order"
|
||||||
|
"gateway/utils"
|
||||||
|
"github.com/beego/beego/v2/client/orm"
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
Interval = 2 //隔多少分钟进行结算
|
||||||
|
Minutes = 1 //每隔15分钟,进行扫码,看有没有隔天押款金额
|
||||||
|
)
|
||||||
|
|
||||||
|
// OrderSettle 订单结算,将那些支付成功的订单金额加入到商户账户的结算金额中
|
||||||
|
func OrderSettle() {
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["is_allow_settle"] = conf.YES
|
||||||
|
params["is_complete_settle"] = conf.NO
|
||||||
|
orderSettleList := order.GetOrderSettleListByParams(params)
|
||||||
|
for _, orderSettle := range orderSettleList {
|
||||||
|
orderProfitInfo := order.GetOrderProfitByBankOrderId(orderSettle.BankOrderId)
|
||||||
|
if !settle(orderSettle, orderProfitInfo) {
|
||||||
|
logs.Error(fmt.Sprintf("结算订单bankOrderId = #{orderSettle.BankOrderId}, 执行失败"))
|
||||||
|
} else {
|
||||||
|
logs.Info(fmt.Sprintf("结算订单bankOrderId= #{orderSettle.BankOrderId},执行成功"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func settle(orderSettle order.OrderSettleInfo, orderProfit order.OrderProfitInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
tmpSettle := new(order.OrderSettleInfo)
|
||||||
|
if err := txOrm.Raw("select * from order_settle_info where bank_order_id=? for update", orderSettle.BankOrderId).QueryRow(tmpSettle); err != nil || tmpSettle.BankOrderId == "" {
|
||||||
|
logs.Error("获取tmpSettle失败,bankOrderId=%s", orderSettle.BankOrderId)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpSettle.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
tmpSettle.IsCompleteSettle = conf.YES
|
||||||
|
if _, err := txOrm.Update(tmpSettle); err != nil {
|
||||||
|
logs.Error("更新tmpSettle失败,错误:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountInfo := new(accounts.AccountInfo)
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid= ? for update", orderSettle.MerchantUid).
|
||||||
|
QueryRow(accountInfo); err != nil || accountInfo.UpdateTime == "" {
|
||||||
|
logs.Error("结算select account info失败,错误信息:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
|
||||||
|
// 商户有押款操作
|
||||||
|
loadAmount := 0.0
|
||||||
|
merchantDeployInfo := merchant.GetMerchantDeployByUidAndPayType(accountInfo.AccountUid, orderSettle.PayTypeCode)
|
||||||
|
if merchantDeployInfo.IsLoan == conf.YES {
|
||||||
|
loadAmount = merchantDeployInfo.LoanRate * 0.01 * orderProfit.FactAmount
|
||||||
|
date := utils.GetDate()
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["merchant_uid"] = tmpSettle.MerchantUid
|
||||||
|
params["road_uid"] = tmpSettle.RoadUid
|
||||||
|
params["load_date"] = date
|
||||||
|
if !merchant.IsExistMerchantLoadByParams(params) {
|
||||||
|
|
||||||
|
tmp := merchant.MerchantLoadInfo{Status: conf.NO, MerchantUid: orderSettle.MerchantUid, RoadUid: orderSettle.RoadUid,
|
||||||
|
LoadDate: utils.GetDateAfterDays(merchantDeployInfo.LoanDays), LoadAmount: loadAmount,
|
||||||
|
UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()}
|
||||||
|
|
||||||
|
if _, err := txOrm.Insert(&tmp); err != nil {
|
||||||
|
logs.Error("結算插入merchantLoad失敗,失败信息:", err)
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
logs.Info("结算插入新的merchantLoad信息成功")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
merchantLoad := new(merchant.MerchantLoadInfo)
|
||||||
|
if err := txOrm.Raw("select * from merchant_load_info where merchant_uid=? and road_uid=? and load_date=? for update", orderSettle.MerchantUid, orderSettle.RoadUid, date).
|
||||||
|
QueryRow(merchantLoad); err != nil || merchantLoad.UpdateTime == "" {
|
||||||
|
logs.Error(fmt.Sprintf("结算过程,select merchant load info失败,错误信息:%s", err))
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
merchantLoad.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
merchantLoad.LoadAmount += loadAmount
|
||||||
|
if _, err := txOrm.Update(merchantLoad); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("结算过程,update merchant load info失败,失败信息:%s", err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logs.Info(fmt.Sprintf("结算过程中,该商户不需要押款,全款结算"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if accountInfo.WaitAmount < orderProfit.UserInAmount {
|
||||||
|
logs.Error("系统出现严重故障,账户的带结算金额小于订单结算金额")
|
||||||
|
return errors.New("系统出现严重故障,账户的带结算金额小于订单结算金额, 账户 = " + accountInfo.AccountName + "订单id = " + orderProfit.BankOrderId)
|
||||||
|
}
|
||||||
|
|
||||||
|
needAmount := orderProfit.UserInAmount - loadAmount
|
||||||
|
|
||||||
|
accountInfo.SettleAmount = accountInfo.SettleAmount + needAmount
|
||||||
|
accountInfo.WaitAmount = accountInfo.WaitAmount - orderProfit.UserInAmount
|
||||||
|
accountInfo.LoanAmount = accountInfo.LoanAmount + loadAmount
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(accountInfo); err != nil {
|
||||||
|
logs.Error("结算update account 失败,错误信息:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 商户的押款释放处理,根据商户的押款时间进行处理
|
||||||
|
*/
|
||||||
|
func MerchantLoadSolve() {
|
||||||
|
hour := time.Now().Hour()
|
||||||
|
merchantDeployList := merchant.GetMerchantDeployByHour(hour)
|
||||||
|
for _, merchantDeploy := range merchantDeployList {
|
||||||
|
logs.Info(fmt.Sprintf("开始执行商户uid= #{merchantDeploy.MerchantUid},进行解款操作"))
|
||||||
|
|
||||||
|
loadDate := utils.GetDateBeforeDays(merchantDeploy.LoanDays)
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["status"] = conf.NO
|
||||||
|
params["merchant_uid"] = merchantDeploy.MerchantUid
|
||||||
|
params["load_date__lte"] = loadDate
|
||||||
|
|
||||||
|
merchantLoadList := merchant.GetMerchantLoadInfoByMap(params)
|
||||||
|
for _, merchantLoad := range merchantLoadList {
|
||||||
|
if MerchantAbleAmount(merchantLoad) {
|
||||||
|
logs.Info(fmt.Sprintf("商户uid= %s,押款金额=%f,押款通道= %s, 解款成功", merchantLoad.MerchantUid, merchantLoad.LoadAmount, merchantLoad.RoadUid))
|
||||||
|
} else {
|
||||||
|
logs.Error(fmt.Sprintf("商户uid=%s,押款金额=%f,押款通道=%s, 解款失败",
|
||||||
|
merchantLoad.MerchantUid, merchantLoad.LoadAmount, merchantLoad.RoadUid))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 对应的商户的账户可用金额进行调整操作
|
||||||
|
*/
|
||||||
|
func MerchantAbleAmount(merchantLoad merchant.MerchantLoadInfo) bool {
|
||||||
|
o := orm.NewOrm()
|
||||||
|
|
||||||
|
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
||||||
|
tmpLoad := new(merchant.MerchantLoadInfo)
|
||||||
|
if err := txOrm.Raw("select * from merchant_load_info where merchant_uid=? and road_uid=? and load_date=? for update",
|
||||||
|
merchantLoad.MerchantUid, merchantLoad.RoadUid, merchantLoad.LoadDate).QueryRow(tmpLoad); err != nil || tmpLoad.MerchantUid == "" {
|
||||||
|
logs.Error(fmt.Sprintf("解款操作获取商户押款信息失败,fail: %s", err))
|
||||||
|
return err
|
||||||
|
|
||||||
|
}
|
||||||
|
if tmpLoad.Status != conf.NO {
|
||||||
|
logs.Error(fmt.Sprintf("押款信息merchantuid=%s,通道uid=%s, 押款日期=%s,已经解款过,不需要再进行处理了", tmpLoad.MerchantUid, tmpLoad.RoadUid, tmpLoad.LoadDate))
|
||||||
|
return errors.New("已经解款过,不需要再进行处理了")
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpLoad.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
tmpLoad.Status = conf.YES
|
||||||
|
if _, err := txOrm.Update(tmpLoad); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("解款操作更新merchant load info 失败:%s", err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountInfo := new(accounts.AccountInfo)
|
||||||
|
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", merchantLoad.MerchantUid).QueryRow(accountInfo); err != nil || accountInfo.AccountUid == "" {
|
||||||
|
logs.Error("结款操作获取账户信息失败:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
||||||
|
if accountInfo.LoanAmount >= tmpLoad.LoadAmount {
|
||||||
|
accountInfo.LoanAmount = accountInfo.LoanAmount - tmpLoad.LoadAmount
|
||||||
|
accountInfo.SettleAmount = accountInfo.SettleAmount + tmpLoad.LoadAmount
|
||||||
|
} else {
|
||||||
|
accountInfo.LoanAmount = conf.ZERO
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := txOrm.Update(accountInfo); err != nil {
|
||||||
|
logs.Error(fmt.Sprintf("解款操作更新account info 失败:%s,账户uid=%s", err, accountInfo.AccountUid))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func OrderSettleInit() {
|
||||||
|
//每隔5分钟,巡查有没有可以进行结算的订单
|
||||||
|
go func() {
|
||||||
|
settleTimer := time.NewTimer(time.Duration(Interval) * time.Minute)
|
||||||
|
oneMinuteTimer := time.NewTimer(time.Duration(Minutes) * time.Minute)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-settleTimer.C:
|
||||||
|
settleTimer = time.NewTimer(time.Duration(Interval) * time.Minute)
|
||||||
|
logs.Info("开始对商户进行支付订单结算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
||||||
|
OrderSettle()
|
||||||
|
case <-oneMinuteTimer.C:
|
||||||
|
oneMinuteTimer = time.NewTimer(time.Duration(Minutes) * time.Minute)
|
||||||
|
logs.Info("开始执行商户的解款操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
||||||
|
MerchantLoadSolve()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
238
static/css/cashier.css
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
/* CSS Document */
|
||||||
|
li, ol, ul {
|
||||||
|
list-style: outside none none;
|
||||||
|
}
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background: #f8f8f8;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
font-family: Arial,microsoft yahei;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.tastesdk-box {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
/*头部*/
|
||||||
|
.header{width:100%; height:60px;background: #fefefe;border-bottom: 2px solid #f68452;}
|
||||||
|
.header .title{width: 1200px;margin: 0 auto;position: relative;}
|
||||||
|
.header .title .scan_code{display:none;width:190px;height:190px;position: absolute;right: 0px;top: 52px;background: #ffffff;border: 1px solid #dcdcdc;box-shadow:0 0 7px rgba(115, 115, 115, .2);-webkit-box-shadow:0 0 7px rgba(115, 115, 115, .2);-moz-box-shadow:0 0 7px rgba(1115, 115, 115, .2);}
|
||||||
|
.header .title .scan_code img{width: 160px;height: 160px;padding: 15px;}
|
||||||
|
.header .title .logo{font-family: "方正正黑简体";font-size:22px;color:#000000;float:left;background: url(../images/icon_logo.png) no-repeat left center;display:inline-block;height: 30px;margin-top: 17px;padding-left: 126px;}
|
||||||
|
.header .title .logo span{font-size: 24px;color: #9f9f9f;font-family: "微软雅黑";background: url(../images/syt_03.png) no-repeat 8px 4px;display: block;width: 72px;height:30px;}
|
||||||
|
.header .title .right{float:right; padding-top:16px;}
|
||||||
|
.header .title .right ul{float:right; padding-top:7px;}
|
||||||
|
.header .title .right li{float:left; padding-left:15px;font-size:12px;line-height: 17px;height: 17px;}
|
||||||
|
.header .title .right li span{display:inline-block;color:#868686; background-repeat:no-repeat; background-image:url(../images/icon_header.png);letter-spacing: 1px;}
|
||||||
|
.icon_info{padding-left:21px; background-position:left top;line-height: 13px;}
|
||||||
|
.icon_qq{padding-left:22px; background-position:left -13px;}
|
||||||
|
.icon_phone{padding-left:21px; background-position:left -30px;}
|
||||||
|
.login{padding-left: 15px;}
|
||||||
|
.iap_new img{margin-left: 8px;float: right;margin-top: 1px;}
|
||||||
|
.iap_new:hover .scan_code{display: block;}
|
||||||
|
|
||||||
|
.clearfix {
|
||||||
|
zoom: 1;
|
||||||
|
}
|
||||||
|
li {
|
||||||
|
list-style-image: none;
|
||||||
|
list-style-position: outside;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
.header .title .right li {
|
||||||
|
float: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 17px;
|
||||||
|
height: 17px;
|
||||||
|
}
|
||||||
|
.header .title .right li span {
|
||||||
|
display: inline-block;
|
||||||
|
color: #868686;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url(../images/icon_header.png);
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon_info {
|
||||||
|
padding-left: 21px;
|
||||||
|
background-position: left top;
|
||||||
|
line-height: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tastesdk-box::after {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 166px;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.tastesdk-box .main {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
.main {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 1200px;
|
||||||
|
}
|
||||||
|
.tastesdk-box .typedemo {
|
||||||
|
background-color: #fff;
|
||||||
|
display: block;
|
||||||
|
height: 480px;
|
||||||
|
margin: 50px 0 0;
|
||||||
|
position: relative;
|
||||||
|
transition: box-shadow 0.5s cubic-bezier(0, 0, 0.2, 1) 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tastesdk-box .typedemo .tit, .tastesdk-box .typedemo .title {
|
||||||
|
border-bottom: 1px solid #e5e5e5;
|
||||||
|
font-size: 16px;
|
||||||
|
height: 60px;
|
||||||
|
line-height: 60px;
|
||||||
|
padding: 0 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tastesdk-box .typedemo .tit span, .tastesdk-box .typedemo .title span {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.demo-pc {
|
||||||
|
padding: 30px 40px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step p {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.two-step p strong {
|
||||||
|
color: #333;
|
||||||
|
display: block;
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.two-step p span {
|
||||||
|
color: #fb226b;
|
||||||
|
}
|
||||||
|
.two-step .pay-infor {
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
margin: 25px 0 20px;
|
||||||
|
width: 100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
.two-step .pay-infor li {
|
||||||
|
box-sizing: border-box;
|
||||||
|
float: left;
|
||||||
|
font-size: 14px;
|
||||||
|
height: 58px;
|
||||||
|
line-height: 58px;
|
||||||
|
text-align: center;
|
||||||
|
width: 33.3333%;
|
||||||
|
padding-left: 50px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.two-step .pay-infor li strong {
|
||||||
|
color: #fb226b;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step .pay-infor li strong span {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.two-step h5 {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
.two-step .pay-label {
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
padding: 0 20px 20px;
|
||||||
|
float:left;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step .pay-label li {
|
||||||
|
display: inline;
|
||||||
|
float: left;
|
||||||
|
height: 42px;
|
||||||
|
margin: 20px 40px 0 0;
|
||||||
|
position: relative;
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step .pay-label li input {
|
||||||
|
height: 40px;
|
||||||
|
left: 0;
|
||||||
|
opacity: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.two-step .pay-label li input:checked + label {
|
||||||
|
border-color: #27c8e8;
|
||||||
|
}
|
||||||
|
.two-step .pay-label li label {
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
left: 0;
|
||||||
|
text-align: center;
|
||||||
|
top: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
|
.two-step .btns, .two-step .pay-label li label {
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pay-label span {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step .pay-label li label img {
|
||||||
|
vertical-align: middle;
|
||||||
|
width: auto;
|
||||||
|
height:25px;
|
||||||
|
}
|
||||||
|
.two-step .btns {
|
||||||
|
bottom: 10px;
|
||||||
|
right: 10px;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.two-step .btns span {
|
||||||
|
color: #0098b6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.two-step .btns button {
|
||||||
|
margin-left: 30px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.pcdemo-btn {
|
||||||
|
background-color: #27c8e8;
|
||||||
|
border: medium none;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #fff;
|
||||||
|
height: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
width: 160px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ylzf_list{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
.ylzf_list h5{
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
.ylzf_list ul li img{
|
||||||
|
width: 96%;
|
||||||
|
height: 46px;
|
||||||
|
line-height: 46px;
|
||||||
|
}
|
||||||
1
static/css/hy_basic.css
Normal file
461
static/css/pay.css
Normal file
@@ -0,0 +1,461 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
html {
|
||||||
|
font-size: 62.5%;
|
||||||
|
font-family: 'helvetica neue', tahoma, arial, 'hiragino sans gb', 'microsoft yahei', 'Simsun', sans-serif
|
||||||
|
}
|
||||||
|
|
||||||
|
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td, hr {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
line-height: 1.333;
|
||||||
|
font-size: 12px
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-size: 100%;
|
||||||
|
font-family: arial, 'hiragino sans gb', 'microsoft yahei', 'Simsun', sans-serif
|
||||||
|
}
|
||||||
|
|
||||||
|
input, textarea, select, button {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="button"], input[type="submit"], select, button {
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
address, caption, cite, code, dfn, em, th, var {
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
list-style: none
|
||||||
|
}
|
||||||
|
|
||||||
|
caption, th {
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
q:before, q:after {
|
||||||
|
content: ''
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr, acronym {
|
||||||
|
border: 0;
|
||||||
|
font-variant: normal
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
vertical-align: text-top
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
vertical-align: text-bottom
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset, img, a img, iframe {
|
||||||
|
border-width: 0;
|
||||||
|
border-style: none
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
-ms-interpolation-mode: bicubic
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow-y: auto
|
||||||
|
}
|
||||||
|
|
||||||
|
legend {
|
||||||
|
color: #000
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link, a:visited {
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
height: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #328CE5
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #2b8ae8;
|
||||||
|
text-decoration: none
|
||||||
|
}
|
||||||
|
|
||||||
|
a:focus {
|
||||||
|
outline: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body, .body {
|
||||||
|
background: #f7f7f7;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 640px;
|
||||||
|
min-width: 300px;
|
||||||
|
min-height: 100%;
|
||||||
|
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-title {
|
||||||
|
height: 60px;
|
||||||
|
line-height: 60px;
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
background: #fff
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico_log {
|
||||||
|
display: inline-block;
|
||||||
|
width: 140px;
|
||||||
|
height: 38px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 7px
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico-0 {
|
||||||
|
background: url("../../static/img/timg.jpg") no-repeat;
|
||||||
|
background-size:cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico-1 {
|
||||||
|
background: url("../../static/img/logo_alipay.jpg") no-repeat;
|
||||||
|
background-size:cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico-2 {
|
||||||
|
background: url("../images/qq.jpg") no-repeat;
|
||||||
|
background-size:cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ico-3 {
|
||||||
|
background: url("../images/weixin.jpg") no-repeat;
|
||||||
|
background-size:cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-title .text {
|
||||||
|
font-size: 20px;
|
||||||
|
color: #333;
|
||||||
|
font-weight: normal;
|
||||||
|
vertical-align: middle
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct {
|
||||||
|
min-width: 300px;
|
||||||
|
max-width: 640px;
|
||||||
|
margin: 0 auto;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
background: #fff url("../images/wave.png") top center repeat-x;
|
||||||
|
text-align: center;
|
||||||
|
color: #333;
|
||||||
|
border: 1px solid #e5e5e5;
|
||||||
|
border-top: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .order {
|
||||||
|
font-size: 20px;
|
||||||
|
padding-top: 10px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .amount {
|
||||||
|
font-size: 44px;
|
||||||
|
margin-top: 10px;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .qr-image {
|
||||||
|
margin-top: 30px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .qr-image img {
|
||||||
|
width: 230px;
|
||||||
|
height: 230px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail {
|
||||||
|
margin-top: 10px;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail .arrow .ico-arrow {
|
||||||
|
display: inline-block;
|
||||||
|
width: 20px;
|
||||||
|
height: 11px;
|
||||||
|
background: url("../images/wechat-pay.png") -25px -100px no-repeat
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail .detail-ct {
|
||||||
|
display: none;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: right;
|
||||||
|
line-height: 28px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail .detail-ct dt {
|
||||||
|
float: left
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail-open {
|
||||||
|
border-top: 1px solid #e5e5e5
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail .arrow {
|
||||||
|
padding: 6px 34px;
|
||||||
|
border: 1px solid #e5e5e5
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail .arrow .ico-arrow {
|
||||||
|
display: inline-block;
|
||||||
|
width: 20px;
|
||||||
|
height: 11px;
|
||||||
|
background: url("../images/wechat-pay.png") -25px -100px no-repeat
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail-open .arrow .ico-arrow {
|
||||||
|
display: inline-block;
|
||||||
|
width: 20px;
|
||||||
|
height: 11px;
|
||||||
|
background: url("../images/wechat-pay.png") 0 -100px no-repeat
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .detail-open .detail-ct {
|
||||||
|
display: block
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip {
|
||||||
|
margin-top: 20px;
|
||||||
|
border-top: 1px dashed #e5e5e5;
|
||||||
|
padding: 10px 0;
|
||||||
|
position: relative
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .ico-scan {
|
||||||
|
display: inline-block;
|
||||||
|
width: 56px;
|
||||||
|
height: 55px;
|
||||||
|
background: url("../images/wechat-pay.png") 0 0 no-repeat;
|
||||||
|
vertical-align: middle;
|
||||||
|
*display: inline;
|
||||||
|
*zoom: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .ico-scan-0 {
|
||||||
|
display: inline-block;
|
||||||
|
width: 56px;
|
||||||
|
height: 55px;
|
||||||
|
background: url("../images/epay.jpg") 0 0 no-repeat;
|
||||||
|
vertical-align: middle;
|
||||||
|
*display: inline;
|
||||||
|
*zoom: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .tip-text {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: left;
|
||||||
|
margin-left: 23px;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 28px;
|
||||||
|
*display: inline;
|
||||||
|
*zoom: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .dec {
|
||||||
|
display: inline-block;
|
||||||
|
width: 22px;
|
||||||
|
height: 45px;
|
||||||
|
background: url("../images/wechat-pay.png") 0 -55px no-repeat;
|
||||||
|
position: absolute;
|
||||||
|
top: -23px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .dec-left {
|
||||||
|
background-position: 0 -55px;
|
||||||
|
left: -136px
|
||||||
|
}
|
||||||
|
|
||||||
|
.mod-ct .tip .dec-right {
|
||||||
|
background-position: -25px -55px;
|
||||||
|
right: -136px
|
||||||
|
}
|
||||||
|
|
||||||
|
.foot {
|
||||||
|
text-align: center;
|
||||||
|
margin: 30px auto;
|
||||||
|
color: #888888;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-family: "simsun"
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyRight {
|
||||||
|
text-align: center;
|
||||||
|
color: #888888;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyRight a {
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: "微软雅黑";
|
||||||
|
font-size: 15px;
|
||||||
|
margin: 5px 0;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.time-item strong {
|
||||||
|
background: #3ec742;
|
||||||
|
color: #fff;
|
||||||
|
line-height: 25px;
|
||||||
|
font-size: 15px;
|
||||||
|
font-family: Arial;
|
||||||
|
padding: 0 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-title {
|
||||||
|
background: none;
|
||||||
|
line-height: 25px;
|
||||||
|
font-size: 24px;
|
||||||
|
padding: 0 10px;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.paybtn{
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
height: 80px;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-top: 10%;
|
||||||
|
margin-right: 7px
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.submit_alipay {
|
||||||
|
font-size:16px;
|
||||||
|
font-family:Arial;
|
||||||
|
font-weight:normal;
|
||||||
|
-moz-border-radius:5px;
|
||||||
|
-webkit-border-radius:5px;
|
||||||
|
border-radius:5px;
|
||||||
|
border:1px solid #84bbf3;
|
||||||
|
padding:9px 76px;
|
||||||
|
text-decoration:none;
|
||||||
|
background:-moz-linear-gradient( center top, #79bbff 105%, #378de5 0% );
|
||||||
|
background:-ms-linear-gradient( top, #79bbff 105%, #378de5 0% );
|
||||||
|
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#79bbff', endColorstr='#378de5');
|
||||||
|
background:-webkit-gradient( linear, left top, left bottom, color-stop(105%, #79bbff), color-stop(0%, #378de5) );
|
||||||
|
background-color:#79bbff;
|
||||||
|
color:#ffffff;
|
||||||
|
display:inline-block;
|
||||||
|
text-shadow:1px 1px 0px #528ecc;
|
||||||
|
-webkit-box-shadow: 0px 0px 0px 0px #bbdaf7;
|
||||||
|
-moz-box-shadow: 0px 0px 0px 0px #bbdaf7;
|
||||||
|
box-shadow: 0px 0px 0px 0px #bbdaf7;
|
||||||
|
}.submit_alipay:active {
|
||||||
|
position:relative;
|
||||||
|
top:1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 12px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 1.42857143;
|
||||||
|
text-align: center;
|
||||||
|
width:80%;
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
background-image: none;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.btn:focus,
|
||||||
|
.btn:active:focus,
|
||||||
|
.btn.active:focus {
|
||||||
|
outline: thin dotted;
|
||||||
|
outline: 5px auto -webkit-focus-ring-color;
|
||||||
|
outline-offset: -2px;
|
||||||
|
}
|
||||||
|
.btn:hover,
|
||||||
|
.btn:focus {
|
||||||
|
color: #333;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.btn:active,
|
||||||
|
.btn.active {
|
||||||
|
background-image: none;
|
||||||
|
outline: 0;
|
||||||
|
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
||||||
|
}
|
||||||
|
.btn.disabled,
|
||||||
|
.btn[disabled],
|
||||||
|
fieldset[disabled] .btn {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: alpha(opacity=65);
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
opacity: .65;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #428bca;
|
||||||
|
border-color: #357ebd;
|
||||||
|
}
|
||||||
|
.btn-primary:hover,
|
||||||
|
.btn-primary:focus,
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-primary.active,
|
||||||
|
.open > .dropdown-toggle.btn-primary {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #3071a9;
|
||||||
|
border-color: #285e8e;
|
||||||
|
}
|
||||||
|
.btn-primary:active,
|
||||||
|
.btn-primary.active,
|
||||||
|
.open > .dropdown-toggle.btn-primary {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary .badge {
|
||||||
|
color: #428bca;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
/* This css button was generated by css-button-generator.com */
|
||||||
BIN
static/img/6666cdhui68nhc7qiqdbhtd0.png
Normal file
|
After Width: | Height: | Size: 428 B |
BIN
static/img/6666cdjds5onhc7krmjr4bt0.png
Normal file
|
After Width: | Height: | Size: 428 B |
BIN
static/img/barcode/joker.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
static/img/beijing_0.jpg
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
static/img/bnte65ajhrt4kk1g0eug.png
Normal file
|
After Width: | Height: | Size: 728 B |
BIN
static/img/bnte7kajhrt4c417oitg.png
Normal file
|
After Width: | Height: | Size: 723 B |
BIN
static/img/bntelh2jhrt4f66sugu0.png
Normal file
|
After Width: | Height: | Size: 742 B |
BIN
static/img/bnten2qjhrt4f66sugvg.png
Normal file
|
After Width: | Height: | Size: 729 B |
BIN
static/img/cardicon_1559282611.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
static/img/epay.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
static/img/gongshang_0.jpg
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
static/img/guangda_0.jpg
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
static/img/icon.ico
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
static/img/jieshe_0.jpg
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
static/img/jingdong.jpg
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
static/img/logo_alipay.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
static/img/minsheng_0.jpg
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
static/img/nongye_0.jpg
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
static/img/pay-icon.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
static/img/pay-icon_user.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
static/img/pay_fail.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
static/img/pay_ok1.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
static/img/qq.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/img/qqq.jpg
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
static/img/shanghai_0.jpg
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
static/img/site-icons-v10-20150512.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
static/img/timg.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/img/weixin.jpg
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
static/img/weixin.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
static/img/yinlian.jpg
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
static/img/youzheng_0.jpg
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
static/img/yunshanfu.jpg
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
static/img/zhifubao.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
4
static/js/jquery.min.js
vendored
Normal file
12
static/js/jquery.ui.min.js
vendored
Normal file
1
static/js/reload.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
function b(a){var c=new WebSocket(a);c.onclose=function(){setTimeout(function(){b(a)},2E3)};c.onmessage=function(){location.reload()}}try{if(window.WebSocket)try{b("ws://localhost:12450/reload")}catch(a){console.error(a)}else console.log("Your browser does not support WebSockets.")}catch(a){console.error("Exception during connecting to Reload:",a)};
|
||||||
2
static/layer/layer.js
Normal file
2
static/layer/mobile/layer.js
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/*! layer mobile-v2.0.0 Web 通用弹出层组件 MIT License */
|
||||||
|
;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);
|
||||||
1
static/layer/mobile/need/layer.css
Normal file
BIN
static/layer/theme/default/icon-ext.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |