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 } // 发起支付 alipayOrder, err := SendPayInfo2Ali(payOrder, param) if err != nil { return err } if err := UpdateUserMoney(alipayOrder, 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("账户余额小于可支付余额,请重新申请") } // 发起支付 alipayOrder, 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, }) if err != nil { return err } if err := UpdateUserMoney(alipayOrder, userBill); err != nil { return err } return nil }