|
@@ -5,6 +5,7 @@ import (
|
|
|
"fohow.com/apps/models/sys_config"
|
|
"fohow.com/apps/models/sys_config"
|
|
|
"fohow.com/libs/lib_redis"
|
|
"fohow.com/libs/lib_redis"
|
|
|
"fohow.com/libs/tool"
|
|
"fohow.com/libs/tool"
|
|
|
|
|
+ "fohow.com/libs/wx_mp"
|
|
|
"github.com/astaxie/beego"
|
|
"github.com/astaxie/beego"
|
|
|
"math"
|
|
"math"
|
|
|
"strings"
|
|
"strings"
|
|
@@ -27,9 +28,9 @@ import (
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
const (
|
|
|
- TAKE_CASH_AMOUNT_LIMIT_MIN = 1000 //10元
|
|
|
|
|
- TAKE_CASH_AMOUNT_LIMIT_MAX = 2000000 //2w
|
|
|
|
|
- WX_TAKE_CASH_AMOUNT_LIMIT_MAX = 20000 //5000元
|
|
|
|
|
|
|
+ TAKE_CASH_AMOUNT_LIMIT_MIN = 1000 //10元
|
|
|
|
|
+ TAKE_CASH_AMOUNT_LIMIT_MAX = 20000 //200元
|
|
|
|
|
+ WX_TAKE_CASH_AMOUNT_LIMIT_MAX = 20000 //200元
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// 提货券和提货券余额
|
|
// 提货券和提货券余额
|
|
@@ -120,6 +121,16 @@ func (self *BalanceController) GetCashBalanceDetail() {
|
|
|
item.CTime = item.CreatedAt.Unix()
|
|
item.CTime = item.CreatedAt.Unix()
|
|
|
item.CreatedAtText = item.CreatedAt.Format("2006-01-02 15:04:05")
|
|
item.CreatedAtText = item.CreatedAt.Format("2006-01-02 15:04:05")
|
|
|
item.SourceName = item.GetSourceName()
|
|
item.SourceName = item.GetSourceName()
|
|
|
|
|
+ if item.Source == balance_model.CASH_SOURCE_TAKE_CASH && item.RelateId != "" {
|
|
|
|
|
+ takeCashOrder := balance_model.GetTakeCashOrderByOId(item.RelateId, false)
|
|
|
|
|
+ if takeCashOrder != nil {
|
|
|
|
|
+ wxUser := user_model.GetWxUserById(item.WxUId, false)
|
|
|
|
|
+ if wxUser != nil {
|
|
|
|
|
+ syncTakeCashMerchantTransfer(wxUser, takeCashOrder)
|
|
|
|
|
+ fillCashBalanceTransferInfo(item, wxUser, takeCashOrder)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
self.Data["json"] = item
|
|
self.Data["json"] = item
|
|
|
self.ServeJSON()
|
|
self.ServeJSON()
|
|
|
}
|
|
}
|
|
@@ -195,7 +206,7 @@ func (self *BalanceController) TakeCash() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if amount < TAKE_CASH_AMOUNT_LIMIT_MIN || amount > TAKE_CASH_AMOUNT_LIMIT_MAX {
|
|
if amount < TAKE_CASH_AMOUNT_LIMIT_MIN || amount > TAKE_CASH_AMOUNT_LIMIT_MAX {
|
|
|
- self.ReturnError(403, []string{"amountLimit", "提现单日限额2W,最低10元"}, "", nil)
|
|
|
|
|
|
|
+ self.ReturnError(403, []string{"amountLimit", "单次提现金额最低10元,最高200元"}, "", nil)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* if user.IsCertification != 1 {
|
|
/* if user.IsCertification != 1 {
|
|
@@ -226,7 +237,7 @@ func (self *BalanceController) TakeCash() {
|
|
|
self.ReturnError(403, apps.BalanceNotEnough, "", nil)
|
|
self.ReturnError(403, apps.BalanceNotEnough, "", nil)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //超过微信余额限制5K,按5K计算
|
|
|
|
|
|
|
+ //超过商家转账单笔限制200元,按200元计算
|
|
|
if amount > WX_TAKE_CASH_AMOUNT_LIMIT_MAX {
|
|
if amount > WX_TAKE_CASH_AMOUNT_LIMIT_MAX {
|
|
|
amount = WX_TAKE_CASH_AMOUNT_LIMIT_MAX
|
|
amount = WX_TAKE_CASH_AMOUNT_LIMIT_MAX
|
|
|
}
|
|
}
|
|
@@ -286,7 +297,7 @@ func (self *BalanceController) GetTakeCashLimit() {
|
|
|
FeeBl int64 `json:"fee_bl"` //手续费比例
|
|
FeeBl int64 `json:"fee_bl"` //手续费比例
|
|
|
}
|
|
}
|
|
|
limitInfo := new(LimitInfo)
|
|
limitInfo := new(LimitInfo)
|
|
|
- limitInfo.MaxLimitCash = TAKE_CASH_AMOUNT_LIMIT_MAX
|
|
|
|
|
|
|
+ limitInfo.MaxLimitCash = WX_TAKE_CASH_AMOUNT_LIMIT_MAX
|
|
|
limitInfo.MinLimitCash = TAKE_CASH_AMOUNT_LIMIT_MIN
|
|
limitInfo.MinLimitCash = TAKE_CASH_AMOUNT_LIMIT_MIN
|
|
|
limitInfo.FeeBl = sys_config.GetTakeCashTax()
|
|
limitInfo.FeeBl = sys_config.GetTakeCashTax()
|
|
|
|
|
|
|
@@ -310,23 +321,28 @@ func (self *BalanceController) GetTakeCashOrders() {
|
|
|
|
|
|
|
|
//user := self.GetCurrentUser(cache)
|
|
//user := self.GetCurrentUser(cache)
|
|
|
wxUId := self.GetCurrentWxUserIdByToken()
|
|
wxUId := self.GetCurrentWxUserIdByToken()
|
|
|
|
|
+ wxUser := user_model.GetWxUserById(wxUId, false)
|
|
|
|
|
|
|
|
list := balance_model.GetTakeCashOrderListByWxUId(wxUId, page, perPage, cache)
|
|
list := balance_model.GetTakeCashOrderListByWxUId(wxUId, page, perPage, cache)
|
|
|
listCount := balance_model.GetTakeCashOrderCountByWxUId(wxUId, cache)
|
|
listCount := balance_model.GetTakeCashOrderCountByWxUId(wxUId, cache)
|
|
|
|
|
|
|
|
type Order struct {
|
|
type Order struct {
|
|
|
- Id int64 ` json:"id"` // int(11)
|
|
|
|
|
- WxUId int64 ` json:"wx_uid"` // int(11)
|
|
|
|
|
- //OrderId string ` json:"order_id"` // varchar(64)
|
|
|
|
|
- //TradeNo string ` json:"trade_no"` // varchar(64)
|
|
|
|
|
- Count int64 ` json:"count"` // bigint(20)
|
|
|
|
|
- State int64 ` json:"pay_state"` // tinyint(1)
|
|
|
|
|
- AuditState int64 ` json:"audit_state"` // tinyint(1)
|
|
|
|
|
- StateCN string ` json:"state_cn"`
|
|
|
|
|
- PaiedAt int64 ` json:"paied_at"` // int(11)
|
|
|
|
|
- Remark string ` json:"remark"` // varchar(255)
|
|
|
|
|
- //ExpcPayAt time.Time ` json:"expc_pay_at"` // datetime
|
|
|
|
|
- CreatedAt int64 ` json:"created_at"` // datetime
|
|
|
|
|
|
|
+ Id int64 ` json:"id"` // int(11)
|
|
|
|
|
+ WxUId int64 ` json:"wx_uid"` // int(11)
|
|
|
|
|
+ OrderId string ` json:"order_id"`
|
|
|
|
|
+ TradeNo string ` json:"trade_no"`
|
|
|
|
|
+ Count int64 ` json:"count"` // bigint(20)
|
|
|
|
|
+ State int64 ` json:"pay_state"` // tinyint(1)
|
|
|
|
|
+ AuditState int64 ` json:"audit_state"` // tinyint(1)
|
|
|
|
|
+ StateCN string ` json:"state_cn"`
|
|
|
|
|
+ PaiedAt int64 ` json:"paied_at"` // int(11)
|
|
|
|
|
+ Remark string ` json:"remark"` // varchar(255)
|
|
|
|
|
+ MchId string `json:"mch_id"`
|
|
|
|
|
+ AppId string `json:"app_id"`
|
|
|
|
|
+ PackageInfo string `json:"package_info"`
|
|
|
|
|
+ TransferState string `json:"transfer_state"`
|
|
|
|
|
+ CanConfirm bool `json:"can_confirm_transfer"`
|
|
|
|
|
+ CreatedAt int64 ` json:"created_at"` // datetime
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
retList := make([]*Order, 0, 0)
|
|
retList := make([]*Order, 0, 0)
|
|
@@ -336,12 +352,18 @@ func (self *BalanceController) GetTakeCashOrders() {
|
|
|
|
|
|
|
|
order.Id = item.Id
|
|
order.Id = item.Id
|
|
|
order.WxUId = item.WxUId
|
|
order.WxUId = item.WxUId
|
|
|
|
|
+ order.OrderId = item.OrderId
|
|
|
|
|
+ order.TradeNo = item.TradeNo
|
|
|
order.Count = item.Count
|
|
order.Count = item.Count
|
|
|
order.StateCN = item.GetStateCn()
|
|
order.StateCN = item.GetStateCn()
|
|
|
order.PaiedAt = item.PaiedAt
|
|
order.PaiedAt = item.PaiedAt
|
|
|
order.CreatedAt = item.CreatedAt.Unix()
|
|
order.CreatedAt = item.CreatedAt.Unix()
|
|
|
order.State = item.State
|
|
order.State = item.State
|
|
|
order.AuditState = item.AuditState
|
|
order.AuditState = item.AuditState
|
|
|
|
|
+ order.Remark = item.Remark
|
|
|
|
|
+ if wxUser != nil {
|
|
|
|
|
+ order.MchId, order.AppId, order.PackageInfo, order.TransferState, order.CanConfirm = getMerchantTransferConfirmInfo(wxUser, item)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
retList = append(retList, order)
|
|
retList = append(retList, order)
|
|
|
}
|
|
}
|
|
@@ -355,6 +377,103 @@ func (self *BalanceController) GetTakeCashOrders() {
|
|
|
self.ServeJSON()
|
|
self.ServeJSON()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func fillCashBalanceTransferInfo(item *balance_model.CashBalance, wxUser *user_model.WxUser, order *balance_model.TakeCashOrder) {
|
|
|
|
|
+ item.TakeCashId = order.Id
|
|
|
|
|
+ item.TakeCashState = order.State
|
|
|
|
|
+ item.TakeCashAudit = order.AuditState
|
|
|
|
|
+ item.MchId, item.AppId, item.PackageInfo, item.TransferState, item.CanConfirm = getMerchantTransferConfirmInfo(wxUser, order)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func getMerchantTransferConfirmInfo(wxUser *user_model.WxUser, order *balance_model.TakeCashOrder) (mchId, appId, packageInfo, transferState string, canConfirm bool) {
|
|
|
|
|
+ if wxUser == nil || order == nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ payCode := sys_config.GetPayConfigByDepart(wxUser.Depart, true)
|
|
|
|
|
+ mechantInfo := wx_mp.GetMechantInfo(payCode)
|
|
|
|
|
+ mchId = mechantInfo.MchId
|
|
|
|
|
+ appId = beego.AppConfig.String("WxFohowXcxAppId")
|
|
|
|
|
+ packageInfo = getMerchantTransferPackageInfo(order.Remark)
|
|
|
|
|
+ transferState = getMerchantTransferState(order.Remark)
|
|
|
|
|
+ canConfirm = order.State == 0 && order.AuditState == 1 && packageInfo != "" && transferState == wx_mp.MerchantTransferWaitUserConfirm
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func syncTakeCashMerchantTransfer(wxUser *user_model.WxUser, order *balance_model.TakeCashOrder) {
|
|
|
|
|
+ if wxUser == nil || order == nil || order.TradeNo == "" || order.State == 1 {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ payCode := sys_config.GetPayConfigByDepart(wxUser.Depart, true)
|
|
|
|
|
+ ret, err := wx_mp.QueryMerchantTransferByOutBillNo(order.OrderId, payCode)
|
|
|
|
|
+ if err != nil || ret == nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if ret.TransferBillNo != "" {
|
|
|
|
|
+ order.TradeNo = ret.TransferBillNo
|
|
|
|
|
+ }
|
|
|
|
|
+ switch ret.State {
|
|
|
|
|
+ case wx_mp.MerchantTransferSuccess:
|
|
|
|
|
+ order.State = 1
|
|
|
|
|
+ order.Remark = "商家转账已成功"
|
|
|
|
|
+ order.PaiedAt = time.Now().Unix()
|
|
|
|
|
+ case wx_mp.MerchantTransferFail, wx_mp.MerchantTransferCancelled:
|
|
|
|
|
+ order.State = 2
|
|
|
|
|
+ order.Remark = truncateTakeCashRemark(firstNotEmpty(ret.FailReason, ret.Message, ret.State))
|
|
|
|
|
+ default:
|
|
|
|
|
+ if wx_mp.MerchantTransferStatePending(ret.State) {
|
|
|
|
|
+ order.State = 0
|
|
|
|
|
+ order.Remark = truncateTakeCashRemark(merchantTransferPendingRemark(ret, order.Remark))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ order.Save()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func getMerchantTransferState(remark string) string {
|
|
|
|
|
+ const prefix = "商家转账状态:"
|
|
|
|
|
+ if !strings.Contains(remark, prefix) {
|
|
|
|
|
+ return ""
|
|
|
|
|
+ }
|
|
|
|
|
+ state := strings.TrimPrefix(remark[strings.Index(remark, prefix):], prefix)
|
|
|
|
|
+ if idx := strings.Index(state, ";"); idx >= 0 {
|
|
|
|
|
+ state = state[:idx]
|
|
|
|
|
+ }
|
|
|
|
|
+ return state
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func getMerchantTransferPackageInfo(remark string) string {
|
|
|
|
|
+ const prefix = ";package_info="
|
|
|
|
|
+ idx := strings.Index(remark, prefix)
|
|
|
|
|
+ if idx < 0 {
|
|
|
|
|
+ return ""
|
|
|
|
|
+ }
|
|
|
|
|
+ return remark[idx+len(prefix):]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func merchantTransferPendingRemark(ret *wx_mp.MerchantTransferResponse, oldRemark string) string {
|
|
|
|
|
+ remark := "商家转账状态:" + ret.State
|
|
|
|
|
+ if ret.PackageInfo != "" {
|
|
|
|
|
+ remark += ";package_info=" + ret.PackageInfo
|
|
|
|
|
+ } else if idx := strings.Index(oldRemark, ";package_info="); idx >= 0 {
|
|
|
|
|
+ remark += oldRemark[idx:]
|
|
|
|
|
+ }
|
|
|
|
|
+ return remark
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func firstNotEmpty(values ...string) string {
|
|
|
|
|
+ for _, value := range values {
|
|
|
|
|
+ if value != "" {
|
|
|
|
|
+ return value
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return ""
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func truncateTakeCashRemark(remark string) string {
|
|
|
|
|
+ if len([]rune(remark)) <= 240 {
|
|
|
|
|
+ return remark
|
|
|
|
|
+ }
|
|
|
|
|
+ return string([]rune(remark)[:240])
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 佣金转提货券
|
|
// 佣金转提货券
|
|
|
func (self *BalanceController) TransferToBalance() {
|
|
func (self *BalanceController) TransferToBalance() {
|
|
|
//单位:分
|
|
//单位:分
|