mirror of
https://github.com/kongyuebin1/dongfeng-pay.git
synced 2024-12-25 19:42:25 +08:00
删除已经没有用的微服务
This commit is contained in:
parent
a9b7d38741
commit
5c43b3108a
@ -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,5 +0,0 @@
|
|||||||
appname = jhmicro
|
|
||||||
httpport = 8010
|
|
||||||
runmode = dev
|
|
||||||
|
|
||||||
mysql = dljjj
|
|
@ -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,13 +0,0 @@
|
|||||||
module microservice
|
|
||||||
|
|
||||||
go 1.13
|
|
||||||
|
|
||||||
require github.com/beego/beego/v2 v2.0.1
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/astaxie/beego v1.12.3
|
|
||||||
github.com/go-sql-driver/mysql v1.5.0
|
|
||||||
github.com/go-stomp/stomp v2.1.4+incompatible
|
|
||||||
github.com/rs/xid v1.3.0
|
|
||||||
github.com/smartystreets/goconvey v1.6.4 // indirect
|
|
||||||
)
|
|
@ -1,284 +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 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
|
|
||||||
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
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 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
|
|
||||||
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 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
|
||||||
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/go-stomp/stomp v1.0.2 h1:apk/+6YIaphgNd+K0MoOkxENskEa9dSDUq5OADDcqKw=
|
|
||||||
github.com/go-stomp/stomp v2.1.4+incompatible h1:D3SheUVDOz9RsjVWkoh/1iCOwD0qWjyeTZMUZ0EXg2Y=
|
|
||||||
github.com/go-stomp/stomp v2.1.4+incompatible/go.mod h1:VqCtqNZv1226A1/79yh+rMiFUcfY3R109np+7ke4n0c=
|
|
||||||
github.com/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 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
|
||||||
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 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
|
|
||||||
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
|
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
|
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
|
|
||||||
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 h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
|
||||||
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 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/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/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4=
|
|
||||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
|
||||||
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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
|
||||||
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 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
|
|
||||||
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 h1:1Bs6RVeBFtLZ8Yi1Hk07DiOqzvwLD/4hln4iahvFlag=
|
|
||||||
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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
|
||||||
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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
|
||||||
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,224 +0,0 @@
|
|||||||
package gojson
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Js struct {
|
|
||||||
data interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Initialize the json configruation
|
|
||||||
func Json(data string) *Js {
|
|
||||||
j := new(Js)
|
|
||||||
var f interface{}
|
|
||||||
err := json.Unmarshal([]byte(data), &f)
|
|
||||||
if err != nil {
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
j.data = f
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
//According to the key of the returned data information,return js.data
|
|
||||||
func (j *Js) Get(key string) *Js {
|
|
||||||
m := j.Getdata()
|
|
||||||
if v, ok := m[key]; ok {
|
|
||||||
j.data = v
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
j.data = nil
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
//判断是否有郊
|
|
||||||
func (j *Js) IsValid() bool {
|
|
||||||
if nil == j.data {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//return json data
|
|
||||||
func (j *Js) Getdata() map[string]interface{} {
|
|
||||||
if m, ok := (j.data).(map[string]interface{}); ok {
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *Js) Getindex(i int) *Js {
|
|
||||||
|
|
||||||
num := i - 1
|
|
||||||
if m, ok := (j.data).([]interface{}); ok {
|
|
||||||
//防止越界
|
|
||||||
if num < len((j.data).([]interface{})) {
|
|
||||||
v := m[num]
|
|
||||||
j.data = v
|
|
||||||
} else {
|
|
||||||
j.data = nil
|
|
||||||
}
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
if m, ok := (j.data).(map[string]interface{}); ok {
|
|
||||||
var n = 0
|
|
||||||
var data = make(map[string]interface{})
|
|
||||||
for i, v := range m {
|
|
||||||
if n == num {
|
|
||||||
switch vv := v.(type) {
|
|
||||||
case float64:
|
|
||||||
data[i] = strconv.FormatFloat(vv, 'f', -1, 64)
|
|
||||||
j.data = data
|
|
||||||
return j
|
|
||||||
case string:
|
|
||||||
data[i] = vv
|
|
||||||
j.data = data
|
|
||||||
return j
|
|
||||||
case []interface{}:
|
|
||||||
j.data = vv
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
j.data = nil
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
// When the data {"result":["username","password"]} can use arrayindex(1) get the username
|
|
||||||
func (j *Js) Arrayindex(i int) string {
|
|
||||||
num := i - 1
|
|
||||||
if i > len((j.data).([]interface{})) {
|
|
||||||
data := errors.New("index out of range list").Error()
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
if m, ok := (j.data).([]interface{}); ok {
|
|
||||||
v := m[num]
|
|
||||||
switch vv := v.(type) {
|
|
||||||
case float64:
|
|
||||||
return strconv.FormatFloat(vv, 'f', -1, 64)
|
|
||||||
case string:
|
|
||||||
return vv
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := (j.data).(map[string]interface{}); ok {
|
|
||||||
return "error"
|
|
||||||
}
|
|
||||||
return "error"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//The data must be []interface{} ,According to your custom number to return your key and array data
|
|
||||||
func (j *Js) Getkey(key string, i int) *Js {
|
|
||||||
num := i - 1
|
|
||||||
if i > len((j.data).([]interface{})) {
|
|
||||||
j.data = errors.New("index out of range list").Error()
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
if m, ok := (j.data).([]interface{}); ok {
|
|
||||||
v := m[num].(map[string]interface{})
|
|
||||||
if h, ok := v[key]; ok {
|
|
||||||
j.data = h
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
j.data = nil
|
|
||||||
return j
|
|
||||||
}
|
|
||||||
|
|
||||||
//According to the custom of the PATH to find the PATH
|
|
||||||
func (j *Js) Getpath(args ...string) *Js {
|
|
||||||
d := j
|
|
||||||
for i := range args {
|
|
||||||
m := d.Getdata()
|
|
||||||
|
|
||||||
if val, ok := m[args[i]]; ok {
|
|
||||||
d.data = val
|
|
||||||
} else {
|
|
||||||
d.data = nil
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *Js) Tostring() string {
|
|
||||||
if m, ok := j.data.(string); ok {
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
if m, ok := j.data.(float64); ok {
|
|
||||||
return strconv.FormatFloat(m, 'f', -1, 64)
|
|
||||||
}
|
|
||||||
if m, ok := j.data.(bool); ok {
|
|
||||||
return strconv.FormatBool(m)
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *Js) ToArray() (k, d []string) {
|
|
||||||
var key, data []string
|
|
||||||
if m, ok := (j.data).([]interface{}); ok {
|
|
||||||
for _, value := range m {
|
|
||||||
for index, v := range value.(map[string]interface{}) {
|
|
||||||
switch vv := v.(type) {
|
|
||||||
case float64:
|
|
||||||
data = append(data, strconv.FormatFloat(vv, 'f', -1, 64))
|
|
||||||
key = append(key, index)
|
|
||||||
case string:
|
|
||||||
data = append(data, vv)
|
|
||||||
key = append(key, index)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return key, data
|
|
||||||
}
|
|
||||||
|
|
||||||
if m, ok := (j.data).(map[string]interface{}); ok {
|
|
||||||
for index, v := range m {
|
|
||||||
switch vv := v.(type) {
|
|
||||||
case float64:
|
|
||||||
data = append(data, strconv.FormatFloat(vv, 'f', -1, 64))
|
|
||||||
key = append(key, index)
|
|
||||||
case string:
|
|
||||||
data = append(data, vv)
|
|
||||||
key = append(key, index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return key, data
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *Js) StringtoArray() []string {
|
|
||||||
var data []string
|
|
||||||
for _, v := range j.data.([]interface{}) {
|
|
||||||
switch vv := v.(type) {
|
|
||||||
case string:
|
|
||||||
data = append(data, vv)
|
|
||||||
case float64:
|
|
||||||
data = append(data, strconv.FormatFloat(vv, 'f', -1, 64))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
func (j *Js) Type() {
|
|
||||||
fmt.Println(reflect.TypeOf(j.data))
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
beego "github.com/beego/beego/v2/server/web"
|
|
||||||
"microservice/notify"
|
|
||||||
"microservice/order_settle"
|
|
||||||
"microservice/pay_for"
|
|
||||||
"microservice/query"
|
|
||||||
_ "microservice/supplier"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
RegisterLogs()
|
|
||||||
//logs.SetLogger(logs.AdapterFile, `{"level": 7, "color":true, "filename":"jhmicro.log"}`)
|
|
||||||
go notify.CreateOrderNotifyConsumer()
|
|
||||||
go query.CreateSupplierOrderQueryCuConsumer()
|
|
||||||
go pay_for.PayForInit()
|
|
||||||
go query.CreatePayForQueryConsumer()
|
|
||||||
go order_settle.OrderSettleInit()
|
|
||||||
beego.Run()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
** 注册日志信息
|
|
||||||
*/
|
|
||||||
func RegisterLogs() {
|
|
||||||
logs.SetLogger(logs.AdapterFile,
|
|
||||||
`{
|
|
||||||
"filename":"../logs/legend.log",
|
|
||||||
"level":4,
|
|
||||||
"maxlines":0,
|
|
||||||
"maxsize":0,
|
|
||||||
"daily":true,
|
|
||||||
"maxdays":10,
|
|
||||||
"color":true
|
|
||||||
}`)
|
|
||||||
|
|
||||||
f := &logs.PatternLogFormatter{
|
|
||||||
Pattern: "%F:%n|%w%t>> %m",
|
|
||||||
WhenFormat: "2006-01-02",
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.RegisterFormatter("pattern", f)
|
|
||||||
_ = logs.SetGlobalFormatter("pattern")
|
|
||||||
}
|
|
@ -1,45 +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 (
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"github.com/go-stomp/stomp"
|
|
||||||
"microservice/common"
|
|
||||||
"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/beego/beego/v2/core/logs"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
func SendMessage(topic, message string) {
|
|
||||||
|
|
||||||
conn := GetActiveMQConn()
|
|
||||||
|
|
||||||
if conn == nil {
|
|
||||||
logs.Error("send message get Active mq fail")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := conn.Send(topic, "text/plain", []byte(message))
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("发送消息给activeMQ失败, message=", message)
|
|
||||||
} else {
|
|
||||||
logs.Info("发送消息给activeMQ成功,message=", message)
|
|
||||||
}
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type AccountInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
AccountUid string
|
|
||||||
AccountName string
|
|
||||||
Balance float64 //账户总余额
|
|
||||||
SettleAmount float64 //已经结算的金额
|
|
||||||
LoanAmount float64 //账户押款金额
|
|
||||||
FreezeAmount float64 //账户冻结金额
|
|
||||||
WaitAmount float64 //待结算资金
|
|
||||||
PayforAmount float64 //代付在途金额
|
|
||||||
//AbleBalance float64 //账户可用金额
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const ACCOUNT_INFO = "account_info"
|
|
||||||
|
|
||||||
func InsetAcount(account AccountInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&account)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert account fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAccountByUid(accountUid string) AccountInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var account AccountInfo
|
|
||||||
_, err := o.QueryTable(ACCOUNT_INFO).Filter("account_uid", accountUid).Limit(1).All(&account)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get account by uid fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return account
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAccountLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ACCOUNT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).OrderBy("-update_time").Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get account len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAccountByMap(params map[string]string, displayCount, offset int) []AccountInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var accountList []AccountInfo
|
|
||||||
qs := o.QueryTable(ACCOUNT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&accountList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get account by map fail: ", err)
|
|
||||||
}
|
|
||||||
return accountList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAllAccount() []AccountInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var accountList []AccountInfo
|
|
||||||
|
|
||||||
_, err := o.QueryTable(ACCOUNT_INFO).Limit(-1).All(&accountList)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all account fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return accountList
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateAccount(account AccountInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&account)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update account fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteAccountByUid(accountUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(ACCOUNT_INFO).Filter("account_uid", accountUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete account fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type AccountHistoryInfo struct {
|
|
||||||
Id int
|
|
||||||
AccountUid string
|
|
||||||
AccountName string
|
|
||||||
Type string
|
|
||||||
Amount float64
|
|
||||||
Balance float64
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const ACCOUNT_HISTORY_INFO = "account_history_info"
|
|
||||||
|
|
||||||
func InsertAccountHistory(accountHistory AccountHistoryInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(accountHistory)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert account history fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAccountHistoryLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ACCOUNT_HISTORY_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get account history len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAccountHistoryByMap(params map[string]string, displayCount, offset int) []AccountHistoryInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ACCOUNT_HISTORY_INFO)
|
|
||||||
var accountHistoryList []AccountHistoryInfo
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&accountHistoryList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get account history by map fail: ", err)
|
|
||||||
}
|
|
||||||
return accountHistoryList
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type AgentInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
AgentName string
|
|
||||||
AgentPassword string
|
|
||||||
PayPassword string
|
|
||||||
AgentRemark string
|
|
||||||
AgentUid string
|
|
||||||
AgentPhone string
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const AGENT_INFO = "agent_info"
|
|
||||||
|
|
||||||
func IsEixstByAgentName(agentName string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(AGENT_INFO).Filter("agent_name", agentName).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsExistByAgentUid(uid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(AGENT_INFO).Filter("agent_uid", uid).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsEixstByAgentPhone(agentPhone string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(AGENT_INFO).Filter("agent_phone", agentPhone).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func InsertAgentInfo(agentInfo AgentInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&agentInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert agent info fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAgentInfoByAgentUid(agentUid string) AgentInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var agentInfo AgentInfo
|
|
||||||
_, err := o.QueryTable(AGENT_INFO).Filter("agent_uid", agentUid).Limit(1).All(&agentInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get agent info by agentUid fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return agentInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAgentInfoByPhone(phone string) AgentInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var agentInfo AgentInfo
|
|
||||||
_, err := o.QueryTable(AGENT_INFO).Filter("agent_phone", phone).Limit(1).All(&agentInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get agent info by phone fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return agentInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAgentInfoLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(AGENT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get agentinfo len by map fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAgentInfoByMap(params map[string]string, displayCount, offset int) []AgentInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var agentInfoList []AgentInfo
|
|
||||||
|
|
||||||
qs := o.QueryTable(AGENT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&agentInfoList)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get agentInfo by map fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return agentInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAllAgentByMap(parmas map[string]string) []AgentInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var agentList []AgentInfo
|
|
||||||
|
|
||||||
qs := o.QueryTable(AGENT_INFO)
|
|
||||||
for k, v := range parmas {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := qs.Limit(-1).All(&agentList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all agent by map fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return agentList
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateAgentInfo(agentInfo AgentInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&agentInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update agentinfo fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteAgentByAgentUid(agentUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(AGENT_INFO).Filter("agent_uid", agentUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete agent by agent uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type BankCardInfo struct {
|
|
||||||
Id int
|
|
||||||
Uid string
|
|
||||||
UserName string
|
|
||||||
BankName string
|
|
||||||
BankCode string
|
|
||||||
BankAccountType string
|
|
||||||
AccountName string
|
|
||||||
BankNo string
|
|
||||||
IdentifyCard string
|
|
||||||
CertificateNo string
|
|
||||||
PhoneNo string
|
|
||||||
BankAddress string
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const BANK_CARD_INFO = "bank_card_info"
|
|
||||||
|
|
||||||
func InsertBankCardInfo(bankCardInfo BankCardInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&bankCardInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert bank card info fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBankCardLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(BANK_CARD_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get bank card len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBankCardByMap(params map[string]string, displayCount, offset int) []BankCardInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var bankCardList []BankCardInfo
|
|
||||||
qs := o.QueryTable(BANK_CARD_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&bankCardList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get bank card by map fail: ", err)
|
|
||||||
}
|
|
||||||
return bankCardList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetBankCardByUid(uid string) BankCardInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var bankCardInfo BankCardInfo
|
|
||||||
_, err := o.QueryTable(bankCardInfo).Filter("uid", uid).Limit(1).All(&bankCardInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get bank card by uid fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return bankCardInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteBankCardByUid(uid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(BANK_CARD_INFO).Filter("uid", uid).Delete()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete bank card by uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateBankCard(bankCard BankCardInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&bankCard)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update bank card fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
_ "github.com/go-sql-driver/mysql"
|
|
||||||
"microservice/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)
|
|
||||||
|
|
||||||
logs.Info("mysql init.....", link)
|
|
||||||
|
|
||||||
orm.RegisterDriver("mysql", orm.DRMySQL)
|
|
||||||
orm.RegisterDataBase("default", "mysql", link)
|
|
||||||
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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MenuInfo struct {
|
|
||||||
Id int
|
|
||||||
MenuOrder int
|
|
||||||
MenuUid string
|
|
||||||
FirstMenu string
|
|
||||||
SecondMenu string
|
|
||||||
Creater string
|
|
||||||
Status string
|
|
||||||
CreateTime string
|
|
||||||
UpdateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
//实现排序的三个接口函数
|
|
||||||
type MenuInfoSlice []MenuInfo
|
|
||||||
|
|
||||||
func (m MenuInfoSlice) Len() int {
|
|
||||||
return len(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m MenuInfoSlice) Swap(i, j int) {
|
|
||||||
m[i], m[j] = m[j], m[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m MenuInfoSlice) Less(i, j int) bool {
|
|
||||||
return m[i].MenuOrder < m[j].MenuOrder //从小到大排序
|
|
||||||
}
|
|
||||||
|
|
||||||
const MENUINFO = "menu_info"
|
|
||||||
|
|
||||||
func InsertMenu(menuInfo MenuInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&menuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert new menu info fail:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func FirstMenuIsExists(firstMenu string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MENUINFO).Filter("first_menu", firstMenu).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func FirstMenuUidIsExists(firstMenUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MENUINFO).Filter("menu_uid", firstMenUid).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func MenuOrderIsExists(menuOrder int) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MENUINFO).Filter("menu_order", menuOrder).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuLen() int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
cnt, err := o.QueryTable(MENUINFO).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu info len length fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuInfoByMenuUid(menuUid string) MenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var menuInfo MenuInfo
|
|
||||||
_, err := o.QueryTable(MENUINFO).Filter("menu_uid", menuUid).Limit(1).All(&menuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu info by menuUid fail: ", err)
|
|
||||||
}
|
|
||||||
return menuInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuInfosByMenuUids(menuUids []string) []MenuInfo {
|
|
||||||
menuInfoList := make([]MenuInfo, 0)
|
|
||||||
for _, v := range menuUids {
|
|
||||||
m := GetMenuInfoByMenuUid(v)
|
|
||||||
menuInfoList = append(menuInfoList, m)
|
|
||||||
}
|
|
||||||
return menuInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuInfoByMenuOrder(menuOrder int) MenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var menuInfo MenuInfo
|
|
||||||
_, err := o.QueryTable(MENUINFO).Filter("menu_order", menuOrder).Limit(1).All(&menuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu info by menu order fail: ", err)
|
|
||||||
}
|
|
||||||
return menuInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuAll() []MenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var menuInfoList []MenuInfo
|
|
||||||
_, err := o.QueryTable(MENUINFO).OrderBy("-update_time").All(&menuInfoList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all menu list fail:", err)
|
|
||||||
}
|
|
||||||
return menuInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuOffset(displayCount, offset int) []MenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var menuInfoList []MenuInfo
|
|
||||||
_, err := o.QueryTable(MENUINFO).Limit(displayCount, offset).All(&menuInfoList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu offset fail: ", err)
|
|
||||||
}
|
|
||||||
return menuInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuOffsetByMap(params map[string]string, displayCount, offset int) []MenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var menuInfoList []MenuInfo
|
|
||||||
qs := o.QueryTable(MENUINFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&menuInfoList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu offset by map fail: ", err)
|
|
||||||
}
|
|
||||||
return menuInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMenuLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MENUINFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get menu len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateMenuInfo(menuInfo MenuInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
cnt, err := o.Update(&menuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update menu info fail: ", err)
|
|
||||||
}
|
|
||||||
logs.Info("update menu info success, num: ", cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteMenuInfo(menuUid string) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
cnt, err := o.QueryTable(MENUINFO).Filter("menu_uid", menuUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete menu info fail: ", err)
|
|
||||||
}
|
|
||||||
logs.Info("delete menu info num: ", cnt)
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MerchantDeployInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
MerchantUid string
|
|
||||||
PayType string
|
|
||||||
SingleRoadUid string
|
|
||||||
SingleRoadName string
|
|
||||||
SingleRoadPlatformRate float64
|
|
||||||
SingleRoadAgentRate float64
|
|
||||||
RollRoadCode string
|
|
||||||
RollRoadName string
|
|
||||||
RollRoadPlatformRate float64
|
|
||||||
RollRoadAgentRate float64
|
|
||||||
IsLoan string
|
|
||||||
LoanRate float64
|
|
||||||
LoanDays int
|
|
||||||
UnfreezeHour int
|
|
||||||
WaitUnfreezeAmount float64
|
|
||||||
LoanAmount float64
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const MERCHANT_DEPLOY_INFO = "merchant_deploy_info"
|
|
||||||
|
|
||||||
func 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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MerchantInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
BelongAgentUid string
|
|
||||||
BelongAgentName string
|
|
||||||
MerchantName string
|
|
||||||
MerchantUid string
|
|
||||||
MerchantKey string
|
|
||||||
MerchantSecret string
|
|
||||||
LoginPassword string
|
|
||||||
LoginAccount string
|
|
||||||
AutoSettle string
|
|
||||||
AutoPayFor string
|
|
||||||
WhiteIps string
|
|
||||||
Remark string
|
|
||||||
SinglePayForRoadUid string
|
|
||||||
SinglePayForRoadName string
|
|
||||||
RollPayForRoadCode string
|
|
||||||
RollPayForRoadName string
|
|
||||||
PayforFee float64
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const MERCHANT_INFO = "merchant_info"
|
|
||||||
|
|
||||||
func IsExistByMerchantName(merchantName string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_name", merchantName).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsExistByMerchantUid(uid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", uid).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsExistMerchantByAgentUid(uid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsExistByMerchantPhone(phone string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(MERCHANT_INFO).Filter("LoginAccount", phone).Exist()
|
|
||||||
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantByPhone(phone string) (m MerchantInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, e := o.QueryTable(MERCHANT_INFO).Filter("LoginAccount", phone).Limit(1).All(&m)
|
|
||||||
if e != nil {
|
|
||||||
logs.Error("GetMerchantByPhone merchant fail: ", e)
|
|
||||||
}
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func InsertMerchantInfo(merchantInfo MerchantInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&merchantInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert merchant fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MERCHANT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get merchant len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantListByMap(params map[string]string, displayCount, offset int) []MerchantInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MERCHANT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var merchantList []MerchantInfo
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&merchantList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get merchant list by map fail: ", err)
|
|
||||||
}
|
|
||||||
return merchantList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAllMerchant() []MerchantInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var merchantList []MerchantInfo
|
|
||||||
|
|
||||||
_, err := o.QueryTable(MERCHANT_INFO).Limit(-1).All(&merchantList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all merchant fail:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return merchantList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantByParams(params map[string]string, displayCount, offset int) []MerchantInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var merchantList []MerchantInfo
|
|
||||||
qs := o.QueryTable(MERCHANT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qs.Limit(displayCount, offset).All(&merchantList)
|
|
||||||
|
|
||||||
return merchantList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantLenByParams(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MERCHANT_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get merchant len by params fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMerchantByUid(merchantUid string) MerchantInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var merchantInfo MerchantInfo
|
|
||||||
_, err := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", merchantUid).Limit(1).All(&merchantInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get merchant info fail: ", err)
|
|
||||||
}
|
|
||||||
return merchantInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func 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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MerchantLoadInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
MerchantUid string
|
|
||||||
RoadUid string
|
|
||||||
LoadDate string
|
|
||||||
LoadAmount float64
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const MERCHANT_LOAD_INFO = "merchant_load_info"
|
|
||||||
|
|
||||||
func GetMerchantLoadInfoByMap(params map[string]string) []MerchantLoadInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MERCHANT_LOAD_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var merchantLoadList []MerchantLoadInfo
|
|
||||||
_, err := qs.Limit(-11).All(&merchantLoadList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get merchant load info fail: ", err)
|
|
||||||
}
|
|
||||||
return merchantLoadList
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsExistMerchantLoadByParams(params map[string]string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(MERCHANT_LOAD_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return qs.Exist()
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type NotifyInfo struct {
|
|
||||||
Id int
|
|
||||||
Type string //订单-order,代付-payfor
|
|
||||||
BankOrderId string
|
|
||||||
MerchantOrderId string
|
|
||||||
Status string
|
|
||||||
Times int
|
|
||||||
Url string
|
|
||||||
Response string
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const NOTIFYINFO = "notify_info"
|
|
||||||
|
|
||||||
func InsertNotifyInfo(notifyInfo NotifyInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(¬ifyInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert notify fail:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func NotifyInfoExistByBankOrderId(bankOrderId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(NOTIFYINFO).Filter("bank_order_id", bankOrderId).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetNotifyInfoByBankOrderId(bankOrderId string) NotifyInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var notifyInfo NotifyInfo
|
|
||||||
_, err := o.QueryTable(NOTIFYINFO).Filter("bank_order_id", bankOrderId).All(¬ifyInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get notify info by bankOrderId fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return notifyInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetNotifyInfosNotSuccess(params map[string]interface{}) []NotifyInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var notifyInfoList []NotifyInfo
|
|
||||||
qs := o.QueryTable(NOTIFYINFO)
|
|
||||||
for k, v := range params {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
qs = qs.Exclude("status", "success")
|
|
||||||
_, err := qs.Limit(-1).All(¬ifyInfoList)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get notifyinfos fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return notifyInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func 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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type OrderInfo struct {
|
|
||||||
Id int
|
|
||||||
ShopName string //商品名称
|
|
||||||
OrderPeriod string //订单有效时间
|
|
||||||
MerchantOrderId string //商户订单id
|
|
||||||
BankOrderId string //本系统订单id
|
|
||||||
BankTransId string //上游流水id
|
|
||||||
OrderAmount float64 //订单提交的金额
|
|
||||||
ShowAmount float64 //待支付的金额
|
|
||||||
FactAmount float64 //用户实际支付金额
|
|
||||||
RollPoolCode string //轮询池编码
|
|
||||||
RollPoolName string //轮询池名臣
|
|
||||||
RoadUid string //通道标识
|
|
||||||
RoadName string //通道名称
|
|
||||||
PayProductName string //上游支付公司的名称
|
|
||||||
PayProductCode string //上游支付公司的编码代号
|
|
||||||
PayTypeCode string //支付产品编码
|
|
||||||
PayTypeName string //支付产品名称
|
|
||||||
OsType string //操作系统类型
|
|
||||||
Status string //订单支付状态
|
|
||||||
Refund string //退款状态
|
|
||||||
RefundTime string //退款操作时间
|
|
||||||
Freeze string //冻结状态
|
|
||||||
FreezeTime string //冻结时间
|
|
||||||
Unfreeze string //是否已经解冻
|
|
||||||
UnfreezeTime string //解冻时间
|
|
||||||
ReturnUrl string //支付完跳转地址
|
|
||||||
NotifyUrl string //下游回调地址
|
|
||||||
MerchantUid string //商户id
|
|
||||||
MerchantName string //商户名称
|
|
||||||
AgentUid string //该商户所属代理
|
|
||||||
AgentName string //该商户所属代理名称
|
|
||||||
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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type OrderSettleInfo struct {
|
|
||||||
Id int
|
|
||||||
PayProductCode string
|
|
||||||
PayProductName string
|
|
||||||
PayTypeCode string
|
|
||||||
RoadUid string
|
|
||||||
PayTypeName string
|
|
||||||
MerchantUid string
|
|
||||||
MerchantName string
|
|
||||||
MerchantOrderId string
|
|
||||||
BankOrderId string
|
|
||||||
SettleAmount float64
|
|
||||||
IsAllowSettle string
|
|
||||||
IsCompleteSettle string
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const ORDER_SETTLE_INFO = "order_settle_info"
|
|
||||||
|
|
||||||
func GetOrderSettleListByParams(params map[string]string) []OrderSettleInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ORDER_SETTLE_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var orderSettleList []OrderSettleInfo
|
|
||||||
if _, err := qs.Limit(-1).All(&orderSettleList); err != nil {
|
|
||||||
logs.Error("get order settle list fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return orderSettleList
|
|
||||||
}
|
|
@ -1,228 +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 (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/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()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
var tmp PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if tmp.Status == common.PAYFOR_FAIL || tmp.Status == common.PAYFOR_SUCCESS {
|
|
||||||
return errors.New("订单已经处理")
|
|
||||||
}
|
|
||||||
|
|
||||||
//如果是手动打款,并且是需要处理商户金额
|
|
||||||
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 := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
//计算该用户的可用金额
|
|
||||||
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 := txOrm.Update(&account); err != nil {
|
|
||||||
logs.Error("for update payfor update account fail:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logs.Error(fmt.Sprintf("商户uid=%s,可用金额不够", payFor.MerchantUid))
|
|
||||||
payFor.ResponseContext = "商户可用余额不足"
|
|
||||||
payFor.Status = common.PAYFOR_FAIL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&payFor); err != nil {
|
|
||||||
logs.Error("for update payfor fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PowerInfo struct {
|
|
||||||
Id int
|
|
||||||
FirstMenuUid string
|
|
||||||
SecondMenuUid string
|
|
||||||
SecondMenu string
|
|
||||||
PowerId string
|
|
||||||
PowerItem string
|
|
||||||
Creater string
|
|
||||||
Status string
|
|
||||||
CreateTime string
|
|
||||||
UpdateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const POWER_INFO = "power_info"
|
|
||||||
|
|
||||||
type PowerInfoSlice []PowerInfo
|
|
||||||
|
|
||||||
func (sm PowerInfoSlice) Len() int {
|
|
||||||
return len(sm)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm PowerInfoSlice) Swap(i, j int) {
|
|
||||||
sm[i], sm[j] = sm[j], sm[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm PowerInfoSlice) Less(i, j int) bool {
|
|
||||||
return sm[i].SecondMenuUid < sm[j].SecondMenuUid
|
|
||||||
}
|
|
||||||
|
|
||||||
func PowerUidExists(powerUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exists := o.QueryTable(POWER_INFO).Filter("power_id", powerUid).Exist()
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
|
|
||||||
func InsertPowerInfo(powerInfo PowerInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&powerInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert power info fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPower() []PowerInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var powerInfo []PowerInfo
|
|
||||||
_, err := o.QueryTable(POWER_INFO).Limit(-1).All(&powerInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get power fail: ", err)
|
|
||||||
}
|
|
||||||
return powerInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPowerById(powerId string) PowerInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var powerInfo PowerInfo
|
|
||||||
_, err := o.QueryTable(POWER_INFO).Filter("power_id", powerId).Limit(1).All(&powerInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get power by id fail: ", err)
|
|
||||||
}
|
|
||||||
return powerInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPowerByIds(powerIds []string) []PowerInfo {
|
|
||||||
var powerInfoList []PowerInfo
|
|
||||||
for _, v := range powerIds {
|
|
||||||
m := GetPowerById(v)
|
|
||||||
powerInfoList = append(powerInfoList, m)
|
|
||||||
}
|
|
||||||
return powerInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPowerItemLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(POWER_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get power item len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPowerItemByMap(params map[string]string, displpay, offset int) []PowerInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var powerItemList []PowerInfo
|
|
||||||
qs := o.QueryTable(POWER_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := qs.Limit(displpay, offset).OrderBy("-update_time").All(&powerItemList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get power item by map fail: ", err)
|
|
||||||
}
|
|
||||||
return powerItemList
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeletePowerItemByPowerID(powerID string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(POWER_INFO).Filter("power_id", powerID).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete power item by powerID fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeletePowerBySecondUid(secondUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(POWER_INFO).Filter("second_menu_uid", secondUid).Delete()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete power by second menu uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RoadInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
RoadName string
|
|
||||||
RoadUid string
|
|
||||||
Remark string
|
|
||||||
ProductName string
|
|
||||||
ProductUid string
|
|
||||||
PayType string
|
|
||||||
BasicFee float64
|
|
||||||
SettleFee float64
|
|
||||||
TotalLimit float64
|
|
||||||
TodayLimit float64
|
|
||||||
SingleMinLimit float64
|
|
||||||
SingleMaxLimit float64
|
|
||||||
StarHour int
|
|
||||||
EndHour int
|
|
||||||
Params string
|
|
||||||
TodayIncome float64
|
|
||||||
TotalIncome float64
|
|
||||||
TodayProfit float64
|
|
||||||
TotalProfit float64
|
|
||||||
Balance float64
|
|
||||||
RequestAll int
|
|
||||||
RequestSuccess int
|
|
||||||
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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RoadPoolInfo struct {
|
|
||||||
Id int
|
|
||||||
Status string
|
|
||||||
RoadPoolName string
|
|
||||||
RoadPoolCode string
|
|
||||||
RoadUidPool string
|
|
||||||
UpdateTime string
|
|
||||||
CreateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const ROAD_POOL_INFO = "road_pool_info"
|
|
||||||
|
|
||||||
func InsertRoadPool(roadPool RoadPoolInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&roadPool)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert road pool fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoadPoolLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ROAD_POOL_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get road pool len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoadPoolByMap(params map[string]string, displayCount, offset int) []RoadPoolInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roadPoolList []RoadPoolInfo
|
|
||||||
qs := o.QueryTable(ROAD_POOL_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&roadPoolList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get road pool by map fail: ", err)
|
|
||||||
}
|
|
||||||
return roadPoolList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoadPoolByRoadPoolCode(roadPoolCode string) RoadPoolInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roadPoolInfo RoadPoolInfo
|
|
||||||
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_code", roadPoolCode).Limit(1).All(&roadPoolInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get road pool info by road pool code fail: ", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return roadPoolInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetAllRollPool(params map[string]string) []RoadPoolInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roadPoolList []RoadPoolInfo
|
|
||||||
qs := o.QueryTable(ROAD_POOL_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(-1).All(&roadPoolList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all roll pool fail: ", err)
|
|
||||||
}
|
|
||||||
return roadPoolList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoadPoolByName(roadPoolName string) RoadPoolInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roadPoolInfo RoadPoolInfo
|
|
||||||
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_name", roadPoolName).Limit(1).All(&roadPoolInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get road pool by name fail: ", err)
|
|
||||||
}
|
|
||||||
return roadPoolInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteRoadPoolByCode(roadPoolCode string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(ROAD_POOL_INFO).Filter("road_pool_code", roadPoolCode).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete road pool by code fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateRoadPool(roadPool RoadPoolInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&roadPool)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update road pool fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RoleInfo struct {
|
|
||||||
Id int
|
|
||||||
RoleName string
|
|
||||||
RoleUid string
|
|
||||||
ShowFirstMenu string
|
|
||||||
ShowFirstUid string
|
|
||||||
ShowSecondMenu string
|
|
||||||
ShowSecondUid string
|
|
||||||
ShowPower string
|
|
||||||
ShowPowerUid string
|
|
||||||
Creater string
|
|
||||||
Status string
|
|
||||||
Remark string
|
|
||||||
CreateTime string
|
|
||||||
UpdateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
const ROLE_INFO = "role_info"
|
|
||||||
|
|
||||||
func GetRoleLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(ROLE_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cnt, err := qs.Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get role len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRole() []RoleInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roleInfo []RoleInfo
|
|
||||||
_, err := o.QueryTable(ROLE_INFO).Limit(-1).OrderBy("-update_time").All(&roleInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get all role fail: ", err)
|
|
||||||
}
|
|
||||||
return roleInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoleByMap(params map[string]string, display, offset int) []RoleInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roleInfo []RoleInfo
|
|
||||||
qs := o.QueryTable(ROLE_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(display, offset).OrderBy("-update_time").All(&roleInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get role by map fail: ", err)
|
|
||||||
}
|
|
||||||
return roleInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRoleByRoleUid(roleUid string) RoleInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var roleInfo RoleInfo
|
|
||||||
_, err := o.QueryTable(ROLE_INFO).Filter("role_uid", roleUid).Limit(1).All(&roleInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get role by role uid fail: ", err)
|
|
||||||
}
|
|
||||||
return roleInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func RoleNameExists(roleName string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exists := o.QueryTable(ROLE_INFO).Filter("role_name", roleName).Exist()
|
|
||||||
return exists
|
|
||||||
}
|
|
||||||
|
|
||||||
func InsertRole(roleInfo RoleInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&roleInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert role fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteRoleByRoleUid(roleUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(ROLE_INFO).Filter("role_uid", roleUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete role by role uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateRoleInfo(roleInfo RoleInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&roleInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update role info fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
const SECOND_MENU_INFO = "second_menu_info"
|
|
||||||
|
|
||||||
type SecondMenuInfo struct {
|
|
||||||
Id int
|
|
||||||
FirstMenuOrder int
|
|
||||||
FirstMenuUid string
|
|
||||||
FirstMenu string
|
|
||||||
MenuOrder int
|
|
||||||
SecondMenuUid string
|
|
||||||
SecondMenu string
|
|
||||||
SecondRouter string
|
|
||||||
Creater string
|
|
||||||
Status string
|
|
||||||
CreateTime string
|
|
||||||
UpdateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
type SecondMenuSlice []SecondMenuInfo
|
|
||||||
|
|
||||||
func (sm SecondMenuSlice) Len() int {
|
|
||||||
return len(sm)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm SecondMenuSlice) Swap(i, j int) {
|
|
||||||
sm[i], sm[j] = sm[j], sm[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm SecondMenuSlice) Less(i, j int) bool {
|
|
||||||
if sm[i].FirstMenuOrder == sm[j].FirstMenuOrder {
|
|
||||||
return sm[i].MenuOrder < sm[j].MenuOrder
|
|
||||||
}
|
|
||||||
return sm[i].FirstMenuOrder < sm[j].FirstMenuOrder
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuLen() int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
cnt, err := o.QueryTable(SECOND_MENU_INFO).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second meun len fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuInfoByMenuOrder(menuOrder int, firstMenuUid string) SecondMenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var secondMenuInfo SecondMenuInfo
|
|
||||||
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Filter("menu_order", menuOrder).Limit(1).All(&secondMenuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu info by menu order fail: ", err)
|
|
||||||
}
|
|
||||||
return secondMenuInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuLenByFirstMenuUid(firstMenuUid string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
cnt, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu len by first menu uid fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuList() []SecondMenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var secondMenuList []SecondMenuInfo
|
|
||||||
_, err := o.QueryTable(SECOND_MENU_INFO).Limit(-1).OrderBy("-update_time").All(&secondMenuList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu list fail: ", err)
|
|
||||||
}
|
|
||||||
return secondMenuList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuInfoBySecondMenuUid(secondMenuUid string) SecondMenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var secondMenuInfo SecondMenuInfo
|
|
||||||
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Limit(1).All(&secondMenuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get scond menu info by second menu uid fail: ", err)
|
|
||||||
}
|
|
||||||
return secondMenuInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuInfoBySecondMenuUids(secondMenuUids []string) []SecondMenuInfo {
|
|
||||||
secondMenuInfoList := make([]SecondMenuInfo, 0)
|
|
||||||
for _, v := range secondMenuUids {
|
|
||||||
sm := GetSecondMenuInfoBySecondMenuUid(v)
|
|
||||||
secondMenuInfoList = append(secondMenuInfoList, sm)
|
|
||||||
}
|
|
||||||
return secondMenuInfoList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuListByFirstMenuUid(firstMenuUid string) []SecondMenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var secondMenuList []SecondMenuInfo
|
|
||||||
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Limit(-1).OrderBy("-update_time").All(&secondMenuList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu list by first menu uid fail: ", err)
|
|
||||||
}
|
|
||||||
return secondMenuList
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(SECOND_MENU_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
cnt, err := qs.Limit(-1).Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSecondMenuByMap(params map[string]string, displayCount, offset int) []SecondMenuInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var secondMenuList []SecondMenuInfo
|
|
||||||
qs := o.QueryTable(SECOND_MENU_INFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Limit(displayCount, offset).OrderBy("-update_time").All(&secondMenuList)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get second menu by map fail: ", err)
|
|
||||||
}
|
|
||||||
return secondMenuList
|
|
||||||
}
|
|
||||||
func InsertSecondMenu(secondMenuInfo SecondMenuInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&secondMenuInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert second menu fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func SecondMenuIsExists(seconfMenu string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu", seconfMenu).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func SecondMenuUidIsExists(secondMenuUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func SecondRouterExists(secondRouter string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(SECOND_MENU_INFO).Filter("second_router", secondRouter).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteSecondMenuByFirstMenuUid(firstMenuUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
num, err := o.QueryTable(SECOND_MENU_INFO).Filter("first_menu_uid", firstMenuUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete second menu by first menu uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
logs.Info("delete second menu by first menu uid success, num: ", num)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteSecondMenuBySecondMenuUid(secondMenuUid string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
num, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondMenuUid).Delete()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete second menu by second menu uid fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
logs.Info("delete second menu by second menu uid success, num: ", num)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateSecondMenuOrderBySecondUid(secondUid string, order int) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(SECOND_MENU_INFO).Filter("second_menu_uid", secondUid).Update(orm.Params{"menu_order": order})
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update second menu order by second menu uid fail: ", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateSecondMenu(secondMenu SecondMenuInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Update(&secondMenu)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update second menu for first order fail: ", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func SecondMenuExistByMenuOrder(menuOrder int) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(SECOND_MENU_INFO).Filter("menu_order", menuOrder).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
@ -1,82 +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 (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"github.com/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
func OperatorAccount(accountUid, operatorType string, amount float64) (string, bool) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
msg := ""
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
//处理事务
|
|
||||||
accountInfo := new(AccountInfo)
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
return errors.New("处理失败")
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(accountInfo); err != nil {
|
|
||||||
logs.Error("operator account update account fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
//往account_history表中插入一条动账记录
|
|
||||||
accountHistory := AccountHistoryInfo{AccountUid: accountUid, AccountName: accountInfo.AccountName, Type: operatorType,
|
|
||||||
Amount: amount, Balance: accountInfo.Balance, CreateTime: utils.GetBasicDateTime(), UpdateTime: utils.GetBasicDateTime()}
|
|
||||||
|
|
||||||
if _, err := txOrm.Insert(&accountHistory); err != nil {
|
|
||||||
logs.Error("operator account insert account history fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
return msg, false
|
|
||||||
}
|
|
||||||
|
|
||||||
return msg, 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/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
USERINFO = "user_info"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UserInfo struct {
|
|
||||||
Id int
|
|
||||||
UserId string
|
|
||||||
Passwd string
|
|
||||||
Nick string
|
|
||||||
Remark string
|
|
||||||
Ip string
|
|
||||||
Status string
|
|
||||||
Role string
|
|
||||||
RoleName string
|
|
||||||
CreateTime string
|
|
||||||
UpdateTime string
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUserInfoByUserID(userID string) UserInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var userInfo UserInfo
|
|
||||||
err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userID).One(&userInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get user info fail: ", err)
|
|
||||||
}
|
|
||||||
return userInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetOperatorByMap(params map[string]string, displayCount, offset int) []UserInfo {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
var userInfo []UserInfo
|
|
||||||
qs := o.QueryTable(USERINFO)
|
|
||||||
for k, v := range params {
|
|
||||||
if len(v) > 0 {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := qs.Exclude("status", "delete").Limit(displayCount, offset).OrderBy("-update_time").All(&userInfo)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get operator by map fail: ", err)
|
|
||||||
}
|
|
||||||
return userInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetOperatorLenByMap(params map[string]string) int {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
qs := o.QueryTable(USERINFO)
|
|
||||||
for k, v := range params {
|
|
||||||
qs = qs.Filter(k, v)
|
|
||||||
}
|
|
||||||
cnt, err := qs.Exclude("status", "delete").Count()
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("get operator len by map fail: ", err)
|
|
||||||
}
|
|
||||||
return int(cnt)
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateUserInfoIP(userInfo UserInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
num, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userInfo.UserId).Update(orm.Params{"ip": userInfo.Ip})
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("%s update user info ip fail: %v", userInfo.UserId, err)
|
|
||||||
} else {
|
|
||||||
logs.Info("%s update user info ip success, num: %d", userInfo.UserId, num)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateUserInfoPassword(userInfo UserInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
num, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userInfo.UserId).Update(orm.Params{"passwd": userInfo.Passwd})
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("%s update user info password fail: %v", userInfo.UserId, err)
|
|
||||||
} else {
|
|
||||||
logs.Info("%s update user info password success, update num: %d", userInfo.UserId, num)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateUserInfo(userInfo UserInfo) {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
if num, err := o.Update(&userInfo); err != nil {
|
|
||||||
logs.Error("update user info fail: ", err)
|
|
||||||
} else {
|
|
||||||
logs.Info("update user info success, num: ", num)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func UpdateStauts(status, userId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(USERINFO).Filter("user_id", userId).Update(orm.Params{"status": status})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("update status fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func UserInfoExistByUserId(userId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userId).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func NickIsExist(nick string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
exist := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("nick", nick).Exist()
|
|
||||||
return exist
|
|
||||||
}
|
|
||||||
|
|
||||||
func InsertUser(userInfo UserInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.Insert(&userInfo)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("insert user fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteUserByUserId(userId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
_, err := o.QueryTable(USERINFO).Exclude("status", "delete").Filter("user_id", userId).Update(orm.Params{"status": "delete"})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("delete user by userId fail: ", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -1,163 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : This file for ...
|
|
||||||
** @Time : 2019/11/20 1:35
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : order_notify
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/11/20 1:35
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package notify
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/client/httplib"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"github.com/go-stomp/stomp"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/message_queue"
|
|
||||||
"microservice/models"
|
|
||||||
"microservice/utils"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type OrderNotifyTask struct {
|
|
||||||
Delay *time.Timer
|
|
||||||
MerchantOrderId string
|
|
||||||
BankOrderId string
|
|
||||||
FirstNotifyTime string
|
|
||||||
NotifyTimes int
|
|
||||||
LimitTimes int
|
|
||||||
Status string //success-通知成功,其余的为待通知或者通知未完成
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
LimitTimes = 5 //最多通知5次
|
|
||||||
)
|
|
||||||
|
|
||||||
//给商户发送订单结果
|
|
||||||
func SendOrderNotify(bankOrderId string) {
|
|
||||||
if !models.NotifyInfoExistByBankOrderId(bankOrderId) {
|
|
||||||
logs.Error("该订单不存在回调内容,bankOrderId=", bankOrderId)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
notifyInfo := models.GetNotifyInfoByBankOrderId(bankOrderId)
|
|
||||||
if notifyInfo.Status == "success" {
|
|
||||||
logs.Info(fmt.Sprintf("该订单=%s,已经回调", bankOrderId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
notifyInfo.Times += 1
|
|
||||||
notifyInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
|
|
||||||
req := httplib.Post(notifyInfo.Url)
|
|
||||||
response, err := req.String()
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
if strings.Contains(strings.ToLower(response), "success") {
|
|
||||||
notifyInfo.Status = "success"
|
|
||||||
if models.UpdateNotifyInfo(notifyInfo) {
|
|
||||||
logs.Info("订单回调成功, bankOrderId=", bankOrderId)
|
|
||||||
} else {
|
|
||||||
logs.Error("订单回调成功,但是更新数据库失败, bankOrderId=", bankOrderId)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logs.Notice("订单已经回调,商户已经收到了回调通知,但是返回值错误: ", response)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if notifyInfo.Times > LimitTimes {
|
|
||||||
logs.Notice(fmt.Sprintf("该订单=%s,已经超过了回调次数", bankOrderId))
|
|
||||||
} else {
|
|
||||||
minute := GetOrderNotifyMinute(notifyInfo.Times)
|
|
||||||
task := OrderNotifyTask{Delay: time.NewTimer(time.Duration(minute) * time.Minute),
|
|
||||||
MerchantOrderId: notifyInfo.MerchantOrderId, BankOrderId: notifyInfo.BankOrderId, FirstNotifyTime: notifyInfo.CreateTime,
|
|
||||||
NotifyTimes: notifyInfo.Times, LimitTimes: LimitTimes, Status: notifyInfo.Status}
|
|
||||||
logs.Info(fmt.Sprintf("订单bankOrderId=%s,已经是第:%d,回调", bankOrderId, notifyInfo.Times))
|
|
||||||
go OrderNotifyTimer(task)
|
|
||||||
if !models.UpdateNotifyInfo(notifyInfo) {
|
|
||||||
logs.Error("订单回调失败,数据库更新失败:", bankOrderId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetOrderNotifyMinute(times int) int {
|
|
||||||
cur := 1
|
|
||||||
switch times {
|
|
||||||
case 0:
|
|
||||||
cur = 1
|
|
||||||
case 2:
|
|
||||||
cur = 2
|
|
||||||
case 3:
|
|
||||||
cur = 5
|
|
||||||
case 4:
|
|
||||||
cur = 15
|
|
||||||
case 5:
|
|
||||||
cur = 30
|
|
||||||
}
|
|
||||||
return cur
|
|
||||||
}
|
|
||||||
|
|
||||||
func OrderNotifyTimer(task OrderNotifyTask) {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-task.Delay.C:
|
|
||||||
SendOrderNotify(task.BankOrderId)
|
|
||||||
task.Delay.Stop()
|
|
||||||
return
|
|
||||||
//70分钟没有执行该协程,那么退出协程
|
|
||||||
case <-time.After(time.Minute * 70):
|
|
||||||
logs.Notice("订单回调延时执行,70分钟没有执行")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//读取一小时之内,未发送成功,并且还没有到达回调限制次数的记录读取,存入延迟队列
|
|
||||||
func CreateOrderDelayQueue() {
|
|
||||||
params := make(map[string]interface{})
|
|
||||||
params["times__lte"] = LimitTimes
|
|
||||||
params["create_time__gte"] = utils.GetDateTimeBeforeHours(1)
|
|
||||||
notifyList := models.GetNotifyInfosNotSuccess(params)
|
|
||||||
for _, notify := range notifyList {
|
|
||||||
minute := GetOrderNotifyMinute(notify.Times)
|
|
||||||
task := OrderNotifyTask{Delay: time.NewTimer(time.Duration(minute) * time.Minute),
|
|
||||||
MerchantOrderId: notify.MerchantOrderId, BankOrderId: notify.BankOrderId, FirstNotifyTime: notify.CreateTime,
|
|
||||||
NotifyTimes: notify.Times, LimitTimes: LimitTimes, Status: notify.Status}
|
|
||||||
go OrderNotifyTimer(task)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//创建订单回调消费者
|
|
||||||
func CreateOrderNotifyConsumer() {
|
|
||||||
CreateOrderDelayQueue()
|
|
||||||
//启动定时任务
|
|
||||||
conn := message_queue.GetActiveMQConn()
|
|
||||||
if conn == nil {
|
|
||||||
logs.Error("启动消息队列消费者失败....")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.Notice("订单回调消息队列启动成功......")
|
|
||||||
orderNotify, err := conn.Subscribe(common.MqOrderNotify, stomp.AckClient)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("订阅订单回调失败......")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case v := <-orderNotify.C:
|
|
||||||
if v != nil {
|
|
||||||
bankOrderId := string(v.Body)
|
|
||||||
go SendOrderNotify(bankOrderId)
|
|
||||||
//应答,重要
|
|
||||||
err := conn.Ack(v)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("消息应答失败!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : This file for ...
|
|
||||||
** @Time : 2019/11/20 1:35
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : payfor_notify
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/11/20 1:35
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package notify
|
|
@ -1,41 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : 将待结算的订单金额,加入账户可用金额中
|
|
||||||
** @Time : 2019/11/21 23:43
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : settle
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/11/21 23:43
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package order_settle
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
controller "microservice/supplier"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
SettleInterval = 5 //隔多少分钟进行结算
|
|
||||||
OneMinute = 15 //每隔15分钟,进行扫码,看有没有隔天押款金额
|
|
||||||
)
|
|
||||||
|
|
||||||
func OrderSettleInit() {
|
|
||||||
//每隔5分钟,巡查有没有可以进行结算的订单
|
|
||||||
go func() {
|
|
||||||
settleTimer := time.NewTimer(time.Duration(SettleInterval) * time.Minute)
|
|
||||||
oneMinuteTimer := time.NewTimer(time.Duration(OneMinute) * time.Minute)
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-settleTimer.C:
|
|
||||||
settleTimer = time.NewTimer(time.Duration(SettleInterval) * time.Minute)
|
|
||||||
logs.Info("开始对商户进行支付订单结算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
|
||||||
controller.OrderSettle()
|
|
||||||
case <-oneMinuteTimer.C:
|
|
||||||
oneMinuteTimer = time.NewTimer(time.Duration(OneMinute) * time.Minute)
|
|
||||||
logs.Info("开始执行商户的解款操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
|
|
||||||
controller.MerchantLoadSolve()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : 处理代付问题
|
|
||||||
** @Time : 2019/11/29 14:07
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : payfor
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/11/29 14:07
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package pay_for
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
"microservice/common"
|
|
||||||
controller "microservice/supplier"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func PayForInit() {
|
|
||||||
payForIntervalTimer := time.NewTimer(time.Duration(common.PAYFOR_INTERVAL * time.Second))
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-payForIntervalTimer.C:
|
|
||||||
logs.Info("代付小程序开始执行任务......")
|
|
||||||
payForIntervalTimer = time.NewTimer(time.Duration(common.PAYFOR_INTERVAL * time.Minute))
|
|
||||||
controller.SolvePayForConfirm()
|
|
||||||
controller.SolvePayFor()
|
|
||||||
case <-time.After(time.Duration(10 * time.Minute)):
|
|
||||||
logs.Notice("代付小程序已经10分钟没有执行了.........")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : This file for ...
|
|
||||||
** @Time : 2019/11/22 23:02
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : order_query
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/11/22 23:02
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package query
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
"github.com/go-stomp/stomp"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/message_queue"
|
|
||||||
"microservice/models"
|
|
||||||
controller "microservice/supplier"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type OrderQueryTask struct {
|
|
||||||
BankOrderId string
|
|
||||||
OrderQueryTimer *time.Timer
|
|
||||||
Times int
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
DelayTime = 5 //延时时间为5分钟查询一次
|
|
||||||
LimitTimes = 5 //最多查询5次
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
** 该接口是查询上游的订单
|
|
||||||
*/
|
|
||||||
func solveSupplierOrderQuery(task OrderQueryTask) {
|
|
||||||
bankOrderId := task.BankOrderId
|
|
||||||
orderInfo := models.GetOrderByBankOrderId(bankOrderId)
|
|
||||||
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
|
|
||||||
logs.Error("不存在这样的订单,订单查询结束")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if orderInfo.Status != "" && orderInfo.Status != "wait" {
|
|
||||||
logs.Error(fmt.Sprintf("该订单=%s,已经处理完毕,", bankOrderId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
supplierCode := orderInfo.PayProductCode
|
|
||||||
supplier := controller.GetPaySupplierByCode(supplierCode)
|
|
||||||
flag := supplier.PayQuery(orderInfo)
|
|
||||||
if flag {
|
|
||||||
logs.Info("订单查询成功, bankOrderId:", bankOrderId)
|
|
||||||
} else {
|
|
||||||
if task.Times <= LimitTimes {
|
|
||||||
task.Times += 1
|
|
||||||
task.OrderQueryTimer = time.NewTimer(time.Duration(5) * time.Minute)
|
|
||||||
DelayOrderQueryQueue(task)
|
|
||||||
} else {
|
|
||||||
logs.Notice(fmt.Sprintf("订单id=%s, 已经查询超过次数"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 延时队列
|
|
||||||
*/
|
|
||||||
func DelayOrderQueryQueue(task OrderQueryTask) {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-task.OrderQueryTimer.C:
|
|
||||||
logs.Info(fmt.Sprintf("订单id=%s,执行第:%d 次查询", task.BankOrderId, task.Times))
|
|
||||||
solveSupplierOrderQuery(task)
|
|
||||||
return
|
|
||||||
case <-time.After(time.Duration(2*DelayTime) * time.Minute):
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
** 启动消息订单查询的消息队列消费者
|
|
||||||
*/
|
|
||||||
func CreateSupplierOrderQueryCuConsumer() {
|
|
||||||
conn := message_queue.GetActiveMQConn()
|
|
||||||
if conn == nil {
|
|
||||||
logs.Error("supplier order query consumer fail")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
logs.Notice("启动订单查询的消费者成功.....")
|
|
||||||
orderQuerySub, _ := conn.Subscribe(common.MqOrderQuery, stomp.AckClient)
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case v := <-orderQuerySub.C:
|
|
||||||
if v != nil {
|
|
||||||
bankOrderId := string(v.Body)
|
|
||||||
logs.Info("消费者正在处理订单查询: " + bankOrderId)
|
|
||||||
task := OrderQueryTask{BankOrderId: bankOrderId, OrderQueryTimer: time.NewTimer(time.Second * 1), Times: 1}
|
|
||||||
DelayOrderQueryQueue(task)
|
|
||||||
//应答,重要
|
|
||||||
err := conn.Ack(v)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("消息应答失败!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,135 +0,0 @@
|
|||||||
/***************************************************
|
|
||||||
** @Desc : 处理代付查询功能
|
|
||||||
** @Time : 2019/12/3 15:07
|
|
||||||
** @Author : yuebin
|
|
||||||
** @File : pay_for_query
|
|
||||||
** @Last Modified by : yuebin
|
|
||||||
** @Last Modified time: 2019/12/3 15:07
|
|
||||||
** @Software: GoLand
|
|
||||||
****************************************************/
|
|
||||||
package query
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"github.com/go-stomp/stomp"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/message_queue"
|
|
||||||
"microservice/models"
|
|
||||||
controller "microservice/supplier"
|
|
||||||
"microservice/utils"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PayForQueryTask struct {
|
|
||||||
Delay *time.Timer
|
|
||||||
MerchantOrderId string
|
|
||||||
BankOrderId string
|
|
||||||
FirstNotifyTime string
|
|
||||||
QueryTimes int
|
|
||||||
LimitTimes int
|
|
||||||
Status string
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
PayForLimitTimes = 12 //最多查询次数
|
|
||||||
PayForQueryInterval = 5 //时间间隔为5分钟
|
|
||||||
)
|
|
||||||
|
|
||||||
func PayForQueryTimer(task PayForQueryTask) {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-task.Delay.C:
|
|
||||||
PayForSupplier(task)
|
|
||||||
task.Delay.Stop()
|
|
||||||
return
|
|
||||||
//70分钟没有执行该协程,那么退出协程
|
|
||||||
case <-time.After(time.Minute * 70):
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func PayForSupplier(task PayForQueryTask) {
|
|
||||||
logs.Info(fmt.Sprintf("执行代付查询任务:%+v", task))
|
|
||||||
payFor := models.GetPayForByBankOrderId(task.BankOrderId)
|
|
||||||
roadInfo := models.GetRoadInfoByRoadUid(payFor.RoadUid)
|
|
||||||
supplier := controller.GetPaySupplierByCode(roadInfo.ProductUid)
|
|
||||||
if supplier == nil {
|
|
||||||
logs.Error("代付查询返回supplier为空")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
res, _ := supplier.PayForQuery(payFor)
|
|
||||||
if res == common.PAYFOR_SUCCESS {
|
|
||||||
//代付成功了
|
|
||||||
controller.PayForSuccess(payFor)
|
|
||||||
} else if res == common.PAYFOR_FAIL {
|
|
||||||
//代付失败
|
|
||||||
controller.PayForFail(payFor)
|
|
||||||
} else if res == common.PAYFOR_BANKING {
|
|
||||||
//银行处理中,那么就继续执行查询,直到次数超过最大次数
|
|
||||||
if task.QueryTimes <= task.LimitTimes {
|
|
||||||
task.QueryTimes += 1
|
|
||||||
task.Delay = time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute)
|
|
||||||
go PayForQueryTimer(task)
|
|
||||||
} else {
|
|
||||||
logs.Info(fmt.Sprintf("该代付订单已经超过最大查询次数,bankOrderId = %s", task.BankOrderId))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func payForQueryConsumer(bankOrderId string) {
|
|
||||||
exist := models.IsExistPayForByBankOrderId(bankOrderId)
|
|
||||||
if !exist {
|
|
||||||
logs.Error(fmt.Sprintf("代付记录不存在,bankOrderId = %s", bankOrderId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
payFor := models.GetPayForByBankOrderId(bankOrderId)
|
|
||||||
|
|
||||||
if payFor.Status != common.PAYFOR_BANKING {
|
|
||||||
logs.Info(fmt.Sprintf("代付状态不是银行处理中,不需要去查询,bankOrderId = %s", bankOrderId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
payForQueryTask := PayForQueryTask{Delay: time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute), MerchantOrderId: payFor.MerchantOrderId,
|
|
||||||
BankOrderId: payFor.BankOrderId, FirstNotifyTime: utils.GetBasicDateTime(), QueryTimes: 1, LimitTimes: PayForLimitTimes, Status: payFor.Status}
|
|
||||||
|
|
||||||
go PayForQueryTimer(payForQueryTask)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 创建代付查询的消费者
|
|
||||||
*/
|
|
||||||
func CreatePayForQueryConsumer() {
|
|
||||||
//启动定时任务
|
|
||||||
conn := message_queue.GetActiveMQConn()
|
|
||||||
if conn == nil {
|
|
||||||
logs.Error("启动消息队列消费者失败....")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.Notice("代付查询消费启动成功......")
|
|
||||||
|
|
||||||
payForQuery, err := conn.Subscribe(common.MQ_PAYFOR_QUERY, stomp.AckClient)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("订阅代付查询失败......")
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case v := <-payForQuery.C:
|
|
||||||
if v != nil {
|
|
||||||
bankOrderId := string(v.Body)
|
|
||||||
go payForQueryConsumer(bankOrderId)
|
|
||||||
//应答,重要
|
|
||||||
err := conn.Ack(v)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("消息应答失败!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 (
|
|
||||||
"microservice/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/beego/beego/v2/adapter/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/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,33 +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 (
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
_ "microservice/models"
|
|
||||||
)
|
|
||||||
|
|
||||||
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/beego/beego/v2/adapter/httplib"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
beego "github.com/beego/beego/v2/server/web"
|
|
||||||
"github.com/rs/xid"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/gojson"
|
|
||||||
"microservice/models"
|
|
||||||
"microservice/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,192 +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 (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/models"
|
|
||||||
"microservice/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()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
tmpSettle := new(models.OrderSettleInfo)
|
|
||||||
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tmpSettle.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
tmpSettle.IsCompleteSettle = common.YES
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(tmpSettle); err != nil {
|
|
||||||
logs.Error("更新tmpSettle失败,错误:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountInfo := new(models.AccountInfo)
|
|
||||||
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid=? for update", orderSettle.MerchantUid).QueryRow(accountInfo); err != nil || accountInfo == nil {
|
|
||||||
logs.Error("结算select account info失败,错误信息:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
accountInfo.SettleAmount += orderProfit.FactAmount
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(accountInfo); err != nil {
|
|
||||||
logs.Error("结算update account 失败,错误信息:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
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 := txOrm.Insert(tmp); err != nil {
|
|
||||||
logs.Error("結算插入merchantLoad失敗,失败信息:", err)
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
logs.Info("结算插入新的merchantLoad信息成功")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
merchantLoad := new(models.MerchantLoadInfo)
|
|
||||||
if err := txOrm.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))
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
merchantLoad.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
merchantLoad.LoadAmount = merchantLoad.LoadAmount + loadAmount
|
|
||||||
if _, err := txOrm.Update(merchantLoad); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("结算过程,update merchant load info失败,失败信息:%s", err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logs.Info(fmt.Sprintf("结算过程中,该商户不需要押款,全款结算"))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
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()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
tmpLoad := new(models.MerchantLoadInfo)
|
|
||||||
|
|
||||||
if err := txOrm.Raw("select * from merchant_load_info where merchant_uid=? and road_uid=? and load_date=? for update",
|
|
||||||
merchantLoad.MerchantUid, merchantLoad.RoadUid, merchantLoad.LoadDate).QueryRow(tmpLoad); err != nil || tmpLoad == nil {
|
|
||||||
logs.Error(fmt.Sprintf("解款操作获取商户押款信息失败,fail: %s", err))
|
|
||||||
return err
|
|
||||||
|
|
||||||
}
|
|
||||||
if tmpLoad.Status != common.NO {
|
|
||||||
logs.Error(fmt.Sprintf("押款信息merchantuid=%s,通道uid=%s, 押款日期=%s,已经解款过,不需要再进行处理了", tmpLoad.MerchantUid, tmpLoad.RoadUid, tmpLoad.LoadDate))
|
|
||||||
return errors.New("已经解款过,不需要再进行处理了")
|
|
||||||
}
|
|
||||||
|
|
||||||
tmpLoad.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
tmpLoad.Status = common.YES
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(tmpLoad); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("解款操作更新merchant load info 失败:%s", err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountInfo := new(models.AccountInfo)
|
|
||||||
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if accountInfo.LoanAmount >= tmpLoad.LoadAmount {
|
|
||||||
accountInfo.LoanAmount -= tmpLoad.LoadAmount
|
|
||||||
} else {
|
|
||||||
accountInfo.LoanAmount = common.ZERO
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(accountInfo); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("解款操作更新account info 失败:%s,账户uid=%s", err, accountInfo.AccountUid))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
@ -1,489 +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 (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/message_queue"
|
|
||||||
"microservice/models"
|
|
||||||
"microservice/utils"
|
|
||||||
url2 "net/url"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PaySolveController struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
//处理支付成功的加款等各项操作
|
|
||||||
func (c *PaySolveController) SolvePaySuccess(bankOrderId string, factAmount float64, trxNo string) bool {
|
|
||||||
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
var orderInfo models.OrderInfo
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
|
||||||
logs.Error("不存在该订单,或者select for update出错")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orderInfo.Status != "wait" {
|
|
||||||
logs.Error("该订单已经处理,订单号=", bankOrderId)
|
|
||||||
return errors.New(fmt.Sprintf("该订单已经处理,订单号= %s", bankOrderId))
|
|
||||||
}
|
|
||||||
|
|
||||||
if factAmount <= common.ZERO {
|
|
||||||
factAmount = orderInfo.OrderAmount
|
|
||||||
}
|
|
||||||
|
|
||||||
var orderProfitInfo models.OrderProfitInfo
|
|
||||||
if err := txOrm.Raw("select * from order_profit_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderProfitInfo); err != nil || orderProfitInfo.BankOrderId == "" {
|
|
||||||
logs.Error("select order_profit_info for update fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orderProfitInfo.BankOrderId == "" {
|
|
||||||
logs.Error("solve pay success, get orderProfit fail, bankOrderId = ", bankOrderId)
|
|
||||||
return errors.New(fmt.Sprintf("solve pay success, get orderProfit fail, bankOrderId = %s", bankOrderId))
|
|
||||||
}
|
|
||||||
|
|
||||||
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 := txOrm.Update(orderProfitInfo); err != nil {
|
|
||||||
logs.Info("solve pay success fail:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
orderInfo.Status = common.SUCCESS
|
|
||||||
orderInfo.BankTransId = trxNo
|
|
||||||
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if _, err := txOrm.Update(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success, update order info fail: %s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//插入一条待结算记录
|
|
||||||
settAmount := orderProfitInfo.FactAmount - orderProfitInfo.SupplierProfit - orderProfitInfo.PlatformProfit - orderProfitInfo.AgentProfit
|
|
||||||
if settAmount <= 0.00 {
|
|
||||||
logs.Error(fmt.Sprintf("订单id=%s,计算利润存在异常", bankOrderId))
|
|
||||||
return errors.New(fmt.Sprintf("订单id=%s,计算利润存在异常", bankOrderId))
|
|
||||||
}
|
|
||||||
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 := txOrm.Insert(&orderSettleInfo); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success,insert order settle info fail: %s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//做账户的加款操作,最重要的一部
|
|
||||||
var accountInfo models.AccountInfo
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(&accountInfo); err != nil || accountInfo.AccountUid == "" {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success, raw account info fail: %s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := txOrm.QueryTable(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))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//添加一条动账记录
|
|
||||||
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 := txOrm.Insert(&accountHistory); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success,insert account history fail:%s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//更新通道信息
|
|
||||||
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 := txOrm.Update(&roadInfo); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success, update road info fail: %s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//更新订单利润表
|
|
||||||
orderProfitInfo.Status = common.SUCCESS
|
|
||||||
orderProfitInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if _, err := txOrm.Update(&orderProfitInfo); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay success, update order profit info fail: %s, bankOrderId = %s", err, bankOrderId))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 给下游发送回调通知
|
|
||||||
go c.CreateOrderNotifyInfo(orderInfo, common.SUCCESS)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("SolvePaySuccess失败:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.Info("SolvePaySuccess处理成功")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
//处理支付失败
|
|
||||||
func (c *PaySolveController) SolvePayFail(orderInfo models.OrderInfo, str string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
var orderTmp models.OrderInfo
|
|
||||||
bankOrderId := orderInfo.BankOrderId
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ?", bankOrderId).QueryRow(&orderTmp); err != nil || orderTmp.BankOrderId == "" {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orderTmp.Status != "wait" {
|
|
||||||
return errors.New("订单已经处理,不要重复加款")
|
|
||||||
}
|
|
||||||
if _, err := txOrm.QueryTable(models.ORDER_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": str, "bank_trans_id": orderInfo.BankTransId}); err != nil {
|
|
||||||
logs.Error("更改订单状态失败:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := txOrm.QueryTable(models.ORDER_PROFIT_INFO).Filter("bank_order_id", bankOrderId).Update(orm.Params{"status": str, "bank_trans_id": orderInfo.BankTransId}); err != nil {
|
|
||||||
logs.Error("更改订单状态失败:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
go c.CreateOrderNotifyInfo(orderInfo, common.FAIL)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("SolvePayFail:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.Info("SolvePayFail成功")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
//处理订单冻结
|
|
||||||
func (c *PaySolveController) SolveOrderFreeze(bankOrderId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
var orderInfo models.OrderInfo
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(&orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
|
||||||
logs.Error("solve order freeze 不存在这样的订单记录,bankOrderId = ", bankOrderId)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orderInfo.Status != common.SUCCESS {
|
|
||||||
logs.Error("非成功订单不能进行冻结")
|
|
||||||
return errors.New("非成功订单不能进行冻结")
|
|
||||||
}
|
|
||||||
|
|
||||||
orderInfo.Freeze = common.YES
|
|
||||||
orderInfo.FreezeTime = utils.GetBasicDateTime()
|
|
||||||
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if _, err := txOrm.Update(&orderInfo); err != nil {
|
|
||||||
logs.Error("solve order freeze fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//账户的冻结金额里面加入相应的金额
|
|
||||||
orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId)
|
|
||||||
var accountInfo models.AccountInfo
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(&accountInfo); err != nil || accountInfo.AccountUid == "" {
|
|
||||||
logs.Error(fmt.Sprintf("solve pay fail select acount fail:%s", err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
accountInfo.FreezeAmount = accountInfo.FreezeAmount + orderProfitInfo.UserInAmount
|
|
||||||
if _, err := txOrm.Update(&accountInfo); err != nil {
|
|
||||||
logs.Error("solve order freeze fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
//插入一条动账记录
|
|
||||||
accountHistoryInfo := 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 := txOrm.Insert(&accountHistoryInfo); err != nil {
|
|
||||||
logs.Error("solve order freeze fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("SolveOrderFreeze:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
logs.Info("SolveOrderFreeze")
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
//订单解冻
|
|
||||||
func (c *PaySolveController) SolveOrderUnfreeze(bankOrderId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
orderInfo := new(models.OrderInfo)
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
|
||||||
logs.Error("solve order unfreeze 不存在这样的订单记录,bankOrderId = ", bankOrderId)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
orderInfo.Freeze = ""
|
|
||||||
orderInfo.Unfreeze = common.YES
|
|
||||||
orderInfo.UnfreezeTime = utils.GetBasicDateTime()
|
|
||||||
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if _, err := txOrm.Update(orderInfo); err != nil {
|
|
||||||
logs.Error("solve order unfreeze fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId)
|
|
||||||
|
|
||||||
accountInfo := new(models.AccountInfo)
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(accountInfo); err != nil || accountInfo.AccountUid == "" {
|
|
||||||
logs.Error(fmt.Sprintf("unfreeze select account fail: %s", err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
accountInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
accountInfo.FreezeAmount = accountInfo.FreezeAmount - orderProfitInfo.UserInAmount
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(accountInfo); err != nil {
|
|
||||||
logs.Error("solve order unfreeze fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountHistoryInfo := 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 := txOrm.Insert(&accountHistoryInfo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
logs.Error("SolveOrderUnfreeze失败:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PaySolveController) SolveRefund(bankOrderId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
orderInfo := new(models.OrderInfo)
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil || orderInfo.BankOrderId == "" {
|
|
||||||
logs.Error("solve refund 不存在这样的订单,bankOrderId = " + bankOrderId)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
orderInfo.Refund = common.YES
|
|
||||||
orderInfo.RefundTime = utils.GetBasicDateTime()
|
|
||||||
|
|
||||||
orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId)
|
|
||||||
account := new(models.AccountInfo)
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
account.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
account.SettleAmount = account.SettleAmount - orderProfitInfo.UserInAmount
|
|
||||||
account.Balance = account.Balance - orderProfitInfo.UserInAmount
|
|
||||||
|
|
||||||
if orderInfo.Freeze == common.YES {
|
|
||||||
account.FreezeAmount = account.FreezeAmount - orderProfitInfo.UserInAmount
|
|
||||||
if account.FreezeAmount < 0 {
|
|
||||||
account.FreezeAmount = common.ZERO
|
|
||||||
}
|
|
||||||
orderInfo.Freeze = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(orderInfo); err != nil {
|
|
||||||
logs.Error("solve order refund update order info fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := txOrm.Update(account); err != nil {
|
|
||||||
logs.Error("solve order refund update account fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountHistoryInfo := 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 := txOrm.Insert(&accountHistoryInfo); err != nil {
|
|
||||||
logs.Error("solve order refund insert account history fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
logs.Error("SolveRefund 成功:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PaySolveController) SolveOrderRoll(bankOrderId string) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
orderInfo := new(models.OrderInfo)
|
|
||||||
|
|
||||||
if err := txOrm.Raw("select * from order_info where bank_order_id = ? for update", bankOrderId).QueryRow(orderInfo); err != nil {
|
|
||||||
logs.Error("solve order roll fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if orderInfo.Status != common.SUCCESS {
|
|
||||||
logs.Error("solve order roll 订单不存在或者订单状态不是success, bankOrderId=", bankOrderId)
|
|
||||||
return errors.New("solve order roll failed")
|
|
||||||
}
|
|
||||||
orderInfo.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
|
|
||||||
orderProfitInfo := models.GetOrderProfitByBankOrderId(bankOrderId)
|
|
||||||
|
|
||||||
account := new(models.AccountInfo)
|
|
||||||
if err := txOrm.Raw("select * from account_info where account_uid = ? for update", orderInfo.MerchantUid).QueryRow(account); err != nil || account.AccountUid == "" {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
account.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if orderInfo.Refund == common.YES {
|
|
||||||
account.Balance = account.Balance + orderProfitInfo.UserInAmount
|
|
||||||
account.SettleAmount = account.SettleAmount + orderProfitInfo.UserInAmount
|
|
||||||
orderInfo.Refund = common.NO
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(orderInfo); err != nil {
|
|
||||||
logs.Error("solve order roll fail update order info fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err := txOrm.Update(account); err != nil {
|
|
||||||
logs.Error("solve order roll update account fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
accountHistoryInfo := 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 := txOrm.Insert(&accountHistoryInfo); err != nil {
|
|
||||||
logs.Error("solve order roll insert account history fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
logs.Error("SolveOrderRoll处理失败:", err)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
//比较订单金额和实际支付金额的大小
|
|
||||||
func (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,350 +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 (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"github.com/beego/beego/v2/client/orm"
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
|
||||||
"microservice/common"
|
|
||||||
"microservice/message_queue"
|
|
||||||
"microservice/models"
|
|
||||||
"microservice/utils"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func PayForFail(payFor models.PayforInfo) bool {
|
|
||||||
|
|
||||||
o := orm.NewOrm()
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
|
|
||||||
var tmpForPay models.PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if tmpForPay.Status == common.PAYFOR_FAIL || tmpForPay.Status == common.PAYFOR_SUCCESS {
|
|
||||||
logs.Error(fmt.Sprintf("该代付订单uid=%s,状态已经是最终结果", payFor.PayforUid))
|
|
||||||
return errors.New("状态已经是最终结果")
|
|
||||||
}
|
|
||||||
//更新payfor记录的状态
|
|
||||||
tmpForPay.Status = common.PAYFOR_FAIL
|
|
||||||
tmpForPay.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if _, err := txOrm.Update(&tmpForPay); err != nil {
|
|
||||||
logs.Error("PayForFail update payfor_info fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var account models.AccountInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
account.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if account.PayforAmount < (payFor.PayforAmount + payFor.PayforFee) {
|
|
||||||
logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", payFor.MerchantUid))
|
|
||||||
return errors.New("账户中待代付金额小于代付记录的金额")
|
|
||||||
}
|
|
||||||
//将正在打款中的金额减去
|
|
||||||
account.PayforAmount = account.PayforAmount - payFor.PayforAmount - payFor.PayforFee
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&account); err != nil {
|
|
||||||
logs.Error("PayForFail update account fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func PayForSuccess(payFor models.PayforInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
var tmpPayFor models.PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if tmpPayFor.Status == common.PAYFOR_FAIL || tmpPayFor.Status == common.PAYFOR_SUCCESS {
|
|
||||||
logs.Error(fmt.Sprintf("该代付订单uid=%s,已经是最终结果,不需要处理", payFor.PayforUid))
|
|
||||||
return errors.New("已经是最终结果,不需要处理")
|
|
||||||
}
|
|
||||||
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
tmpPayFor.Status = common.PAYFOR_SUCCESS
|
|
||||||
_, err := txOrm.Update(&tmpPayFor)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("PayForSuccess update payfor fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var account models.AccountInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
account.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
if account.PayforAmount < (payFor.PayforAmount + payFor.PayforFee) {
|
|
||||||
logs.Error(fmt.Sprintf("商户uid=%s,账户中待代付金额小于代付记录的金额", payFor.MerchantUid))
|
|
||||||
return errors.New("账户中待代付金额小于代付记录的金额")
|
|
||||||
}
|
|
||||||
|
|
||||||
//代付打款中的金额减去
|
|
||||||
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 := txOrm.Update(&account); err != nil {
|
|
||||||
logs.Error("PayForSuccess udpate account fail:", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//添加一条动账记录
|
|
||||||
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 := txOrm.Insert(&accountHistory); err != nil {
|
|
||||||
logs.Error("PayForSuccess insert account history fail: ", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
//检查是否单独填写了每笔代付的手续费
|
|
||||||
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 := orm.NewOrm()
|
|
||||||
// 开启事务
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
var tmpPayFor models.PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if tmpPayFor.Status != common.PAYFOR_COMFRIM {
|
|
||||||
logs.Notice(fmt.Sprintf("该代付记录uid=%s,已经被审核", payFor.PayforUid))
|
|
||||||
return errors.New("已经被审核")
|
|
||||||
}
|
|
||||||
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
tmpPayFor.Status = common.PAYFOR_SOLVING
|
|
||||||
tmpPayFor.GiveType = common.PAYFOR_ROAD
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&tmpPayFor); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("该代付记录uid=%s,从审核更新为正在处理出错: %s", payFor.PayforUid, err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
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) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
var tmpPayFor models.PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return errors.New("solve self payfor fail")
|
|
||||||
}
|
|
||||||
|
|
||||||
if tmpPayFor.IsSend == common.YES {
|
|
||||||
return errors.New("代付已经发送")
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
if _, err := txOrm.Update(&tmpPayFor); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
RequestPayFor(payFor)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendPayFor(payFor models.PayforInfo) bool {
|
|
||||||
o := orm.NewOrm()
|
|
||||||
|
|
||||||
if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
|
|
||||||
var tmpPayFor models.PayforInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var account models.AccountInfo
|
|
||||||
if err := txOrm.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)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//支付金额不足,将直接判定为失败,不往下面邹逻辑了
|
|
||||||
if account.SettleAmount-account.PayforAmount < tmpPayFor.PayforAmount+tmpPayFor.PayforFee {
|
|
||||||
tmpPayFor.Status = common.PAYFOR_FAIL
|
|
||||||
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&tmpPayFor); err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
account.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
account.PayforAmount = account.PayforAmount + payFor.PayforAmount + payFor.PayforFee
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&account); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更新账户表出错, err: %s", payFor.MerchantUid, err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
tmpPayFor.IsSend = common.YES
|
|
||||||
tmpPayFor.Status = common.PAYFOR_BANKING //变为银行处理中
|
|
||||||
tmpPayFor.RequestTime = utils.GetBasicDateTime()
|
|
||||||
tmpPayFor.UpdateTime = utils.GetBasicDateTime()
|
|
||||||
|
|
||||||
if _, err := txOrm.Update(&tmpPayFor); err != nil {
|
|
||||||
logs.Error(fmt.Sprintf("商户uid=%s,在发送代付给上游的处理中,更代付列表出错, err:%s", payFor.MerchantUid, err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
RequestPayFor(payFor)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
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 (
|
|
||||||
"microservice/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 (
|
|
||||||
"microservice/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,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/beego/beego/v2/core/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"
|
|
||||||
"fmt"
|
|
||||||
"image"
|
|
||||||
"image/color"
|
|
||||||
"image/png"
|
|
||||||
"io"
|
|
||||||
"math/rand"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user