package serviceGame
import (
"context"
"crypto/md5"
"encoding/json"
"errors"
"fmt"
"github.com/gogf/gf/v2/encoding/gcharset"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"log"
"time"
"tyj_admin/api/v1/game"
"tyj_admin/internal/dao"
"tyj_admin/internal/model/do"
"tyj_admin/internal/model/entity"
"tyj_admin/internal/service"
"tyj_admin/internal/serviceGame/internal"
)
type IGameOrder interface {
GetOrders ( ctx context . Context , req * game . OrderSearchReq ) ( res * game . OrderSearchRes , err error )
GetOrderCount ( ctx context . Context , req * game . OrderCountReq ) ( res * game . OrderCountRes , err error )
ChangeCoin ( ctx context . Context , req * game . AddCoinReq ) ( res * game . AddCoinRes , err error )
Deposit ( ctx context . Context , req * game . OrderDepositReq ) ( res * game . OrderDepositRes , err error )
//IosDeposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error)
GetOrderLog ( ctx context . Context , req * game . OrderLogReq ) ( res * game . OrderLogRes , err error )
GetOrderBehavior ( ctx context . Context , req * game . OrderBehaviorReq ) ( res * game . OrderBehaviorRes , err error )
GetRechargePer ( ctx context . Context , req * game . RechargePerReq ) ( res * game . RechargePerRes , err error )
GameRechargeControl ( ctx context . Context , req * game . RechargeControlReq ) ( res * game . RechargeControlRes , err error )
GetRechargeControl ( ctx context . Context , req * game . GetRechargeControlReq ) ( res * game . GetRechargeControlRes , err error )
AddRechargeControl ( ctx context . Context , req * game . AddRechargeControlReq ) ( res * game . AddRechargeControlRes , err error )
DeleteRechargeControl ( ctx context . Context , req * game . DeleteRechargeControlReq ) ( res * game . DeleteRechargeControlRes , err error )
ChangeOrderState ( ctx context . Context , req * game . ChangeOrderStateReq ) ( res * game . ChangeOrderStateRes , err error )
}
type gameOrderImpl struct {
}
var gameOrderService = gameOrderImpl { }
func GameOrder ( ) IGameOrder {
return & gameOrderService
}
func ( o gameOrderImpl ) ChangeCoin ( ctx context . Context , req * game . AddCoinReq ) ( res * game . AddCoinRes , err error ) {
res = new ( game . AddCoinRes )
mqttMoney := internal . MqttChangeMoney { }
mqttMoney . Body . Money = req . Amount
mqttMoney . Body . Uids = req . Uid
mqttMoney . Body . Type = req . AmountType
mqttMoney . Body . ModuleType = "changeMoney"
mqttMoney . ModuleId = "webadmin"
mqttMoney . ReqId = 1
js , err := json . Marshal ( mqttMoney )
connectCh := make ( chan bool )
server := "192.168.2.100:3005"
internal . SendMqttMoney ( js , connectCh , server )
defer close ( connectCh )
var result bool
for {
select {
case result = <- connectCh :
if result == false {
err = gerror . New ( "失败" )
return
} else {
return
}
}
}
}
type AndroIdRecharge struct {
GmMessage string ` json:"gmMessage" `
Md5Sign string ` json:"md5Sign" `
}
type Recharge struct {
Uid string ` json:"uid" `
Server string ` json:"server" `
Channel string ` json:"channel" `
RechargeId string ` json:"rechargeId" `
OrderNo string ` json:"orderNo" `
PayTime string ` json:"payTime" `
Amount string ` json:"amount" `
Status string ` json:"status" `
}
type IosRecharge struct {
OrderId string ` json:"orderId" `
Account string ` json:"uid" `
Receipt string ` json:"receipt" `
Server string ` json:"server" `
TimeStamp string ` json:"timeStamp" `
ItemId string ` json:"itemId" `
Gm string ` json:"gm" `
Token string ` json:"token" `
}
type DepositResult struct {
Status int ` json:"status" `
Code interface { } ` json:"code" `
Msg string ` json:"msg" `
}
func checkQuickMd5 ( nt_data string , sign string , md5Sign string ) bool {
return md5Sign == fmt . Sprintf ( "%x" , md5 . Sum ( [ ] byte ( nt_data + sign + internal . Md5key ) ) )
}
func encryptData ( code_data string ) string {
dataArr := [ ] rune ( code_data )
keyArr := [ ] byte ( internal . CallbackKey )
keyLen := len ( keyArr )
var tmpList [ ] int
for index , value := range dataArr {
base := int ( value )
dataString := base + int ( 0xFF & keyArr [ index % keyLen ] )
tmpList = append ( tmpList , dataString )
}
var str string
for _ , value := range tmpList {
str += "@" + fmt . Sprintf ( "%d" , value )
}
return str
}
var timeFormat = "2006-01-02 15:04:05"
func ( o gameOrderImpl ) Deposit ( ctx context . Context , req * game . OrderDepositReq ) ( res * game . OrderDepositRes , err error ) {
gmMessage := Recharge { }
//gmMessage.Server = fmt.Sprint(req.ServerId)
gmMessage . RechargeId = fmt . Sprint ( req . DepositId )
//gmMessage.Channel = req.Channel
gmMessage . OrderNo = fmt . Sprintf ( "GM%v%v" , req . Uid , time . Now ( ) . UnixMilli ( ) )
//gmMessage.OrderNo = fmt.Sprintf("GM%v%v%v", req.Uid, 11111111111, 22222)
if req . Count == 1 {
gmMessage . OrderNo = fmt . Sprintf ( "G2M%v%v" , req . Uid , time . Now ( ) . UnixMilli ( ) )
}
gmMessage . PayTime = time . Now ( ) . Format ( timeFormat )
gmMessage . Amount = fmt . Sprint ( req . Amount )
gmMessage . Status = "SUCCESS"
unit , err := internal . GetUnitByUid ( ctx , req . Uid , req . ServerId )
//uid, err := internal.GetIdToUid(ctx, req.Uid)
if err != nil {
log . Println ( "GetOrders 1 : " , req . Uid )
return nil , err
}
if req . ServerId != unit . Server {
var serverInfo entity . GameLoginUrl
for _ , v := range internal . ServerList {
if v . Id == unit . Server {
serverInfo = v
break
}
}
return nil , errors . New ( "区服选择错误!当前id在<" + fmt . Sprint ( serverInfo . Id ) + "><" + serverInfo . Name + ">区" )
}
gmMessage . Server = fmt . Sprint ( unit . Server )
gmMessage . Channel = unit . Channel
gmMessage . Uid = fmt . Sprint ( unit . Uid )
recharge := AndroIdRecharge { }
data , _ := json . Marshal ( gmMessage )
recharge . GmMessage = encryptData ( string ( data ) )
recharge . Md5Sign = fmt . Sprintf ( "%x" , md5 . Sum ( [ ] byte ( recharge . GmMessage + internal . Md5key ) ) )
fmt . Println ( "Deposit - json: " , string ( data ) , recharge . Md5Sign )
url := internal . RechargeServer + "/gmPay/notify"
rs , err := g . Client ( ) . Post ( ctx , url , recharge )
if err != nil {
log . Println ( "Post 1 : " , req . Uid , url , gjson . MustEncodeString ( recharge ) )
return nil , err
}
src := string ( rs . ReadAll ( ) )
tmp , _ := gcharset . ToUTF8 ( "UTF-8" , src )
fmt . Println ( "Deposit - json: " , tmp )
go insertRechargeLog ( ctx , gmMessage , tmp )
if tmp != "SUCCESS" {
g . Log ( ) . Info ( ctx , " Deposit === DecodeToJson err " , req . Uid , err . Error ( ) )
return nil , errors . New ( tmp )
}
return
}
func insertRechargeLog ( ctx context . Context , req Recharge , remark string ) ( err error ) {
_ , err = dao . GameRechargeLog . Ctx ( ctx ) . Insert ( & do . GameRechargeLog {
UnitId : req . Uid ,
Channel : req . Channel ,
Server : req . Server ,
Amount : req . Amount ,
Config : req . RechargeId ,
TradeNo : req . OrderNo ,
User : service . Context ( ) . GetLoginUser ( ctx ) . UserName ,
Remark : remark ,
} )
return
}
func ( o gameOrderImpl ) GetOrders ( ctx context . Context , req * game . OrderSearchReq ) ( res * game . OrderSearchRes , err error ) {
if req . PageSize == 0 {
req . PageSize = 10
}
orderModel := dao . GameRecharge . Ctx ( ctx )
if req . Account != "" {
uid , err := internal . AccountToUids ( ctx , req . Account )
if err != nil {
return nil , err
}
orderModel = orderModel . Where ( ` unitId in (?) ` , uid )
}
if req . Uid != 0 {
uid , err := internal . GetIdToUid ( ctx , int64 ( req . Uid ) )
if err != nil {
return nil , err
}
orderModel = orderModel . Where ( ` unitId=? ` , uid )
}
if req . Channel != "" {
orderModel = orderModel . Where ( ` channel=? ` , req . Channel )
}
if req . ExternalOrderId != "" {
orderModel = orderModel . Where ( ` externalTradeNo=? ` , req . ExternalOrderId )
}
if req . OrderId != "" {
orderModel = orderModel . Where ( ` tradeNo=? ` , req . OrderId )
}
if req . Status != 0 {
orderModel = orderModel . Where ( ` status=? ` , req . Status )
}
res = new ( game . OrderSearchRes )
res . Total , err = orderModel . Count ( )
if err != nil {
log . Println ( "GetOrdersBy" , err . Error ( ) )
}
orderModel . Page ( int ( req . PageNum ) , int ( req . PageSize ) ) . OrderDesc ( "createTime" ) . Scan ( & res . Orders )
for k , v := range res . Orders {
res . Orders [ k ] . StringId = fmt . Sprint ( v . UnitId )
uid , _ := internal . GetIdToUid ( ctx , v . UnitId )
res . Orders [ k ] . Uid = int32 ( uid )
}
return
}
func ( o gameOrderImpl ) GetOrderCount ( ctx context . Context , req * game . OrderCountReq ) ( res * game . OrderCountRes , err error ) {
res = new ( game . OrderCountRes )
sql := fmt . Sprintf ( ` select unitId,sum(amount) as amount,max(server) as server from game_recharge where 1=1 and status=2 ` )
if req . GM == 0 {
sql = fmt . Sprintf ( ` %s and tradeNo NOT LIKE 'GM%%' ` , sql )
}
if req . Server != 0 {
sql = fmt . Sprintf ( ` %s and server=%d ` , sql , req . Server )
}
sql = fmt . Sprintf ( ` %s group by unitId ` , sql )
sql = fmt . Sprintf ( ` select u.account,r.unitId as id,r.amount as allMoney,r.server as serverId from (%s) as r inner join game_unit as u on u.uid=r.unitId where 1=1 ` , sql )
sql = internal . CompareSqlType ( sql , req . Amount , "r.amount" , req . CompareType )
res . Total , err = g . Model ( ) . Raw ( sql ) . Count ( )
if err != nil {
log . Println ( "GetOrderCount 1 : " , err . Error ( ) )
return
}
err = g . Model ( ) . Raw ( sql ) . Page ( req . PageNo , req . PageSize ) . OrderAsc ( "u.account" ) . Scan ( & res . Orders )
if err != nil {
log . Println ( "GetOrderCount 2 : " , err . Error ( ) )
return
}
for k , v := range res . Orders {
if v . Id == 0 {
continue
}
res . Orders [ k ] . StringId = fmt . Sprint ( v . Id )
log . Println ( "GetOrderCount 31 : " , v . Id )
uid , err := internal . GetIdToUid ( ctx , v . Id )
if err != nil {
log . Println ( "GetOrderCount 3 : " , v . Id , uid , err . Error ( ) )
continue
}
res . Orders [ k ] . Uid = int32 ( uid )
}
data , _ := json . Marshal ( res . Orders )
log . Println ( "GetOrderCount 4 : " , string ( data ) )
return
}
func ( o gameOrderImpl ) GetOrderLog ( ctx context . Context , req * game . OrderLogReq ) ( res * game . OrderLogRes , err error ) {
res = new ( game . OrderLogRes )
g . Try ( ctx , func ( ctx context . Context ) {
modelTotal := dao . GameRegister . Ctx ( ctx )
if req . StartTime != 0 {
modelTotal = modelTotal . Where ( ` UNIX_TIMESTAMP(create_time)>? ` , req . StartTime / 1000 )
}
if req . EndTime != 0 {
modelTotal = modelTotal . Where ( ` UNIX_TIMESTAMP(create_time)<? ` , req . EndTime / 1000 )
}
if req . Channel != "" {
modelTotal = modelTotal . Where ( ` channel=? ` , req . Channel )
}
modelTotal . Group ( "channel" ) . FieldMax ( "channel" , "channel" ) . FieldCount ( "account" , "totalAccount" ) . Scan ( & res . AccountTotal )
var sql = fmt . Sprintf ( "select max(r.channel) as channel, sum(r.amount) as amount, u.account from game_recharge as r inner join game_unit as u on u.uid=r.unitId where r.status=2 and r.tradeNo NOT LIKE 'GM%%' " )
if req . StartTime != 0 {
sql += fmt . Sprintf ( ` and UNIX_TIMESTAMP(r.createTime)>%d ` , req . StartTime / 1000 )
}
if req . EndTime != 0 {
sql += fmt . Sprintf ( ` and UNIX_TIMESTAMP(r.createTime)<%d ` , req . EndTime / 1000 )
}
if req . RechargeTotal > 0 {
sql = internal . CompareSqlType ( sql , req . RechargeTotal , "r.amount" , req . CompareType1 )
}
if req . Channel != "" {
sql += fmt . Sprintf ( ` and r.channel="%s" ` , req . Channel )
if req . ServerId != 0 {
sql += fmt . Sprintf ( ` and r.server=%d ` , req . ServerId )
}
}
sql += fmt . Sprint ( " group by u.account" )
amountSql := fmt . Sprintf ( ` select max(a.channel) as channel, sum(a.amount) as totalAmount from (%s) as a WHERE 1=1 ` , sql )
if req . RechargeMin > 0 {
amountSql = internal . CompareSqlType ( amountSql , req . RechargeMin , "a.amount" , req . CompareType )
}
amountSql += " group by a.channel"
g . Model ( ) . Raw ( amountSql ) . Scan ( & res . AmountTotal )
accountSql := fmt . Sprintf ( ` select max(a.channel) as channel, count(1) as totalAccount from (%s) as a WHERE 1=1 ` , sql )
if req . RechargeMin > 0 {
accountSql = internal . CompareSqlType ( accountSql , req . RechargeMin , "a.amount" , req . CompareType )
}
accountSql += " group by a.channel"
g . Model ( ) . Raw ( accountSql ) . Scan ( & res . RechargeAccountTotal )
log . Printf ( "GetOrderLog: %v, %v, %v" , res . AmountTotal , res . AccountTotal , res . RechargeAccountTotal )
} )
return
}
func ( o gameOrderImpl ) GetOrderBehavior ( ctx context . Context , req * game . OrderBehaviorReq ) ( res * game . OrderBehaviorRes , err error ) {
res = new ( game . OrderBehaviorRes )
if req . StartTime == "" {
return nil , errors . New ( "填写注册时间!" )
}
g . Try ( ctx , func ( ctx context . Context ) {
modelTotal := dao . GameRegister . Ctx ( ctx )
modelTotal = modelTotal . Where ( ` STR_TO_DATE(create_time, "%Y-%m-%d")=? ` , req . StartTime )
modelTotal . Fields ( "max(channel) as channel, count(1) as totalAccount" ) . Group ( "channel" ) . Scan ( & res . Account )
sql := fmt . Sprintf ( ` select account from game_register where STR_TO_DATE(create_time, "%%Y-%%m-%%d")="%s" ` , req . StartTime )
sql = fmt . Sprintf ( ` select u.account,u.uid from game_unit as u inner join (%s) as a on a.account=u.account ` , sql )
amountSql := fmt . Sprintf ( ` select max ( r . channel ) as channel , sum ( r . amount ) as totalAmount , STR_TO_DATE ( r . createTime , "%%Y-%%m-%%d" ) as createTime
from game_recharge as r inner join ( % s ) as c on c . uid = r . unitId where r . status = 2 and r . tradeNo NOT LIKE ' GM % % ' group by r . channel , STR_TO_DATE ( r . createTime , "%%Y-%%m-%%d" ) ` , sql )
g . Model ( ) . Raw ( amountSql ) . Scan ( & res . AmountList )
accountSql := fmt . Sprintf ( ` SELECT max ( a . channel ) AS channel , count ( a . account ) as totalAccount , a . createTime as createTime
FROM ( SELECT max ( r . channel ) AS channel , c . account AS account , min ( STR_TO_DATE ( r . createTime , "%%Y-%%m-%%d" ) ) AS createTime
FROM game_recharge AS r INNER JOIN ( % s ) AS c ON c . uid = r . unitId WHERE r . STATUS = 2 AND r . tradeNo NOT LIKE ' GM % % ' GROUP BY r . channel , c . account ) as a
GROUP BY a . channel , a . createTime ` , sql )
g . Model ( ) . Raw ( accountSql ) . Scan ( & res . RechargeAccount )
log . Printf ( "GetOrderBehavior: %v, %v, %v" , res . Account , res . RechargeAccount , res . AmountList )
} )
return
}
func ( o gameOrderImpl ) GetRechargePer ( ctx context . Context , req * game . RechargePerReq ) ( res * game . RechargePerRes , err error ) {
res = new ( game . RechargePerRes )
if req . StartTime == "" || req . EndTime == "" {
return nil , errors . New ( "填写注册时间!" )
}
g . Try ( ctx , func ( ctx context . Context ) {
modelTotal := dao . GameRegister . Ctx ( ctx )
modelTotal = modelTotal . Where ( ` tradeNo NOT LIKE 'GM%' ` ) . Where ( ` STR_TO_DATE(create_time, "%Y-%m-%d")>=? ` , req . StartTime ) . Where ( ` STR_TO_DATE(create_time, "%Y-%m-%d")<=? ` , req . EndTime )
modelTotal . Fields ( "max(channel) as channel, count(1) as totalAccount, STR_TO_DATE(create_time, \"%Y-%m-%d\") as createTime" ) . Group ( "channel,STR_TO_DATE(create_time, \"%Y-%m-%d\")" ) . Scan ( & res . Account )
sql := fmt . Sprintf ( ` select account,STR_TO_DATE(create_time, "%%Y-%%m-%%d") as createTime from game_register where STR_TO_DATE(create_time, "%%Y-%%m-%%d")>="%s" and STR_TO_DATE(create_time, "%%Y-%%m-%%d")<="%s" ` , req . StartTime , req . EndTime )
sql = fmt . Sprintf ( ` select u.account,u.uid,a.createTime from game_unit as u inner join (%s) as a on a.account=u.account ` , sql )
accountSql := fmt . Sprintf ( ` select max ( r . channel ) as channel , count ( DISTINCT c . account ) as totalAccount , c . createTime
from game_recharge as r inner join ( % s ) as c on c . uid = r . unitId where status = 2 and tradeNo NOT LIKE ' GM % % ' group by r . channel , c . createTime ` , sql )
g . Model ( ) . Raw ( accountSql ) . Scan ( & res . RechargeAccount )
log . Printf ( "GetOrderBehavior: %v, %v" , res . Account , res . RechargeAccount )
} )
return
}
func ( o gameOrderImpl ) GameRechargeControl ( ctx context . Context , req * game . RechargeControlReq ) ( res * game . RechargeControlRes , err error ) {
res = new ( game . RechargeControlRes )
model := dao . GameRechargeControl . Ctx ( ctx )
var list [ ] * entity . GameRechargeControl
model . Where ( "channel=?" , req . Channel ) . Scan ( & list )
if len ( list ) == 0 {
res . State = 1
}
return
}
func ( o gameOrderImpl ) GetRechargeControl ( ctx context . Context , req * game . GetRechargeControlReq ) ( res * game . GetRechargeControlRes , err error ) {
res = new ( game . GetRechargeControlRes )
dao . GameRechargeControl . Ctx ( ctx ) . Scan ( & res . Control )
return
}
func ( o gameOrderImpl ) AddRechargeControl ( ctx context . Context , req * game . AddRechargeControlReq ) ( res * game . AddRechargeControlRes , err error ) {
res = new ( game . AddRechargeControlRes )
_ , err = dao . GameRechargeControl . Ctx ( ctx ) . Insert ( do . GameRechargeControl { Channel : req . Channel } )
return
}
func ( o gameOrderImpl ) DeleteRechargeControl ( ctx context . Context , req * game . DeleteRechargeControlReq ) ( res * game . DeleteRechargeControlRes , err error ) {
res = new ( game . DeleteRechargeControlRes )
_ , err = dao . GameRechargeControl . Ctx ( ctx ) . Where ( "channel=?" , req . Channel ) . Delete ( )
return
}
func ( o gameOrderImpl ) ChangeOrderState ( ctx context . Context , req * game . ChangeOrderStateReq ) ( res * game . ChangeOrderStateRes , err error ) {
res = new ( game . ChangeOrderStateRes )
update := g . Map {
dao . GameRecharge . Columns ( ) . Status : req . State ,
}
if req . Remark != "" {
update [ dao . GameRecharge . Columns ( ) . Remark ] = req . Remark
}
_ , err = dao . GameRecharge . Ctx ( ctx ) . Where ( dao . GameRecharge . Columns ( ) . TradeNo , req . Order ) . Update ( update )
if err == nil {
res . ResData = 1
}
return
}