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 }