You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
681 lines
30 KiB
681 lines
30 KiB
<?php
|
|
|
|
namespace app\home\service;
|
|
|
|
use app\model\FeeSettingModel;
|
|
use app\model\PreUsStockModel;
|
|
use app\model\StockListModel;
|
|
use app\model\StockMarketModel;
|
|
use app\model\UserStockLogModel;
|
|
use app\model\UserStockModel;
|
|
use app\model\UserUsPreStockOrderModel;
|
|
use think\facade\Db;
|
|
|
|
class PreUsStockService extends BaseHomeService
|
|
{
|
|
|
|
// 列表
|
|
public function index($param)
|
|
{
|
|
try {
|
|
if (empty($param['page']) || !is_numeric($param['page']) || empty($param['limit']) || !is_numeric($param['limit'])) {
|
|
$param['page'] = 1;
|
|
$param['limit'] = 10;
|
|
}
|
|
|
|
$where = [];
|
|
$where[] = ['is_delete', '=', PreUsStockModel::IS_DELETE_NO];
|
|
$where[] = ['status', '=', PreUsStockModel::STATUS_ON];
|
|
|
|
$query = PreUsStockModel::where($where);
|
|
$totalQuery = PreUsStockModel::where($where);
|
|
// 申购状态筛选 1 可申购 2 带中签 3 待上市 4 已上市
|
|
if (isset($param['open_status']) && in_array($param['open_status'], ['1', '2', '3', '4'])) {
|
|
switch ($param['open_status']) {
|
|
case '1':
|
|
$query = $query->whereTime('end_time', '>', date('Y-m-d H:i:s'));
|
|
$totalQuery = $totalQuery->whereTime('end_time', '>', date('Y-m-d H:i:s'));
|
|
break;
|
|
case '2':
|
|
$query = $query->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreUsStockModel::SIGN_STATUS_NO);
|
|
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreUsStockModel::SIGN_STATUS_NO);
|
|
break;
|
|
case '3':
|
|
$query = $query->where('sign_status', '=', PreUsStockModel::SIGN_STATUS_DONE)->where('open_status', PreUsStockModel::OPEN_STATUS_NO);
|
|
$totalQuery = $totalQuery->where('sign_status', '=', PreUsStockModel::SIGN_STATUS_DONE)->where('open_status', PreUsStockModel::OPEN_STATUS_NO);
|
|
break;
|
|
case '4':
|
|
$query = $query->where('open_status', PreUsStockModel::OPEN_STATUS_HAD);
|
|
$totalQuery = $totalQuery->where('open_status', PreUsStockModel::OPEN_STATUS_HAD);
|
|
break;
|
|
}
|
|
}
|
|
|
|
$list = $query->page($param['page'], $param['limit'])->select();
|
|
$total = $totalQuery->count();
|
|
|
|
$rows = [];
|
|
if (!$list->isEmpty()) {
|
|
foreach ($list as $item) {
|
|
// 是否延期开盘
|
|
$is_defer = '0';
|
|
if ($item->open_time < date('Y-m-d H:i:s') && $item->open_status == PreUsStockModel::OPEN_STATUS_NO) {
|
|
$is_defer = '1';
|
|
}
|
|
|
|
$is_start = '0';
|
|
if ($item->start_time <= date('Y-m-d H:i:s') && $item->end_time >= date('Y-m-d H:i:s')) {
|
|
$is_start = '1';
|
|
}
|
|
|
|
$progressStatus = 1;
|
|
if (time() >= $item->end_time) $progressStatus = 2;
|
|
if ($item->sign_status == PreUsStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
|
|
if ($item->is_post_pay == PreUsStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
|
|
if ($item->open_status == PreUsStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreUsStockModel::IS_POST_PAY_YES ? 5 : 4;
|
|
|
|
$rows[] = [
|
|
'id' => $item->id,
|
|
'stock_code' => $item->stock_code,
|
|
'stock_name' => $item->stock_name,
|
|
'stock_type' => $item->stock_type,
|
|
'price' => $item->price,
|
|
'min' => $item->min,
|
|
'total' => $item->total,
|
|
'tape' => $item->tape,
|
|
'start_time' => $item->start_time,
|
|
'end_time' => $item->end_time,
|
|
'get_time' => $item->get_time,
|
|
'open_time' => $item->open_time,
|
|
'rate' => $item->rate,
|
|
'is_defer' => $is_defer,
|
|
'is_start' => $is_start,
|
|
'pay_deadline_time' => $item->pay_deadline_time,
|
|
'progress_status' => $progressStatus,
|
|
'is_post_pay' => $item->is_post_pay,
|
|
];
|
|
}
|
|
}
|
|
|
|
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
|
|
'tape_list' => StockListModel::$tapeList,
|
|
'stock_type_list' => PreUsStockModel::$stockTypeList,
|
|
]]);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('1', 'System error', []);
|
|
}
|
|
}
|
|
|
|
// 股票详情
|
|
public function stockDetail($param)
|
|
{
|
|
try {
|
|
if (empty($param['id']) || !is_numeric($param['id'])) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
$preStock = PreUsStockModel::where('id', $param['id'])->where('is_delete', PreUsStockModel::IS_DELETE_NO)->where('status', PreUsStockModel::STATUS_ON)->find();
|
|
if (empty($preStock)) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
$is_defer = '0';
|
|
if ($preStock->open_time < date('Y-m-d H:i:s') && $preStock->open_status == PreUsStockModel::OPEN_STATUS_NO) {
|
|
$is_defer = '1';
|
|
}
|
|
|
|
$is_start = '0';
|
|
if ($preStock->start_time <= date('Y-m-d H:i:s') && $preStock->end_time >= date('Y-m-d H:i:s')) {
|
|
$is_start = '1';
|
|
}
|
|
|
|
$progressStatus = 1;
|
|
if (time() >= $preStock->end_time) $progressStatus = 2;
|
|
if ($preStock->sign_status == PreUsStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
|
|
if ($preStock->is_post_pay == PreUsStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
|
|
if ($preStock->open_status == PreUsStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreUsStockModel::IS_POST_PAY_YES ? 5 : 4;
|
|
|
|
$data = [
|
|
'id' => $preStock->id,
|
|
'stock_code' => $preStock->stock_code,
|
|
'stock_name' => $preStock->stock_name,
|
|
'stock_type' => $preStock->stock_type,
|
|
'price' => $preStock->price,
|
|
'min' => $preStock->min,
|
|
'total' => $preStock->total,
|
|
'tape' => $preStock->tape,
|
|
'start_time' => $preStock->start_time,
|
|
'end_time' => $preStock->end_time,
|
|
'get_time' => $preStock->get_time,
|
|
'open_time' => $preStock->open_time,
|
|
'rate' => $preStock->rate,
|
|
'is_defer' => $is_defer,
|
|
'is_start' => $is_start,
|
|
'is_post_pay' => $preStock->is_post_pay,
|
|
'logo' => $preStock->logo,
|
|
'company_info' => $preStock->company_info,
|
|
'company_open_time' => $preStock->company_open_time,
|
|
'company_reg_amount' => $preStock->company_reg_amount,
|
|
'pay_deadline_time' => $preStock->pay_deadline_time,
|
|
'progress_status' => $progressStatus
|
|
];
|
|
|
|
|
|
return $this->toData('0', 'SUCCESS', ['data' => $data, 'extend' => [
|
|
'tape_list' => StockListModel::$tapeList,
|
|
'stock_type_list' => PreUsStockModel::$stockTypeList,
|
|
]]);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('1', 'System error', []);
|
|
}
|
|
}
|
|
|
|
// 申购操作
|
|
public function order($param, $userId)
|
|
{
|
|
try {
|
|
if (empty($param['id']) || !is_numeric($param['id'])) {
|
|
return $this->toData('1', 'Params error2', []);
|
|
}
|
|
|
|
$preUsStock = PreUsStockModel::where('id', $param['id'])
|
|
->where('status', PreUsStockModel::STATUS_ON)
|
|
->where('is_delete', PreUsStockModel::IS_DELETE_NO)
|
|
->whereTime('start_time', '<=', date('Y-m-d H:i:s'))
|
|
->whereTime('end_time', '>=', date('Y-m-d H:i:s'))
|
|
->find();
|
|
if (empty($preUsStock)) {
|
|
return $this->toData('1', 'Params error3', []);
|
|
}
|
|
|
|
$hasOrder = UserUsPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
|
|
if ($preUsStock->limit_get_num <= $hasOrder) {
|
|
return $this->toData('1', 'Had Purchased', []);
|
|
}
|
|
|
|
// 下单参数
|
|
if (empty($param['num']) || !is_numeric($param['num']) || ceil($param['num']) != $param['num'] || $param['num'] <= 0) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
if ($param['num'] < $preUsStock->min) {
|
|
return $this->toData('1', 'Order quantity less than the minimum', []);
|
|
}
|
|
|
|
if ($preUsStock->max > 0 && $param['num'] > $preUsStock->max) {
|
|
return $this->toData('1', 'Order quantity greater than maximum', []);
|
|
}
|
|
|
|
if ($preUsStock->price <= 0) {
|
|
return $this->toData('1', 'Price error', []);
|
|
}
|
|
|
|
// 支付类型
|
|
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserUsPreStockOrderModel::PAY_TYPE_ONE, UserUsPreStockOrderModel::PAY_TYPE_TWO])) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
// 计算金额
|
|
$price = number_format($preUsStock->price, 18, '.', '');
|
|
$amount = bcmul($param['num'], $price, 18);
|
|
|
|
// 计算手续费
|
|
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_USA)->value('purchase_fee');
|
|
if ($purchaseFee <= 0) {
|
|
$fee = 0;
|
|
} else {
|
|
$purchaseFee = number_format($purchaseFee, 18, '.', '');
|
|
$fee = bcmul($amount, $purchaseFee, 18);
|
|
}
|
|
|
|
|
|
Db::startTrans();
|
|
|
|
// 生成订单
|
|
$orderNo = $this->generateOrderNumber(20);
|
|
$order = new UserUsPreStockOrderModel;
|
|
$order->user_id = $userId;
|
|
$order->pre_stock_id = $preUsStock->id;
|
|
$order->status = $param['pay_type'] == 1 ? UserUsPreStockOrderModel::STATUS_DOING : UserUsPreStockOrderModel::STATUS_POST_PAY;
|
|
$order->pay_type = $param['pay_type'];
|
|
$order->order_no = $orderNo;
|
|
$order->num = $param['num'];
|
|
$order->get_num = 0;
|
|
$order->price = $preUsStock->price;
|
|
$order->amount = $amount;
|
|
$order->get_amount = 0;
|
|
$order->fee = $fee;
|
|
$order->get_fee = 0;
|
|
$order->fee_rate = $purchaseFee; // 手续费比率
|
|
$order->get_time = $preUsStock->get_time;
|
|
$bool = $order->save();
|
|
if (!$bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create order error', []);
|
|
}
|
|
|
|
// 后支付模式 - 生成订单,无流水
|
|
if ($param['pay_type'] == 2) {
|
|
Db::commit();
|
|
return $this->toData('0', 'SUCCESS', []);
|
|
}
|
|
|
|
// 扣除用户资产
|
|
$userStockName = (new UserStockModel())->getName();
|
|
$beforeAmount = Db::name($userStockName)->where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeAmount < $amount) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = Db::name($userStockName)->where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $amount)->dec('usable_num', $amount)
|
|
->inc('frozen_num', $amount)
|
|
->update(['update_time' => date('Y-m-d H:i:s')]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel;
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 15; // 新股申购扣减费用
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeAmount;
|
|
$userStockLog->change_num = '-' . $amount;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = date('Y-m-d H:i:s');
|
|
$userStockLog->update_time = date('Y-m-d H:i:s');
|
|
$updateNum2 = $userStockLog->save();
|
|
if ($updateNum2 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user log error', []);
|
|
}
|
|
|
|
|
|
// 扣除手续费
|
|
if ($fee > 0) {
|
|
$beforeFee = Db::name($userStockName)->where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeFee < $fee) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = Db::name($userStockName)->where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $fee)->dec('usable_num', $fee)
|
|
->inc('frozen_num', $fee)
|
|
->update(['update_time' => date('Y-m-d H:i:s')]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel;
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 16;
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeFee;
|
|
$userStockLog->change_num = '-' . $fee;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = date('Y-m-d H:i:s');
|
|
$userStockLog->update_time = date('Y-m-d H:i:s');
|
|
$updateNum3 = $userStockLog->save();
|
|
if ($updateNum3 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user fee log error', []);
|
|
}
|
|
}
|
|
|
|
// 增加股票已经申购的数量
|
|
$num = Db::name((new PreUsStockModel())->getName())->where('id', $param['id'])->inc('had_get_num', $param['num'])->update(['update_time' => date('Y-m-d H:i:s')]);
|
|
if ($num <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'update stock num error', []);
|
|
}
|
|
|
|
Db::commit();
|
|
return $this->toData('0', 'SUCCESS', [
|
|
]);
|
|
} catch (\Exception $exception) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'System error', [$exception->getMessage()]);
|
|
}
|
|
}
|
|
|
|
// 后支付 - 支付
|
|
public function postPay($param, $userId)
|
|
{
|
|
try {
|
|
if (empty($param['id']) || empty($param['stock_code']) || !is_numeric($param['id'])) {
|
|
return $this->toData('1', 'Params error2', []);
|
|
}
|
|
$now = date('Y-m-d H:i:s');
|
|
$preUstock = PreUsStockModel::where('stock_code', $param['stock_code'])
|
|
->where('status', PreUsStockModel::STATUS_ON)
|
|
->where('is_delete', PreUsStockModel::IS_DELETE_NO)
|
|
->where('is_post_pay', PreUsStockModel::IS_POST_PAY_YES)
|
|
->whereTime('pay_deadline_time', '>=', $now)
|
|
->find();
|
|
|
|
if (empty($preUstock)) {
|
|
return $this->toData('1', 'Payment deadline exceeded', []);
|
|
}
|
|
|
|
$hasOrder = UserUsPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserUsPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserUsPreStockOrderModel::STATUS_POST_PAY)->find();
|
|
if (empty($hasOrder)) {
|
|
return $this->toData('1', 'Params error3', []);
|
|
}
|
|
|
|
$orderNo = $hasOrder->order_no;
|
|
Db::startTrans();
|
|
if ($preUstock->sign_status == PreUsStockModel::SIGN_STATUS_DONE && strtotime($preUstock->get_time) < strtotime($now)) {
|
|
//已签名
|
|
|
|
$amount = $hasOrder->get_amount;
|
|
$fee = $hasOrder->get_fee;
|
|
$getNum = $hasOrder->get_num;
|
|
if ($getNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'get num error', []);
|
|
}
|
|
|
|
// 扣除用户资产
|
|
$beforeAmount = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeAmount < $amount) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $amount)->dec('usable_num', $amount)
|
|
->inc('frozen_num', $amount)
|
|
->update(['update_time' => $now]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel();
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 15; // 新股申购扣减费用
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeAmount;
|
|
$userStockLog->change_num = '-' . $amount;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = $now;
|
|
$userStockLog->update_time = $now;
|
|
$updateNum2 = $userStockLog->save();
|
|
if ($updateNum2 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user log error', []);
|
|
}
|
|
|
|
// 扣除手续费
|
|
if ($fee > 0) {
|
|
$beforeFee = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeFee < $fee) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $fee)->dec('usable_num', $fee)
|
|
->inc('frozen_num', $fee)
|
|
->update(['update_time' => date('Y-m-d H:i:s')]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel;
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 16;
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeFee;
|
|
$userStockLog->change_num = '-' . $fee;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = $now;
|
|
$userStockLog->update_time = $now;
|
|
$updateNum3 = $userStockLog->save();
|
|
if ($updateNum3 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user fee log error', []);
|
|
}
|
|
}
|
|
|
|
$bool = UserUsPreStockOrderModel::where('id', $param['id'])->update(['status' => UserUsPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
|
|
if (!$bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'update order error', []);
|
|
}
|
|
|
|
} elseif ($preUstock->sign_status == PreUsStockModel::SIGN_STATUS_NO && strtotime($preUstock->get_time) >= strtotime($now)) {
|
|
//未签名
|
|
|
|
$amount = $hasOrder->amount;
|
|
$fee = $hasOrder->fee;
|
|
// 扣除用户资产
|
|
$beforeAmount = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeAmount < $amount) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $amount)->dec('usable_num', $amount)
|
|
->inc('frozen_num', $amount)
|
|
->update(['update_time' => $now]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel();
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 15; // 新股申购扣减费用
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeAmount;
|
|
$userStockLog->change_num = '-' . $amount;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = $now;
|
|
$userStockLog->update_time = $now;
|
|
$updateNum2 = $userStockLog->save();
|
|
if ($updateNum2 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user log error', []);
|
|
}
|
|
|
|
// 扣除手续费
|
|
if ($fee > 0) {
|
|
$beforeFee = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)->value('usable_num');
|
|
if ($beforeFee < $fee) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'assert not enough', []);
|
|
}
|
|
|
|
$updateNum = UserStockModel::where('stock_id', 'USD')->where('user_id', $userId)
|
|
->where('usable_num', '>=', $fee)->dec('usable_num', $fee)
|
|
->inc('frozen_num', $fee)
|
|
->update(['update_time' => date('Y-m-d H:i:s')]);
|
|
if ($updateNum <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Update user amount error', []);
|
|
}
|
|
|
|
// 生成流水
|
|
$userStockLog = new UserStockLogModel;
|
|
$userStockLog->user_id = $userId;
|
|
$userStockLog->change_type = 16;
|
|
$userStockLog->stock_id = 'USD';
|
|
$userStockLog->before_num = $beforeFee;
|
|
$userStockLog->change_num = '-' . $fee;
|
|
$userStockLog->order_id = $orderNo;
|
|
$userStockLog->create_time = $now;
|
|
$userStockLog->update_time = $now;
|
|
$updateNum3 = $userStockLog->save();
|
|
if ($updateNum3 <= 0) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'create user fee log error', []);
|
|
}
|
|
}
|
|
$bool = UserUsPreStockOrderModel::where('id', $param['id'])->update(['status' => UserUsPreStockOrderModel::STATUS_DOING, 'update_time' => $now]);
|
|
if (!$bool) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'update order error', []);
|
|
}
|
|
|
|
} else {
|
|
Db::rollback();
|
|
return $this->toData('1', 'Params error4', []);
|
|
}
|
|
|
|
Db::commit();
|
|
return $this->toData('0', 'SUCCESS', []);
|
|
} catch (\Exception $exception) {
|
|
Db::rollback();
|
|
return $this->toData('1', 'System error', [$exception->getMessage()]);
|
|
}
|
|
}
|
|
|
|
// 申购记录
|
|
public function list($param, $userId)
|
|
{
|
|
try {
|
|
if (empty($param['page']) || !is_numeric($param['page']) || empty($param['limit']) || !is_numeric($param['limit'])) {
|
|
$param['page'] = 1;
|
|
$param['limit'] = 20;
|
|
}
|
|
|
|
if (empty($param['status'])) {
|
|
return $this->toData('1', 'Params error');
|
|
}
|
|
|
|
$statusArr = explode(",", $param['status']);
|
|
$list = UserUsPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)
|
|
->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
|
|
|
|
$total = UserUsPreStockOrderModel::where('status', $param['status'])->where('user_id', $userId)->count();
|
|
|
|
$rows = [];
|
|
if (!$list->isEmpty()) {
|
|
$stockIdList = [];
|
|
foreach ($list as $item) {
|
|
$stockIdList[] = $item->pre_stock_id;
|
|
}
|
|
$stockList = PreUsStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
|
|
|
|
// 计算手续费
|
|
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_USA)->value('purchase_fee');
|
|
foreach ($list as $item) {
|
|
$stock = $stockList[$item->pre_stock_id] ?? [];
|
|
$openTime = $stock['open_time'] ?? '';
|
|
$openStatus = $stock['open_status'] ?? '0';
|
|
|
|
// 是否延期开盘
|
|
$is_defer = '0';
|
|
if ($openTime && $openTime < date('Y-m-d H:i:s') && $openStatus == PreUsStockModel::OPEN_STATUS_NO) {
|
|
$is_defer = '1';
|
|
}
|
|
|
|
$arr = [
|
|
'id' => $item->id,
|
|
'order_no' => $item->order_no,
|
|
'stock_code' => $stock['stock_code'] ?? '-',
|
|
'stock_name' => $stock['stock_name'] ?? '-',
|
|
'get_time' => $stock['get_time'] ?? '-',
|
|
'open_time' => $stock['open_time'] ?? '-',
|
|
'num' => $item->num,
|
|
'get_num' => $item->get_num,
|
|
'price' => $item->price,
|
|
'amount' => $item->amount,
|
|
'get_amount' => $item->get_amount,
|
|
'create_time' => $item->create_time,
|
|
'fee' => $item->fee,
|
|
'get_fee' => $item->get_fee,
|
|
'status' => $item->status,
|
|
'tape' => $stock['tape'] ?? '-',
|
|
'stock_type' => $stock['stock_type'] ?? '-',
|
|
'is_defer' => $is_defer,
|
|
'stock_data' => $stock,
|
|
'pay_deadline_time' => $stock['pay_deadline_time'] ?? '-',
|
|
];
|
|
|
|
if ($item->pay_type == UserUsPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserUsPreStockOrderModel::STATUS_POST_PAY && empty($item->get_time)) {
|
|
$arr['amount'] = bcmul($item->get_num, $item->price, 18);
|
|
if ($purchaseFee <= 0) {
|
|
$arr['fee'] = 0;
|
|
} else {
|
|
$arr['fee'] = bcmul($arr['amount'], $purchaseFee, 18);
|
|
}
|
|
}
|
|
$rows[] = $arr;
|
|
}
|
|
}
|
|
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
|
|
'tape_list' => StockListModel::$tapeList,
|
|
'stock_type_list' => PreUsStockModel::$stockTypeList,
|
|
]]);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('1', 'System error', []);
|
|
}
|
|
}
|
|
|
|
// 申购订单详情
|
|
public function detail($param, $userId)
|
|
{
|
|
try {
|
|
if (empty($param['id']) || !is_numeric($param['id'])) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
$order = UserUsPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
|
|
if (empty($order)) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
|
|
$stock = PreUsStockModel::where('id', $order->pre_stock_id)->find();
|
|
if (empty($stock)) {
|
|
return $this->toData('1', 'Params error', []);
|
|
}
|
|
$is_defer = '0';
|
|
if ($stock->open_time < date('Y-m-d H:i:s') && $stock->open_status == PreUsStockModel::OPEN_STATUS_NO) {
|
|
$is_defer = '1';
|
|
}
|
|
|
|
$data = [
|
|
'logo' => $stock->logo,
|
|
'stock_code' => $stock->stock_code,
|
|
'stock_name' => $stock->stock_name,
|
|
'stock_type' => $stock->stock_type,
|
|
'order_no' => $order->order_no,
|
|
'num' => $order->num,
|
|
'get_num' => $order->get_num,
|
|
'amount' => $order->amount,
|
|
'get_amount' => $order->get_amount,
|
|
'price' => $order->price,
|
|
'fee' => $order->fee,
|
|
'get_fee' => $order->get_fee,
|
|
'create_time' => $order->create_time,
|
|
'get_time' => $order->get_time,
|
|
'open_time' => $stock->open_time,
|
|
'tape' => $stock->tape,
|
|
'is_defer' => $is_defer,
|
|
'stock_data' => $stock,
|
|
'pay_deadline_time' => $stock->pay_deadline_time,
|
|
'status' => $order->status
|
|
];
|
|
|
|
return $this->toData('0', 'SUCCESS', ['data' => $data, 'extend' => [
|
|
'tape_list' => StockListModel::$tapeList,
|
|
'stock_type_list' => PreUsStockModel::$stockTypeList,
|
|
]]);
|
|
} catch (\Exception $exception) {
|
|
return $this->toData('1', 'System error', []);
|
|
}
|
|
}
|
|
}
|