diff --git a/business/model/withdrawal_record.go b/business/model/withdrawal_record.go index f921971c4..8bd288389 100644 --- a/business/model/withdrawal_record.go +++ b/business/model/withdrawal_record.go @@ -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"` +} diff --git a/business/q_bida/q_bida_server.go b/business/q_bida/q_bida_server.go index 94e8ce0f5..d9c4c1319 100644 --- a/business/q_bida/q_bida_server.go +++ b/business/q_bida/q_bida_server.go @@ -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) +} diff --git a/business/q_bida/withdrawal_record.go b/business/q_bida/withdrawal_record.go index d0e8decb7..63eb6d686 100644 --- a/business/q_bida/withdrawal_record.go +++ b/business/q_bida/withdrawal_record.go @@ -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 +} diff --git a/business/q_bida/withdrawal_record_utils.go b/business/q_bida/withdrawal_record_utils.go new file mode 100644 index 000000000..daf96aa3f --- /dev/null +++ b/business/q_bida/withdrawal_record_utils.go @@ -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 +} diff --git a/controllers/q_bida.go b/controllers/q_bida.go index 5df9d00dc..60851c941 100644 --- a/controllers/q_bida.go +++ b/controllers/q_bida.go @@ -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 + }) +} diff --git a/controllers/withdrawal_record.go b/controllers/withdrawal_record.go index 15831f739..08fe06b8a 100644 --- a/controllers/withdrawal_record.go +++ b/controllers/withdrawal_record.go @@ -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 + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 9ef94742f..97a697c8b 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -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}) }