添加用户提现操作

This commit is contained in:
邹宗楠
2022-07-11 15:16:10 +08:00
parent efc987d932
commit 780fca768e
7 changed files with 326 additions and 43 deletions

View File

@@ -54,3 +54,24 @@ func (*WithdrawalRecord) TableIndex() [][]string {
[]string{"OrderID"},
}
}
// 结构体
type OrderListParam struct {
PageSize int `json:"pageSize"`
PageNum int `json:"pageNum"`
UserId string `json:"userId"`
UserName string `json:"userName"`
OrderId string `json:"orderId"`
Phone string `json:"phone"`
OrderStatus int `json:"orderStatus"`
StartTime string `json:"startTime"`
EndTime string `json:"endTime"`
}
type WithdrawalListRes struct {
WithdrawalRecord
Name string `json:"name"`
Mobile string `json:"mobile"`
AccountBalance int `json:"accountBalance"`
}

View File

@@ -49,7 +49,6 @@ func QueryExpressPrice(param *bida.GetExpressPriceReq) (map[string]*bida.GetExpr
}
// 给快递默认值
result := make(map[string]*bida.GetExpressPriceRes, 0)
if param.Type == 0 {
// 渠道费每公斤加价五毛
@@ -464,11 +463,11 @@ func ManagerGetOrderList(param *model.OrderListReq) ([]*model.UserVendorOrder, i
paramSql = append(paramSql, param.StartTime, param.EndTime)
}
if param.ExpressType != 0 {
sql += `AND ou.type = ? `
sql += ` AND ou.type = ? `
paramSql = append(paramSql, param.ExpressType)
}
if param.OrderStatus != 0 {
sql += `AND ou.order_status = ? `
sql += ` AND ou.order_status = ? `
paramSql = append(paramSql, param.OrderStatus)
}
if param.PageNum == 0 {
@@ -493,6 +492,7 @@ func ManagerGetOrderList(param *model.OrderListReq) ([]*model.UserVendorOrder, i
return nil, 0, err
}
count := dao.GetLastTotalRowCountTx(txdb)
dao.Commit(db, txdb)
return result, count, nil
}
@@ -556,3 +556,75 @@ func UpdateOrderStatus() {
}
}
}
// TryAgainOrder 再来一单
func TryAgainOrder(ctx *jxcontext.Context, oldNo string) (*model.UserVendorOrder, error) {
sql := `SELECT * FROM user_vendor_order WHERE local_way_bill = ?`
var oldOrder *model.UserVendorOrder
if err := dao.GetRow(dao.GetDB(), &oldOrder, sql, []interface{}{oldNo}...); err != nil {
return nil, err
}
// 获取用户发货地址信息
sendAddress, countSend, err := dao.QueryUserDeliveryAddress(dao.GetDB(), oldOrder.SenderAddressID, nil, 0, 1, 10)
if err != nil || countSend != model.YES {
return nil, errors.New("查询错误/送货地址信息不正确")
}
// 获取用户收货
receiveAddress, receiveSend, err := dao.QueryUserDeliveryAddress(dao.GetDB(), oldOrder.SenderAddressID, nil, 0, 1, 10)
if err != nil || receiveSend != model.YES {
return nil, errors.New("查询错误/收货地址信息不正确")
}
// 查询配送费选择最低的
fee, err := QueryExpressPrice(&bida.GetExpressPriceReq{
Type: oldOrder.Type,
PromiseTimeType: oldOrder.PromiseTimeType,
DeliveryType: oldOrder.DeliveryType,
GoodsValue: oldOrder.GuarantFee,
ReceiveAddress: receiveAddress[0].AutoAddress,
SendAddress: sendAddress[0].AutoAddress,
Weight: oldOrder.Weight,
Length: oldOrder.Length,
Height: oldOrder.Height,
Width: oldOrder.Width,
SendPhone: sendAddress[0].ConsigneeMobile,
ChannelType: oldOrder.ChannelType,
})
if err != nil {
return nil, err
}
param := &model.MakeOrderParamReq{
PromiseTimeType: oldOrder.PromiseTimeType,
DeliveryType: oldOrder.DeliveryType,
Goods: oldOrder.Goods,
GuaranteeValueAmount: oldOrder.GuaranteeValueAmount,
Weight: oldOrder.Weight,
Length: oldOrder.Length,
Height: oldOrder.Height,
Width: oldOrder.Width,
OrderSendTime: oldOrder.OrderSendTime,
PackageNum: oldOrder.PackageNum,
ReceiveAddressId: oldOrder.ReceiveAddressID,
ReceiveAddress: receiveAddress[0].AutoAddress,
ReceiveName: receiveAddress[0].ConsigneeName,
ReceivePhone: receiveAddress[0].ConsigneeMobile,
Remark: oldOrder.Remark,
SenderAddressId: oldOrder.SenderAddressID,
SenderAddress: sendAddress[0].AutoAddress,
SenderName: sendAddress[0].ConsigneeName,
SenderPhone: sendAddress[0].ConsigneeMobile,
ThirdPlatform: oldOrder.ThirdPlatform,
Type: oldOrder.Type,
ChannelType: oldOrder.ChannelType,
Images: oldOrder.Img,
ChannelFee: fee[fmt.Sprintf("%d", oldOrder.Type)].Data.ChannelFee,
Bulk: utils.Int2Float64(fee[fmt.Sprintf("%d", oldOrder.Type)].Data.Bulk),
ServiceCharge: fee[fmt.Sprintf("%d", oldOrder.Type)].Data.ServiceCharge,
GuarantFee: fee[fmt.Sprintf("%d", oldOrder.Type)].Data.GuarantFee,
OriginalFee: utils.Int2Float64(fee[fmt.Sprintf("%d", oldOrder.Type)].Data.OriginalFee),
Increment: fee[fmt.Sprintf("%d", oldOrder.Type)].Data.IncrementFee,
}
return CreateWayOrder(ctx, param, oldOrder.UserId)
}

View File

@@ -3,13 +3,11 @@ package q_bida
import (
"errors"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/alipayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"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-callback/globals/api"
"time"
)
@@ -48,7 +46,7 @@ func AddUserWithdrawal(ctx *jxcontext.Context, param *model.AddWithdrawalRecordR
DistrictCode: param.DistrictCode,
}
dao.WrapAddIDCULDEntity(payOrder, ctx.GetUserName())
payOrder.OrderID = fmt.Sprintf("%d", time.Now().Unix()) + ctx.GetUserID()[:8]
payOrder.OrderID = fmt.Sprintf("%d", time.Now().Unix()) + ctx.GetUserID()[:4] + RandomString(4)
// 核算手续费
if param.WithdrawalMoney < 100 {
@@ -60,21 +58,14 @@ func AddUserWithdrawal(ctx *jxcontext.Context, param *model.AddWithdrawalRecordR
}
// 发起支付
var aliResult *alipayapi.Withdrawal4AliPayRes
if payOrder.WithdrawalMoney <= alipayapi.MinWithdrawalMoney {
aliResult, err = api.AliPayAPI.Withdrawal4AliPay(&alipayapi.WithdrawalParam{
OutBizNo: payOrder.OrderID,
TransAmount: utils.Int2Float64(payOrder.PayMoney),
OrderTitle: "京西生活提现成功",
PayeeInfo: &alipayapi.PayeeInfoParam{
Identity: param.AlipayAccount,
Name: param.AlipayName,
},
Remark: payOrder.Remark,
})
if err := SendPayInfo2Ali(payOrder, param); err != nil {
return err
}
if err := UpdateUserMoney(payOrder, userBill); err != nil {
return err
}
return dao.CreateEntity(dao.GetDB(), payOrder)
return nil
}
// DeleteOrder 删除申请订单
@@ -122,27 +113,8 @@ func GetOrderListByStatus(userId string, status, pageSize, pageNum int) (map[str
return result, nil
}
type OrderListParam struct {
PageSize int `json:"pageSize"`
PageNum int `json:"pageNum"`
UserId string `json:"userId"`
UserName string `json:"userName"`
OrderId string `json:"orderId"`
Phone string `json:"phone"`
OrderStatus int `json:"orderStatus"`
StartTime string `json:"startTime"`
EndTime string `json:"endTime"`
}
type WithdrawalListRes struct {
model.WithdrawalRecord
Name string `json:"name"`
Mobile string `json:"mobile"`
AccountBalance int `json:"accountBalance"`
}
// GetUserWithdrawalList 管理系统获取提现申请列表
func GetUserWithdrawalList(param *OrderListParam) ([]*WithdrawalListRes, int, error) {
func GetUserWithdrawalList(param *model.OrderListParam) ([]*model.WithdrawalListRes, int, error) {
sql := `
SELECT SQL_CALC_FOUND_ROWS w.* ,u.name,u.mobile,b.account_balance
FROM withdrawal_record w
@@ -152,7 +124,7 @@ func GetUserWithdrawalList(param *OrderListParam) ([]*WithdrawalListRes, int, er
`
sqlParam := make([]interface{}, 0, 0)
sqlParam = append(sqlParam, utils.DefaultTimeValue)
result := make([]*WithdrawalListRes, 0, 0)
result := make([]*model.WithdrawalListRes, 0, 0)
db := dao.GetDB()
tx, _ := dao.Begin(db)
defer func() {
@@ -202,3 +174,61 @@ func GetUserWithdrawalList(param *OrderListParam) ([]*WithdrawalListRes, int, er
}
return result, dao.GetLastTotalRowCountTx(tx), nil
}
// ManagerExamineWithdrawal 管理员审核提现
func ManagerExamineWithdrawal(userId, orderId string, examineStatus int, phone, remark string) error {
// 审核不通过
if examineStatus != model.YES && remark == "" {
return errors.New("拒绝申请原因未填写")
}
// 获取当前用户提现订单
var order *model.WithdrawalRecord
if err := dao.GetRow(dao.GetDB(), &order, `SELECT * FROM withdrawal_record WHERE user_id = ? and order_id = ?`, []interface{}{userId, orderId}...); err != nil {
return err
}
// 审核不通过
if examineStatus != model.YES {
order.OrderStatus = model.WithdrawalRecordFail
order.Remark = remark
order.LastOperator = phone
order.UpdatedAt = time.Now()
_, err := dao.UpdateEntity(dao.GetDB(), &order, "OrderStatus", "Remark", "LastOperator", "UpdatedAt")
return err
}
// 获取当前用户钱包余额
userBill, err := dao.GetUserBill(dao.GetDB(), userId, "")
if err != nil {
return err
}
if userBill.AccountBalance < order.WithdrawalMoney {
order.OrderStatus = model.WithdrawalRecordFail
order.Remark = "当前用户余额,小于提现金额。请重新发起支付"
order.LastOperator = phone
order.UpdatedAt = time.Now()
_, err := dao.UpdateEntity(dao.GetDB(), &order, "OrderStatus", "Remark", "LastOperator", "UpdatedAt")
if err != nil {
return err
}
return errors.New("账户余额小于可支付余额,请重新申请")
}
// 发起支付
if err := SendPayInfo2Ali(order, &model.AddWithdrawalRecordReq{
WithdrawalMoney: order.PayMoney,
AlipayAccount: order.AlipayAccount,
AlipayName: order.AlipayName,
Lng: order.Lng,
Lat: order.Lat,
CityCode: order.CityCode,
DistrictCode: order.DistrictCode,
}); err != nil {
return err
}
if err := UpdateUserMoney(order, userBill); err != nil {
return err
}
return nil
}

View File

@@ -0,0 +1,66 @@
package q_bida
import (
"git.rosy.net.cn/baseapi/platformapi/alipayapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals/api"
)
// SendPayInfo2Ali 发起支付
func SendPayInfo2Ali(payOrder *model.WithdrawalRecord, param *model.AddWithdrawalRecordReq) error {
if payOrder.WithdrawalMoney <= alipayapi.MinWithdrawalMoney {
aliResult, err := api.AliPayAPI.Withdrawal4AliPay(&alipayapi.WithdrawalParam{
OutBizNo: payOrder.OrderID,
TransAmount: utils.Int2Float64(payOrder.PayMoney),
OrderTitle: "京西生活提现成功",
PayeeInfo: &alipayapi.PayeeInfoParam{
Identity: param.AlipayAccount,
Name: param.AlipayName,
},
Remark: payOrder.Remark,
})
if err != nil || aliResult.Status != "SUCCESS" {
payOrder.OrderStatus = model.WithdrawalRecordPayFail // 支付失败
} else {
payOrder.OrderStatus = model.WithdrawalRecordPaySuccess // 支付成功
payOrder.AlipayOrderId = aliResult.OrderId
payOrder.PayTime = utils.Str2Time(aliResult.TransDate)
}
}
return nil
}
// UpdateUserMoney 修改数据库
func UpdateUserMoney(payOrder *model.WithdrawalRecord, userBill *model.UserBill) error {
// 如果支付成功
db := dao.GetDB()
tx, _ := dao.Begin(db)
defer func() {
if r := recover(); r != nil {
panic(r)
}
dao.Commit(db, tx)
}()
switch payOrder.OrderStatus {
case model.WithdrawalRecordPaySuccess:
userBill.AccountBalance = userBill.AccountBalance - payOrder.WithdrawalMoney
if _, err := dao.UpdateEntityTx(tx, &userBill, "AccountBalance"); err != nil {
dao.Rollback(db, tx)
return err
}
if err := dao.CreateEntityTx(tx, payOrder); err != nil {
dao.Rollback(db, tx)
return err
}
case model.WithdrawalWaitRecord, model.WithdrawalRecordFail, model.WithdrawalRecordPayFail:
if err := dao.CreateEntityTx(tx, payOrder); err != nil {
dao.Rollback(db, tx)
return err
}
}
return nil
}

View File

@@ -248,3 +248,18 @@ func (c *QBiDaExpressController) DeleteOrder() {
return count, "", err
})
}
// TryAgainOrderByOldOrder 用户再来一单
// @Title Q必达
// @Description 再来一单
// @Param token header string true "用户token"
// @Param oldNo formData string true "旧的订单Id"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /TryAgainOrderByOldOrder [post]
func (c *QBiDaExpressController) TryAgainOrderByOldOrder() {
c.callTryAgainOrderByOldOrder(func(params *tExpressTryAgainOrderByOldOrderParams) (interface{}, string, error) {
newOrder, err := bidaServer.TryAgainOrder(params.Ctx, params.OldNo)
return newOrder, "", err
})
}

View File

@@ -1,6 +1,7 @@
package controllers
import (
"errors"
"git.rosy.net.cn/jx-callback/business/model"
withdreawal "git.rosy.net.cn/jx-callback/business/q_bida"
"github.com/astaxie/beego/server/web"
@@ -92,7 +93,7 @@ func (c *WithdrawalRecordController) GetWithdrawalRecord() {
// @router /GetWithdrawalList [post]
func (c *WithdrawalRecordController) GetWithdrawalList() {
c.callGetWithdrawalList(func(params *tWithdrawalGetWithdrawalListParams) (interface{}, string, error) {
data, count, err := withdreawal.GetUserWithdrawalList(&withdreawal.OrderListParam{
data, count, err := withdreawal.GetUserWithdrawalList(&model.OrderListParam{
PageSize: params.PageSize,
PageNum: params.PageNum,
UserId: params.UserId,
@@ -111,4 +112,25 @@ func (c *WithdrawalRecordController) GetWithdrawalList() {
})
}
//
// ExamineWithdrawalOrder
// 管理员审核提现申请
// @Title 审核提现申请
// @Description 审核提现申请
// @Param token header string true "认证token"
// @Param phone formData string true "当前审核人员电话号码"
// @Param orderId formData string true "被审核订单Id"
// @Param examineStatus formData int true "1-通过"
// @Param remark formData string false "不通过原因"
// @Param userId formData string false "提现人员Id"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /ExamineWithdrawalOrder [post]
func (c *WithdrawalRecordController) ExamineWithdrawalOrder() {
c.callExamineWithdrawalOrder(func(params *tWithdrawalExamineWithdrawalOrderParams) (interface{}, string, error) {
if DefaultMobile[params.Phone] != "ok" {
return nil, "", errors.New("当前用户不具备操作权限,请联系管理员")
}
err := withdreawal.ManagerExamineWithdrawal(params.UserId, params.OrderId, params.ExamineStatus, params.Phone, params.Remark)
return nil, "", err
})
}

View File

@@ -1078,6 +1078,16 @@ func init() {
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 再来一单
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:QBiDaExpressController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:QBiDaExpressController"],
beego.ControllerComments{
Method: "TryAgainOrderByOldOrder",
Router: "/TryAgainOrderByOldOrder",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 修改用户账户余额
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserBalanceController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserBalanceController"],
beego.ControllerComments{
@@ -1087,7 +1097,8 @@ func init() {
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请
// 修改用户账户余额
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "UpdateUserBalance",
@@ -1096,4 +1107,50 @@ func init() {
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请:用户发起提现申请
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "AddWWithdrawalRecord",
Router: "/AddWWithdrawalRecord",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请:取消或者删除提现生情
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "DeleteWithdrawalRecord",
Router: "/DeleteWithdrawalRecord",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请:用户查询申请列表
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "GetWithdrawalRecord",
Router: "/GetWithdrawalRecord",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请:管理系统查询列表
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "GetWithdrawalList",
Router: "/GetWithdrawalList",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
// 提现申请:审核提现申请
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:WithdrawalRecordController"],
beego.ControllerComments{
Method: "ExamineWithdrawalOrder",
Router: "/ExamineWithdrawalOrder",
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
}