package handler import ( "fmt" "server/call" "server/common" "server/db" "server/modules/backend/app" utils "server/modules/backend/util" "server/modules/backend/values" "time" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" ) func WithdrawList(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.WithdrawListReq) if !a.S(req) { return } if req.Type <= common.WithdrawOrderTypeZero || req.Type >= common.WithdrawOrderTypeAll { a.Code = values.CodeRetry return } table1 := `(SELECT id,uid,channel_id,pay_channel,orderid,fail_reason,apipayid,payaccount,amount,create_time,callback_time,status,operator from withdraw_order %s)a` table2 := `(SELECT id,platform,mobile,tag from users %s)b` table3 := `(SELECT uid,inr from player_currency)c` table4 := `(SELECT uid,total_recharge,total_recharge_count,total_withdraw,total_withdrawing,total_withdraw_count FROM recharge_info)d` // 表1的查询条件 table1Condition := fmt.Sprintf(" where event = %v and order_type = %d", common.CurrencyEventWithDraw, req.Type) if req.Start != nil { st, _ := utils.GetQueryUnix(*req.Start, "") table1Condition += fmt.Sprintf(" AND create_time >= %d ", st) } if req.End != nil { _, et := utils.GetQueryUnix("", *req.End) table1Condition += fmt.Sprintf(" AND create_time < %d ", et) } if req.Status != nil { table1Condition += fmt.Sprintf(" AND status = %d ", *req.Status) } if req.Channel != nil { table1Condition += fmt.Sprintf(" AND channel_id = %d ", *req.Channel) } if req.UID != nil { table1Condition += fmt.Sprintf(" AND uid = %d ", *req.UID) } if req.Amount != nil { table1Condition += fmt.Sprintf(" AND amount = %d ", *req.Amount) } if req.OderID != nil { table1Condition += fmt.Sprintf(" AND orderid = %s ", *req.OderID) } if req.APIPayID != nil { table1Condition += fmt.Sprintf(" AND apipayid = %s ", *req.APIPayID) } if req.PayChannel != nil { table1Condition += fmt.Sprintf(" AND pay_channel = %d ", *req.PayChannel) } if req.Operator != nil { table1Condition += fmt.Sprintf(" AND operator = %s ", *req.Operator) } if req.OrderId != nil { table1Condition += fmt.Sprintf(" AND orderid = '%s' ", *req.OrderId) } // 表2的查询条件 table2Condition := "" if req.Platform != nil { table2Condition += fmt.Sprintf(" where platform = %d ", *req.Platform) } sqlCount := " SELECT COUNT(*) AS count from" sqlList := `SELECT a.id,a.uid,a.channel_id,a.pay_channel,a.orderid as OrderID,a.fail_reason as FailReason,a.apipayid as APIPayID,a.payaccount,a.amount,a.create_time,a.callback_time, a.status,a.operator,b.platform,b.mobile,b.tag,c.inr,d.total_recharge,d.total_recharge_count,d.total_withdraw,d.total_withdrawing,d.total_withdraw_count from ` querySql := fmt.Sprintf(table1, table1Condition) + " inner join " + fmt.Sprintf(table2, table2Condition) + " on a.uid = b.id inner join " + table3 + " on a.uid = c.uid inner join " + table4 + " on a.uid = d.uid " var count int64 err := db.Mysql().QueryBySql(sqlCount+querySql, &count) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } switch req.Sort { case 1: querySql += " ORDER BY a.create_time DESC " case 2: querySql += " ORDER BY a.audit_time DESC " default: querySql += " ORDER BY a.create_time DESC " } querySql += fmt.Sprintf(" LIMIT %d, %d", (req.Page-1)*req.Num, req.Num) WithdrawOrderArr := []values.WithdrawInfo{} err = db.Mysql().QueryBySql(sqlList+querySql, &WithdrawOrderArr) if err != nil { log.Error("查询体现审核失败, error : %s", err.Error()) a.Code = values.CodeRetry return } payList := make(map[int]string) withdrawChannels := call.GetConfigWithdrawChannels() for _, v := range withdrawChannels { payList[v.ChannelID] = call.GetWithdrawChannelName(v.ChannelID) } for index, v := range WithdrawOrderArr { totalRecharge := v.TotalRecharge if totalRecharge == 0 { totalRecharge = 1 } WithdrawOrderArr[index].WithDrawPer = (v.Inr + v.TotalWithdraw + v.TotalWithdrawing) * 100 / totalRecharge } a.Data = values.WithdrawListResp{List: WithdrawOrderArr, Count: count, PayList: payList} } func WithdrawExamine(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.WithdrawExamineReq) if !a.S(req) { return } if req.Opt < 1 || req.Opt > 3 { a.Code = values.CodeParam a.Msg = "非法操作" return } one := new(common.WithdrawOrder) one.ID = uint(req.ID) err := db.Mysql().Get(one) if err != nil || one.UID == 0 { log.Error("err:%v", err) a.Code = values.CodeParam a.Msg = "订单不存在" return } if one.Event != int(common.CurrencyEventWithDraw) { a.Code = values.CodeParam a.Msg = "订单不合法" return } if one.Status != common.StatusROrderCreate && one.Status != common.StatusROrderPending { a.Code = values.CodeParam a.Msg = "订单已审核,不能重复操作" return } u := map[string]interface{}{"audit_time": time.Now().Unix(), "operator": a.User.Account} if len(req.Remark) > 0 { u["remarks"] = req.Remark } if req.PayChannel != 0 { u["pay_channel"] = req.PayChannel u["upi"] = req.PayChannel } // 审核通过,发起提现,会在pay模块扫描提交 if req.Opt == 1 { u["status"] = common.StatusROrderWaitting } else if req.Opt == 3 { u["status"] = common.StatusROrderPending } if res := db.Mysql().C().Model(&common.WithdrawOrder{}).Where("id = ? and status = ?", req.ID, common.StatusROrderCreate).Updates(u); res.Error != nil || res.RowsAffected == 0 { log.Error("err:%v", res.Error) a.Code = values.CodeRetry a.Msg = "系统错误,审核失败" return } if req.Opt == 2 { // 拒绝 err := call.ReturnBackWithdraw(one, common.StatusROrderCreate, common.StatusROrderRefuse) if err != nil { log.Error(err.Error()) } if one.Extra == "share" { call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailShareWithdrawFail, one.OrderID, one.Amount/common.DecimalDigits)) } else { call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailWithdrawFail, one.OrderID, one.Amount/common.DecimalDigits)) } return } call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailWithdrawPass, one.OrderID, one.Amount/common.DecimalDigits)) a.RecordEdit(values.PowerExamineWithdraw, fmt.Sprintf("审核退出订单ID:%v", req.ID)) } // WithdrawReturn 强制取消代付,直接退 func WithdrawReturn(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.WithdrawReturnReq) if !a.S(req) { return } one := &common.WithdrawOrder{OrderID: req.OrderID} err := db.Mysql().Get(one) if err != nil { one = &common.WithdrawOrder{APIPayID: req.OrderID} err := db.Mysql().Get(one) if err != nil { a.Code = values.CodeParam a.Msg = "订单不存在" return } } if one.Event != int(common.CurrencyEventWithDraw) { a.Code = values.CodeParam a.Msg = "订单不合法" return } if one.Status == common.StatusROrderFinish { a.Code = values.CodeParam a.Msg = "订单已完成打款,不能退回" return } err = call.ReturnBackWithdraw(one, common.StatusROrderPay, common.StatusROrderFail) if err != nil { log.Error(err.Error()) } a.RecordEdit(values.PowerExamineWithdraw, fmt.Sprintf("退回退出订单ID:%v", req.OrderID)) } // PayCallback 后台模拟订单回调 func PayCallback(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.PayCallbackReq) if !a.S(req) { return } if req.Status != common.StatusROrderPay && req.Status != common.StatusROrderFail { a.Code = values.CodeParam return } one := &common.RechargeOrder{OrderID: req.OrderID} err := db.Mysql().Get(one) if err != nil { one = &common.RechargeOrder{APIPayID: req.OrderID} err := db.Mysql().Get(one) if err != nil { a.Code = values.CodeParam a.Msg = "订单不存在" return } } if one.Event != int(common.CurrencyEventReCharge) && one.Event != common.CurrencyEventGMRecharge { a.Code = values.CodeParam a.Msg = "订单不合法" return } if one.Status == common.StatusROrderPay { a.Code = values.CodeParam a.Msg = "订单已完成" return } if req.Status == common.StatusROrderFail && one.Status == common.StatusROrderFail { a.Code = values.CodeParam a.Msg = "订单已回调失败" return } status := false str := "失败" if req.Status == common.StatusROrderPay { status = true str = "成功" } err = call.RechargeCallback(one, status, "", "") if err != nil { log.Error(err.Error()) } a.RecordEdit(values.PowerExamineWithdraw, fmt.Sprintf("修改充值订单ID:%v,回调状态:%s", req.OrderID, str)) } func ShareOrderList(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareOrderListReq) if !a.S(req) { return } su, eu := utils.GetQueryUnix(req.Start, req.End) sql := fmt.Sprintf("create_time>=%d and create_time<%d", su, eu) if req.Channel > 0 { sql += fmt.Sprintf(" and channel_id = %d", req.Channel) } if req.Status != nil { sql += fmt.Sprintf(" and status = %d", *req.Status) } resp := new(values.ShareOrderListResp) a.Data = resp db.Mysql().QueryListW(int(req.Page)-1, int(req.Num), "create_time desc", &common.ShareOrder{}, &resp.List, sql) } func ShareOrderExamine(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.ShareOrderExamineReq) if !a.S(req) { return } if req.Opt != 1 && req.Opt != 2 { a.Code = values.CodeParam a.Msg = "非法操作" return } order := &common.ShareOrder{OrderID: req.OrderID} db.Mysql().Get(order) if order.Status >= common.StatusROrderFinish { a.Code = values.CodeParam return } if req.Opt == 1 { res, err := db.Mysql().UpdateResW(&common.ShareOrder{}, map[string]interface{}{"status": common.StatusROrderFinish}, fmt.Sprintf("orderid = '%s' and status = %d", req.OrderID, common.StatusROrderCreate)) if err != nil || res == 0 { log.Error("err:%v", err) a.Code = values.CodeRetry return } call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: order.UID, Value: order.Amount, Event: common.CurrencyEventShareWithdraw, Type: common.CurrencyINR, }, }) } else if req.Opt == 2 { // 拒绝 db.Mysql().UpdateResW(&common.ShareOrder{}, map[string]interface{}{"status": common.StatusROrderFail}, fmt.Sprintf("orderid = '%s' and status = %d", req.OrderID, common.StatusROrderCreate)) } a.RecordEdit(values.PowerExamineWithdraw, fmt.Sprintf("审核分享订单ID:%v,opt:%v", req.OrderID, req.Opt)) }