diff --git a/business/jxstore/cms/order.go b/business/jxstore/cms/order.go index 1c619609c..e9170de58 100644 --- a/business/jxstore/cms/order.go +++ b/business/jxstore/cms/order.go @@ -118,6 +118,67 @@ func Pay(ctx *jxcontext.Context, orderID string, payType int, vendorPayType, app return payHandler.WxPayParam, err } +var ( + NotPay = 2 //订单待支付 + AlreadyPay = 1 //订单已支付 +) + +//余额支付 微信补差值 +func PayByBalance(ctx *jxcontext.Context, orderID string, payType, restPrice int, appID, vendorPayType string) (errMsg string, err error) { + var ( + db = dao.GetDB() + ) + //获取订单信息 + orderInfo, err := dao.GetOrderByID(db, orderID) + if err != nil { + return "获取订单信息失败", err + } + //获取用户 会员账户信息 + userBill, err := dao.GetUserBill(db, orderInfo.UserID, "") + if err != nil { + return "获取用户会员账户余额失败", err + } + txDB, _ := dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db, txDB) + panic(r) + } + }() + if orderInfo.Status == NotPay { + if userBill.AccountBalance > 0 { + //余额 全款支付 + if userBill.AccountBalance > orderInfo.PayPrice && userBill.AccountBalance-orderInfo.PayPrice > 0 { + if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypePayByAccountBalance, orderInfo.PayPrice, 0); err != nil { + dao.Rollback(db, txDB) + return "使用余额支付失败:", err + } + orderInfo.Status = AlreadyPay + } else { + //需支付部分 + //restPrice := orderInfo.PayPrice - userBill.AccountBalance + orderInfo.PayPrice = restPrice + if _, err := Pay(ctx, orderInfo.OrderID, payType, vendorPayType, appID); err != nil { + return "微信支付失败:", err + } + //支付成功后修改余额为0 + if err := dao.UpdateUserBill(orderInfo.UserID, 0); err != nil { + dao.Rollback(db, txDB) + return "余额修改失败:", err + } + //增加一条用户账单 + if err = financial.AddBillExpend(txDB, userBill.BillID, model.BillTypePayByAccountBalance, orderInfo.PayPrice, 0); err != nil { + dao.Rollback(db, txDB) + return "使用余额支付失败:", err + } + + } + } + dao.Commit(db, txDB) + } + return "", err +} + func Cash(ctx *jxcontext.Context, orderID string, payType int, vendorPayType string) (errCode string, err error) { var ( db = dao.GetDB() @@ -146,6 +207,15 @@ func GetOrders(ctx *jxcontext.Context, orderID, userID string, orderType int, ci return dao.GetOrders(dao.GetDB(), orderID, userID, orderType, cityCodes, utils.Str2Time(fromTime), utils.Str2Time(toTime), keyword, offset, pageSize) } +//id获取订单详情(单条查询) +//func GetOrderByID(ctx *jxcontext.Context, orderID int) (errMsg string, err error) { +// //var db = dao.GetDB() +// if _, err := dao.GetOrderByID(dao.GetDB(), orderID); err != nil { +// return "id获取订单详情失败", err +// } +// return "", err +//} + func FinishedCashOrders(ctx *jxcontext.Context, orderIDs []string) (err error) { var ( db = dao.GetDB() diff --git a/business/jxstore/cms/user2.go b/business/jxstore/cms/user2.go index aed58e059..618c1a62c 100644 --- a/business/jxstore/cms/user2.go +++ b/business/jxstore/cms/user2.go @@ -555,15 +555,6 @@ func InvestMember(ctx *jxcontext.Context, memberID int, userID string, isFree bo memberCard = v } } - if !isFree { - //验证微信绑定 - if err = auth2.CheckWeixinminiAuthBind(userIDReal); err != nil { - return "", err - } - if userBill.AccountBalance < memberCard.ActPrice { - return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!") - } - } txDB, _ := dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -571,6 +562,19 @@ func InvestMember(ctx *jxcontext.Context, memberID int, userID string, isFree bo panic(r) } }() + if !isFree { + //验证微信绑定 + if err = auth2.CheckWeixinminiAuthBind(userIDReal); err != nil { + return "", err + } + if userBill.AccountBalance < memberCard.ActPrice { + //if _, err := financial.WXInvestMember(ctx, userMembers[0].MemberTypeID, userMembers[0].UserID); err != nil { + // dao.Rollback(db, txDB) + //} + return model.ErrCodeAccountBalanceNotEnough, fmt.Errorf("用户余额不足,请充值!") + } + } + //证明已经开了会员了,相当于续费 if len(userMembers) > 0 { userMember := userMembers[0] @@ -601,7 +605,6 @@ func InvestMember(ctx *jxcontext.Context, memberID int, userID string, isFree bo } } if !isFree { - //支出明细 if err = financial.AddExpendUpdateAccount(txDB, userBill, model.BillTypeMember, memberCard.ActPrice, 0); err != nil { dao.Rollback(db, txDB) diff --git a/business/jxstore/financial/bill.go b/business/jxstore/financial/bill.go index 4d026cffd..667c43737 100644 --- a/business/jxstore/financial/bill.go +++ b/business/jxstore/financial/bill.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" - "git.rosy.net.cn/jx-print/globals" "github.com/astaxie/beego/client/orm" "time" ) @@ -168,6 +167,7 @@ func SettleUnionOrders(ctx *jxcontext.Context, vendorIDs []int) (err error) { return err } +//微信 老会员续费 func WXInvestMember(ctx *jxcontext.Context, memberID int, userID string) (errCode string, err error) { var db = dao.GetDB() //获取用户 当前会员信息 @@ -176,12 +176,10 @@ func WXInvestMember(ctx *jxcontext.Context, memberID int, userID string) (errCod return "获取用户会员信息失败", err } //当前状态是否是会员 续费/开通 - var cnt = 0 if len(userMembers) > 0 { userMember := userMembers[0] if memberID == model.OrderTypeMember { userMember.EndAt = userMember.EndAt.AddDate(0, 1, 0) - cnt++ } else { userMember.EndAt = userMember.EndAt.AddDate(1, 0, 0) } @@ -204,6 +202,25 @@ func WXInvestMember(ctx *jxcontext.Context, memberID int, userID string) (errCod return "开通会员失败", err } } - globals.SugarLogger.Debugf("==================== %d", cnt) + return errCode, err +} + +//微信 新充值会员 +func WXInvestMemberNew(ctx *jxcontext.Context, memberID int, userID string) (errCode string, err error) { + var db = dao.GetDB() + userMember2 := &model.UserMember{ + UserID: userID, + MemberType: model.MemberTypeNormal, + MemberTypeID: memberID, + } + if memberID == model.OrderTypeMember { + userMember2.EndAt = time.Now().AddDate(0, 1, 0) + } else { + userMember2.EndAt = time.Now().AddDate(1, 0, 0) + } + dao.WrapAddIDCULDEntity(userMember2, ctx.GetUserName()) + if err = dao.CreateEntity(db, userMember2); err != nil { + return "开通会员失败", err + } return errCode, err } diff --git a/business/jxstore/financial/financial.go b/business/jxstore/financial/financial.go index 1272131b1..cb222f4c2 100644 --- a/business/jxstore/financial/financial.go +++ b/business/jxstore/financial/financial.go @@ -296,13 +296,9 @@ func onTLpayFinished(call *tonglianpayapi.CallBackResult) (err error) { if call.TrxStatus == tonglianpayapi.TrxStatusSuccess { switch order.OrderType { case model.PayType4Express: -<<<<<<< HEAD - err = q_bida.CreateOrder2QBiDa(&userOrder) -======= err = q_bida.CreateOrder2QBiDa(&userOrder, order.OrderID) case model.PayType4Member, model.PayType4Recharge: err = OnPayFinished(order) ->>>>>>> 273aa3164fbc887ac30837bd4ce1b25410ca498c } } return err diff --git a/business/jxstore/financial/pay.go b/business/jxstore/financial/pay.go index 286785926..05cac2921 100644 --- a/business/jxstore/financial/pay.go +++ b/business/jxstore/financial/pay.go @@ -105,12 +105,27 @@ func OnCashFinished(order *model.Order) (err error) { //微信支付充值会员 func OnWXPayFinished(order *model.Order) (err error) { var ( + db = dao.GetDB() ctx *jxcontext.Context ) globals.SugarLogger.Debugf("OnWXPayFinished begin modify account order: %v", utils.Format4Output(order, false)) + //判断是新会员充值还是老会员续费 + userMembers, err := dao.GetUserMember(db, order.UserID, model.MemberTypeNormal) + if err != nil { + return err + } //根据订单类型来操作账户 if order.Type == model.OrderTypePay { - _, err = WXInvestMember(ctx, order.OrderType, order.UserID) + //为新会员生成会员信息并充值 + if len(userMembers) > 0 { + if _, err := WXInvestMember(ctx, order.OrderType, order.UserID); err != nil { + return err + } + } else { + if _, err := WXInvestMemberNew(ctx, order.OrderType, order.UserID); err != nil { + return err + } + } } else { globals.SugarLogger.Debugf("OnWXPayFinished 暂不支持此订单类型 order: %v", utils.Format4Output(order, false)) return fmt.Errorf("暂不支持此订单类型!") diff --git a/business/model/bill.go b/business/model/bill.go index 5abc28925..1e2860943 100644 --- a/business/model/bill.go +++ b/business/model/bill.go @@ -12,9 +12,11 @@ const ( BillTypeDropShippingDeposit = 18 //一件代发保证金 BillTypeUnionShare = 19 //联盟任务分成 - BillTypeMember = 20 //开通会员 - - BillTypeQuitGroup = 30 //退群 + BillTypeMember = 20 //开通会员 + BillTypePayByAccountBalance = 25 //余额支付 + BillTypePayByMixPay1 = 26 //混合支付中的 余额部分状态码 + BillTypePayByMixPay2 = 27 //混合支付中的 微信部分状态码 + BillTypeQuitGroup = 30 //退群 BillTypeJdWaybillOverWeight = 40 //京东物流超重扣款 diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index dda8501e6..fc53e14d1 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -124,6 +124,22 @@ type GetOrdersResult struct { Mobile string `json:"mobile"` } +var TableOrder = "order" + +func GetOrderByID(db *DaoDB, orderID string) (orderInfos *model.Order, err error) { + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + sql := `SELECT * FROM %s WHERE order_id = ?` + sqlParams = append(sqlParams, TableOrder, orderID) + txDB, _ := Begin(db) + defer Commit(db, txDB) + if err = GetRowsTx(txDB, &orderInfos, sql, sqlParams); err != nil { + return nil, err + } + return orderInfos, err +} + func GetOrders(db *DaoDB, orderID, userID string, orderType int, cityCodes []int, fromTime, toTime time.Time, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { var orders []*GetOrdersResult sql := ` diff --git a/controllers/order_controller.go b/controllers/order_controller.go index 4d69195e7..ccedaa1c4 100644 --- a/controllers/order_controller.go +++ b/controllers/order_controller.go @@ -30,6 +30,29 @@ func (c *OrderController) Pay() { }) } +// @PayByBalance 余额支付 +// @Description 支付 +// @Param token header string true "认证token" +// @Param orderID formData string true "订单号" +// @Param payType formData int true "支付平台类型" +// @Param vendorPayType formData string true "平台支付类型" +// @Param orderType formData string true "订单类型member(会员),express快递,recharge充值" +// @Param appId formData string true "appId" +// @Param restPrice formData int true "需要微信支付的价格" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /PayByBalance [post] + +func (c *OrderController) PayByBalance() { + c.callPayByBalance(func(params *tPayByBalanceParams) (retVal interface{}, errCode string, err error) { + retVal, err = cms.PayByBalance(params.Ctx, params.OrderID, params.RestPrice, params.PayType, params.VendorPayType, params.AppId) + return retVal, "", err + }) + //if _, err := financial.PayByBalance(orderID, payType, restPrice, appID, vendorPayType); err != nil { + // return err + //} +} + // @Title 提现 // @Description 提现 // @Param token header string true "认证token"