Files
jx-callback/business/q_bida/withdrawal_record.go
2022-07-11 15:16:10 +08:00

235 lines
7.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}