1067 lines
40 KiB
PHP
Executable File
1067 lines
40 KiB
PHP
Executable File
<?php
|
||
|
||
namespace App\Http\Controllers\Api\Customer;
|
||
|
||
use App\Enums\LottState;
|
||
use App\Enums\OrderType;
|
||
use App\Enums\PayState;
|
||
use App\Enums\PayType;
|
||
use App\Exceptions\JingCaiException;
|
||
use App\Model\Config;
|
||
use App\Model\Customer\Customer;
|
||
use App\Model\Customer\CustomerFollow;
|
||
use App\Model\Customer\CustomerRanking;
|
||
use App\Model\Lottery;
|
||
use App\Model\Order;
|
||
use App\Service\LotteryService;
|
||
use App\Utils\Helps;
|
||
use App\Utils\ThrowException;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Arr;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
class OrderController extends BaseController
|
||
{
|
||
|
||
const FILTER_HIT_RATE = 'hit_rate'; // 命中率
|
||
const FILTER_HOT = 'hot'; // 跟单人气
|
||
const FILTER_MONEY = 'money'; // 自购金额
|
||
const FILTER_FOLLOW = 'follow'; // 我的关注
|
||
|
||
/**
|
||
* @api {GET} /api/customer/order/da_shen_list 跟单-一站成名等
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code": 200,
|
||
* "message": "",
|
||
* "data": {
|
||
* "lian_hong": [ // 连红榜
|
||
* {
|
||
* "id": 1,
|
||
* "name": "我是大神1",
|
||
* "nickname": "我是大神1",
|
||
* "avatar": "",
|
||
* "red_num": 1
|
||
* }
|
||
* ],
|
||
* "cheng_ming": [ // 一站成名
|
||
* {
|
||
* "id": 1,
|
||
* "name": "我是大神1",
|
||
* "nickname": "我是大神1",
|
||
* "avatar": "",
|
||
* "red_num": 1
|
||
* }
|
||
* ],
|
||
* "sheng_lv": [ // 胜率榜
|
||
* {
|
||
* "id": 1,
|
||
* "name": "我是大神1",
|
||
* "nickname": "我是大神1",
|
||
* "avatar": "",
|
||
* "red_num": 1
|
||
* }
|
||
* ]
|
||
* }
|
||
* }
|
||
*/
|
||
public function daShenList()
|
||
{
|
||
|
||
$cdate = date('Ymd');
|
||
$fames = CustomerRanking::with('customer:id,name,nickname,avatar,remark')
|
||
->where('cdate', $cdate)
|
||
->where('rank_fame', 1)
|
||
->orderBy('last_prize', 'desc')
|
||
->limit(4)
|
||
->get();
|
||
|
||
$hitRate = CustomerRanking::with('customer:id,name,nickname,avatar,remark')
|
||
->where('cdate', $cdate)
|
||
->where('rank_hit_rate', 1)
|
||
->orderBy('wined_max7', 'desc')
|
||
->limit(4)
|
||
->get();
|
||
|
||
$prifit = CustomerRanking::with('customer:id,name,nickname,avatar,remark')
|
||
->where('cdate', $cdate)
|
||
->where('rank_profit', 1)
|
||
->orderBy('last_prize', 'desc')
|
||
->limit(4)
|
||
->get();
|
||
$data = [
|
||
'lian_hong' => $hitRate,
|
||
'cheng_ming' => $fames,
|
||
'sheng_lv' => $prifit,
|
||
];
|
||
$this->setGendanNum($data);
|
||
return $this->jsonSuccess($data);
|
||
}
|
||
|
||
protected function setGendanNum(&$data) {
|
||
$values = array_values($data);
|
||
$customerRankings = collect();
|
||
foreach ($values as $item) {
|
||
$customerRankings = $customerRankings->merge($item);
|
||
}
|
||
$customerIds = $customerRankings->pluck('customer_id')->toArray();
|
||
$allowGendanNum = [];
|
||
if ($customerIds) {
|
||
$allowGendanNum = Order::select([
|
||
'customer_id',
|
||
DB::raw('count(*) as c')
|
||
])
|
||
->where('lottery_state', LottState::WAIT)
|
||
->where('type', OrderType::FADAN)
|
||
->whereIn('customer_id', $customerIds)
|
||
->where('pay_state', PayState::SUCCESS)
|
||
->where('odds_early_close_time', '>', date('Y-m-d H:i:s'))
|
||
->groupBy('customer_id')
|
||
->pluck('c', 'customer_id')
|
||
->toArray();
|
||
}
|
||
foreach ($data as $k => &$items) {
|
||
foreach ($items as &$item) {
|
||
$item->gendan_num = Arr::get($allowGendanNum, $item->customer_id, 0);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/customer/order/ranking_list 排名详情
|
||
*/
|
||
public function rankingList(Request $request)
|
||
{
|
||
$rankTypes = [
|
||
'rank_fame' => 'last_prize',
|
||
'rank_hit_rate' => 'wined_max7',
|
||
'rank_profit' => 'profit_lv7'
|
||
];
|
||
// rank_type: rank_fame, rank_hit_rate,rank_profit
|
||
$rankType = $request->input('rank_type');
|
||
|
||
$sortField = Arr::get($rankTypes, $rankType);
|
||
if (!$rankType || !$sortField) {
|
||
return $this->jsonSuccess([]);
|
||
}
|
||
|
||
$list = CustomerRanking::with('customer:id,name,nickname,avatar,remark')
|
||
->where('cdate', date('Ymd'))
|
||
->where($rankType, 1)
|
||
->orderBy($sortField, 'desc')
|
||
->limit(10)
|
||
->get();
|
||
|
||
$customerIdList = [];
|
||
foreach ($list as $item) {
|
||
$customerIdList[] = $item->customer_id;
|
||
}
|
||
|
||
$followed = CustomerFollow::whereIn('customer_id', $customerIdList)
|
||
->where('follower_id', $this->customerId())
|
||
->pluck('follower_id', 'customer_id')
|
||
->toArray();
|
||
foreach ($list as $item) {
|
||
$item->followed = Arr::get($followed, $item->customer_id) ? true : false;
|
||
}
|
||
|
||
return $this->jsonSuccess([
|
||
'data' => $list,
|
||
'total' => 0
|
||
]);
|
||
}
|
||
|
||
// {GET} /api/customer/order/fadan_customers 跟单-大厅列表
|
||
public function fadanCustomers(Request $request) {
|
||
$nickname = $request->input('nickname');
|
||
if (!$nickname) {
|
||
return $this->jsonSuccess();
|
||
}
|
||
|
||
$customers = Order::leftJoin('customer', 'order.customer_id', 'customer.id')
|
||
->select([
|
||
'customer.id',
|
||
'customer.name',
|
||
'customer.nickname',
|
||
'customer.avatar',
|
||
'customer.fans_num',
|
||
'customer.fadan_num',
|
||
'customer.follower_num',
|
||
DB::raw('count(*) as c')
|
||
])
|
||
->where('order.type', OrderType::FADAN)
|
||
// ->where('customer.follower_num', '>', 0)
|
||
->whereLike('customer.nickname', $nickname)
|
||
->groupBy('customer.id')
|
||
->paging();
|
||
|
||
$customerIdList = [];
|
||
foreach ($customers as $item) {
|
||
$customerIdList[] = $item->id;
|
||
}
|
||
|
||
$rankings = CustomerRanking::where('customer_id', $customerIdList)
|
||
->where('cdate', date('Ymd'))
|
||
->get()
|
||
->keyBy('customer_id');
|
||
foreach ($customers as $item) {
|
||
$item->ranking = Arr::get($rankings, $item->id);
|
||
}
|
||
|
||
return $this->jsonSuccess($customers);
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/copies 跟单-大厅列表
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} filter hit_rate:命中率;hot: 跟单人气;money: 自购金额;follow: 我的关注
|
||
* @apiParam {String} [nickname] 彩民昵称
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code": 200,
|
||
* "message": "",
|
||
* "data": {
|
||
* "current_page": 1,
|
||
* "data": [
|
||
* {
|
||
* "nickname": "", // 用户昵称
|
||
* "name": "发达", // 用户名称
|
||
* "win_alway_num": 0, // 连胜次数
|
||
* "avatar": "", // 用户头像
|
||
* "id": 1,
|
||
* "customer_id": 1,
|
||
* "lottery_id": 1,
|
||
* "money": 24, // 自购金额
|
||
* "pid": 0,
|
||
* "odds_early_close_time": "2023-04-05 15:48:38", // 结束时间
|
||
* "play_type": "mixed",
|
||
* "pass_mode": [ // 玩法
|
||
* "2.1"
|
||
* ],
|
||
* "copy_num": 0,
|
||
* "play_type_name": "混合投注", // 玩法名称
|
||
* "buy_type_name": "自购", // 购买类型
|
||
* "pass_mode_name": [
|
||
* "2串1"
|
||
* ],
|
||
* "lottery": {
|
||
* "id": 1,
|
||
* "name": "竞彩足球", // 彩种名称
|
||
* "description": "出票,最低投注0元,停售前0分钟截止投注"
|
||
* }
|
||
* },
|
||
* ],
|
||
* "from": 1,
|
||
* "per_page": 20,
|
||
* "to": 2,
|
||
* "total": 2
|
||
* }
|
||
* }
|
||
*/
|
||
public function copies(Request $request)
|
||
{
|
||
$size = $request->input('size');
|
||
$filter = $request->input('filter');
|
||
$nickname = $request->input('nickname');
|
||
|
||
$customerIds = [];
|
||
if ($nickname) {
|
||
$customerIds = Customer::whereLike('nickname', $nickname)->pluck('id')->toArray();
|
||
if (!$customerIds) {
|
||
return $this->jsonSuccess();
|
||
}
|
||
}
|
||
|
||
$query = Order::with([
|
||
'lottery:id,name',
|
||
])
|
||
->leftJoin('customer', 'order.customer_id', '=', 'customer.id')
|
||
->select([
|
||
'customer.nickname', 'customer.name', 'customer.win_alway_num', 'customer.avatar',
|
||
'order.id', 'order.order_sn', 'order.customer_id', 'order.lottery_id', 'order.money', 'order.pid', 'order.odds_early_close_time', 'order.play_type', 'order.pass_mode', 'order.gendan_num', 'order.type'
|
||
])
|
||
->where('type', OrderType::FADAN)
|
||
->where('order.pay_state', PayState::SUCCESS)
|
||
->where('odds_early_close_time', '>', date('Y-m-d H:i:s'))
|
||
// ->whereIn('order.lottery_state', [LottState::PENDING, LottState::WAIT, LottState::DRAFT]);
|
||
->where('order.lottery_state', LottState::WAIT);
|
||
if ($nickname && $customerIds) {
|
||
$query->whereIn('customer_id', $customerIds);
|
||
}
|
||
|
||
// TODO:: 我的关注
|
||
if ($filter == self::FILTER_FOLLOW) {
|
||
$follows = CustomerFollow::where('follower_id', $this->customerId())->get()->toArray();
|
||
if (!$follows) {
|
||
return $this->jsonSuccess([
|
||
'data' => [],
|
||
'total' => 0,
|
||
'per_page' => 20
|
||
]);
|
||
}
|
||
$query->whereIn('customer_id', array_column($follows, 'customer_id'));
|
||
}
|
||
|
||
if ($filter == self::FILTER_HIT_RATE) {
|
||
$query->orderBy('customer.win_alway_num', 'desc')
|
||
->orderBy('customer.win_hit_rate', 'desc');
|
||
} else if ($filter == self::FILTER_HOT) {
|
||
$query->orderBy('order.gendan_num', 'desc');
|
||
} else if ($filter == self::FILTER_MONEY) {
|
||
$query->orderBy('order.money', 'desc');
|
||
}
|
||
$orders = $query->paging($size);
|
||
foreach ($orders as $item) {
|
||
$item->avatar = Helps::resizeImage($item->avatar);
|
||
}
|
||
return $this->jsonSuccess($orders);
|
||
}
|
||
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/copy 跟单创建
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
* @apiParam {Float} money 金额
|
||
* @apiParam {Int} bets_num 倍数
|
||
* @apiParamExample {json} 请求示例
|
||
* {
|
||
* "id":1, // 订单id
|
||
* "money":2, // 金额
|
||
* "bets_num":2,
|
||
* }
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code":200,
|
||
* "message":"",
|
||
* "data":{
|
||
* "order_sn":"P2023033000000010", // 订单号
|
||
* "balance":"0.00", // 余额
|
||
* "money":0, // 订单金额
|
||
* "username":"发达", // 用户名
|
||
* "lottery":"jc足球混合投注", // 投注彩票信息
|
||
* "pay_types":[ // 支付方式
|
||
* {
|
||
* "pay_type":"alipay",
|
||
* "name":"支付宝"
|
||
* }
|
||
* ]
|
||
* }
|
||
* }
|
||
*/
|
||
public function copy(Request $request)
|
||
{
|
||
$orderSn = $request->input('order_sn');
|
||
throw_if(!$orderSn, JingCaiException::create('id不能为空!'));
|
||
$betsNum = $request->input('bets_num');
|
||
throw_if($betsNum < 1 || !is_integer($betsNum), JingCaiException::create('投注倍数有误'));
|
||
|
||
/** @var Order $od */
|
||
$od = Order::sn($orderSn)->first();
|
||
ThrowException::isTrue(!$od, '所跟订单不存在');
|
||
|
||
ThrowException::isTrue($od->type != OrderType::FADAN, '请在跟单大厅中跟单');
|
||
// ThrowException::isTrue(!$od->canCopy(), '已无法跟单,请选择大厅中的其他跟单');
|
||
ThrowException::isTrue($od->customer_id == $this->customerId(), '无法跟单自己的发单');
|
||
|
||
ThrowException::isTrue($od->lottery_state != LottState::WAIT, '订单状态有误');
|
||
ThrowException::isTrue(date('Y-m-d H:i:s') > $od->odds_early_close_time, '所跟订单已结束投注');
|
||
|
||
/** @var Order $gendan */
|
||
$gendan = Order::where('pid', $od->id)->where('customer_id', $this->customerId())->first();
|
||
if ($gendan) {
|
||
// if ($gendan->pay_state == PayState::SUCCESS) {
|
||
// if (in_array($gendan->lottery_state, $gendan->gendanLotteryState())) {
|
||
// ThrowException::run('无法重复跟单');
|
||
// }
|
||
// }
|
||
if ($gendan->pay_state == PayState::UNPAID) {
|
||
$gendan->where('id', $gendan->id)->where('pay_state', PayState::SUCCESS)->delete();
|
||
}
|
||
}
|
||
|
||
$service = LotteryService::getJingcaiServiceByOrder($od);
|
||
$order = $service->copyOrder($this->customer(), $od, $request->all());
|
||
ThrowException::isTrue(!$order, '不支持跟单');
|
||
|
||
$payMoney = $order->getPayMoney();
|
||
|
||
/** @var Customer $customer */
|
||
$customer = Customer::find($this->customerId());
|
||
$balance = $customer->balanceActive();
|
||
return $this->jsonSuccess([
|
||
'order_sn' => $order->order_sn,
|
||
'balance' => $balance,
|
||
'money' => $payMoney,
|
||
'need_pay_money' => Helps::floatFormat($balance >= $payMoney ? 0 : $payMoney - $balance),
|
||
'username' => $this->customer()->name,
|
||
'lottery' => $order->lotteryName(),
|
||
'pay_types' => $this->getPayTypes()
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/customer/order/show 订单详情(普通投注和发单)
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code": 200,
|
||
* "message": "",
|
||
* "data": {
|
||
* "lottery_type": {
|
||
* "id": 1,
|
||
* "type": "jczq", //jczq:竞彩足球,jclq:竞彩篮球,ctzq_jqc4:场进球彩,ctzq_bqc6:场半全场(根据此字段判断订单详情中的投注信息)
|
||
* "name": "jc足球"
|
||
* }
|
||
* "customer":{ // 投注人
|
||
* "id":2,
|
||
* "name":"",
|
||
* "nickname":"", // 投注人名
|
||
* "level_name":"储备组长",
|
||
* "level_score_group":"5000",
|
||
* "lottery_state_name":"",
|
||
* "client_type_name":"未知"
|
||
* },
|
||
* "id": 2,
|
||
* "pid": 0,
|
||
* "lottery_is_wined": true, // true中奖;false未中奖
|
||
* "order_sn": "P2023040900000002",
|
||
* "customer_id": 1,
|
||
* "lottery_id": 1,
|
||
* "shop_id": 0,
|
||
* "lottery_type_id": 0,
|
||
* "type": 1,
|
||
* "copy_num": 0, // 跟单数
|
||
* "bets_num": 2, // 倍数
|
||
* "piao_num": 0, //
|
||
* "money": 24, // 购买金额
|
||
* "prize_min": "11.04", // 最低奖金
|
||
* "prize_max": "142.56", // 最高奖金
|
||
* "pass_mode": [
|
||
* "2.1"
|
||
* ],
|
||
* "play_type": "mixed",
|
||
* "pay_type": "",
|
||
* "pay_state": "success",
|
||
* "pay_at": "2023-04-09 03:41:06",
|
||
* "odds_early_close_time": "2023-04-05 15:38:38",
|
||
* "odds_late_close_time": "2023-04-06 15:38:38",
|
||
* "lottery_state": 5,
|
||
* "lottery_prize": "0.00", // 中奖金额
|
||
* "lottery_tax_prize": "0.00", // 中奖金额
|
||
* "type_mode": 1, 1截止后公开,2公开;3认购可见
|
||
* "type_desc": "浪费大家发的啦",
|
||
* "created_at": "2023-04-09T03:32:51.000000Z",
|
||
* "updated_at": "2023-04-09T03:41:06.000000Z",
|
||
* "deleted_at": null,
|
||
* "sellings": [ // 4场进球彩/6场半全场
|
||
* {
|
||
* "no": "01", // 序号
|
||
* "team_name": "jc_home_team_name+1", // 球队名
|
||
* "odds": [ // 购买的比分
|
||
* 1,
|
||
* 2
|
||
* ]
|
||
* },
|
||
* ],
|
||
* "sellings": [ // 竞彩篮球,竞彩足球
|
||
* {
|
||
* "issue_num": "2022-01-01/周一",
|
||
* "play_num": 21,
|
||
* "jc_competition_name": "adsf离开家",
|
||
* "jc_competition_name_full": "发三分大赛",
|
||
* "jc_home_team_name": "发顺丰",
|
||
* "jc_home_team_name_full": "发送",
|
||
* "jc_away_team_name": "fda",
|
||
* "jc_away_team_name_full": "fda",
|
||
* "id": 3,
|
||
* "order_id": 2,
|
||
* "jczq_odds_id": 3,
|
||
* "odds_id": 1,
|
||
* "match_id": 1,
|
||
* "odds_result": 0,
|
||
* "issue_num_week": "周一",
|
||
* "issue_num_day": "2022-01-01",
|
||
* "vs_b": "发顺丰",
|
||
* "vs_m": "vs",
|
||
* "vs_a": "fda",
|
||
* "half_time_score": "fda", // 足球:半场比分
|
||
* "full_time_score": "fda", // 足球:全场比分
|
||
* "home_score": "fda", // 篮球: 主队得分
|
||
* "away_score": "fda", // 篮球: 客队得分
|
||
* "play_items": [ // 每种玩法和对应的投注项
|
||
* {
|
||
* "win_result": "",
|
||
* "play_name": "胜平负", // 玩法
|
||
* "play_items": [
|
||
* {
|
||
* name: "胜", // 投注项
|
||
* wined: true, // 是否中
|
||
* }
|
||
* ]
|
||
* }
|
||
* ]
|
||
* },
|
||
*
|
||
* ],
|
||
* "chang_num": 2,
|
||
* "pass_mode_names": [ // 串关
|
||
* "2x1"
|
||
* ],
|
||
* "play_name": "竞彩足球", // 彩种
|
||
* "play_type_name": "混合投注", // 玩法
|
||
* "buy_type_name": "自购",
|
||
* "pass_mode_name": [
|
||
* "2串1"
|
||
* ],
|
||
* "materials": [],
|
||
* "gendan_info": { // 跟单信息
|
||
* "brokerage":1, // 跟单佣金
|
||
* "count_gendan":1, // 跟单人数
|
||
* "count_default_show":10, // 默认人数
|
||
* "list":[
|
||
* {
|
||
* "id":16,
|
||
* "pid":13,
|
||
* "customer_id":2,
|
||
* "money":20, // 跟单金额
|
||
* "lottery_state":5,
|
||
* "lottery_tax_prize":"0.00", // 税后奖金
|
||
* "play_type_name":"",
|
||
* "buy_type_name":"",
|
||
* "pass_mode_name":[
|
||
*
|
||
* ],
|
||
* "lottery_estimate_send_prize":"0.00",
|
||
* "gendan_brokerage":"0.00",
|
||
* "customer":{ // 投注人
|
||
* "id":2,
|
||
* "name":"",
|
||
* "nickname":"", // 投注人名
|
||
* "level_name":"储备组长",
|
||
* "level_score_group":"5000",
|
||
* "lottery_state_name":"",
|
||
* "client_type_name":"未知"
|
||
* },
|
||
* "p_order":{ // 发单
|
||
* "id":13,
|
||
* "order_sn":"P2023050500000004",
|
||
* "customer_id":1,
|
||
* "play_type_name":"",
|
||
* "buy_type_name":"",
|
||
* "pass_mode_name":[
|
||
*
|
||
* ],
|
||
* "lottery_estimate_send_prize":null,
|
||
* "gendan_brokerage":null,
|
||
* "customer":{ // 发单人
|
||
* "id":1,
|
||
* "nickname":"",
|
||
* "name":"发达",
|
||
* "level_name":"储备组长",
|
||
* "level_score_group":"5000",
|
||
* "lottery_state_name":"",
|
||
* "client_type_name":"未知"
|
||
* }
|
||
* }
|
||
* }
|
||
* ]
|
||
* }
|
||
* }
|
||
* }
|
||
*
|
||
*/
|
||
public function show(Request $request)
|
||
{
|
||
$orderSn = $request->input('order_sn');
|
||
/** @var Order $order */
|
||
$order = Order::with([
|
||
'materials:id,order_id,path', 'receiver:id,name',
|
||
'lotteryType:id,type,name',
|
||
'customer:id,nickname,name,avatar'
|
||
])->sn($orderSn)->first();
|
||
ThrowException::isTrue(!$order, '订单不存在');
|
||
|
||
$order->withShuziCai();
|
||
if ($order->type == OrderType::UNION) {
|
||
if ($order->id != $order->pid) {
|
||
$order = Order::with([
|
||
'materials:id,path,order_id', 'receiver:id,name',
|
||
'lotteryType:id,type,name',
|
||
'customer:id,nickname,name,avatar'
|
||
])->where('id', $order->pid)->first();
|
||
}
|
||
}
|
||
|
||
$order->p_order = null;
|
||
if ($order->pid > 0) {
|
||
$pOrder = Order::with('customer:id,nickname,name')
|
||
->select('id', 'customer_id')
|
||
->find($order->pid);
|
||
$order->p_order = $pOrder;
|
||
$order->p_order->fadan_lv = Config::fadanAllFeeLv() * 100 . '%';
|
||
}
|
||
|
||
$jingcaiService = LotteryService::getJingcaiServiceByOrder($order);
|
||
|
||
$order->gendan_info = $order->getGendanInfo();
|
||
$order->union_info = $order->getUnionInfo();
|
||
|
||
$orderData = $jingcaiService->showOrder($this->customer(), $order);
|
||
|
||
|
||
$closeTime = $order->getMatchStartTime();
|
||
$orderData->all_closed = true;
|
||
if (($orderData->type == OrderType::FADAN && $this->customerId()!= $orderData->customer_id) || $orderData->type == OrderType::GENDAN || ($orderData->type == OrderType::UNION && $this->customerId() != $orderData->customer_id)) {
|
||
if ($closeTime >= time()) {
|
||
unset($orderData->materials);
|
||
$orderData->materials = [];
|
||
$orderData->all_closed = false;
|
||
}
|
||
if ($orderData->type_mode != 1) {
|
||
$orderData->all_closed = true;
|
||
}
|
||
}
|
||
return $this->jsonSuccess($orderData);
|
||
}
|
||
|
||
/**
|
||
* @api {GET} /api/customer/order/gendan_list 订单详情-跟列列表分页
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
*
|
||
* @apiSuccessExample {json} 返回结果,参考订单详情中的gendan列表数据
|
||
* {}
|
||
*/
|
||
public function gendanList(Request $request) {
|
||
$customerId = $this->customerId();
|
||
$orderSn = $request->input('order_sn');
|
||
$size = $request->input('size');
|
||
ThrowException::isTrue(!$orderSn, '缺少参数');
|
||
$order = Order::where('order_sn', $orderSn)->first();
|
||
ThrowException::isTrue(!$order, '参数无效');
|
||
|
||
|
||
$query = Order::with([
|
||
'customer:id,name,nickname',
|
||
'pOrder:id,order_sn,customer_id', 'pOrder.customer:id,nickname,name'
|
||
])
|
||
->select(['id', 'pid', 'customer_id', 'money', 'lottery_state', 'lottery_tax_prize', 'lottery_gendan_brokerage', 'lottery_gendan_brokerage_all'])
|
||
->where('pid', $order->id)
|
||
->where('pay_state', PayState::SUCCESS)
|
||
->where('created_date', '>', Config::faDanVisibleDate())
|
||
->whereIn('lottery_state', [LottState::WAIT, LottState::WIN, LottState::LOSS, LottState::DRAFT, LottState::SEND]);
|
||
|
||
if ($customerId == $order->customer_id) {
|
||
$result = $query->orderBy('money', 'desc')
|
||
->paging($size);
|
||
} else {
|
||
$page = $request->input('page');
|
||
$gendanList = $query->orderBy('money', 'desc')
|
||
->limit(10)
|
||
->get();
|
||
$gt1Page = $page > 1;
|
||
$result['data'] = $gt1Page ? [] : $gendanList;
|
||
$result['per_page'] = $gt1Page ? 0 : 10;
|
||
$result['current_page'] = $gt1Page ? 0 : $page;
|
||
$result['total'] = $gt1Page ? 0 : 10;
|
||
}
|
||
return $this->jsonSuccess($result);
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/unions 合买-列表
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {Int} [lottery_type_id] 彩种类型id
|
||
* @apiParam {String} sort_filter schedule进度,new最新,seven七日命中,follow我的关注
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code":200,
|
||
* "message":"",
|
||
* "data":{
|
||
* "current_page":1,
|
||
* "data":[
|
||
* {
|
||
* "customer":{
|
||
* "id":1,
|
||
* "nickname":"大象", // 合买发起人
|
||
* "avatar":"/avatar/TM1f852RwuK2Dh6b5xcfT8q3xPOdY2I3nKMl1G5P.png", // 头像
|
||
* "name":"发达",
|
||
* "level_score":0,
|
||
* "level_name":"储备组长",
|
||
* "level_score_group":"5000",
|
||
* "lottery_state_name":"",
|
||
* "client_type_name":"未知"
|
||
* },
|
||
* "lottery":{
|
||
* "id":1,
|
||
* "name":"竞彩足球", // 彩种
|
||
* },
|
||
* "id":2,
|
||
* "order_sn":"P2023041800000002",
|
||
* "money":24, // 方案金额
|
||
* "odds_early_close_time":"2023-04-05 15:38:38", // 截止时间
|
||
* "odds_late_close_time":"2023-04-06 15:38:38",
|
||
* "type_mode":3,
|
||
* "type_desc":"这是个合买", // 合买宣言
|
||
* "union_pay_success":0,
|
||
* "union_brokerage":1, // 佣金比例
|
||
* "union_keep":1, // 全额保底:1是;0否
|
||
* "union_piece_keep":6, // 保底份数
|
||
* "union_piece_self":0, // 发起人购买份数
|
||
* "union_piece_buy":6, // 已购买份数
|
||
* "union_piece_total":12, // 总份数
|
||
*
|
||
* }
|
||
* ],
|
||
* "from":1,
|
||
* "per_page":20,
|
||
* "to":4,
|
||
* "total":4 // 总条数
|
||
* }
|
||
* }
|
||
*
|
||
*/
|
||
public function unions(Request $request)
|
||
{
|
||
$size = $request->input('size');
|
||
$lottery_type_id = $request->input('lottery_type_id');
|
||
// schedule进度,new最新,seven七日命中,follow我的关注
|
||
$sort_filter = $request->input('sort_filter');
|
||
$query = Order::with([
|
||
'customer:id,nickname,avatar,name,level_score',
|
||
'lottery:id,name'
|
||
])
|
||
->where('shop_id', $this->customerShopId())
|
||
->whereRaw('id=pid')
|
||
->where('type', OrderType::UNION)
|
||
->where('pay_state', PayState::SUCCESS)
|
||
->where('odds_early_close_time', '>', date('Y-m-d H:i:s'))
|
||
->where('lottery_state', LottState::PENDING);
|
||
|
||
if ($lottery_type_id) {
|
||
$query->where('lottery_type_id', $lottery_type_id);
|
||
}
|
||
|
||
if ($sort_filter == 'schedule') {
|
||
$query->orderBy('union_schedule', 'desc');
|
||
}
|
||
if ($sort_filter == 'new') {
|
||
$query->orderBy('id', 'desc');
|
||
}
|
||
|
||
$orders = $query->paging($size);
|
||
return $this->jsonSuccess($orders);
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/union_show 合买-详情
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code":200,
|
||
* "message":"",
|
||
* "data":{
|
||
* "customer":{
|
||
* "id":1,
|
||
* "name":"发达", // 真是姓名
|
||
* "nickname":"大象", // 用户昵称
|
||
* "email":"fdsa",
|
||
* "email_verified_at":null,
|
||
* "remark":"",
|
||
* "win_alway_num":0,
|
||
* "win_lead_num":0,
|
||
* "star":0,
|
||
* "agent":1,
|
||
* "avatar":"/avatar/TM1f852RwuK2Dh6b5xcfT8q3xPOdY2I3nKMl1G5P.png", // 头像
|
||
* "seven_hit":"",
|
||
* "profit_rate":"",
|
||
* "fans_num":0, // 粉丝数
|
||
* "follower_num":0,
|
||
* "pay_time":0,
|
||
* "pay_money":"0.00",
|
||
* "client_type":0,
|
||
* "level_name":"储备组长",
|
||
* },
|
||
* "order":{
|
||
* "id":6,
|
||
* "pid":0,
|
||
* "order_sn":"P2023041900000001", // 订单编号
|
||
* "customer_id":1,
|
||
* "lottery_id":1,
|
||
* "shop_id":1,
|
||
* "lottery_type_id":1,
|
||
* "type":3,
|
||
* "copy_num":0,
|
||
* "bets_num":2,
|
||
* "piao_num":2, // 票数
|
||
* "money":24,
|
||
* "prize_min":"11.04",
|
||
* "prize_max":"142.56",
|
||
* "pass_mode":[
|
||
* "2.1"
|
||
* ],
|
||
* "play_type":"mixed",
|
||
* "pay_type":"",
|
||
* "pay_state":"success",
|
||
* "pay_at":"2023-04-19 12:53:15",
|
||
* "odds_early_close_time":"2023-04-05 15:38:38", // 截止时间
|
||
* "created_at":"2023-04-06 15:38:38", // 发单时间
|
||
* "lottery_qupiao":0,
|
||
* "lottery_state":5,
|
||
* "lottery_prize":"0.00",
|
||
* "lottery_send_prize":0,
|
||
* "lottery_tax_prize":"0.00",
|
||
* "type_mode":3, // 1截止后公开;2公开;3认购可见
|
||
* "type_desc":"这是个合买", // 合买宣言
|
||
* "union_pay_success":0,
|
||
* "union_brokerage":1, //
|
||
* "union_keep":1, // 是否全额保底
|
||
* "union_piece_keep":2, // 保底份数
|
||
* "union_piece_self":6, // 自购份数
|
||
* "union_piece_buy":6, // 已购份数
|
||
* "union_piece_total":12, // 总份数
|
||
* "union_schedule":50, // 合买进度1-100
|
||
*
|
||
* "sellings":[ // 参考订单详情
|
||
*
|
||
* ],
|
||
* "chang_num":2,
|
||
* "pass_mode_names":[
|
||
* "2串1"
|
||
* ],
|
||
* "play_name":"竞彩足球",
|
||
* "play_type_name":"混合投注",
|
||
* "buy_type_name":"自购",
|
||
* "pass_mode_name":[
|
||
* "2串1"
|
||
* ],
|
||
* },
|
||
* "users":[
|
||
* {
|
||
* "id":1,
|
||
* "order_id":6,
|
||
* "customer_id":1,
|
||
* "union_piece_total":12, // 总份额
|
||
* "union_piece_buy":6, // 购买份额
|
||
* "money":"16.00", // 出资
|
||
* "created_at":"2023-04-19T12:53:15.000000Z",
|
||
* "updated_at":"2023-04-19T12:53:15.000000Z",
|
||
* "deleted_at":null,
|
||
* "customer":{ // 彩友信息
|
||
* "id":1,
|
||
* "avatar":"/avatar/TM1f852RwuK2Dh6b5xcfT8q3xPOdY2I3nKMl1G5P.png",
|
||
* "nickname":"大象",
|
||
* "name":"发达",
|
||
* "level_score":0,
|
||
* "level_name":"储备组长",
|
||
* "level_score_group":"5000",
|
||
* "lottery_state_name":"",
|
||
* "client_type_name":"未知"
|
||
* }
|
||
* }
|
||
* ]
|
||
* }
|
||
* }
|
||
*
|
||
*/
|
||
public function unionShow(Request $request)
|
||
{
|
||
$orderSn = $request->input('order_sn');
|
||
/** @var Order $order */
|
||
$order = Order::with('materials:id,path')->sn($orderSn)->first();
|
||
|
||
$jingcaiService = LotteryService::getJingcaiServiceByOrder($order);
|
||
|
||
/** @var Customer $unionUser */
|
||
$unionUser = Customer::find($order->customer_id);
|
||
|
||
$orderData = $jingcaiService->showOrder($this->customer(), $order);
|
||
$unionUses = Order::with('customer:id,avatar,nickname,name,level_score')
|
||
->select(['id', 'pid', 'customer_id', 'union_piece_total', 'union_piece_buy'])
|
||
->where('pid', $order->id)
|
||
->where('type', OrderType::UNION)
|
||
->where('pay_state', PayState::SUCCESS)
|
||
->orderBy('union_piece_buy', 'desc')
|
||
->get();
|
||
|
||
return $this->jsonSuccess([
|
||
'customer' => $unionUser,
|
||
'order' => $orderData,
|
||
'users' => $unionUses,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/union_show 合买-剩余份数
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code":200,
|
||
* "message":"",
|
||
* "data":{
|
||
* "order_sn":"P2023041900000001", // 订单号
|
||
* "remain_piece":6, // 剩余份数
|
||
* "union_piece_money":2 // 每份金额
|
||
* }
|
||
* }
|
||
*/
|
||
public function unionPieces(Request $request)
|
||
{
|
||
$orderSn = $request->input('order_sn');
|
||
/** @var Order $order */
|
||
$order = Order::sn($orderSn)->where('type', OrderType::UNION)->first();
|
||
ThrowException::isTrue(!$order, '无效数据');
|
||
|
||
return $this->jsonSuccess([
|
||
'order_sn' => $order->order_sn,
|
||
'remain_piece' => $order->union_piece_total - $order->union_piece_buy,
|
||
'union_price_money' => $order->union_piece_money,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* @api {POST} /api/customer/order/create_union 合买-创建合买订单
|
||
* @apiVersion 0.1.0
|
||
* @apiGroup 客户端
|
||
*
|
||
* @apiParam {String} order_sn 订单编号
|
||
* @apiParam {Int} buy_piece 购买份数
|
||
*
|
||
* @apiSuccessExample {json} 返回结果
|
||
* {
|
||
* "code":200,
|
||
* "message":"",
|
||
* "data":{
|
||
* "order_sn":"P2023041900000001",
|
||
* "balance":"9840.00", // 余额
|
||
* "money":10, // 投注金额
|
||
* "username":"发达", // 昵称
|
||
* "lottery":"jc足球混合投注",
|
||
* "pay_types":[
|
||
* {
|
||
* "pay_type":"alipay",
|
||
* "name":"支付宝"
|
||
* }
|
||
* ]
|
||
* }
|
||
* }
|
||
*/
|
||
public function createUnion(Request $request)
|
||
{
|
||
$orderSn = $request->input('order_sn');
|
||
$buyPiece = $request->input('buy_piece');
|
||
/** @var Order $unionOrder */
|
||
$unionOrder = Order::sn($orderSn)->where('type', OrderType::UNION)->first();
|
||
ThrowException::isTrue(!$unionOrder, '无效数据');
|
||
|
||
$earlyTime = date('Y-m-d H:i:s', strtotime($unionOrder->odds_early_close_time));
|
||
ThrowException::isTrue(date('Y-m-d H:i:s') >= $earlyTime, '投注已截止');
|
||
ThrowException::isTrue($unionOrder->pay_state != PayState::SUCCESS, '合买不存在');
|
||
ThrowException::isTrue($buyPiece < 1, '购买份数不小于1');
|
||
// ThrowException::isTrue($this->customerId() == $unionOrder->customer_id, '发起者不能参与合买');
|
||
|
||
/** @var Lottery $lott */
|
||
$lott = Lottery::find($unionOrder->lottery_id);
|
||
$lott->validEnableHemai();
|
||
|
||
$remain = $unionOrder->union_piece_total - $unionOrder->union_piece_buy;
|
||
ThrowException::isTrue($buyPiece > $remain, "剩余{$remain}份,份数不足,请重新下单");
|
||
|
||
$exist = Order::where('customer_id', $this->customerId())
|
||
->where('pay_state', PayState::UNPAID)
|
||
->where('pid', $unionOrder->id)->first();
|
||
if ($exist) {
|
||
$exist->where('id', $exist->id)->where('pay_state', PayState::SUCCESS)->delete();
|
||
}
|
||
|
||
/** @var Customer $customer */
|
||
$customer = Customer::find($this->customerId());
|
||
if (!$this->getPayTypes()) {
|
||
ThrowException::isTrue($customer->balanceActive() <= 0, '该店铺暂未开启支付');
|
||
}
|
||
|
||
DB::beginTransaction();
|
||
try {
|
||
$order = new Order();
|
||
$order->pid = $unionOrder->id;
|
||
$order->customer_id = $this->customerId();
|
||
$order->lottery_id = $unionOrder->lottery_id;
|
||
$order->shop_id = $this->customerShopId();
|
||
$order->lottery_type_id = $unionOrder->lottery_type_id;
|
||
$order->order_sn = Order::makeOrderSn();
|
||
$order->play_type = '';
|
||
$order->bets_num = 0;
|
||
$order->piao_num = 0;
|
||
$order->money = $unionOrder->money;
|
||
$order->prize_min = 0;
|
||
$order->prize_max = 0;
|
||
$order->pay_state = PayState::UNPAID;
|
||
$order->pass_mode = $unionOrder->pass_mode;
|
||
$order->odds_close_time = $unionOrder->odds_close_time;
|
||
$order->odds_early_close_time = $unionOrder->odds_early_close_time;
|
||
$order->odds_late_close_time = $unionOrder->odds_late_close_time;
|
||
$order->type = $unionOrder->type;
|
||
$order->type_mode = $unionOrder->type_mode;
|
||
$order->type_desc = '';
|
||
$order->odds = [];
|
||
$order->union_piece_total = $unionOrder->union_piece_total;
|
||
$order->union_piece_money = $unionOrder->union_piece_money;
|
||
$order->union_money = $unionOrder->union_piece_money * $buyPiece;
|
||
$order->union_piece_buy = $buyPiece;
|
||
$order->union_piece_self = $buyPiece;
|
||
$order->union_piece_keep = 0;
|
||
$order->union_keep = 0;
|
||
$order->union_brokerage = 0;
|
||
$order->created_date = date('Ymd');
|
||
$order->save();
|
||
DB::commit();
|
||
|
||
$balance = $customer->balanceActive();
|
||
$payMoney = $order->getPayMoney();
|
||
return $this->jsonSuccess([
|
||
'order_sn' => $order->order_sn,
|
||
'balance' => $balance,
|
||
'money' => $payMoney,
|
||
'need_pay_money' => Helps::floatFormat($balance >= $payMoney ? 0 : $payMoney - $balance),
|
||
'username' => $this->customer()->name,
|
||
'lottery' => $order->lotteryName(),
|
||
'pay_types' => $this->getPayTypes()
|
||
]);
|
||
|
||
} catch (JingCaiException $exception) {
|
||
DB::rollBack();
|
||
throw $exception;
|
||
} catch (\Exception $exception) {
|
||
DB::rollBack();
|
||
throw $exception;
|
||
}
|
||
}
|
||
}
|