k.zhang 1 mese fa
parent
commit
11e278541c

+ 183 - 0
apis/shanghu/active.cash.out.go

@@ -0,0 +1,183 @@
+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 merchantAccountSql shanghu.MerchantAccount
+	var clientAccountSql shanghu.MerchantClientAccount
+	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.GetClientAccount()
+		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.MerchantClientUser
+		client.Code = "7jb6"
+		clientInfo, _ := client.GetUserInfoByCode()
+		if clientInfo.ClientOpenID == inData.OpenId {
+			cashOut.Fee = decimal.NewFromInt(0)
+		} else {
+			cashOut.Fee = inData.Amount.Mul(decimal.NewFromFloat32(0.05))
+		}
+
+	} else if inData.AccountType == "merchant" {
+		merchantAccountSql.MerchantOpenID = inData.OpenId
+		merchantAccountInfo, err := merchantAccountSql.GetMerchantAccount()
+		if err != nil {
+			app.Error(c, 400, err, err.Error())
+			return
+		}
+		if inData.Amount.Cmp(merchantAccountInfo.Amount) > 0 {
+			app.Error(c, 400, errors.New("账号余额不够"), "账号余额不够")
+			return
+		}
+		cashOut.Fee = decimal.NewFromInt(0)
+	} 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)
+
+}

+ 1 - 1
apis/shanghu/active.pay.go

@@ -428,7 +428,7 @@ func GroupBuyCancel(c *gin.Context) {
 			return
 		}
 		if merchantAccountInfo.ID == 0 { //需要创建新账号
-			merchantAccount.MerchantOpenID = payTrans.MerchantOpenID
+			merchantAccount.MerchantOpenID = transInfo.MerchantOpenID
 			merchantAccount.Version = 1
 			merchantAccount.CreatedAt = time.Now()
 			merchantAccount.UpdatedAt = time.Now()

+ 30 - 0
models/shanghu/active.cash.out.go

@@ -0,0 +1,30 @@
+package shanghu
+
+import (
+	"time"
+)
+
+// 活动提现
+type ActiveCashOut struct {
+	ID               int64     `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` // Id
+	OpenID           string    `gorm:"column:open_id;type:varchar(255)" json:"open_id"`                // Openid
+	AppID            string    `gorm:"column:app_id;type:varchar(255)" json:"app_id"`                  // Appid
+	Status           int       `gorm:"column:status;type:int(11)" json:"status"`                       // 1-提现中 2-提现失败 3-钱已到账待账户扣减  99-提现成功
+	FailRes          string    `gorm:"column:fail_res;type:text" json:"fail_res"`                      // 失败原因
+	PartnerTradeNo   string    `gorm:"column:partner_trade_no;type:varchar(50)" json:"partner_trade_no"`
+	Amount           string    `gorm:"column:amount;type:decimal(10,2)" json:"amount"`                          // 金额
+	CornTime         time.Time `gorm:"column:corn_time;type:datetime" json:"corn_time"`                         // 定时任务下次查询状态时间
+	CreateBy         int64     `gorm:"column:create_by;type:bigint(20)" json:"create_by"`                       // 创建者
+	UpdateBy         int64     `gorm:"column:update_by;type:bigint(20)" json:"update_by"`                       // 更新者
+	CreatedAt        time.Time `gorm:"column:created_at;type:datetime(3)" json:"created_at"`                    // 创建时间
+	UpdatedAt        time.Time `gorm:"column:updated_at;type:datetime(3)" json:"updated_at"`                    // 最后更新时间
+	DeletedAt        time.Time `gorm:"column:deleted_at;type:datetime(3);default:null" json:"deleted_at"`       // 删除时间
+	Fee              string    `gorm:"column:fee;type:decimal(10,2)" json:"fee"`                                // 手续费
+	WxPartnerTradeNo string    `gorm:"column:wx_partner_trade_no;type:varchar(255)" json:"wx_partner_trade_no"` // 微信批次号
+	AccountStatus    int       `gorm:"column:account_status;type:int(11);default:0" json:"account_status"`      // 分账状态 99-分账成功 2-分账失败 0-未分账 3-分账中
+	AccountFailRes   string    `gorm:"column:account_fail_res;type:varchar(255)" json:"account_fail_res"`       // 分账失败原因
+}
+
+func (m *ActiveCashOut) TableName() string {
+	return "active_cash_out"
+}

+ 6 - 3
models/shanghu/merchant.account.go

@@ -65,9 +65,12 @@ func (m *MerchantAccount) ActiveCancelSettle(log []ActiveCancelLog, merchantAcco
 		return err
 	}
 
-	err = orm.ShMysql.Table("active_client_account").Select("*").Where("client_open_id = ?", activeClientAccount.ClientOpenID).First(&activeClientAccount).Error
-	if err != nil {
-		return err
+	if payTrans.InvitationCode != YuanShiMa {
+		err = orm.ShMysql.Table("active_client_account").Select("*").Where("client_open_id = ?", activeClientAccount.ClientOpenID).First(&activeClientAccount).Error
+		if err != nil {
+			return err
+		}
+
 	}
 
 	fmt.Println("merchantAccount =", merchantAccount)