Quellcode durchsuchen

feat: cancel merchant transfer on withdraw delete

Codex vor 1 Monat
Ursprung
Commit
a994118051

+ 70 - 0
go/gopath/src/fohow.com/apps/controllers/railsadmin_controller/take_cash_controller.go

@@ -1,6 +1,8 @@
 package railsadmin_controller
 
 import (
+	"fmt"
+
 	"fohow.com/apps"
 	"fohow.com/apps/models/balance_model"
 	"fohow.com/apps/models/sys_config"
@@ -12,6 +14,35 @@ import (
 	"time"
 )
 
+// 佣金提现商家转账撤销
+func (self *RailsadminController) CancelTakeCash() {
+	_id := self.Ctx.Input.Param(":id")
+	id, _ := strconv.ParseInt(_id, 10, 64)
+	beego.BeeLogger.Warn("Railsadmin CancelTakeCash id:(%d)", id)
+
+	order := balance_model.GetTakeCashOrderById(id, false)
+	if order == nil {
+		self.ReturnError(404, apps.NoExist, "", nil)
+	}
+	wxUser := user_model.GetWxUserById(order.WxUId, false)
+	if wxUser == nil {
+		self.ReturnError(404, apps.WxUserNotExist, "", nil)
+	}
+	payCode := sys_config.GetPayConfigByDepart(wxUser.Depart, true)
+	ret, err := railsadminCancelTakeCashMerchantTransfer(order, payCode)
+	self.Data["json"] = map[string]interface{}{
+		"order_id":         order.OrderId,
+		"trade_no":         order.TradeNo,
+		"pay_state":        order.State,
+		"remark":           order.Remark,
+		"wechat_state":     getMerchantTransferState(ret),
+		"package_info":     getMerchantTransferPackageInfo(ret),
+		"transfer_bill_no": getMerchantTransferBillNo(ret),
+		"error":            errString(err),
+	}
+	self.ServeJSON()
+}
+
 // 佣金提现商家转账
 func (self *RailsadminController) TakeCash() {
 	_id := self.Ctx.Input.Param(":id")
@@ -70,6 +101,45 @@ func railsadminUpdateTakeCashByMerchantTransfer(order *balance_model.TakeCashOrd
 	return ret, nil
 }
 
+func railsadminCancelTakeCashMerchantTransfer(order *balance_model.TakeCashOrder, payCode string) (*wx_mp.MerchantTransferResponse, error) {
+	if order.TradeNo == "" && !railsadminTakeCashMayHaveWechatTransfer(order) {
+		return nil, nil
+	}
+
+	ret, err := wx_mp.QueryMerchantTransferByOutBillNo(order.OrderId, payCode)
+	if err != nil {
+		beego.BeeLogger.Error("Railsadmin QueryMerchantTransfer before cancel order[%s] err[%s]", order.OrderId, err)
+		return ret, err
+	}
+	if ret.TransferBillNo != "" || ret.State != "" {
+		railsadminApplyMerchantTransferResult(order, ret)
+	}
+
+	switch ret.State {
+	case wx_mp.MerchantTransferSuccess:
+		return ret, fmt.Errorf("商家转账已成功,不能撤销")
+	case wx_mp.MerchantTransferFail, wx_mp.MerchantTransferCancelled:
+		return ret, nil
+	}
+
+	ret, err = wx_mp.CancelMerchantTransferByOutBillNo(order.OrderId, payCode)
+	if err != nil {
+		beego.BeeLogger.Error("Railsadmin CancelMerchantTransfer order[%s] err[%s]", order.OrderId, err)
+		return ret, err
+	}
+	if ret != nil {
+		railsadminApplyMerchantTransferResult(order, ret)
+	}
+	return ret, nil
+}
+
+func railsadminTakeCashMayHaveWechatTransfer(order *balance_model.TakeCashOrder) bool {
+	if order == nil {
+		return false
+	}
+	return strings.Contains(order.Remark, "商家转账状态:") || strings.Contains(order.Remark, "package_info=")
+}
+
 func railsadminApplyMerchantTransferResult(order *balance_model.TakeCashOrder, ret *wx_mp.MerchantTransferResponse) {
 	if ret.TransferBillNo != "" {
 		order.TradeNo = ret.TransferBillNo

+ 1 - 1
go/gopath/src/fohow.com/apps/models/balance_model/takecash.go

@@ -20,7 +20,7 @@ const (
 	STATE_CN_IN_PROGRESS = "提现中"
 	STATE_CN_SUCESS      = "已完成"
 
-	TAKE_CASH_LIMIT = 7        //每天提现次数限制
+	TAKE_CASH_LIMIT = 1        //每天提现次数限制
 	AUTOTAKE_STATE  = int64(1) //自动提现状态
 
 	REAL_STATE = int64(0) //强制检验

+ 10 - 0
go/gopath/src/fohow.com/libs/wx_mp/mch_transfer.go

@@ -92,6 +92,16 @@ func QueryMerchantTransferByOutBillNo(outBillNo, payCode string) (*MerchantTrans
 	return doMerchantTransferRequest("GET", path, nil, mechantInfo)
 }
 
+func CancelMerchantTransferByOutBillNo(outBillNo, payCode string) (*MerchantTransferResponse, error) {
+	mechantInfo := GetMechantInfo(payCode)
+	path := "/v3/fund-app/mch-transfer/transfer-bills/out-bill-no/" + url.PathEscape(outBillNo) + "/cancel"
+	body, err := json.Marshal(map[string]string{"out_bill_no": outBillNo})
+	if err != nil {
+		return nil, err
+	}
+	return doMerchantTransferRequest("POST", path, body, mechantInfo)
+}
+
 func MerchantTransferStatePending(state string) bool {
 	switch state {
 	case MerchantTransferAccepted, MerchantTransferProcessing, MerchantTransferWaitUserConfirm, MerchantTransferTransfering, MerchantTransferCanceling:

+ 1 - 0
go/gopath/src/fohow.com/routers/routes.go

@@ -255,6 +255,7 @@ func init() {
 	beego.Router("/railsadmin/order/static/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:OrderStatic")
 	beego.Router("/railsadmin/order/refund/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:OrderRefund")
 	beego.Router("/railsadmin/take_cash/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:TakeCash")
+	beego.Router("/railsadmin/take_cash/:id([0-9]+)/cancel", &railsadmin_controller.RailsadminController{}, "get:CancelTakeCash;post:CancelTakeCash")
 	beego.Router("/railsadmin/user/perfomance/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:UserPerfomance")
 	beego.Router("/railsadmin/live/award/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:LiveAward")
 	beego.Router("/railsadmin/recharge/award/:id([0-9]+)", &railsadmin_controller.RailsadminController{}, "get:PatchCashAward")