mirror of
				https://github.com/kongyuebin1/dongfeng-pay.git
				synced 2025-11-01 02:57:33 +08:00 
			
		
		
		
	由gopath形式改为module形式
This commit is contained in:
		| @@ -1,50 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/11/25 14:14 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : consts.go | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/11/25 14:14 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package common | ||||
|  | ||||
| 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" //对私卡 | ||||
| ) | ||||
| @@ -1,25 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/11/6 11:37 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : mq_config | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/11/6 11:37 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package common | ||||
|  | ||||
| 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) | ||||
| } | ||||
| @@ -1,99 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 common | ||||
|  | ||||
| var ScanPayWayCodes = []string{ | ||||
| 	"WEIXIN_SCAN", | ||||
| 	"UNION_SCAN", | ||||
| 	"ALI_SCAN", | ||||
| 	"BAIDU_SCAN", | ||||
| 	"JD_SCAN", | ||||
| 	"QQ_SCAN", | ||||
| } | ||||
|  | ||||
| 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" | ||||
| 	default: | ||||
| 		return "未知" | ||||
| 	} | ||||
| } | ||||
| @@ -1,47 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 上有支付公司的编号 | ||||
|  ** @Time : 2019/10/28 10:47 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : supplier | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 10:47 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package common | ||||
|  | ||||
| //添加新的上游通道时,需要添加这里 | ||||
| var supplierCode2Name = map[string]string{ | ||||
| 	"KF":     "快付支付", | ||||
| 	"WEIXIN": "官方微信", | ||||
| 	"ALIPAY": "官方支付宝", | ||||
| } | ||||
|  | ||||
| func GetSupplierMap() map[string]string { | ||||
| 	return supplierCode2Name | ||||
| } | ||||
|  | ||||
| func GetSupplierCodes() []string { | ||||
| 	var supplierCodes []string | ||||
| 	for k := range supplierCode2Name { | ||||
| 		supplierCodes = append(supplierCodes, k) | ||||
| 	} | ||||
|  | ||||
| 	return supplierCodes | ||||
| } | ||||
|  | ||||
| func GetSupplierNames() []string { | ||||
| 	var supplierNames []string | ||||
| 	for _, v := range supplierCode2Name { | ||||
| 		supplierNames = append(supplierNames, v) | ||||
| 	} | ||||
| 	return supplierNames | ||||
| } | ||||
|  | ||||
| func CheckSupplierByCode(code string) string { | ||||
| 	for k, v := range supplierCode2Name { | ||||
| 		if k == code { | ||||
| 			return v + ",注册完毕" | ||||
| 		} | ||||
| 	} | ||||
| 	return "未找到上游名称,注册有问题。" | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| appname = service | ||||
| httpport = 8080 | ||||
| runmode = dev | ||||
| @@ -1,18 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 | ||||
| ****************************************************/ | ||||
| package conf | ||||
|  | ||||
| const ( | ||||
| 	DB_HOST     = "localhost" | ||||
| 	DB_PORT     = "3306" | ||||
| 	DB_USER     = "root" | ||||
| 	DB_PASSWORD = "Kyb^15273031604" | ||||
| 	DB_BASE     = "juhe_pay" | ||||
| ) | ||||
| @@ -1,70 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/28 16:38 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : alipay | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 16:38 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/models" | ||||
| ) | ||||
|  | ||||
| type AlipayImpl struct { | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) Scan(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) H5(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) Syt(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) Fast(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) Web(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) PayNotify() { | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) PayQuery(orderInfo models.OrderInfo) bool { | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) PayFor(info models.PayforInfo) string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) PayForNotify() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) PayForQuery(payFor models.PayforInfo) (string, string) { | ||||
| 	return "", "" | ||||
| } | ||||
|  | ||||
| func (c *AlipayImpl) BalanceQuery(roadInfo models.RoadInfo) float64 { | ||||
| 	return 0.00 | ||||
| } | ||||
| @@ -1,14 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/11/19 18:12 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : consts.go | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/11/19 18:12 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| const ( | ||||
| 	PayNotify = "" | ||||
| ) | ||||
| @@ -1,48 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/models" | ||||
| ) | ||||
|  | ||||
| /* | ||||
| * 插入支付订单记录和订单利润记录,保证一致性 | ||||
|  */ | ||||
| func InsertOrderAndOrderProfit(orderInfo models.OrderInfo, orderProfitInfo models.OrderProfitInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	if _, err := o.Insert(&orderInfo); err != nil { | ||||
| 		logs.Error("insert orderInfo fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if _, err := o.Insert(&orderProfitInfo); err != nil { | ||||
| 		logs.Error("insert orderProfit fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("insert order and orderProfit fail:", err) | ||||
| 	} else { | ||||
| 		logs.Info("插入order和orderProfit记录成功") | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 注册上游支付接口 | ||||
|  ** @Time : 2019/10/28 14:48 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : init | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 14:48 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/common" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| ) | ||||
|  | ||||
| var registerSupplier = make(map[string]PayInterface) | ||||
|  | ||||
| //注册各种上游的支付接口 | ||||
|  | ||||
| func Init() { | ||||
| 	registerSupplier["KF"] = new(KuaiFuImpl) | ||||
| 	logs.Notice(common.CheckSupplierByCode("KF")) | ||||
| 	registerSupplier["WEIXIN"] = new(WeiXinImpl) | ||||
| 	logs.Notice(common.CheckSupplierByCode("WEIXIN")) | ||||
| 	registerSupplier["ALIPAY"] = new(AlipayImpl) | ||||
| 	logs.Notice(common.CheckSupplierByCode("ALIPAY")) | ||||
| } | ||||
|  | ||||
| func GetPaySupplierByCode(code string) PayInterface { | ||||
| 	return registerSupplier[code] | ||||
| } | ||||
| @@ -1,381 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 快付支付的实现逻辑 | ||||
|  ** @Time : 2019/10/28 14:12 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : kuaifu | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 14:12 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego" | ||||
| 	"github.com/astaxie/beego/httplib" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/rs/xid" | ||||
| 	"github.com/widuu/gojson" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/models" | ||||
| 	"dongfeng/service/utils" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type KuaiFuImpl struct { | ||||
| 	beego.Controller | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	HOST             = "localhost" | ||||
| 	KF_SCAN_HOST     = "http://" + HOST + "/gateway/scanPay/payService" | ||||
| 	KF_PAYFOR_HOST   = "http://" + HOST + "/gateway/remittance/pay" | ||||
| 	KF_BALANCE_QUERY = "http://" + HOST + "/gateway/remittance/getBalance" | ||||
| 	KF_ORDER_QUERY   = "http://" + HOST + "/gateway/scanPay/orderQuery" | ||||
| 	KF_PAYFOR_QUERY  = "http://" + HOST + "/gateway/remittance/query" | ||||
| 	KF_PAY_KEY       = "xxxxxxx" | ||||
| 	KF_PAY_SECRET    = "xxxxxx" | ||||
| ) | ||||
|  | ||||
| func (c *KuaiFuImpl) Scan(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	payWayCode := "" | ||||
| 	switch orderInfo.PayTypeCode { | ||||
| 	case "ALI_SCAN": | ||||
| 		payWayCode = "SCAN_ALIPAY" | ||||
| 	case "WEIXIN_SCAN": | ||||
| 		payWayCode = "SCAN_WEIXIN" | ||||
| 	case "QQ_SCAN": | ||||
| 		payWayCode = "SCAN_QQ" | ||||
| 	case "UNION_SCAN": | ||||
| 		payWayCode = "SCAN_YL" | ||||
| 	case "BAIDU_SCAN": | ||||
| 	case "JD_SCAN": | ||||
| 	} | ||||
| 	//将金额转为带有2位小数点的float | ||||
| 	order := fmt.Sprintf("%0.2f", orderInfo.OrderAmount) | ||||
| 	params := make(map[string]string) | ||||
| 	params["orderNo"] = orderInfo.BankOrderId | ||||
| 	params["productName"] = orderInfo.ShopName | ||||
| 	params["orderPeriod"] = orderInfo.OrderPeriod | ||||
| 	params["orderPrice"] = order | ||||
| 	params["payWayCode"] = payWayCode | ||||
| 	params["osType"] = orderInfo.OsType | ||||
| 	params["notifyUrl"] = PayNotify + "KF" | ||||
| 	params["payKey"] = KF_PAY_KEY | ||||
| 	//params["field1"] = "field1" | ||||
|  | ||||
| 	keys := utils.SortMap(params) | ||||
| 	sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET) | ||||
| 	params["sign"] = sign | ||||
|  | ||||
| 	req := httplib.Post(KF_SCAN_HOST) | ||||
| 	for k, v := range params { | ||||
| 		req.Param(k, v) | ||||
| 	} | ||||
| 	var scanData ScanData | ||||
| 	scanData.Supplier = orderInfo.PayProductCode | ||||
| 	scanData.PayType = orderInfo.PayTypeCode | ||||
| 	scanData.OrderNo = orderInfo.MerchantOrderId | ||||
| 	scanData.BankNo = orderInfo.BankOrderId | ||||
| 	scanData.OrderPrice = params["orderPrice"] | ||||
| 	response, err := req.String() | ||||
| 	if err != nil { | ||||
| 		logs.Error("KF 请求失败:", err) | ||||
| 		scanData.Status = "01" | ||||
| 		scanData.Msg = gojson.Json(response).Get("statusMsg").Tostring() | ||||
| 		return scanData | ||||
| 	} | ||||
| 	statusCode := gojson.Json(response).Get("statusCode").Tostring() | ||||
| 	if statusCode != "00" { | ||||
| 		logs.Error("KF生成扫码地址失败") | ||||
| 		scanData.Status = "01" | ||||
| 		scanData.Msg = "生成扫码地址失败" | ||||
| 		return scanData | ||||
| 	} | ||||
| 	payUrl := gojson.Json(response).Get("payURL").Tostring() | ||||
| 	scanData.Status = "00" | ||||
| 	scanData.PayUrl = payUrl | ||||
| 	scanData.Msg = "请求成功" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) H5(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) Syt(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) Fast(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) Web(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| //支付回调 | ||||
| func (c *KuaiFuImpl) PayNotify() { | ||||
| 	params := make(map[string]string) | ||||
| 	orderNo := strings.TrimSpace(c.GetString("orderNo")) | ||||
| 	orderInfo := models.GetOrderByBankOrderId(orderNo) | ||||
| 	if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 { | ||||
| 		logs.Error("快付回调的订单号不存在,订单号=", orderNo) | ||||
| 		c.StopRun() | ||||
| 	} | ||||
| 	roadInfo := models.GetRoadInfoByRoadUid(orderInfo.RoadUid) | ||||
| 	if roadInfo.RoadUid == "" || len(roadInfo.RoadUid) == 0 { | ||||
| 		logs.Error("支付通道已经关系或者删除,不进行回调") | ||||
| 		c.StopRun() | ||||
| 	} | ||||
| 	merchantUid := orderInfo.MerchantUid | ||||
| 	merchantInfo := models.GetMerchantByUid(merchantUid) | ||||
| 	if merchantInfo.MerchantUid == "" || len(merchantInfo.MerchantUid) == 0 { | ||||
| 		logs.Error("快付回调失败,该商户不存在或者已经删除,商户uid=", merchantUid) | ||||
| 		c.StopRun() | ||||
| 	} | ||||
| 	paySecret := merchantInfo.MerchantSecret | ||||
| 	params["orderNo"] = orderNo | ||||
| 	params["orderPrice"] = strings.TrimSpace(c.GetString("orderPrice")) | ||||
| 	params["orderTime"] = strings.TrimSpace(c.GetString("orderTime")) | ||||
| 	params["trxNo"] = strings.TrimSpace(c.GetString("trxNo")) | ||||
| 	params["statusCode"] = strings.TrimSpace(c.GetString("statusCode")) | ||||
| 	params["tradeStatus"] = strings.TrimSpace(c.GetString("tradeStatus")) | ||||
| 	params["field1"] = strings.TrimSpace(c.GetString("field1")) | ||||
| 	params["payKey"] = strings.TrimSpace(c.GetString("payKey")) | ||||
| 	//对参数进行验签 | ||||
| 	keys := utils.SortMap(params) | ||||
| 	tmpSign := utils.GetMD5Sign(params, keys, paySecret) | ||||
| 	sign := strings.TrimSpace(c.GetString("sign")) | ||||
| 	if tmpSign != sign { | ||||
| 		logs.Error("快付回调签名异常,回调失败") | ||||
| 		c.StopRun() | ||||
| 	} | ||||
| 	//实际支付金额 | ||||
| 	factAmount, err := strconv.ParseFloat(params["orderPrice"], 64) | ||||
| 	if err != nil { | ||||
| 		logs.Error("快付回调实际金额有误, factAmount=", params["orderPrice"]) | ||||
| 		c.StopRun() | ||||
| 	} | ||||
| 	orderInfo.FactAmount = factAmount | ||||
| 	orderInfo.BankTransId = params["trxNo"] | ||||
| 	tradeStatus := params["tradeStatus"] | ||||
| 	paySolveController := new(PaySolveController) | ||||
| 	if tradeStatus == "FAILED" { | ||||
| 		if !paySolveController.SolvePayFail(orderInfo, "fail") { | ||||
| 			logs.Error("solve order fail fail") | ||||
| 		} | ||||
| 	} else if tradeStatus == "CANCELED" { | ||||
| 		if !paySolveController.SolvePayFail(orderInfo, "cancel") { | ||||
| 			logs.Error("solve order cancel fail") | ||||
| 		} | ||||
| 	} else if tradeStatus == "WAITING_PAYMENT" { | ||||
| 		logs.Notice("快付回调,该订单还处于等待支付,订单id=", orderNo) | ||||
| 	} else if tradeStatus == "SUCCESS" { | ||||
| 		//订单支付成功,需要搞很多事情 TODO | ||||
| 		paySolveController.SolvePaySuccess(orderInfo.BankOrderId, orderInfo.FactAmount, c.GetString("trxNo")) | ||||
| 	} | ||||
| 	c.Ctx.WriteString("success") | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) PayQuery(orderInfo models.OrderInfo) bool { | ||||
| 	if orderInfo.Status != "wait" && orderInfo.Status != "" { | ||||
| 		logs.Error("订单已经被处理,不需要查询,bankOrderId:", orderInfo.BankOrderId) | ||||
| 		return false | ||||
| 	} | ||||
| 	params := make(map[string]string) | ||||
| 	params["orderNo"] = orderInfo.BankOrderId | ||||
| 	params["payKey"] = KF_PAY_KEY | ||||
| 	paySecret := KF_PAY_SECRET | ||||
| 	keys := utils.SortMap(params) | ||||
| 	params["sign"] = utils.GetMD5Sign(params, keys, paySecret) | ||||
| 	req := httplib.Get(KF_ORDER_QUERY) | ||||
| 	for k, v := range params { | ||||
| 		req.Param(k, v) | ||||
| 	} | ||||
| 	response, err := req.String() | ||||
| 	if err != nil { | ||||
| 		logs.Error("快付订单查询失败,bankOrderId: ", orderInfo.BankOrderId) | ||||
| 		logs.Error("err: ", err) | ||||
| 		return false | ||||
| 	} | ||||
| 	statusCode := gojson.Json(response).Get("statusCode").Tostring() | ||||
| 	if statusCode != "00" { | ||||
| 		logs.Error("快付订单查询返回失败,bankOrderId:", orderInfo.BankOrderId) | ||||
| 		logs.Error("err: ", response) | ||||
| 		return false | ||||
| 	} | ||||
| 	//获取用户的实际支付金额 | ||||
| 	orderPrice := gojson.Json(response).Get("orderPrice").Tostring() | ||||
| 	factAmount, err := strconv.ParseFloat(orderPrice, 64) | ||||
| 	if err != nil { | ||||
| 		logs.Error("快速查询得到的实际金额错误, orderPrice=", orderPrice) | ||||
| 	} | ||||
|  | ||||
| 	//orderInfo.FactAmount = orderInfo.OrderAmount | ||||
| 	tradeStatus := gojson.Json(response).Get("tradeStatus").Tostring() | ||||
| 	paySolveController := new(PaySolveController) | ||||
| 	trxNo := gojson.Json(response).Get("trxNo").Tostring() | ||||
| 	if tradeStatus == "SUCCESS" { | ||||
| 		//调用支付成功的接口,做加款更新操作,需要把实际支付金额传入 | ||||
| 		if !paySolveController.SolvePaySuccess(orderInfo.BankOrderId, factAmount, trxNo) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} else if tradeStatus == "FAILED" { | ||||
| 		if !paySolveController.SolvePayFail(orderInfo, "fail") { | ||||
| 			return false | ||||
| 		} | ||||
| 	} else { | ||||
| 		logs.Info("订单状态处于:" + tradeStatus + ";bankOrderId:" + orderInfo.BankOrderId) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) PayFor(payFor models.PayforInfo) string { | ||||
| 	params := make(map[string]string) | ||||
| 	params["merchantKey"] = KF_PAY_KEY | ||||
| 	params["realname"] = payFor.BankAccountName | ||||
| 	params["cardNo"] = payFor.BankAccountNo | ||||
| 	params["bankCode"] = payFor.BankCode | ||||
| 	if payFor.BankAccountType == common.PRIVATE { | ||||
| 		params["accType"] = "01" | ||||
| 	} else { | ||||
| 		params["accType"] = "02" | ||||
| 	} | ||||
| 	params["province"] = payFor.BankAccountAddress | ||||
| 	params["city"] = payFor.BankAccountAddress | ||||
| 	params["bankAccountAddress"] = payFor.BankAccountAddress | ||||
| 	//将float64转为字符串 | ||||
| 	params["amount"] = strconv.FormatFloat(payFor.PayforAmount, 'f', 2, 64) | ||||
| 	params["moblieNo"] = payFor.PhoneNo | ||||
| 	params["merchantOrderId"] = payFor.BankOrderId | ||||
| 	keys := utils.SortMap(params) | ||||
| 	sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET) | ||||
| 	params["sign"] = sign | ||||
| 	req := httplib.Post(KF_PAYFOR_HOST) | ||||
| 	for k, v := range params { | ||||
| 		req.Param(k, v) | ||||
| 	} | ||||
| 	response, err := req.String() | ||||
| 	if err != nil { | ||||
| 		logs.Error("快付代付返回错误结果: ", response) | ||||
| 	} else { | ||||
| 		json := gojson.Json(response) | ||||
| 		resultCode := json.Get("resultCode").Tostring() | ||||
| 		resultMsg := json.Get("resultMsg").Tostring() | ||||
| 		if resultCode != "00" { | ||||
| 			logs.Error("快付代付返回错误信息:", resultMsg) | ||||
| 			return "fail" | ||||
| 		} | ||||
| 		settStatus := json.Get("settStatus").Tostring() | ||||
| 		if settStatus == "00" { | ||||
| 			logs.Info(fmt.Sprintf("代付uid=%s,已经成功发送给了上游处理", payFor.PayforUid)) | ||||
| 		} else if settStatus == "01" { | ||||
| 			logs.Info(fmt.Sprintf("代付uid=%s,发送失败", payFor.PayforUid)) | ||||
| 		} | ||||
| 	} | ||||
| 	return "success" | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) PayForNotify() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) PayForQuery(payFor models.PayforInfo) (string, string) { | ||||
| 	params := make(map[string]string) | ||||
| 	params["merchantKey"] = KF_PAY_KEY | ||||
| 	params["timestamp"] = utils.GetNowTimesTamp() | ||||
| 	params["merchantOrderId"] = payFor.BankOrderId | ||||
| 	keys := utils.SortMap(params) | ||||
| 	sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET) | ||||
| 	params["sign"] = sign | ||||
| 	req := httplib.Get(KF_PAYFOR_QUERY) | ||||
| 	for k, v := range params { | ||||
| 		req.Param(k, v) | ||||
| 	} | ||||
| 	response, err := req.String() | ||||
| 	if err != nil { | ||||
| 		logs.Error("快付代付查询失败:", err) | ||||
| 		return common.PAYFOR_SOLVING, "查询失败" | ||||
| 	} | ||||
|  | ||||
| 	payFor.ResponseContext = response | ||||
| 	payFor.ResponseTime = utils.GetBasicDateTime() | ||||
| 	payFor.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if !models.UpdatePayFor(payFor) { | ||||
| 		logs.Error("更新快付代付订单状态失败") | ||||
| 	} | ||||
|  | ||||
| 	resultCode := gojson.Json(response).Get("resultCode").Tostring() | ||||
| 	resultMsg := gojson.Json(response).Get("resultMsg").Tostring() | ||||
|  | ||||
| 	if resultCode != "00" { | ||||
| 		logs.Error("快付代付查询返回错误:", resultMsg) | ||||
| 		return common.PAYFOR_SOLVING, resultMsg | ||||
| 	} | ||||
|  | ||||
| 	logs.Info("快付代付查询返回结果:", resultMsg) | ||||
|  | ||||
| 	merchantOrderId := gojson.Json(response).Get("merchantOrderId").Tostring() | ||||
| 	if merchantOrderId != payFor.BankOrderId { | ||||
| 		logs.Error("快付代付返回结果,订单id不一致: ", merchantOrderId) | ||||
| 		return common.PAYFOR_SOLVING, "快付代付返回结果,订单id不一致" | ||||
| 	} | ||||
|  | ||||
| 	settStatus := gojson.Json(response).Get("settStatus").Tostring() | ||||
|  | ||||
| 	if settStatus == "00" { | ||||
| 		return common.PAYFOR_SUCCESS, "代付成功" | ||||
| 	} else if settStatus == "01" { | ||||
| 		return common.PAYFOR_FAIL, "代付失败" | ||||
| 	} else { | ||||
| 		return common.PAYFOR_BANKING, "银行处理中" | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *KuaiFuImpl) BalanceQuery(roadInfo models.RoadInfo) float64 { | ||||
| 	params := make(map[string]string) | ||||
| 	params["merchantKey"] = KF_PAY_KEY | ||||
| 	params["timestamp"] = utils.GetNowTimesTamp() | ||||
| 	params["merchantOrderId"] = xid.New().String() | ||||
| 	keys := utils.SortMap(params) | ||||
| 	sign := utils.GetMD5Sign(params, keys, KF_PAY_SECRET) | ||||
| 	params["sign"] = sign | ||||
| 	req := httplib.Get(KF_BALANCE_QUERY) | ||||
| 	for k, v := range params { | ||||
| 		req.Param(k, v) | ||||
| 	} | ||||
|  | ||||
| 	response, err := req.String() | ||||
| 	if err != nil { | ||||
| 		logs.Error("快付余额查询失败,err: ", err) | ||||
| 		return 0.00 | ||||
| 	} | ||||
| 	logs.Debug("快付余额查询返回:", response) | ||||
|  | ||||
| 	resultCode := gojson.Json(response).Get("resultCode").Tostring() | ||||
| 	resultMsg := gojson.Json(response).Get("resultMsg").Tostring() | ||||
| 	logs.Notice("快付返回信息:", resultMsg) | ||||
|  | ||||
| 	if resultCode != "00" { | ||||
| 		return 0.00 | ||||
| 	} | ||||
|  | ||||
| 	balance := gojson.Json(response).Get("balance").Tostring() | ||||
| 	availableAmount := gojson.Json(response).Get("availableAmount").Tostring() | ||||
|  | ||||
| 	logs.Info(fmt.Sprintf("快付余额=%s,可用金额=%s", balance, availableAmount)) | ||||
|  | ||||
| 	f, err := strconv.ParseFloat(availableAmount, 64) | ||||
| 	return f | ||||
| } | ||||
| @@ -1,203 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 controller | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/models" | ||||
| 	"dongfeng/service/utils" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| //订单结算,将那些支付成功的订单金额加入到商户账户的结算金额中 | ||||
| func OrderSettle() { | ||||
|  | ||||
| 	params := make(map[string]string) | ||||
| 	params["is_allow_settle"] = common.YES | ||||
| 	params["is_complete_settle"] = common.NO | ||||
| 	orderSettleList := models.GetOrderSettleListByParams(params) | ||||
| 	for _, orderSettle := range orderSettleList { | ||||
| 		orderProfitInfo := models.GetOrderProfitByBankOrderId(orderSettle.BankOrderId) | ||||
| 		if !settle(orderSettle, orderProfitInfo) { | ||||
| 			logs.Error(fmt.Sprintf("结算订单bankOrderId=%s, 执行失败", orderSettle.BankOrderId)) | ||||
| 		} else { | ||||
| 			logs.Info(fmt.Sprintf("结算订单bankOrderId=%s,执行成功", orderSettle.BankOrderId)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func settle(orderSettle models.OrderSettleInfo, orderProfit models.OrderProfitInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			logs.Error(fmt.Sprintf("结算信息出了panic,错误信息:%s", err)) | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	tmpSettle := new(models.OrderSettleInfo) | ||||
| 	if err := o.Raw("select * from order_settle_info where bank_order_id=? for update", orderSettle.BankOrderId).QueryRow(tmpSettle); err != nil || tmpSettle == nil { | ||||
| 		logs.Error("获取tmpSettle失败,bankOrderId=%s", orderSettle.BankOrderId) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	tmpSettle.UpdateTime = utils.GetBasicDateTime() | ||||
| 	tmpSettle.IsCompleteSettle = common.YES | ||||
| 	if _, err := o.Update(tmpSettle); err != nil { | ||||
| 		logs.Error("更新tmpSettle失败,错误:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	accountInfo := new(models.AccountInfo) | ||||
| 	if err := o.Raw("select * from account_info where account_uid=? for update", orderSettle.MerchantUid).QueryRow(accountInfo); err != nil || accountInfo == nil { | ||||
| 		logs.Error("结算select account info失败,错误信息:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	accountInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	accountInfo.SettleAmount += orderProfit.FactAmount | ||||
| 	if _, err := o.Update(accountInfo); err != nil { | ||||
| 		logs.Error("结算update account 失败,错误信息:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	merchantDeployInfo := models.GetMerchantDeployByUidAndPayType(accountInfo.AccountUid, orderSettle.PayTypeCode) | ||||
| 	if merchantDeployInfo.IsLoan == common.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 !models.IsExistMerchantLoadByParams(params) { | ||||
| 			tmp := models.MerchantLoadInfo{Status: common.NO, MerchantUid: orderSettle.MerchantUid, RoadUid: orderSettle.RoadUid, | ||||
| 				LoadDate: date, LoadAmount: loadAmount, UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
| 			if _, err := o.Insert(tmp); err != nil { | ||||
| 				logs.Error("結算插入merchantLoad失敗,失败信息:", err) | ||||
| 				o.Rollback() | ||||
| 				return false | ||||
| 			} else { | ||||
| 				logs.Info("结算插入新的merchantLoad信息成功") | ||||
| 			} | ||||
| 		} else { | ||||
| 			merchantLoad := new(models.MerchantLoadInfo) | ||||
| 			if err := o.Raw("select * from merchant_load_info where merchant_uid=? and road_uid=? and load_date=? for update"). | ||||
| 				QueryRow(merchantLoad); err != nil || merchantLoad == nil { | ||||
| 				logs.Error(fmt.Sprintf("结算过程,select merchant load info失败,错误信息:%s", err)) | ||||
| 				o.Rollback() | ||||
| 				return false | ||||
| 			} else { | ||||
| 				merchantLoad.UpdateTime = utils.GetBasicDateTime() | ||||
| 				merchantLoad.LoadAmount += loadAmount | ||||
| 				if _, err := o.Update(merchantLoad); err != nil { | ||||
| 					logs.Error(fmt.Sprintf("结算过程,update merchant load info失败,失败信息:%s", err)) | ||||
| 					o.Rollback() | ||||
| 					return false | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		logs.Info(fmt.Sprintf("结算过程中,该商户不需要押款,全款结算")) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| /* | ||||
| * 商户的押款释放处理,根据商户的押款时间进行处理 | ||||
|  */ | ||||
| func MerchantLoadSolve() { | ||||
| 	hour := time.Now().Hour() | ||||
| 	merchantDeployList := models.GetMerchantDeployByHour(hour) | ||||
| 	for _, merchantDeploy := range merchantDeployList { | ||||
| 		logs.Info(fmt.Sprintf("开始执行商户uid=%s,进行解款操作", merchantDeploy.MerchantUid)) | ||||
|  | ||||
| 		loadDate := utils.GetDateBeforeDays(merchantDeploy.LoanDays) | ||||
| 		params := make(map[string]string) | ||||
| 		params["status"] = common.NO | ||||
| 		params["merchant_uid"] = merchantDeploy.MerchantUid | ||||
| 		params["load_date"] = loadDate | ||||
|  | ||||
| 		merchantLoadList := models.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 models.MerchantLoadInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			logs.Error(fmt.Sprintf("解款操作出现了painc,错误信息:%s", err)) | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	tmpLoad := new(models.MerchantLoadInfo) | ||||
| 	if err := o.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 == nil { | ||||
| 		logs.Error(fmt.Sprintf("解款操作获取商户押款信息失败,fail: %s", err)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
|  | ||||
| 	} | ||||
| 	if tmpLoad.Status != common.NO { | ||||
| 		logs.Error(fmt.Sprintf("押款信息merchantuid=%s,通道uid=%s, 押款日期=%s,已经解款过,不需要再进行处理了", tmpLoad.MerchantUid, tmpLoad.RoadUid, tmpLoad.LoadDate)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	tmpLoad.UpdateTime = utils.GetBasicDateTime() | ||||
| 	tmpLoad.Status = common.YES | ||||
| 	if _, err := o.Update(tmpLoad); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("解款操作更新merchant load info 失败:%s", err)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	accountInfo := new(models.AccountInfo) | ||||
| 	accountInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if accountInfo.LoanAmount >= tmpLoad.LoadAmount { | ||||
| 		accountInfo.LoanAmount -= tmpLoad.LoadAmount | ||||
| 	} else { | ||||
| 		accountInfo.LoanAmount = common.ZERO | ||||
| 	} | ||||
|  | ||||
| 	if _, err := o.Update(accountInfo); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("解款操作更新account info 失败:%s,账户uid=%s", err, accountInfo.AccountUid)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("解款操作commint事务失败,账号uid=%s,错误信息=%s", accountInfo.AccountUid, err)) | ||||
| 	} else { | ||||
| 		logs.Info(fmt.Sprintf("账户uid=%s,通道uid=%s,押款日期=%s,解款操作成功", accountInfo.AccountUid, tmpLoad.RoadUid, tmpLoad.LoadDate)) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| @@ -1,539 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 处理订单状态,用户加款等核心业务 | ||||
|  ** @Time : 2019/10/31 11:44 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : pay_solve | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/31 11:44 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/message_queue" | ||||
| 	"dongfeng/service/models" | ||||
| 	"dongfeng/service/utils" | ||||
| 	url2 "net/url" | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| type PaySolveController struct { | ||||
| } | ||||
|  | ||||
| //处理支付成功的加款等各项操作 | ||||
| func (c *PaySolveController) SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if r := recover(); r != nil { | ||||
| 			o.Rollback() | ||||
| 			logs.Error("SolvePaySuccess fail, call rollback") | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var orderInfo models.OrderInfo | ||||
| 	if err := o.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderInfo); err != nil || orderInfo.BankOrderId == "" { | ||||
| 		o.Rollback() | ||||
| 		logs.Error("不存在该订单,或者select for update出错") | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if orderInfo.Status != "wait" { | ||||
| 		o.Rollback() | ||||
| 		logs.Error("该订单已经处理,订单号=", bankOrderId) | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if factAmount <= common.ZERO { | ||||
| 		factAmount = orderInfo.OrderAmount | ||||
| 	} | ||||
|  | ||||
| 	var orderProfitInfo models.OrderProfitInfo | ||||
| 	if err := o.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) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if orderProfitInfo.BankOrderId == "" { | ||||
| 		logs.Error("solve pay success, get orderProfit fail, bankOrderId = ", bankOrderId) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	comp := c.CompareOrderAndFactAmount(factAmount, orderInfo) | ||||
| 	//如果实际支付金额比订单金额大或者小,那么重新按照实际金额金额利润计算 | ||||
| 	if comp != 0 { | ||||
| 		orderProfitInfo.FactAmount = factAmount | ||||
| 		orderProfitInfo.SupplierProfit = orderInfo.FactAmount * orderProfitInfo.SupplierRate | ||||
| 		orderProfitInfo.PlatformProfit = orderInfo.FactAmount * orderProfitInfo.PlatformRate | ||||
| 		orderProfitInfo.AgentProfit = orderInfo.FactAmount * orderProfitInfo.AgentRate | ||||
| 		orderProfitInfo.AllProfit = orderProfitInfo.SupplierProfit + orderProfitInfo.PlatformProfit + orderProfitInfo.AgentProfit | ||||
| 		orderProfitInfo.UserInAmount = orderProfitInfo.FactAmount - orderProfitInfo.AllProfit | ||||
| 		orderProfitInfo.UpdateTime = utils.GetBasicDateTime() | ||||
|  | ||||
| 		orderInfo.FactAmount = factAmount | ||||
| 		//如果实际支付金额跟订单金额有出入,那么需要重新更新利润记录 | ||||
| 		if _, err := o.Update(orderProfitInfo); err != nil { | ||||
| 			logs.Info("solve pay success fail:", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	orderInfo.Status = common.SUCCESS | ||||
| 	orderInfo.BankTransId = trxNo | ||||
| 	orderInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if _, err := o.Update(&orderInfo); err != nil || orderInfo.BankOrderId == "" { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success, update order info fail: %s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//插入一条待结算记录 | ||||
| 	settAmount := orderProfitInfo.FactAmount - orderProfitInfo.SupplierProfit - orderProfitInfo.PlatformProfit - orderProfitInfo.AgentProfit | ||||
| 	if settAmount <= 0.00 { | ||||
| 		logs.Error(fmt.Sprintf("订单id=%s,计算利润存在异常", bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	orderSettleInfo := models.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: settAmount, IsAllowSettle: common.YES, | ||||
| 		IsCompleteSettle: common.NO, UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
|  | ||||
| 	if _, err := o.Insert(&orderSettleInfo); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success,insert order settle info fail: %s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//做账户的加款操作,最重要的一部 | ||||
| 	var accountInfo models.AccountInfo | ||||
| 	if err := o.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)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if _, err := o.QueryTable(models.ACCOUNT_INFO).Filter("account_uid", orderInfo.MerchantUid). | ||||
| 		Update(orm.Params{"balance": accountInfo.Balance + settAmount, "wait_amount": accountInfo.WaitAmount + settAmount}); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success, update account info fail: %s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//添加一条动账记录 | ||||
| 	accountHistory := models.AccountHistoryInfo{AccountUid: orderInfo.MerchantUid, AccountName: orderInfo.MerchantName, | ||||
| 		Type: common.PLUS_AMOUNT, Amount: settAmount, Balance: accountInfo.Balance + settAmount, | ||||
| 		UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
| 	if _, err := o.Insert(&accountHistory); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success,insert account history fail:%s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//更新通道信息 | ||||
| 	roadInfo := models.GetRoadInfoByRoadUid(orderInfo.RoadUid) | ||||
| 	roadInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	roadInfo.RequestSuccess += 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 := o.Update(&roadInfo); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success, update road info fail: %s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//更新订单利润表 | ||||
| 	orderProfitInfo.Status = common.SUCCESS | ||||
| 	orderProfitInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if _, err := o.Update(&orderProfitInfo); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("solve pay success, update order profit info fail:  %s, bankOrderId = %s", err, bankOrderId)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("订单bankOrderId = %s,加款失败!", bankOrderId)) | ||||
| 		logs.Error("失败原因:", err) | ||||
| 		return false | ||||
| 	} else { | ||||
| 		logs.Info("账户加款成功,并记录了账户历史!") | ||||
| 		//如果处理成功,发送到消息队列,进行商户的回调操作 | ||||
| 		go c.CreateOrderNotifyInfo(orderInfo, common.SUCCESS) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| //处理支付失败 | ||||
| func (c *PaySolveController) SolvePayFail(orderInfo models.OrderInfo, str string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if r := recover(); r != nil { | ||||
| 			o.Rollback() | ||||
| 			logs.Error("SolvePaySuccess fail, call rollback") | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var orderTmp models.OrderInfo | ||||
| 	bankOrderId := orderInfo.BankOrderId | ||||
| 	if err := o.Raw("select * from order_info where bank_order_id = ?", bankOrderId).QueryRow(&orderTmp); err != nil || orderTmp.BankOrderId == "" { | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if orderTmp.Status != "wait" { | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	_, err1 := o.QueryTable(models.ORDER_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": str, "bank_trans_id": orderInfo.BankTransId}) | ||||
| 	_, err2 := o.QueryTable(models.ORDER_PROFIT_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": str, "bank_trans_id": orderInfo.BankTransId}) | ||||
| 	if err1 != nil || err2 != nil { | ||||
| 		logs.Error("SolvePayFail fail: ", err1, err2) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} else { | ||||
| 		o.Commit() | ||||
| 		go c.CreateOrderNotifyInfo(orderInfo, common.FAIL) | ||||
| 		return true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| //处理订单冻结 | ||||
| func (c *PaySolveController) SolveOrderFreeze(bankOrderId string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var orderInfo models.OrderInfo | ||||
| 	if err := o.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) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if orderInfo.Status != common.SUCCESS { | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	orderInfo.Freeze = common.YES | ||||
| 	orderInfo.FreezeTime = utils.GetBasicDateTime() | ||||
| 	orderInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if _, err := o.Update(&orderInfo); err != nil { | ||||
| 		logs.Error("solve order freeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//账户的冻结金额里面加入相应的金额 | ||||
| 	orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId) | ||||
| 	var accountInfo models.AccountInfo | ||||
| 	if err := o.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)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	accountInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	accountInfo.FreezeAmount = accountInfo.FreezeAmount + orderProfitInfo.UserInAmount | ||||
| 	if _, err := o.Update(&accountInfo); err != nil { | ||||
| 		logs.Error("solve order freeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	//插入一条动账记录 | ||||
| 	accountHistoryInfo := models.AccountHistoryInfo{AccountName: accountInfo.AccountName, AccountUid: accountInfo.AccountUid, | ||||
| 		Type: common.FREEZE_AMOUNT, Amount: orderProfitInfo.UserInAmount, Balance: accountInfo.Balance, UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
| 	if _, err := o.Insert(&accountHistoryInfo); err != nil { | ||||
| 		logs.Error("solve order freeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("SolveOrderFreeze fail") | ||||
| 	} else { | ||||
| 		logs.Info("冻结处理成功") | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| //订单解冻 | ||||
| func (c *PaySolveController) SolveOrderUnfreeze(bankOrderId string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	orderInfo := new(models.OrderInfo) | ||||
| 	if err := o.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 false | ||||
| 	} | ||||
|  | ||||
| 	orderInfo.Freeze = "" | ||||
| 	orderInfo.Unfreeze = common.YES | ||||
| 	orderInfo.UnfreezeTime = utils.GetBasicDateTime() | ||||
| 	orderInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if _, err := o.Update(orderInfo); err != nil { | ||||
| 		logs.Error("solve order unfreeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId) | ||||
|  | ||||
| 	accountInfo := new(models.AccountInfo) | ||||
| 	if err := o.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)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	accountInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	accountInfo.FreezeAmount = accountInfo.FreezeAmount - orderProfitInfo.UserInAmount | ||||
|  | ||||
| 	if _, err := o.Update(accountInfo); err != nil { | ||||
| 		logs.Error("solve order unfreeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	accountHistoryInfo := models.AccountHistoryInfo{AccountUid: accountInfo.AccountUid, AccountName: accountInfo.AccountName, Type: common.UNFREEZE_AMOUNT, | ||||
| 		Amount: orderProfitInfo.UserInAmount, Balance: accountInfo.Balance, UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
|  | ||||
| 	if _, err := o.Insert(&accountHistoryInfo); err != nil { | ||||
| 		logs.Error("solve order unfreeze fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("unfreeze commit fail: %s", err)) | ||||
| 		return false | ||||
| 	} else { | ||||
| 		logs.Info("解冻成功") | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *PaySolveController) SolveRefund(bankOrderId string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	orderInfo := new(models.OrderInfo) | ||||
| 	if err := o.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 false | ||||
| 	} | ||||
|  | ||||
| 	orderInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	orderInfo.Refund = common.YES | ||||
| 	orderInfo.RefundTime = utils.GetBasicDateTime() | ||||
|  | ||||
| 	orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId) | ||||
| 	account := new(models.AccountInfo) | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" { | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	account.UpdateTime = utils.GetBasicDateTime() | ||||
| 	account.SettleAmount = account.SettleAmount - orderProfitInfo.UserInAmount | ||||
| 	account.Balance = account.Balance - orderProfitInfo.UserInAmount | ||||
|  | ||||
| 	if orderInfo.Freeze == common.YES { | ||||
| 		account.FreezeAmount = account.FreezeAmount - orderProfitInfo.UserInAmount | ||||
| 		if account.FreezeAmount < 0 { | ||||
| 			account.FreezeAmount = common.ZERO | ||||
| 		} | ||||
| 		orderInfo.Freeze = "" | ||||
| 	} | ||||
|  | ||||
| 	if _, err := o.Update(orderInfo); err != nil { | ||||
| 		logs.Error("solve order refund update order info fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if _, err := o.Update(account); err != nil { | ||||
| 		logs.Error("solve order refund update account fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	accountHistoryInfo := models.AccountHistoryInfo{AccountName: account.AccountName, AccountUid: account.AccountUid, | ||||
| 		Type: common.REFUND, Amount: orderProfitInfo.UserInAmount, Balance: account.Balance, | ||||
| 		UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
|  | ||||
| 	if _, err := o.Insert(&accountHistoryInfo); err != nil { | ||||
| 		logs.Error("solve order refund insert account history fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("退款处理失败,fail: ", err) | ||||
| 	} else { | ||||
| 		logs.Info("退款处理成功") | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *PaySolveController) SolveOrderRoll(bankOrderId string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	orderInfo := new(models.OrderInfo) | ||||
|  | ||||
| 	if err := o.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil { | ||||
| 		logs.Error("solve order roll fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if orderInfo.Status != common.SUCCESS { | ||||
| 		logs.Error("solve order roll 订单不存在或者订单状态不是success, bankOrderId=", bankOrderId) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	orderInfo.UpdateTime = utils.GetBasicDateTime() | ||||
|  | ||||
| 	orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId) | ||||
|  | ||||
| 	account := new(models.AccountInfo) | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" { | ||||
| 		logs.Error("solve order roll get account is nil, accountUid = ", orderInfo.MerchantUid) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	account.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if orderInfo.Refund == common.YES { | ||||
| 		account.Balance = account.Balance + orderProfitInfo.UserInAmount | ||||
| 		account.SettleAmount = account.SettleAmount + orderProfitInfo.UserInAmount | ||||
| 		orderInfo.Refund = common.NO | ||||
| 	} | ||||
|  | ||||
| 	if _, err := o.Update(orderInfo); err != nil { | ||||
| 		logs.Error("solve order roll fail update order info fail:  ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if _, err := o.Update(account); err != nil { | ||||
| 		logs.Error("solve order roll update account fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	accountHistoryInfo := models.AccountHistoryInfo{AccountUid: account.AccountUid, AccountName: account.AccountName, | ||||
| 		Type: common.PLUS_AMOUNT, Amount: orderProfitInfo.UserInAmount, Balance: account.Balance, | ||||
| 		UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
| 	if _, err := o.Insert(&accountHistoryInfo); err != nil { | ||||
| 		logs.Error("solve order roll insert account history fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("处理订单回滚失败,fail: ", err) | ||||
| 	} else { | ||||
| 		logs.Info("处理订单回滚成功") | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| //比较订单金额和实际支付金额的大小 | ||||
| func (c *PaySolveController) CompareOrderAndFactAmount(factAmount float64, orderInfo models.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 (c *PaySolveController) CreateOrderNotifyInfo(orderInfo models.OrderInfo, tradeStatus string) { | ||||
|  | ||||
| 	notifyInfo := new(models.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 := models.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 | ||||
| 	} | ||||
| 	params["statusCode"] = "00" | ||||
| 	params["tradeStatus"] = tradeStatus | ||||
| 	params["payKey"] = merchantInfo.MerchantKey | ||||
|  | ||||
| 	params["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret) | ||||
|  | ||||
| 	url := url2.Values{} | ||||
| 	for k, v := range params { | ||||
| 		url.Add(k, v) | ||||
| 	} | ||||
|  | ||||
| 	notifyInfo.Url = orderInfo.NotifyUrl + "?" + url.Encode() | ||||
|  | ||||
| 	if models.InsertNotifyInfo(*notifyInfo) { | ||||
| 		logs.Info(fmt.Sprintf("订单bankOrderId=%s,已经将回调地址插入数据库", orderInfo.BankOrderId)) | ||||
| 	} else { | ||||
| 		logs.Error(fmt.Sprintf("订单bankOrderId=%s,插入回调数据库失败", orderInfo.BankOrderId)) | ||||
| 	} | ||||
| 	//将订单发送到消息队列,给下面的商户进行回调 | ||||
| 	message_queue.SendMessage(common.MqOrderNotify, orderInfo.BankOrderId) | ||||
| } | ||||
| @@ -1,393 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 代付处理 | ||||
|  ** @Time : 2019/11/28 18:52 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : payfor_solve | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/11/28 18:52 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/message_queue" | ||||
| 	"dongfeng/service/models" | ||||
| 	"dongfeng/service/utils" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| func PayForFail(payFor models.PayforInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			logs.Error("pay for fail,rollback....") | ||||
| 			o.Rollback() | ||||
| 		} | ||||
| 		return | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmpForPay models.PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where bank_order_id = ? for update", payFor.BankOrderId).QueryRow(&tmpForPay); err != nil || tmpForPay.PayforUid == "" { | ||||
| 		logs.Error("solve pay fail select fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if tmpForPay.Status == common.PAYFOR_FAIL || tmpForPay.Status == common.PAYFOR_SUCCESS { | ||||
| 		logs.Error(fmt.Sprintf("该代付订单uid=%s,状态已经是最终结果", payFor.PayforUid)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	//更新payfor记录的状态 | ||||
| 	tmpForPay.Status = common.PAYFOR_FAIL | ||||
| 	tmpForPay.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if _, err := o.Update(&tmpForPay); err != nil { | ||||
| 		logs.Error("PayForFail update payfor_info fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	var account models.AccountInfo | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", payFor.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" { | ||||
| 		logs.Error("payfor select account fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	account.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if account.PayforAmount < (payFor.PayforAmount + payFor.PayforFee) { | ||||
| 		logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", payFor.MerchantUid)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	//将正在打款中的金额减去 | ||||
| 	account.PayforAmount = account.PayforAmount - payFor.PayforAmount - payFor.PayforFee | ||||
|  | ||||
| 	if _, err := o.Update(&account); err != nil { | ||||
| 		logs.Error("PayForFail update account fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("代付失败处理出错,fail:", err) | ||||
| 	} else { | ||||
| 		logs.Info("代付处理成功") | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func PayForSuccess(payFor models.PayforInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			logs.Error("pay for success,rollback....") | ||||
| 			o.Rollback() | ||||
| 		} | ||||
| 		return | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmpPayFor models.PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where bank_order_id = ? for update", payFor.BankOrderId).QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" { | ||||
| 		logs.Error("payfor success select payfor fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if tmpPayFor.Status == common.PAYFOR_FAIL || tmpPayFor.Status == common.PAYFOR_SUCCESS { | ||||
| 		logs.Error(fmt.Sprintf("该代付订单uid=%s,已经是最终结果,不需要处理", payFor.PayforUid)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	tmpPayFor.UpdateTime = utils.GetBasicDateTime() | ||||
| 	tmpPayFor.Status = common.PAYFOR_SUCCESS | ||||
| 	_, err := o.Update(&tmpPayFor) | ||||
| 	if err != nil { | ||||
| 		logs.Error("PayForSuccess update payfor fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	var account models.AccountInfo | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", payFor.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" { | ||||
| 		logs.Error("payfor success select account fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	account.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if account.PayforAmount < (payFor.PayforAmount + payFor.PayforFee) { | ||||
| 		logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", payFor.MerchantUid)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//代付打款中的金额减去 | ||||
| 	account.PayforAmount = account.PayforAmount - payFor.PayforAmount - payFor.PayforFee | ||||
| 	//减去余额,减去可用金额 | ||||
| 	account.Balance = account.Balance - payFor.PayforAmount - payFor.PayforFee | ||||
| 	//已结算金额减去 | ||||
| 	account.SettleAmount = account.SettleAmount - payFor.PayforAmount - payFor.PayforFee | ||||
|  | ||||
| 	if _, err := o.Update(&account); err != nil { | ||||
| 		logs.Error("PayForSuccess udpate account fail:", err) | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//添加一条动账记录 | ||||
| 	accountHistory := models.AccountHistoryInfo{AccountUid: payFor.MerchantUid, AccountName: payFor.MerchantName, | ||||
| 		Type: common.SUB_AMOUNT, Amount: payFor.PayforAmount + payFor.PayforFee, Balance: account.Balance, | ||||
| 		UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime()} | ||||
| 	if _, err := o.Insert(&accountHistory); err != nil { | ||||
| 		logs.Error("PayForSuccess insert account history fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("代付成功处理失败,fail:", err) | ||||
| 	} else { | ||||
| 		logs.Info("代付处理成功") | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| /* | ||||
| * 自动审核代付订单 | ||||
|  */ | ||||
| func SolvePayForConfirm() { | ||||
| 	params := make(map[string]string) | ||||
| 	beforeOneDay := utils.GetDateTimeBeforeDays(1) | ||||
| 	nowDate := utils.GetBasicDateTime() | ||||
| 	params["create_time__lte"] = beforeOneDay | ||||
| 	params["create_time__gte"] = nowDate | ||||
| 	params["status"] = common.PAYFOR_COMFRIM | ||||
| 	payForList := models.GetPayForListByParams(params) | ||||
| 	for _, p := range payForList { | ||||
| 		if p.Type == common.SELF_HELP || p.Type == common.SELF_MERCHANT { | ||||
| 			//系统后台提交的,人工审核 | ||||
| 			continue | ||||
| 		} | ||||
| 		//判断商户是否开通了自动代付功能 | ||||
| 		merchant := models.GetMerchantByUid(p.MerchantUid) | ||||
| 		//判断商户是否开通了自动代付 | ||||
| 		if merchant.AutoPayFor == common.NO || merchant.AutoPayFor == "" { | ||||
| 			logs.Notice(fmt.Sprintf("该商户uid=%s, 没有开通自动代付功能", p.MerchantUid)) | ||||
| 			continue | ||||
| 		} | ||||
| 		//找自动代付通道 | ||||
| 		findPayForRoad(p, merchant) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func findPayForRoad(payFor models.PayforInfo, merchant models.MerchantInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
|  | ||||
| 	//检查是否单独填写了每笔代付的手续费 | ||||
| 	if merchant.PayforFee > common.ZERO { | ||||
| 		logs.Info(fmt.Sprintf("商户uid=%s,有单独的代付手续费。", merchant.MerchantUid)) | ||||
| 		payFor.PayforFee = merchant.PayforFee | ||||
| 		payFor.PayforTotalAmount = payFor.PayforFee + payFor.PayforAmount | ||||
| 	} | ||||
|  | ||||
| 	if merchant.SinglePayForRoadUid != "" { | ||||
| 		payFor.RoadUid = merchant.SinglePayForRoadUid | ||||
| 		payFor.RoadName = merchant.SinglePayForRoadName | ||||
| 	} else { | ||||
| 		//到轮询里面寻找代付通道 | ||||
| 		if merchant.RollPayForRoadCode == "" { | ||||
| 			logs.Notice(fmt.Sprintf("该商户没有配置代付通道")) | ||||
| 			return false | ||||
| 		} | ||||
| 		roadPoolInfo := models.GetRoadPoolByRoadPoolCode(merchant.RollPayForRoadCode) | ||||
| 		roadUids := strings.Split(roadPoolInfo.RoadUidPool, "||") | ||||
| 		roadInfoList := models.GetRoadInfosByRoadUids(roadUids) | ||||
| 		if len(roadUids) == 0 || len(roadInfoList) == 0 { | ||||
| 			logs.Error(fmt.Sprintf("通道轮询池=%s, 没有配置通道", merchant.RollPayForRoadCode)) | ||||
| 			return false | ||||
| 		} | ||||
| 		payFor.RoadUid = roadInfoList[0].RoadUid | ||||
| 		payFor.RoadName = roadInfoList[0].RoadName | ||||
| 	} | ||||
|  | ||||
| 	o.Begin() | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmpPayFor models.PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where payfor_uid = ? for update", payFor.PayforUid).QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" { | ||||
| 		logs.Error("find payfor road select payfor fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
| 	if tmpPayFor.Status != common.PAYFOR_COMFRIM { | ||||
| 		logs.Notice(fmt.Sprintf("该代付记录uid=%s,已经被审核", payFor.PayforUid)) | ||||
| 		return false | ||||
| 	} | ||||
| 	tmpPayFor.UpdateTime = utils.GetBasicDateTime() | ||||
| 	tmpPayFor.Status = common.PAYFOR_SOLVING | ||||
| 	tmpPayFor.GiveType = common.PAYFOR_ROAD | ||||
| 	if _, err := o.Update(&tmpPayFor); err != nil { | ||||
| 		logs.Error(fmt.Sprintf("该代付记录uid=%s,从审核更新为正在处理出错: %s", payFor.PayforUid, err)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("挑选代付通道失败,fail:", err) | ||||
| 	} else { | ||||
| 		logs.Info("挑选代付通道成功") | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| /* | ||||
| * 执行逻辑 | ||||
|  */ | ||||
| func SolvePayFor() { | ||||
| 	//取出一天之内的没有做处理并且不是手动打款的代付记录 | ||||
| 	params := make(map[string]string) | ||||
| 	beforeOneDay := utils.GetDateTimeBeforeDays(1) | ||||
| 	nowDate := utils.GetBasicDateTime() | ||||
| 	params["create_time__lte"] = nowDate | ||||
| 	params["create_time__gte"] = beforeOneDay | ||||
| 	params["is_send"] = "no" | ||||
| 	params["status"] = common.PAYFOR_SOLVING | ||||
| 	params["give_type"] = common.PAYFOR_ROAD | ||||
|  | ||||
| 	payForList := models.GetPayForListByParams(params) | ||||
| 	for _, p := range payForList { | ||||
| 		if p.Type == common.SELF_HELP { | ||||
| 			//如果后台管理人员,通过任意下发,不涉及到商户减款操作,直接发送代付请求 | ||||
| 			solveSelf(p) | ||||
| 		} else { | ||||
| 			SendPayFor(p) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func solveSelf(payFor models.PayforInfo) { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmpPayFor models.PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where payfor_uid = ? for update", payFor.PayforUid).QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" { | ||||
| 		logs.Error("solve self payfor fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if tmpPayFor.IsSend == common.YES { | ||||
| 		o.Rollback() | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	tmpPayFor.UpdateTime = utils.GetBasicDateTime() | ||||
| 	if payFor.RoadUid == "" { | ||||
| 		tmpPayFor.Status = common.PAYFOR_FAIL | ||||
| 	} else { | ||||
| 		tmpPayFor.Status = common.PAYFOR_BANKING | ||||
| 		tmpPayFor.RequestTime = utils.GetBasicDateTime() | ||||
| 		tmpPayFor.IsSend = common.YES | ||||
| 	} | ||||
| 	_, err := o.Update(&tmpPayFor) | ||||
| 	if err != nil { | ||||
| 		o.Rollback() | ||||
| 	} else { | ||||
| 		o.Commit() | ||||
| 		RequestPayFor(payFor) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func SendPayFor(payFor models.PayforInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			o.Rollback() | ||||
| 			return | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmpPayFor models.PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where payfor_uid = ? for update", payFor.PayforUid).QueryRow(&tmpPayFor); err != nil || tmpPayFor.PayforUid == "" { | ||||
| 		logs.Error("send payfor select payfor fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	var account models.AccountInfo | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", payFor.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" { | ||||
| 		logs.Error("send payfor select account fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//支付金额不足,将直接判定为失败,不往下面邹逻辑了 | ||||
| 	if account.SettleAmount-account.PayforAmount < tmpPayFor.PayforAmount+tmpPayFor.PayforFee { | ||||
| 		tmpPayFor.Status = common.PAYFOR_FAIL | ||||
| 		tmpPayFor.UpdateTime = utils.GetBasicDateTime() | ||||
| 		o.Update(&tmpPayFor) | ||||
| 		o.Commit() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	account.UpdateTime = utils.GetBasicDateTime() | ||||
| 	account.PayforAmount = account.PayforAmount + payFor.PayforAmount + payFor.PayforFee | ||||
|  | ||||
| 	_, err := o.Update(&account) | ||||
| 	if err != nil { | ||||
| 		logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更新账户表出错, err: %s", payFor.MerchantUid, err)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	tmpPayFor.IsSend = common.YES | ||||
| 	tmpPayFor.Status = common.PAYFOR_BANKING //变为银行处理中 | ||||
| 	tmpPayFor.RequestTime = utils.GetBasicDateTime() | ||||
| 	tmpPayFor.UpdateTime = utils.GetBasicDateTime() | ||||
|  | ||||
| 	_, err = o.Update(&tmpPayFor) | ||||
| 	if err != nil { | ||||
| 		logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更代付列表出错, err:%s", payFor.MerchantUid, err)) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} else { | ||||
| 		o.Commit() | ||||
| 		RequestPayFor(payFor) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func RequestPayFor(payFor models.PayforInfo) { | ||||
| 	if payFor.RoadUid == "" { | ||||
| 		return | ||||
| 	} | ||||
| 	roadInfo := models.GetRoadInfoByRoadUid(payFor.RoadUid) | ||||
| 	supplierCode := roadInfo.ProductUid | ||||
| 	supplier := GetPaySupplierByCode(supplierCode) | ||||
| 	res := supplier.PayFor(payFor) | ||||
| 	logs.Info(fmt.Sprintf("代付uid=%s,上游处理结果为:%s", payFor.PayforUid, res)) | ||||
| 	//将代付订单号发送到消息队列 | ||||
| 	message_queue.SendMessage(common.MQ_PAYFOR_QUERY, payFor.BankOrderId) | ||||
| } | ||||
| @@ -1,41 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/28 9:39 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : supplier_interface | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 9:39 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/models" | ||||
| ) | ||||
|  | ||||
| //定义扫码支付的返回值 | ||||
| type ScanData struct { | ||||
| 	Supplier   string //上游的通道供应商 | ||||
| 	PayType    string //支付类型 | ||||
| 	OrderNo    string //下游商户请求订单号 | ||||
| 	BankNo     string //本系统的请求订单号 | ||||
| 	OrderPrice string //订单金额 | ||||
| 	FactPrice  string //实际的展示在客户面前的金额 | ||||
| 	Status     string //状态码 '00' 成功 | ||||
| 	PayUrl     string //支付二维码链接地址 | ||||
| 	Msg        string //附加的信息 | ||||
| } | ||||
|  | ||||
| type PayInterface interface { | ||||
| 	Scan(models.OrderInfo, models.RoadInfo, models.MerchantInfo) ScanData | ||||
| 	H5(models.OrderInfo, models.RoadInfo, models.MerchantInfo) ScanData | ||||
| 	Fast(models.OrderInfo, models.RoadInfo, models.MerchantInfo) bool | ||||
| 	Syt(models.OrderInfo, models.RoadInfo, models.MerchantInfo) ScanData | ||||
| 	Web(models.OrderInfo, models.RoadInfo, models.MerchantInfo) bool | ||||
| 	PayNotify() | ||||
| 	PayQuery(models.OrderInfo) bool | ||||
| 	PayFor(models.PayforInfo) string | ||||
| 	PayForNotify() string | ||||
| 	PayForQuery(models.PayforInfo) (string, string) | ||||
| 	BalanceQuery(models.RoadInfo) float64 | ||||
| } | ||||
| @@ -1,70 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/28 16:38 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : weixin | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/28 16:38 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/models" | ||||
| ) | ||||
|  | ||||
| type WeiXinImpl struct { | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) Scan(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) H5(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) Syt(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) ScanData { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return scanData | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) Fast(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) Web(orderInfo models.OrderInfo, roadInfo models.RoadInfo, merchantInfo models.MerchantInfo) bool { | ||||
| 	var scanData ScanData | ||||
| 	scanData.Status = "01" | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) PayNotify() { | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) PayQuery(orderInfo models.OrderInfo) bool { | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) PayFor(payFor models.PayforInfo) string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) PayForNotify() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) PayForQuery(payFor models.PayforInfo) (string, string) { | ||||
| 	return "", "" | ||||
| } | ||||
|  | ||||
| func (c *WeiXinImpl) BalanceQuery(roadInfo models.RoadInfo) float64 { | ||||
| 	return 0.00 | ||||
| } | ||||
| @@ -1,15 +0,0 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	beego "github.com/beego/beego/v2/server/web" | ||||
| ) | ||||
|  | ||||
| type MainController struct { | ||||
| 	beego.Controller | ||||
| } | ||||
|  | ||||
| func (c *MainController) Get() { | ||||
| 	c.Data["Website"] = "beego.me" | ||||
| 	c.Data["Email"] = "astaxie@gmail.com" | ||||
| 	c.TplName = "index.tpl" | ||||
| } | ||||
| @@ -1,10 +0,0 @@ | ||||
| module service | ||||
|  | ||||
| go 1.13 | ||||
|  | ||||
| require github.com/beego/beego/v2 v2.0.1 | ||||
|  | ||||
| require ( | ||||
| 	github.com/astaxie/beego v1.12.3 | ||||
| 	github.com/smartystreets/goconvey v1.6.4 | ||||
| ) | ||||
| @@ -1,262 +0,0 @@ | ||||
| cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= | ||||
| 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/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/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ= | ||||
| github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA= | ||||
| github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI= | ||||
| 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/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= | ||||
| github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= | ||||
| github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| 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/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | ||||
| github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||
| github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= | ||||
| github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= | ||||
| github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= | ||||
| 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | ||||
| github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= | ||||
| github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= | ||||
| 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-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-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.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= | ||||
| github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| 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.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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= | ||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| 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/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.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | ||||
| 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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| 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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | ||||
| 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/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/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/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/mitchellh/mapstructure v1.3.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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= | ||||
| github.com/onsi/ginkgo v1.6.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.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||
| github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | ||||
| github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | ||||
| 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.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= | ||||
| github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= | ||||
| 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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= | ||||
| github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U= | ||||
| github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= | ||||
| github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= | ||||
| github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= | ||||
| github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= | ||||
| github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= | ||||
| 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/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/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= | ||||
| 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/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/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= | ||||
| github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= | ||||
| go.etcd.io/etcd v3.3.25+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= | ||||
| go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= | ||||
| golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| 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-20190313153728-d0100b6bd8b3/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-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | ||||
| golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= | ||||
| golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= | ||||
| golang.org/x/mod v0.3.0/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-20181114220301-adae6a3d119a/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-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-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| 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-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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| 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-20181116152217-5ac8a444bdc5/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-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-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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/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 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| 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-20191119224855-298f0cb1881e/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-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||
| 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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= | ||||
| google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||
| 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| 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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||
| 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.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 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/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.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| @@ -1,9 +0,0 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	beego.Run() | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 | ||||
| ****************************************************/ | ||||
| package message_queue | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/common" | ||||
| 	"github.com/astaxie/beego/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 := common.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 | ||||
| } | ||||
| @@ -1,33 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 | ||||
| ****************************************************/ | ||||
| package message_queue | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/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) | ||||
| 	} | ||||
| } | ||||
| @@ -1,119 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,69 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,162 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,13 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| type AgentProfit struct { | ||||
| } | ||||
| @@ -1,106 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,39 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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" | ||||
| 	"github.com/astaxie/beego" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	_ "github.com/go-sql-driver/mysql" | ||||
| 	"dongfeng/service/conf" | ||||
| ) | ||||
|  | ||||
| func Init() { | ||||
| 	dbHost := conf.DB_HOST | ||||
| 	dbUser := conf.DB_USER | ||||
| 	dbPassword := conf.DB_PASSWORD | ||||
| 	dbBase := conf.DB_BASE | ||||
| 	dbPort := conf.DB_PORT | ||||
|  | ||||
| 	link := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", dbUser, dbPassword, dbHost, dbPort, dbBase) | ||||
|  | ||||
| 	beego.Info("mysql init.....", link) | ||||
|  | ||||
| 	orm.RegisterDriver("mysql", orm.DRMySQL) | ||||
| 	orm.RegisterDataBase("default", "mysql", link, 30, 30) | ||||
| 	orm.RegisterModel(new(UserInfo), new(MenuInfo), new(SecondMenuInfo), | ||||
| 		new(PowerInfo), new(RoleInfo), new(BankCardInfo), new(RoadInfo), | ||||
| 		new(RoadPoolInfo), new(AgentInfo), new(MerchantInfo), new(MerchantDeployInfo), | ||||
| 		new(AccountInfo), new(AccountHistoryInfo), new(OrderInfo), new(OrderProfitInfo), | ||||
| 		new(OrderSettleInfo), new(NotifyInfo), new(MerchantLoadInfo), | ||||
| 		new(PayforInfo)) | ||||
| } | ||||
| @@ -1,179 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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) | ||||
| } | ||||
| @@ -1,135 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 InsertMerchantDeployInfo(merchantDeployInfo MerchantDeployInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	_, err := o.Insert(&merchantDeployInfo) | ||||
| 	if err != nil { | ||||
| 		logs.Error("insert merchant deploy info fail: ", err) | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func IsExistByUidAndPayType(uid, payType string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	isEixst := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).Filter("pay_type", payType).Exist() | ||||
| 	return isEixst | ||||
| } | ||||
|  | ||||
| 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 GetMerchantDeployByUid(uid string) (ms []MerchantDeployInfo) { | ||||
| 	o := orm.NewOrm() | ||||
| 	_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).All(&ms) | ||||
| 	if err != nil { | ||||
| 		logs.Error("get merchant deploy by uid fail:", err) | ||||
| 	} | ||||
| 	return ms | ||||
| } | ||||
|  | ||||
| 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 | ||||
| } | ||||
| func DeleteMerchantDeployByUidAndPayType(uid, payType string) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).Filter("pay_type", payType).Delete() | ||||
| 	if err != nil { | ||||
| 		logs.Error("delete merchant deploy by uid and payType fail: ", err) | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func UpdateMerchantDeploy(merchantDeploy MerchantDeployInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	_, err := o.Update(&merchantDeploy) | ||||
| 	if err != nil { | ||||
| 		logs.Error("update merchant deploy fail: ", err) | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func GetMerchantDeployLenByMap(params map[string]string) int { | ||||
| 	o := orm.NewOrm() | ||||
| 	qs := o.QueryTable(MERCHANT_DEPLOY_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 deploy len by map fail: ", err) | ||||
| 	} | ||||
| 	return int(cnt) | ||||
| } | ||||
|  | ||||
| func GetMerchantDeployListByMap(params map[string]string, displayCount, offset int) (md []MerchantDeployInfo) { | ||||
| 	o := orm.NewOrm() | ||||
| 	qs := o.QueryTable(MERCHANT_DEPLOY_INFO) | ||||
| 	for k, v := range params { | ||||
| 		if len(v) > 0 { | ||||
| 			qs = qs.Filter(k, v) | ||||
| 		} | ||||
| 	} | ||||
| 	_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&md) | ||||
| 	if err != nil { | ||||
| 		logs.Error("get merchant deploy list by map fail: ", err) | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
| @@ -1,205 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 GetMerchantByPaykey(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 | ||||
| } | ||||
| @@ -1,56 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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() | ||||
| } | ||||
| @@ -1,103 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 GetNotifyBankOrderIdListByParams(params map[string]string) []string { | ||||
| 	o := orm.NewOrm() | ||||
| 	qs := o.QueryTable(NOTIFYINFO) | ||||
| 	for k, v := range params { | ||||
| 		if len(v) > 0 { | ||||
| 			qs = qs.Filter(k, v) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	var notifyList []NotifyInfo | ||||
| 	qs.Limit(-1).All(¬ifyList) | ||||
| 	var list []string | ||||
| 	for _, n := range notifyList { | ||||
| 		list = append(list, n.BankOrderId) | ||||
| 	} | ||||
|  | ||||
| 	return list | ||||
| } | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,222 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"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  //该商户所属代理名称 | ||||
| 	UpdateTime      string | ||||
| 	CreateTime      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 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 | ||||
| } | ||||
| @@ -1,119 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| 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) []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 []PlatformProfit | ||||
| 	_, err := o.Raw(cond).QueryRows(&platformProfitList) | ||||
| 	if err != nil { | ||||
| 		logs.Error("get platform profit by map fail:", err) | ||||
| 	} | ||||
|  | ||||
| 	return platformProfitList | ||||
| } | ||||
| @@ -1,51 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,239 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/utils" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| 	ResponseContext    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 GetPayForLenByMap(params map[string]string) int { | ||||
| 	o := orm.NewOrm() | ||||
| 	qs := o.QueryTable(PAYFORINFO) | ||||
| 	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 pay for len by map fail: ", err) | ||||
| 	} | ||||
|  | ||||
| 	return int(cnt) | ||||
| } | ||||
|  | ||||
| func GetPayForByMap(params map[string]string, displayCount, offset int) []PayforInfo { | ||||
| 	o := orm.NewOrm() | ||||
| 	var payForList []PayforInfo | ||||
|  | ||||
| 	qs := o.QueryTable(PAYFORINFO) | ||||
| 	for k, v := range params { | ||||
| 		if len(v) > 0 { | ||||
| 			qs = qs.Filter(k, v) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	_, err := qs.Limit(displayCount, offset).OrderBy("-create_time").All(&payForList) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		logs.Error("get agentInfo by map fail: ", err) | ||||
| 	} | ||||
|  | ||||
| 	return payForList | ||||
| } | ||||
|  | ||||
| func GetPayForListByParams(params map[string]string) []PayforInfo { | ||||
| 	o := orm.NewOrm() | ||||
| 	var payForList []PayforInfo | ||||
| 	qs := o.QueryTable(PAYFORINFO) | ||||
| 	for k, v := range params { | ||||
| 		if len(v) > 0 { | ||||
| 			qs = qs.Filter(k, v) | ||||
| 		} | ||||
| 	} | ||||
| 	_, err := qs.Limit(-1).All(&payForList) | ||||
| 	if err != nil { | ||||
| 		logs.Error("GetPayForListByParams fail:", err) | ||||
| 	} | ||||
| 	return payForList | ||||
| } | ||||
|  | ||||
| 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 ForUpdatePayFor(payFor PayforInfo) bool { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if err := recover(); err != nil { | ||||
| 			logs.Error("for update pay for painc.....") | ||||
| 			o.Rollback() | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	var tmp PayforInfo | ||||
| 	if err := o.Raw("select * from payfor_info where bank_order_id = ? for update", payFor.BankOrderId).QueryRow(&tmp); err != nil || tmp.PayforUid == "" { | ||||
| 		logs.Error("for update payfor select fail:", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if tmp.Status == common.PAYFOR_FAIL || tmp.Status == common.PAYFOR_SUCCESS { | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	//如果是手动打款,并且是需要处理商户金额 | ||||
| 	if payFor.Status == common.PAYFOR_SOLVING && tmp.Status == common.PAYFOR_COMFRIM && | ||||
| 		payFor.GiveType == common.PAYFOR_HAND && payFor.Type != common.SELF_HELP { | ||||
|  | ||||
| 		var account AccountInfo | ||||
| 		if err := o.Raw("select * from account_info where account_uid = ? for update", payFor.MerchantUid).QueryRow(&account); err != nil || account.AccountUid == "" { | ||||
| 			logs.Error("for update payfor select account info,fail:", err) | ||||
| 			o.Rollback() | ||||
| 			return false | ||||
| 		} | ||||
| 		//计算该用户的可用金额 | ||||
| 		ableAmount := account.SettleAmount - account.FreezeAmount - account.PayforAmount - account.LoanAmount | ||||
| 		if ableAmount >= payFor.PayforAmount+payFor.PayforFee { | ||||
| 			account.PayforAmount += payFor.PayforFee + payFor.PayforAmount | ||||
| 			account.UpdateTime = utils.GetBasicDateTime() | ||||
| 			if _, err := o.Update(&account); err != nil { | ||||
| 				logs.Error("for update payfor update account fail:", err) | ||||
| 				o.Rollback() | ||||
| 				return false | ||||
| 			} | ||||
| 		} else { | ||||
| 			logs.Error(fmt.Sprintf("商户uid=%s,可用金额不够", payFor.MerchantUid)) | ||||
| 			payFor.ResponseContext = "商户可用余额不足" | ||||
| 			payFor.Status = common.PAYFOR_FAIL | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if _, err := o.Update(&payFor); err != nil { | ||||
| 		logs.Error("for update payfor fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Info("for update payfor success") | ||||
| 	} else { | ||||
| 		logs.Error("for update payfor fail:", err) | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,21 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| type PlatformProfit struct { | ||||
| 	MerchantName   string | ||||
| 	AgentName      string | ||||
| 	SupplierName   string | ||||
| 	PayTypeName    string | ||||
| 	OrderAmount    float64 | ||||
| 	OrderCount     int | ||||
| 	PlatformProfit float64 | ||||
| 	AgentProfit    float64 | ||||
| } | ||||
| @@ -1,143 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,162 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| 	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 | ||||
| } | ||||
| @@ -1,127 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,123 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,216 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,90 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/19 14:17 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : transaction | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/19 14:17 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| 	"dongfeng/service/common" | ||||
| 	"dongfeng/service/utils" | ||||
| ) | ||||
|  | ||||
| func OperatorAccount(accountUid, operatorType string, amount float64) (string, bool) { | ||||
| 	o := orm.NewOrm() | ||||
| 	o.Begin() | ||||
|  | ||||
| 	defer func(interface{}) { | ||||
| 		if r := recover(); r != nil { | ||||
| 			o.Rollback() | ||||
| 			logs.Error("operator account fail") | ||||
| 		} | ||||
| 	}(o) | ||||
|  | ||||
| 	msg := "" | ||||
| 	//处理事务 | ||||
| 	accountInfo := new(AccountInfo) | ||||
| 	if err := o.Raw("select * from account_info where account_uid = ? for update", accountUid).QueryRow(accountInfo); err != nil || accountInfo.AccountUid == "" { | ||||
| 		logs.Error("operator account get account info for update fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return msg, false | ||||
| 	} | ||||
|  | ||||
| 	accountInfo.UpdateTime = utils.GetBasicDateTime() | ||||
| 	flag := true | ||||
|  | ||||
| 	switch operatorType { | ||||
| 	case common.PLUS_AMOUNT: //处理加款操作 | ||||
| 		accountInfo.Balance = accountInfo.Balance + amount | ||||
| 		accountInfo.SettleAmount = accountInfo.SettleAmount + amount | ||||
| 	case common.SUB_AMOUNT: //处理减款 | ||||
| 		if accountInfo.Balance >= amount && accountInfo.SettleAmount >= amount { | ||||
| 			accountInfo.Balance = accountInfo.Balance - amount | ||||
| 			accountInfo.SettleAmount = accountInfo.SettleAmount - amount | ||||
| 		} else { | ||||
| 			msg = "账户余额不够减" | ||||
| 			flag = false | ||||
| 		} | ||||
| 	case common.FREEZE_AMOUNT: //处理冻结款 | ||||
| 		accountInfo.FreezeAmount = accountInfo.FreezeAmount + amount | ||||
| 	case common.UNFREEZE_AMOUNT: //处理解冻款 | ||||
| 		if accountInfo.FreezeAmount >= amount { | ||||
| 			accountInfo.FreezeAmount = accountInfo.FreezeAmount - amount | ||||
| 		} else { | ||||
| 			msg = "账户冻结金额不够解冻款" | ||||
| 			flag = false | ||||
| 		} | ||||
| 	} | ||||
| 	if !flag { | ||||
| 		o.Rollback() | ||||
| 		return msg, false | ||||
| 	} | ||||
|  | ||||
| 	if _, err := o.Update(accountInfo); err != nil { | ||||
| 		logs.Error("operator account update account fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return msg, false | ||||
| 	} | ||||
| 	//往account_history表中插入一条动账记录 | ||||
| 	accountHistory := AccountHistoryInfo{AccountUid: accountUid, AccountName: accountInfo.AccountName, Type: operatorType, | ||||
| 		Amount: amount, Balance: accountInfo.Balance, CreateTime: utils.GetBasicDateTime(), UpdateTime: utils.GetBasicDateTime()} | ||||
|  | ||||
| 	if _, err := o.Insert(&accountHistory); err != nil { | ||||
| 		logs.Error("operator account insert account history fail: ", err) | ||||
| 		o.Rollback() | ||||
| 		return msg, false | ||||
| 	} | ||||
| 	if err := o.Commit(); err != nil { | ||||
| 		logs.Error("operator account commit fail: ", err) | ||||
| 		return msg, false | ||||
| 	} else { | ||||
| 		logs.Info("操作账户成功") | ||||
| 		return "", true | ||||
| 	} | ||||
| } | ||||
| @@ -1,146 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @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 models | ||||
|  | ||||
| import ( | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| 	"github.com/astaxie/beego/orm" | ||||
| ) | ||||
|  | ||||
| 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 | ||||
| } | ||||
| @@ -1,7 +0,0 @@ | ||||
| package routers | ||||
|  | ||||
| import () | ||||
|  | ||||
| func init() { | ||||
| 	//beego.Router("/", &controllers.MainController{}) | ||||
| } | ||||
										
											Binary file not shown.
										
									
								
							| @@ -1,22 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/11/19 17:48 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : init_all | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/11/19 17:48 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package service_init | ||||
|  | ||||
| import ( | ||||
| 	"dongfeng/service/controller" | ||||
| 	_ "dongfeng/service/message_queue" | ||||
| 	"dongfeng/service/models" | ||||
| ) | ||||
|  | ||||
| func InitAll() { | ||||
| 	//初始化mysql | ||||
| 	models.Init() | ||||
| 	controller.Init() | ||||
| } | ||||
							
								
								
									
										1
									
								
								boss/service/static/js/reload.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								boss/service/static/js/reload.min.js
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| 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)}; | ||||
| @@ -1,39 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
| 	"runtime" | ||||
| 	"path/filepath" | ||||
| 	_ "service/routers" | ||||
|  | ||||
| 	beego "github.com/beego/beego/v2/server/web" | ||||
| 	. "github.com/smartystreets/goconvey/convey" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	_, file, _, _ := runtime.Caller(0) | ||||
| 	apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator)))) | ||||
| 	beego.TestBeegoInit(apppath) | ||||
| } | ||||
|  | ||||
|  | ||||
| // TestBeego is a sample to run an endpoint test | ||||
| func TestBeego(t *testing.T) { | ||||
| 	r, _ := http.NewRequest("GET", "/", nil) | ||||
| 	w := httptest.NewRecorder() | ||||
| 	beego.BeeApp.Handlers.ServeHTTP(w, r) | ||||
|  | ||||
| 	beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String()) | ||||
|  | ||||
| 	Convey("Subject: Test Station Endpoint\n", t, func() { | ||||
| 	        Convey("Status Code Should Be 200", func() { | ||||
| 	                So(w.Code, ShouldEqual, 200) | ||||
| 	        }) | ||||
| 	        Convey("The Result Should Not Be Empty", func() { | ||||
| 	                So(w.Body.Len(), ShouldBeGreaterThan, 0) | ||||
| 	        }) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| @@ -1,131 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2018-8-30 13:50 | ||||
|  ** @Author : Joker | ||||
|  ** @File : ACE_ECB | ||||
|  ** @Last Modified by : Joker | ||||
|  ** @Last Modified time: 2018-8-30 13:50 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/aes" | ||||
| 	"crypto/cipher" | ||||
| 	"encoding/hex" | ||||
| 	"github.com/astaxie/beego/logs" | ||||
| ) | ||||
|  | ||||
| /* | ||||
| 	aes解码 | ||||
| 	crypted:要加密的字符串 | ||||
| 	key:用来加密的密钥 密钥长度可以是128bit、192bit、256bit中的任意一个 | ||||
| 	16位key对应128bit | ||||
| */ | ||||
| func AesDecrypt(src, key []byte) []byte { | ||||
| 	block, err := aes.NewCipher(key) | ||||
| 	if err != nil { | ||||
| 		logs.Error("Joker: AesDecrypt failed to NewCipher") | ||||
| 		logs.Error(err) | ||||
| 	} | ||||
| 	blockMode := NewECBDecrypter(block) | ||||
| 	origData := make([]byte, len(src)) | ||||
| 	blockMode.CryptBlocks(origData, src) | ||||
| 	origData = PKCS5UnPadding(origData) | ||||
| 	return origData | ||||
| } | ||||
|  | ||||
| /*aes编码*/ | ||||
| func AesEncrypt(src []byte, key string) []byte { | ||||
| 	decodeString, err := hex.DecodeString(key) | ||||
| 	if err != nil { | ||||
| 		logs.Error("Joker: AesEncrypt failed to hex key") | ||||
| 		logs.Error(err) | ||||
| 	} | ||||
| 	block, err := aes.NewCipher(decodeString) | ||||
| 	if err != nil { | ||||
| 		logs.Error("Joker: AesEncrypt failed to NewCipher") | ||||
| 		logs.Error(err) | ||||
| 	} | ||||
| 	if len(src) < 0 { | ||||
| 		logs.Error("Joker: AesEncrypt`s input is null ") | ||||
| 	} | ||||
| 	ecb := NewECBEncrypter(block) | ||||
| 	src = PKCS5Padding(src, block.BlockSize()) | ||||
| 	crypted := make([]byte, len(src)) | ||||
| 	ecb.CryptBlocks(crypted, src) | ||||
| 	// 普通base64编码加密 区别于urlsafe base64 | ||||
| 	//fmt.Println("base64 result:", base64.StdEncoding.EncodeToString(crypted)) | ||||
| 	//fmt.Println("base64UrlSafe result:", Base64UrlSafeEncode(crypted)) | ||||
| 	return crypted | ||||
| } | ||||
|  | ||||
| func PKCS5Padding(ciphertext []byte, blockSize int) []byte { | ||||
| 	padding := blockSize - len(ciphertext)%blockSize | ||||
| 	padtext := bytes.Repeat([]byte{byte(padding)}, padding) | ||||
| 	return append(ciphertext, padtext...) | ||||
| } | ||||
|  | ||||
| func PKCS5UnPadding(origData []byte) []byte { | ||||
| 	length := len(origData) | ||||
| 	// 去掉最后一个字节 unpadding 次 | ||||
| 	unpadding := int(origData[length-1]) | ||||
| 	return origData[:(length - unpadding)] | ||||
| } | ||||
|  | ||||
| type ecb struct { | ||||
| 	b         cipher.Block | ||||
| 	blockSize int | ||||
| } | ||||
|  | ||||
| func newECB(b cipher.Block) *ecb { | ||||
| 	return &ecb{ | ||||
| 		b:         b, | ||||
| 		blockSize: b.BlockSize(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type ecbEncrypter ecb | ||||
|  | ||||
| // NewECBEncrypter returns a BlockMode which encrypts in electronic code book | ||||
| // mode, using the given Block. | ||||
| func NewECBEncrypter(b cipher.Block) cipher.BlockMode { | ||||
| 	return (*ecbEncrypter)(newECB(b)) | ||||
| } | ||||
| func (x *ecbEncrypter) BlockSize() int { return x.blockSize } | ||||
| func (x *ecbEncrypter) CryptBlocks(dst, src []byte) { | ||||
| 	if len(src)%x.blockSize != 0 { | ||||
| 		logs.Error("Joker: CryptBlocks`s input not full blocks") | ||||
| 	} | ||||
| 	if len(dst) < len(src) { | ||||
| 		logs.Error("Joker: CryptBlocks`s output smaller than input") | ||||
| 	} | ||||
| 	for len(src) > 0 { | ||||
| 		x.b.Encrypt(dst, src[:x.blockSize]) | ||||
| 		src = src[x.blockSize:] | ||||
| 		dst = dst[x.blockSize:] | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type ecbDecrypter ecb | ||||
|  | ||||
| // NewECBDecrypter returns a BlockMode which decrypts in electronic code book | ||||
| // mode, using the given Block. | ||||
| func NewECBDecrypter(b cipher.Block) cipher.BlockMode { | ||||
| 	return (*ecbDecrypter)(newECB(b)) | ||||
| } | ||||
| func (x *ecbDecrypter) BlockSize() int { return x.blockSize } | ||||
| func (x *ecbDecrypter) CryptBlocks(dst, src []byte) { | ||||
| 	if len(src)%x.blockSize != 0 { | ||||
| 		logs.Error("Joker: CryptBlocks`s input not full blocks") | ||||
| 	} | ||||
| 	if len(dst) < len(src) { | ||||
| 		logs.Error("Joker: CryptBlocks`s output smaller than input") | ||||
| 	} | ||||
| 	for len(src) > 0 { | ||||
| 		x.b.Decrypt(dst, src[:x.blockSize]) | ||||
| 		src = src[x.blockSize:] | ||||
| 		dst = dst[x.blockSize:] | ||||
| 	} | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/8/21 10:21 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : date_time | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/8/21 10:21 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| import "time" | ||||
|  | ||||
| func GetDateTimeNot() string { | ||||
| 	return time.Now().Format("2006010215:04:05") | ||||
| } | ||||
|  | ||||
| func GetDate() string { | ||||
| 	return time.Now().Format("2006-01-02") | ||||
| } | ||||
|  | ||||
| func GetBasicDateTime() string { | ||||
| 	return time.Now().Format("2006-01-02 15:04:05") | ||||
| } | ||||
|  | ||||
| func GetNowTimesTamp() string { | ||||
| 	return time.Now().Format("20060102150405") | ||||
| } | ||||
|  | ||||
| func GetDateTimeBeforeHours(hour int) string { | ||||
| 	return time.Now().Add(-time.Hour * time.Duration(hour)).Format("2006-01-02 15:04:05") | ||||
| } | ||||
|  | ||||
| func GetDateBeforeDays(days int) string { | ||||
| 	return time.Now().Add(-time.Hour * time.Duration(days) * 24).Format("2006-01-02") | ||||
| } | ||||
|  | ||||
| func GetDateTimeBeforeDays(days int) string { | ||||
| 	return time.Now().Add(-time.Hour * time.Duration(days) * 24).Format("2006-01-02 15:04:05") | ||||
| } | ||||
| @@ -1,440 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : generate login verify code image | ||||
|  ** @Time : 2019/8/7 17:14  | ||||
|  ** @Author : yuebin | ||||
|  ** @File : login_verify_code | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/8/7 17:14 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	crand "crypto/rand" | ||||
| 	"image" | ||||
| 	"image/color" | ||||
| 	"math/rand" | ||||
| 	"time" | ||||
| 	"io" | ||||
| 	"image/png" | ||||
| 	"net/http" | ||||
| 	"strconv" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	stdWidth  = 100 | ||||
| 	stdHeight = 40 | ||||
| 	maxSkew   = 2 | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	fontWidth  = 5 | ||||
| 	fontHeight = 8 | ||||
| 	blackChar  = 1 | ||||
| ) | ||||
|  | ||||
| var font = [][]byte{ | ||||
| 	{ // 0 | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		0, 1, 1, 1, 0}, | ||||
| 	{ // 1 | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		0, 1, 1, 0, 0, | ||||
| 		1, 0, 1, 0, 0, | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		1, 1, 1, 1, 1}, | ||||
| 	{ // 2 | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 1, 1, | ||||
| 		0, 1, 1, 0, 0, | ||||
| 		1, 0, 0, 0, 0, | ||||
| 		1, 0, 0, 0, 0, | ||||
| 		1, 1, 1, 1, 1}, | ||||
| 	{ // 3 | ||||
| 		1, 1, 1, 1, 0, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 1, 0, | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		0, 0, 0, 1, 0, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		1, 1, 1, 1, 0}, | ||||
| 	{ // 4 | ||||
| 		1, 0, 0, 1, 0, | ||||
| 		1, 0, 0, 1, 0, | ||||
| 		1, 0, 0, 1, 0, | ||||
| 		1, 0, 0, 1, 0, | ||||
| 		1, 1, 1, 1, 1, | ||||
| 		0, 0, 0, 1, 0, | ||||
| 		0, 0, 0, 1, 0, | ||||
| 		0, 0, 0, 1, 0}, | ||||
| 	{ // 5 | ||||
| 		1, 1, 1, 1, 1, | ||||
| 		1, 0, 0, 0, 0, | ||||
| 		1, 0, 0, 0, 0, | ||||
| 		1, 1, 1, 1, 0, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		1, 1, 1, 1, 0}, | ||||
| 	{ // 6 | ||||
| 		0, 0, 1, 1, 1, | ||||
| 		0, 1, 0, 0, 0, | ||||
| 		1, 0, 0, 0, 0, | ||||
| 		1, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		0, 1, 1, 1, 0}, | ||||
| 	{ // 7 | ||||
| 		1, 1, 1, 1, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 1, 0, | ||||
| 		0, 0, 1, 0, 0, | ||||
| 		0, 1, 0, 0, 0, | ||||
| 		0, 1, 0, 0, 0, | ||||
| 		0, 1, 0, 0, 0}, | ||||
| 	{ // 8 | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		0, 1, 1, 1, 0}, | ||||
| 	{ // 9 | ||||
| 		0, 1, 1, 1, 0, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 0, 0, 0, 1, | ||||
| 		1, 1, 0, 0, 1, | ||||
| 		0, 1, 1, 1, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		0, 0, 0, 0, 1, | ||||
| 		1, 1, 1, 1, 0}, | ||||
| } | ||||
|  | ||||
| type Image struct { | ||||
| 	*image.NRGBA | ||||
| 	color   *color.NRGBA | ||||
| 	width   int //a digit width | ||||
| 	height  int //a digit height | ||||
| 	dotsize int | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	rand.Seed(int64(time.Second)) | ||||
|  | ||||
| } | ||||
|  | ||||
| func NewImage(digits []byte, width, height int) *Image { | ||||
| 	img := new(Image) | ||||
| 	r := image.Rect(img.width, img.height, stdWidth, stdHeight) | ||||
| 	img.NRGBA = image.NewNRGBA(r) | ||||
| 	img.color = &color.NRGBA{ | ||||
| 		uint8(rand.Intn(129)), | ||||
| 		uint8(rand.Intn(129)), | ||||
| 		uint8(rand.Intn(129)), | ||||
| 		0xFF} | ||||
| 	// Draw background (10 random circles of random brightness) | ||||
| 	img.calculateSizes(width, height, len(digits)) | ||||
| 	img.fillWithCircles(0, img.dotsize) | ||||
| 	maxx := width - (img.width+img.dotsize)*len(digits) - img.dotsize | ||||
| 	maxy := height - img.height - img.dotsize*2 | ||||
| 	x := rnd(img.dotsize*2, maxx) | ||||
| 	y := rnd(img.dotsize*2, maxy) | ||||
| 	// Draw digits. | ||||
| 	for _, n := range digits { | ||||
| 		img.drawDigit(font[n], x, y) | ||||
| 		x += img.width + img.dotsize | ||||
| 	} | ||||
| 	// Draw strike-through line. | ||||
| 	//img.strikeThrough() | ||||
| 	return img | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) WriteTo(w io.Writer) (int64, error) { | ||||
| 	return 0, png.Encode(w, img) | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) calculateSizes(width, height, ncount int) { | ||||
| 	// Goal: fit all digits inside the image. | ||||
| 	var border int | ||||
| 	if width > height { | ||||
| 		border = height / 5 | ||||
| 	} else { | ||||
| 		border = width / 5 | ||||
| 	} | ||||
| 	// Convert everything to floats for calculations. | ||||
| 	w := float64(width - border*2)  //268 | ||||
| 	h := float64(height - border*2) //48 | ||||
| 	// fw takes into account 1-dot spacing between digits. | ||||
| 	fw := float64(fontWidth) + 1 //6 | ||||
| 	fh := float64(fontHeight)    //8 | ||||
| 	nc := float64(ncount)        //7 | ||||
| 	// Calculate the width of a single digit taking into account only the | ||||
| 	// width of the image. | ||||
| 	nw := w / nc //38 | ||||
| 	// Calculate the height of a digit from this width. | ||||
| 	nh := nw * fh / fw //51 | ||||
| 	// Digit too high? | ||||
| 	if nh > h { | ||||
| 		// Fit digits based on height. | ||||
| 		nh = h //nh = 44 | ||||
| 		nw = fw / fh * nh | ||||
| 	} | ||||
| 	// Calculate dot size. | ||||
| 	img.dotsize = int(nh / fh) | ||||
| 	// Save everything, making the actual width smaller by 1 dot to account | ||||
| 	// for spacing between digits. | ||||
| 	img.width = int(nw) | ||||
| 	img.height = int(nh) - img.dotsize | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) fillWithCircles(n, maxradius int) { | ||||
| 	color := img.color | ||||
| 	maxx := img.Bounds().Max.X | ||||
| 	maxy := img.Bounds().Max.Y | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		setRandomBrightness(color, 255) | ||||
| 		r := rnd(3, maxradius) | ||||
| 		img.drawCircle(color, rnd(r, maxx-r), rnd(r, maxy-r), r) | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) drawHorizLine(color color.Color, fromX, toX, y int) { | ||||
| 	for x := fromX; x <= toX; x++ { | ||||
| 		img.Set(x, y, color) | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) drawCircle(color color.Color, x, y, radius int) { | ||||
| 	f := 1 - radius | ||||
| 	dfx := 1 | ||||
| 	dfy := -2 * radius | ||||
| 	xx := 0 | ||||
| 	yy := radius | ||||
| 	img.Set(x, y+radius, color) | ||||
| 	img.Set(x, y-radius, color) | ||||
| 	img.drawHorizLine(color, x-radius, x+radius, y) | ||||
| 	for xx < yy { | ||||
| 		if f >= 0 { | ||||
| 			yy-- | ||||
| 			dfy += 2 | ||||
| 			f += dfy | ||||
| 		} | ||||
| 		xx++ | ||||
| 		dfx += 2 | ||||
| 		f += dfx | ||||
| 		img.drawHorizLine(color, x-xx, x+xx, y+yy) | ||||
| 		img.drawHorizLine(color, x-xx, x+xx, y-yy) | ||||
| 		img.drawHorizLine(color, x-yy, x+yy, y+xx) | ||||
| 		img.drawHorizLine(color, x-yy, x+yy, y-xx) | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) strikeThrough() { | ||||
| 	r := 0 | ||||
| 	maxx := img.Bounds().Max.X | ||||
| 	maxy := img.Bounds().Max.Y | ||||
| 	y := rnd(maxy/3, maxy-maxy/3) | ||||
| 	for x := 0; x < maxx; x += r { | ||||
| 		r = rnd(1, img.dotsize/3) | ||||
| 		y += rnd(-img.dotsize/2, img.dotsize/2) | ||||
| 		if y <= 0 || y >= maxy { | ||||
| 			y = rnd(maxy/3, maxy-maxy/3) | ||||
| 		} | ||||
| 		img.drawCircle(img.color, x, y, r) | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| func (img *Image) drawDigit(digit []byte, x, y int) { | ||||
| 	skf := rand.Float64() * float64(rnd(-maxSkew, maxSkew)) | ||||
| 	xs := float64(x) | ||||
| 	minr := img.dotsize / 2               // minumum radius | ||||
| 	maxr := img.dotsize/2 + img.dotsize/4 // maximum radius | ||||
| 	y += rnd(-minr, minr) | ||||
| 	for yy := 0; yy < fontHeight; yy++ { | ||||
| 		for xx := 0; xx < fontWidth; xx++ { | ||||
| 			if digit[yy*fontWidth+xx] != blackChar { | ||||
| 				continue | ||||
| 			} | ||||
| 			// Introduce random variations. | ||||
| 			or := rnd(minr, maxr) | ||||
| 			ox := x + (xx * img.dotsize) + rnd(0, or/2) | ||||
| 			oy := y + (yy * img.dotsize) + rnd(0, or/2) | ||||
| 			img.drawCircle(img.color, ox, oy, or) | ||||
| 		} | ||||
| 		xs += skf | ||||
| 		x = int(xs) | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| func setRandomBrightness(c *color.NRGBA, max uint8) { | ||||
| 	minc := min3(c.R, c.G, c.B) | ||||
| 	maxc := max3(c.R, c.G, c.B) | ||||
| 	if maxc > max { | ||||
| 		return | ||||
| 	} | ||||
| 	n := rand.Intn(int(max-maxc)) - int(minc) | ||||
| 	c.R = uint8(int(c.R) + n) | ||||
| 	c.G = uint8(int(c.G) + n) | ||||
| 	c.B = uint8(int(c.B) + n) | ||||
|  | ||||
| } | ||||
|  | ||||
| func min3(x, y, z uint8) (o uint8) { | ||||
| 	o = x | ||||
| 	if y < o { | ||||
| 		o = y | ||||
| 	} | ||||
| 	if z < o { | ||||
| 		o = z | ||||
| 	} | ||||
| 	return | ||||
|  | ||||
| } | ||||
|  | ||||
| func max3(x, y, z uint8) (o uint8) { | ||||
| 	o = x | ||||
| 	if y > o { | ||||
| 		o = y | ||||
| 	} | ||||
| 	if z > o { | ||||
| 		o = z | ||||
| 	} | ||||
| 	return | ||||
|  | ||||
| } | ||||
|  | ||||
| // rnd returns a random number in range [from, to]. | ||||
|  | ||||
| func rnd(from, to int) int { | ||||
| 	//println(to+1-from) | ||||
| 	return rand.Intn(to+1-from) + from | ||||
|  | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	// Standard length of uniuri string to achive ~95 bits of entropy. | ||||
| 	StdLen = 16 | ||||
| 	// Length of uniurl string to achive ~119 bits of entropy, closest | ||||
| 	// to what can be losslessly converted to UUIDv4 (122 bits). | ||||
| 	UUIDLen = 20 | ||||
| ) | ||||
|  | ||||
| // Standard characters allowed in uniuri string. | ||||
|  | ||||
| var StdChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") | ||||
|  | ||||
| // New returns a new random string of the standard length, consisting of | ||||
| // standard characters. | ||||
|  | ||||
| func New() string { | ||||
| 	return NewLenChars(StdLen, StdChars) | ||||
|  | ||||
| } | ||||
|  | ||||
| // NewLen returns a new random string of the provided length, consisting of | ||||
| // standard characters. | ||||
|  | ||||
| func NewLen(length int) string { | ||||
| 	return NewLenChars(length, StdChars) | ||||
|  | ||||
| } | ||||
|  | ||||
| // NewLenChars returns a new random string of the provided length, consisting | ||||
| // of the provided byte slice of allowed characters (maximum 256). | ||||
|  | ||||
| func NewLenChars(length int, chars []byte) string { | ||||
| 	b := make([]byte, length) | ||||
| 	r := make([]byte, length+(length/4)) // storage for random bytes. | ||||
| 	clen := byte(len(chars)) | ||||
| 	maxrb := byte(256 - (256 % len(chars))) | ||||
| 	i := 0 | ||||
| 	for { | ||||
| 		if _, err := io.ReadFull(crand.Reader, r); err != nil { | ||||
| 			panic("error reading from random source: " + err.Error()) | ||||
| 		} | ||||
| 		for _, c := range r { | ||||
| 			if c >= maxrb { | ||||
| 				// Skip this number to avoid modulo bias. | ||||
| 				continue | ||||
| 			} | ||||
| 			b[i] = chars[c%clen] | ||||
| 			i++ | ||||
| 			if i == length { | ||||
| 				return string(b) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
|  | ||||
| } | ||||
|  | ||||
| func GenerateVerifyCodeImg() (*Image, string) { | ||||
| 	d := make([]byte, 4) | ||||
| 	s := NewLen(4) | ||||
| 	ss := "" | ||||
| 	d = []byte(s) | ||||
| 	for v := range d { | ||||
| 		d[v] %= 10 | ||||
| 		ss += strconv.FormatInt(int64(d[v]), 32) | ||||
| 	} | ||||
| 	return NewImage(d, 100, 40), ss | ||||
| } | ||||
|  | ||||
| func pic(w http.ResponseWriter, req *http.Request) { | ||||
| 	d := make([]byte, 4) | ||||
| 	s := NewLen(4) | ||||
| 	ss := "" | ||||
| 	d = []byte(s) | ||||
| 	for v := range d { | ||||
| 		d[v] %= 10 | ||||
| 		ss += strconv.FormatInt(int64(d[v]), 32) | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", "image/png") | ||||
| 	NewImage(d, 100, 40).WriteTo(w) | ||||
| 	fmt.Println(ss) | ||||
|  | ||||
| } | ||||
|  | ||||
| func index(w http.ResponseWriter, req *http.Request) { | ||||
| 	str := "<meta charset=\"utf-8\"><h3>golang 图片验证码例子</h3><img border=\"1\" src=\"/pic\" alt=\"图片验证码\" onclick=\"this.src='/pic'\" />" | ||||
| 	w.Header().Set("Content-Type", "text/html") | ||||
| 	w.Write([]byte(str)) | ||||
|  | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	http.HandleFunc("/pic", pic) | ||||
| 	http.HandleFunc("/", index) | ||||
| 	s := &http.Server{ | ||||
| 		Addr:           ":8080", | ||||
| 		ReadTimeout:    30 * time.Second, | ||||
| 		WriteTimeout:   30 * time.Second, | ||||
| 		MaxHeaderBytes: 1 << 20} | ||||
| 	s.ListenAndServe() | ||||
|  | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : 获取一个md5的字符串 | ||||
|  ** @Time : 2019/8/9 16:06 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : md5 | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/8/9 16:06 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"crypto/md5" | ||||
| 	"encoding/hex" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| /* | ||||
| * 获取小写的MD5 | ||||
|  */ | ||||
| func GetMD5LOWER(s string) string { | ||||
| 	h := md5.New() | ||||
| 	h.Write([]byte(s)) | ||||
| 	return hex.EncodeToString(h.Sum(nil)) | ||||
| } | ||||
|  | ||||
| /* | ||||
| * 获取大写的MD5 | ||||
|  */ | ||||
| func GetMD5Upper(s string) string { | ||||
| 	return strings.ToUpper(GetMD5LOWER(s)) | ||||
| } | ||||
| @@ -1,43 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/26 11:08 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : sign_verify | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/26 11:08 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| func GetMD5Sign(params map[string]string, keys []string, paySecret string) string { | ||||
| 	str := "" | ||||
| 	for i := 0; i < len(keys); i++ { | ||||
| 		k := keys[i] | ||||
| 		if len(params[k]) == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 		str += k + "=" + params[k] + "&" | ||||
| 	} | ||||
| 	str += "paySecret=" + paySecret | ||||
| 	sign := GetMD5Upper(str) | ||||
| 	return sign | ||||
| } | ||||
|  | ||||
| /* | ||||
| * 验签 | ||||
|  */ | ||||
| func Md5Verify(params map[string]string, paySecret string) bool { | ||||
| 	sign := params["sign"] | ||||
| 	if sign == "" { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	delete(params, "sign") | ||||
| 	keys := SortMap(params) | ||||
| 	tmpSign := GetMD5Sign(params, keys, paySecret) | ||||
| 	if tmpSign != sign { | ||||
| 		return false | ||||
| 	} else { | ||||
| 		return true | ||||
| 	} | ||||
| } | ||||
| @@ -1,26 +0,0 @@ | ||||
| /*************************************************** | ||||
|  ** @Desc : This file for ... | ||||
|  ** @Time : 2019/10/26 11:17 | ||||
|  ** @Author : yuebin | ||||
|  ** @File : sort_go | ||||
|  ** @Last Modified by : yuebin | ||||
|  ** @Last Modified time: 2019/10/26 11:17 | ||||
|  ** @Software: GoLand | ||||
| ****************************************************/ | ||||
| package utils | ||||
|  | ||||
| import ( | ||||
| 	"sort" | ||||
| ) | ||||
|  | ||||
| /* | ||||
| * 对map的key值进行排序 | ||||
|  */ | ||||
| func SortMap(m map[string]string) []string { | ||||
| 	var arr []string | ||||
| 	for k := range m { | ||||
| 		arr = append(arr, k) | ||||
| 	} | ||||
| 	sort.Strings(arr) | ||||
| 	return arr | ||||
| } | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user