Files
jx-callback/business/q_bida/withdrawal_record.go
邹宗楠 efc987d932 1
2022-07-11 09:52:25 +08:00

205 lines
6.4 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/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"
)
// 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
}
// 发起支付
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,
})
}
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
}