123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- package shanghu
- import (
- "duoduo/apis/common"
- "duoduo/apis/shanghu/models"
- "duoduo/models/shanghu"
- "duoduo/tools/app"
- "errors"
- "fmt"
- "github.com/gin-gonic/gin"
- "github.com/go-pay/gopay"
- "github.com/shopspring/decimal"
- "time"
- )
- func ActiveCashOut(c *gin.Context) {
- var inData models.PayCashOutRequest
- var clientAccountSql shanghu.ActiveClientAccount
- var cashOut shanghu.CashOut
- var trans []models.TransferDetailList
- var transDetail models.TransferDetailList
- err := c.ShouldBindJSON(&inData)
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- _, ok := GlobalCashOutMap[inData.OpenId]
- if ok {
- app.OK(c, nil, "正在提现中...")
- return
- }
- GlobalCashOutMap[inData.OpenId] = 1
- defer func() {
- delete(GlobalCashOutMap, inData.OpenId)
- }()
- if inData.Appid == "" { //appid 不能为空
- app.Error(c, 400, errors.New("AppID不能为空"), "AppID不能为空")
- return
- }
- if inData.Amount.Cmp(decimal.NewFromInt(500)) > 0 {
- app.Error(c, 400, errors.New("单笔金额不能大于500"), "单笔金额不能大于500")
- return
- }
- if inData.Amount.Cmp(decimal.NewFromInt(1)) < 0 {
- app.Error(c, 400, errors.New("单笔金额不能小于1"), "单笔金额不能大于1")
- return
- }
- //
- cashOut.OpenID = inData.OpenId
- cashOut.AppID = inData.Appid
- cashOut.Status = 1 //提现中
- status := []int{1, 3} //提现中、金额待扣减
- cashNum := cashOut.GetCashOutByStatusNum(status)
- if cashNum > 0 {
- app.Error(c, 400, errors.New("有一笔交易正在提现中"), "有一笔交易正在提现中")
- return
- }
- //校验金额是否够
- if inData.AccountType == "client" {
- clientAccountSql.ClientOpenID = inData.OpenId
- clientAccountInfo, err := clientAccountSql.GetActiveAccount()
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- if inData.Amount.Cmp(clientAccountInfo.Amount) > 0 {
- app.Error(c, 400, errors.New("账号余额不够"), "账号余额不够")
- return
- }
- var client shanghu.ActiveUser
- client.Code = "7jb6"
- clientInfo, _ := client.GetUserInfoByCode()
- if clientInfo.OpenID == inData.OpenId {
- cashOut.Fee = decimal.NewFromInt(0)
- } else {
- cashOut.Fee = inData.Amount.Mul(decimal.NewFromFloat32(0.05))
- }
- } else {
- app.Error(c, 400, errors.New("账户类型错误"), "账户类型错误")
- return
- }
- clientV3, err := NewWechatServiceV3(inData.Appid)
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- userName, err := clientV3.V3EncryptText(inData.UserName)
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- transDetail.OutDetailNo = common.GetRandomString(32)
- transDetail.TransferAmount = inData.Amount.Sub(cashOut.Fee).Mul(decimal.NewFromInt(100)).IntPart()
- transDetail.UserName = userName
- transDetail.Openid = inData.OpenId
- transDetail.TransferRemark = "活动提现"
- trans = append(trans, transDetail)
- partnerTradeNo := common.GetRandomString(32)
- var cashOutCreate shanghu.CashOut
- //创建提现记录
- cashOutCreate.AppID = inData.Appid
- cashOutCreate.Status = 1 //提现中
- cashOutCreate.OpenID = inData.OpenId
- cashOutCreate.Amount = inData.Amount
- cashOutCreate.CreatedAt = time.Now()
- cashOutCreate.UpdatedAt = time.Now()
- cashOutCreate.PartnerTradeNo = partnerTradeNo
- cashOutCreate.Fee = cashOut.Fee
- cashOutInfo, err := cashOutCreate.Create()
- if err != nil {
- app.Error(c, 400, err, err.Error())
- return
- }
- var bMap []gopay.BodyMap
- bm := make(gopay.BodyMap)
- bm.Set("appid", inData.Appid)
- bm.Set("out_batch_no", partnerTradeNo)
- bm.Set("batch_name", "活动提现")
- bm.Set("batch_remark", "活动提现")
- bm.Set("total_amount", inData.Amount.Sub(cashOut.Fee).Mul(decimal.NewFromInt(100)).IntPart())
- bm.Set("total_num", 1)
- bMap = append(bMap, structToMap(&transDetail))
- bm.Set("transfer_detail_list", bMap)
- bm.Set("transfer_scene_id", "1001")
- fmt.Println(bm.JsonBody())
- reply, err := clientV3.V3Transfer(c, bm)
- if err != nil {
- cashOut.ID = cashOutInfo.ID
- cashOut.FailRes = err.Error()
- cashOut.Status = 2 //提现失败
- cashOut.UpdateMerchantStatus()
- app.Error(c, 500, err, err.Error())
- return
- }
- if reply.Code != 0 {
- cashOut.ID = cashOutInfo.ID
- cashOut.FailRes = reply.Error
- cashOut.Status = 2 //提现失败
- cashOut.UpdateMerchantStatus()
- app.Error(c, 500, errors.New(reply.Error), reply.Error)
- return
- }
- cashOut.WxPartnerTradeNo = reply.Response.BatchId
- cashOut.PartnerTradeNo = reply.Response.OutBatchNo
- cashOut.UpdateCashOutWxBachNo()
- app.OK(c, nil, app.Success)
- }
|