235 lines
7.3 KiB
Go
235 lines
7.3 KiB
Go
package q_bida
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"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"
|
||
"time"
|
||
)
|
||
|
||
// AddUserWithdrawal 用户发起提现操作
|
||
func AddUserWithdrawal(ctx *jxcontext.Context, param *model.AddWithdrawalRecordReq) error {
|
||
// 校验用户账户余额是否足够
|
||
userBill, err := dao.GetUserBill(dao.GetDB(), ctx.GetUserID(), "")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if userBill.AccountBalance < param.WithdrawalMoney {
|
||
return errors.New("账户余额小于可支付余额,请重新申请")
|
||
}
|
||
|
||
//1元以下免费,以上收取对应城市手续费
|
||
place, err := dao.GetPlaceByCode(dao.GetDB(), param.CityCode)
|
||
if err != nil || place == nil {
|
||
return fmt.Errorf("未找到该城市!code:%v", param.CityCode)
|
||
}
|
||
|
||
payOrder := &model.WithdrawalRecord{
|
||
OrderID: "",
|
||
UserID: ctx.GetUserID(),
|
||
WithdrawalMoney: param.WithdrawalMoney,
|
||
ServiceCharge: 0,
|
||
PayMoney: 0,
|
||
AlipayAccount: param.AlipayAccount,
|
||
AlipayName: param.AlipayName,
|
||
AlipayOrderId: "",
|
||
OrderStatus: model.WithdrawalWaitRecord,
|
||
PayTime: time.Now(),
|
||
Remark: "",
|
||
Lng: param.Lng,
|
||
Lat: param.Lat,
|
||
CityCode: param.CityCode,
|
||
DistrictCode: param.DistrictCode,
|
||
}
|
||
dao.WrapAddIDCULDEntity(payOrder, ctx.GetUserName())
|
||
payOrder.OrderID = fmt.Sprintf("%d", time.Now().Unix()) + ctx.GetUserID()[:4] + RandomString(4)
|
||
|
||
// 核算手续费
|
||
if param.WithdrawalMoney < 100 {
|
||
payOrder.ServiceCharge = 0
|
||
payOrder.PayMoney = param.WithdrawalMoney
|
||
} else {
|
||
payOrder.ServiceCharge = utils.Float64TwoInt(float64(param.WithdrawalMoney) * (float64(place.DividePercentage) / float64(100)))
|
||
payOrder.PayMoney = param.WithdrawalMoney - payOrder.ServiceCharge
|
||
}
|
||
|
||
// 发起支付
|
||
if err := SendPayInfo2Ali(payOrder, param); err != nil {
|
||
return err
|
||
}
|
||
if err := UpdateUserMoney(payOrder, userBill); err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// DeleteOrder 删除申请订单
|
||
func DeleteOrder(userId string, id int) error {
|
||
order := model.WithdrawalRecord{}
|
||
if err := dao.GetRow(dao.GetDB(), &order, `SELECT * FROM withdrawal_record WHERE id = ? AND user_id = ?`, []interface{}{id, userId}...); err != nil {
|
||
return err
|
||
}
|
||
order.DeletedAt = time.Now()
|
||
if _, err := dao.UpdateEntity(dao.GetDB(), &order, "DeletedAt"); err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// GetOrderListByStatus 用户获取申请订单列表
|
||
func GetOrderListByStatus(userId string, status, pageSize, pageNum int) (map[string]interface{}, error) {
|
||
order := make([]*model.WithdrawalRecord, 0, 0)
|
||
params := make([]interface{}, 0, 0)
|
||
sql := `SELECT SQL_CALC_FOUND_ROWS * FROM withdrawal_record WHERE user_id = ? AND order_status = ? AND deleted_at = ?`
|
||
params = append(params, userId, status, utils.DefaultTimeValue)
|
||
sql += " ORDER BY a.created_at DESC"
|
||
sql += " LIMIT ? OFFSET ?"
|
||
pageSize = jxutils.FormalizePageSize(pageSize)
|
||
params = append(params, pageSize, (pageNum-1)*pageSize)
|
||
|
||
db := dao.GetDB()
|
||
tx, _ := dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
panic(r)
|
||
}
|
||
dao.Commit(db, tx)
|
||
}()
|
||
|
||
if err := dao.GetRowsTx(tx, &order, sql, params...); err != nil {
|
||
dao.Rollback(db, tx)
|
||
return nil, err
|
||
}
|
||
|
||
result := make(map[string]interface{}, 2)
|
||
result["data"] = order
|
||
result["count"] = dao.GetLastTotalRowCountTx(tx)
|
||
|
||
return result, nil
|
||
}
|
||
|
||
// GetUserWithdrawalList 管理系统获取提现申请列表
|
||
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
|
||
LEFT JOIN user u ON w.user_id = u.user_id
|
||
LEFT JOIN user_bill b ON w.user_id = b.user_id
|
||
WHERE 1=1 AND w.deleted_at = ?
|
||
`
|
||
sqlParam := make([]interface{}, 0, 0)
|
||
sqlParam = append(sqlParam, utils.DefaultTimeValue)
|
||
result := make([]*model.WithdrawalListRes, 0, 0)
|
||
db := dao.GetDB()
|
||
tx, _ := dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
panic(r)
|
||
}
|
||
dao.Commit(db, tx)
|
||
}()
|
||
if param.OrderId != "" {
|
||
sql += ` AND w.order_id LIKE ? ORDER BY a.created_at DESC LIMIT ? OFFSET ?`
|
||
sqlParam = append(sqlParam, "%"+param.OrderId+"%", param.PageSize, (param.PageNum-1)*param.PageSize)
|
||
if err := dao.GetRowsTx(tx, &result, sql, sqlParam...); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
return result, dao.GetLastTotalRowCountTx(tx), nil
|
||
}
|
||
|
||
if param.UserId != "" {
|
||
sql += ` AND w.user_id LIKE ?`
|
||
sqlParam = append(sqlParam, "%"+param.UserId+"%")
|
||
}
|
||
if param.UserName != "" {
|
||
sql += ` AND u.name LIKE ?`
|
||
sqlParam = append(sqlParam, param.UserName)
|
||
}
|
||
if param.Phone != "" {
|
||
sql += ` AND u.mobile = ?`
|
||
sqlParam = append(sqlParam, param.Phone)
|
||
}
|
||
if param.OrderStatus != 0 {
|
||
sql += ` AND w.order_status = ?`
|
||
sqlParam = append(sqlParam, param.OrderStatus)
|
||
}
|
||
if param.StartTime != "" {
|
||
sql += ` AND w.created_at >= ? `
|
||
sqlParam = append(sqlParam, utils.Str2TimeWithDefault(param.StartTime, utils.DefaultTimeValue))
|
||
}
|
||
if param.EndTime != "" {
|
||
sql += ` AND w.created_at < ? `
|
||
sqlParam = append(sqlParam, utils.Str2TimeWithDefault(param.EndTime, utils.DefaultTimeValue))
|
||
}
|
||
sql += ` ORDER BY a.created_at DESC LIMIT ? OFFSET ?`
|
||
sqlParam = append(sqlParam, param.PageSize, (param.PageNum-1)*param.PageSize)
|
||
|
||
if err := dao.GetRowsTx(tx, &result, sql, sqlParam...); err != nil {
|
||
return nil, 0, err
|
||
}
|
||
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
|
||
}
|