187 lines
5.9 KiB
Go
187 lines
5.9 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()[:8]
|
||
|
||
// 核算手续费
|
||
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
|
||
}
|
||
return dao.CreateEntity(dao.GetDB(), payOrder)
|
||
}
|
||
|
||
// 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
|
||
}
|
||
|
||
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) {
|
||
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([]*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
|
||
}
|