Browse Source

copy by test

p1
chuan 2 months ago
parent
commit
aa9425d6f5
  1. 6
      app/admin/controller/Flow.php
  2. 30
      app/admin/controller/Index.php
  3. 24
      app/admin/controller/User.php
  4. 24
      app/admin/controller/setting/Forex.php
  5. 72
      app/admin/job/SendGo.php
  6. 19
      app/admin/route/app.php
  7. 173
      app/admin/service/AdminBaseService.php
  8. 432
      app/admin/service/FlowService.php
  9. 8
      app/admin/service/RechargeService.php
  10. 334
      app/admin/service/UserService.php
  11. 21
      app/admin/service/WithdrawService.php
  12. 54
      app/admin/service/setting/BlockStockService.php
  13. 179
      app/admin/service/setting/ForexService.php
  14. 1
      app/admin/service/setting/HqService.php
  15. 16
      app/admin/service/setting/StockMarketService.php
  16. 4
      app/admin/validate/setting/HqValidate.php
  17. 2
      app/home/controller/Country.php
  18. 2
      app/home/controller/Login.php
  19. 91
      app/home/controller/News.php
  20. 44
      app/home/controller/User.php
  21. 2
      app/home/controller/Wallet.php
  22. 14
      app/home/route/app.php
  23. 155
      app/home/service/BaseHomeService.php
  24. 7
      app/home/service/BlockStockService.php
  25. 42
      app/home/service/IPOService.php
  26. 52
      app/home/service/LoginService.php
  27. 4
      app/home/service/MarketService.php
  28. 665
      app/home/service/PreHkdStockService.php
  29. 675
      app/home/service/PreIdnStockService.php
  30. 670
      app/home/service/PreInStockService.php
  31. 672
      app/home/service/PreMysStockService.php
  32. 670
      app/home/service/PreSgdStockService.php
  33. 672
      app/home/service/PreThaStockService.php
  34. 681
      app/home/service/PreUsStockService.php
  35. 250
      app/home/service/UserService.php
  36. 6
      app/home/service/UserVerifyService.php
  37. 175
      app/home/service/WalletService.php
  38. 9
      app/home/validate/UserValidate.php
  39. 79
      app/model/ForexListMode.php
  40. 11
      app/model/ForexMarketModel.php
  41. 4
      app/model/StockBlockListModel.php
  42. 7
      app/model/StockJpListModel.php
  43. 2
      app/model/UserBankModel.php
  44. 22
      app/model/UserLoanModel.php
  45. 59
      app/model/UserMoneyLogModel.php
  46. 81
      app/model/UserMoneyModel.php
  47. 64
      composer.json

6
app/admin/controller/Flow.php

@ -90,4 +90,10 @@ class Flow extends AdminBaseController
$result = $service->blockStock($this->request->param(),$this->getAdminId());
return json($result);
}
public function allList()
{
$service = new FlowService();
$result = $service->allList($this->request->param(),$this->getAdminId());
return json($result);
}
}

30
app/admin/controller/Index.php

@ -57,8 +57,10 @@ use app\model\UserStockThaLogModel;
use app\model\UserStockThaModel;
use app\model\UserThaPreStockOrderModel;
use app\model\UserUsPreStockOrderModel;
use app\model\UserVerifyLogModel;
use app\model\UserWithdrawalModel;
use app\utility\ClientGo;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Queue;
use PhpOffice\PhpSpreadsheet\IOFactory;
@ -166,6 +168,12 @@ class Index extends AdminBaseController
->whereTime('create_time', 'between', [$today, $tomorrow])
->where('status', 2)->sum('apply_num');
//等待处理订单
$no_deal_recharge=Db::table($rechargeApplyTableName)->where('status', 0)->count();
$no_deal_withdraw=Db::table($userWithdrawTableName)->where('status', 0)->count();
$no_deal_real=Db::table($userTableName)->where('real_status', 2)->count();
$no_deal_level=Db::table($userTableName)->where('lever_status', 2)->count();
$data = [
'totalRegisterNum' => $totalRegisterNum, // 总注册人数
@ -181,6 +189,11 @@ class Index extends AdminBaseController
'todayWithdrawNum' => $todayWithdrawNum, // 今日提款用户
'todayRechargeAmount' => $todayRechargeAmount, // 今日充值金额
'todayWithdrawAmount' => $todayWithdrawAmount, // 今日提款金额
'no_deal_recharge' => $no_deal_recharge, // 等待处理充值订单数量
'no_deal_withdraw' => $no_deal_withdraw, // 等待处理提现订单数量
'no_deal_real' => $no_deal_real, // 等待审核实名数量
'no_deal_level' => $no_deal_level, // 等待审核开通杠杆数量
];
return json(['code' => '0', 'message' => 'SUCCESS', 'data' => $data]);
@ -188,6 +201,22 @@ class Index extends AdminBaseController
return json(['code' => '1', 'message' => '系统繁忙']);
}
}
public function getReamNum()
{
$adminId= $this->getAdminId();
$Withdraw_Read_Time= Cache::store('redis')->get('Withdraw_Read_Time'.$adminId);
$Recharge_Read_Time= Cache::store('redis')->get('Recharge_Read_Time'.$adminId);
$User_Read_Time= Cache::store('redis')->get('User_Read_Time'.$adminId);
$withdraw_count=UserWithdrawalModel::where('create_time','>=',date('Y-m-d H:i:s',$Withdraw_Read_Time))->count();
$recharge_count=RechargeApplyModel::where('create_time','>=',date('Y-m-d H:i:s',$Recharge_Read_Time))->count();
$real_count=UserVerifyLogModel::where('create_time','>=',date('Y-m-d H:i:s',$User_Read_Time))->count();
return json(['code' => '0', 'message' => 'SUCCESS', 'data' => [
'withdraw_count'=>$withdraw_count,
'recharge_count'=>$recharge_count,
'real_count'=>$real_count,
]]);
}
// 缓存美股数据
public function cacheUsStock()
@ -826,6 +855,7 @@ class Index extends AdminBaseController
var_dump("交易手续费完成");
// 合约插针缓存
(new AdminBaseService())->initContractHqData();
(new AdminBaseService())->initForexHqData();
(new AdminBaseService())->initContractSetting();
var_dump("合约插针完成");

24
app/admin/controller/User.php

@ -14,6 +14,18 @@ class User extends AdminBaseController
$result = $service->index($this->request->param(),$this->getAdminId());
return json($result);
}
public function RealList()
{
$service = new UserService();
$result = $service->RealList($this->request->param(),$this->getAdminId());
return json($result);
}
public function LevelList()
{
$service = new UserService();
$result = $service->LevelList($this->request->param(),$this->getAdminId());
return json($result);
}
// 用户状态操作
public function status()
@ -79,6 +91,18 @@ class User extends AdminBaseController
$result = $service->getUserCode($this->request->param());
return json($result);
}
public function get_loan()
{
$service = new UserService();
$result = $service->getUserLoan($this->request->param(),$this->getAdminId());
return json($result);
}
public function deal_loan()
{
$service = new UserService();
$result = $service->dealUserLoan($this->request->param(),$this->getAdminId());
return json($result);
}
public function getRegCode()
{

24
app/admin/controller/setting/Forex.php

@ -4,6 +4,8 @@ namespace app\admin\controller\setting;
use app\admin\controller\AdminBaseController;
use app\admin\service\setting\ForexService;
use app\admin\service\setting\HqService;
use app\model\ForexMarketModel;
// 合约交易对
class Forex extends AdminBaseController
@ -44,23 +46,33 @@ class Forex extends AdminBaseController
return json($result);
}
public function set_add()
public function hq_index()
{
$service = new ForexService();
$result = $service->set_add($this->request->param());
$result = $service->hq_index();
return json($result);
}
public function set_edit()
public function hq_add()
{
$service = new ForexService();
$result = $service->hq_add($this->request->param());
return json($result);
}
public function hq_edit()
{
$service = new ForexService();
$result = $service->set_edit($this->request->param());
$result = $service->hq_edit($this->request->param());
return json($result);
}
public function set_del()
public function hq_del()
{
$service = new ForexService();
$result = $service->set_del($this->request->param());
$result = $service->hq_del($this->request->param());
return json($result);
}
}

72
app/admin/job/SendGo.php

@ -0,0 +1,72 @@
<?php
namespace app\admin\job;
use app\admin\service\AdminBaseService;
use app\admin\service\setting\IPOService;
use think\Db;
use think\queue\Job;
class SendGo
{
/**
* @param Job $job
* @param $data
* @return void
*/
public function fire(Job $job, $data)
{
try {
trace('--接收-通知go---' . json_encode($data), 'error');
switch ($data['type']) {
// 通知交易
case 'trade':
$bool = (new IPOService())->sendStockToGo($data['id'], $data['stock_code'], $data['market_type']);
if (!$bool) {
trace('---通知交易异常---', 'error');
$status = 2;
} else {
$status = 1;
}
(new IPOService())->updateIPOStatus($data['market_type'], $data['id'], $data['type'], $status);
break;
//后支付通知交易
case 'last_trade':
$bool = (new IPOService())->sendStockToTrade($data['order_no'], $data['stock_code'], $data['market_type']);
if (!$bool) {
trace('---通知交易异常---', 'error');
$status = 2;
} else {
$status = 1;
}
(new IPOService())->updateIPOStatus($data['market_type'], $data['id'], $data['type'], $status, $data['order_no']);
break;
// 通知行情
case 'hq':
$bool = (new IPOService())->sendNewStockToGo($data['country'], $data['stock_code'], $data['stock_code'], $data['stock_name'], $data['tape'], $data['price'], $data['isReal'], $data['company_info'], $data['source'], $data['numeric_code'] ?? 0);
if (!$bool) {
trace('---通知行情异常---', 'error');
$status = 2;
} else {
$status = 1;
}
(new IPOService())->updateIPOStatus($data['market_type'], $data['id'], $data['type'], $status);
break;
case 'fee':
$bool = (new IPOService())->stockIPOFee($data['market_type'], $data['id'], $data['stock_code']);
if (!$bool) {
trace('---通知扣除异常---', 'error');
}
break;
}
} catch (\Exception $exception) {
trace('---通知GO异常---' . $exception->getMessage(), 'error');
}
$job->delete();
}
}

19
app/admin/route/app.php

@ -23,6 +23,7 @@ Route::group('/', function () {
// 首页数据
Route::post('/index', 'Index/index');
Route::post('/read_num', 'Index/getReamNum');
// 现货订单
Route::post('/order/digital_place', 'Order/digitalPlace');
@ -149,6 +150,7 @@ Route::group('/', function () {
// 用户管理
Route::post('/user/index', 'User/index');
Route::post('/user/real_list', 'User/RealList');
Route::post('/user/status', 'User/status');
Route::post('/user/change', 'User/change')->middleware('admin_log');
Route::post('/user/relation', 'User/relation');
@ -162,6 +164,12 @@ Route::group('/', function () {
Route::post('/user/give_stock_list', 'setting.GiveStock/index');
// 配置管理
// 合约插针行情
Route::post('/setting/forex_hq_index', 'setting.Forex/hq_index');
Route::post('/setting/forex_hq_add', 'setting.Forex/hq_add');
Route::post('/setting/forex_hq_edit', 'setting.Forex/hq_edit');
Route::post('/setting/forex_hq_del', 'setting.Forex/hq_del');
// 合约插针行情
Route::post('/setting/hq_index', 'setting.Hq/index');
Route::post('/setting/hq_add', 'setting.Hq/add');
@ -280,7 +288,7 @@ Route::group('/', function () {
Route::post('/setting/forex_index', 'setting.Forex/index');
Route::post('/setting/forex_add', 'setting.Forex/add');
Route::post('/setting/forex_edit', 'setting.Forex/edit');
Route::post('/setting/forex_select', 'setting.Contract/getTradeNameList');
Route::post('/setting/forex_select', 'setting.Forex/getTradeNameList');
// 印度期权交易对
@ -477,13 +485,16 @@ Route::group('/', function () {
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' =>16]);
Route::post('/flow/eur_stock', 'Flow/StockLogs')->append(['market_type' =>17]);
Route::post('/flow/jp_stock', 'Flow/StockLogs')->append(['market_type' =>18]);
Route::post('/flow/forex_list', 'Flow/forexList'); //外汇流水
Route::post('/flow/block_stock', 'Flow/blockStock'); //股票大宗流水
Route::post('/flow/lists', 'Flow/allList'); //所有账号流水
Route::post('/flow/fund_stock', 'Flow/fundStock');
Route::post('/flow/in_option_stock', 'Flow/inOptionStock');
Route::post('/flow/block_stock', 'Flow/blockStock');
// 充值订单
@ -567,6 +578,10 @@ Route::group('/', function () {
Route::post('/vote/add', 'Vote/add');
Route::post('/vote/edit', 'Vote/edit');
Route::post('/vote/del', 'Vote/del');
// 贷款
Route::post('/user/loan', 'User/get_loan');
Route::post('/user/deal_loan', 'User/deal_loan');
// 用户验证码
Route::post('/user/get_user_code', 'User/getUserCode');

173
app/admin/service/AdminBaseService.php

@ -5,6 +5,9 @@ namespace app\admin\service;
use app\model\AdminModel;
use app\model\ContractMarketModel;
use app\model\ContractSettingModel;
use app\model\ForexMarketModel;
use app\model\UserMoneyLogModel;
use app\model\UserMoneyModel;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use think\db\exception\PDOException;
@ -239,7 +242,7 @@ class AdminBaseService
'create_time' => date('Y-m-d H:i:s'),
'update_time' => date('Y-m-d H:i:s')
];
if (in_array($account_type, [1, 2, 8])) {
if (in_array($account_type, [1, 2, 8,19])) {
$insert_data['contract_id'] = $where['contract_id'];
} else {
$insert_data['stock_id'] = $where['stock_id'];
@ -289,7 +292,39 @@ class AdminBaseService
}
}
$change_data['usable_num'] = $last_usable_num;
$change_data['frozen_num'] = $last_frozen_num;
$change_data['update_time'] = date('Y-m-d H:i:s');
$change_bool = Db::table($table)->where($where)->update($change_data);
if ($change_bool == 0) {
Db::rollback();
return [
'status' => 100,
'msg' => '账户修改失败'
];
}
//echo Db::table($table)->where($where)->getLastSql();
$log_data['user_id'] = $user_id;
$log_data['change_type'] = $change_type;
$log_data['before_num'] = $account_info['usable_num'];
$log_data['change_num'] = $change_usable_num;
$log_data['create_time'] = date('Y-m-d H:i:s');
$log_data['update_time'] = date('Y-m-d H:i:s');
if (!empty($order_no)) {
$log_data['order_id'] = $order_no;
}
$log_bool = Db::table($log_table)->insert($log_data);
if (!$log_bool) {
Db::rollback();
return [
'status' => 100,
'msg' => '账户流水插入失败'
];
}
//后台系统 变更用户余额
//需要录入变更日志 bot_user_balance_change_log
if (in_array($change_type, [12, 13]) && $change_log_admin_id > 0 && $rate != 0) {
$balance_change_log["user_id"] = $user_id;
$balance_change_log["type"] = $account_type;
@ -317,7 +352,103 @@ class AdminBaseService
Db::rollback();
return [
'status' => 100,
'msg' => $e->getMessage()
'msg' => $e->getMessage(),
'data'=>[$e->getTrace()]
];
}
}
public function updateUserAssetNew($user_id,$change_type,$change_usable_num,$change_frozen_num = 0, $order_no = ""){
Db::startTrans();
try{
$account_info = UserMoneyModel::where('user_id',$user_id)->where('stock_id','USD')->lock(true)->find();
if (empty($account_info)) {
UserMoneyModel::InsertUserMoneyk([
'user_id' => $user_id,
'stock_id' => 'USD',
'usable_num' => 0,
'frozen_num' => 0,
]);
$account_info = UserMoneyModel::where('user_id', $user_id)->where('stock_id', 'USD')->lock(true)->find();
if (empty($account_info)) {
Db::rollback();
return [
'status' => 300,
'msg' => '用户资金账号不存在'
];
}
}
$last_usable_num = bcadd($account_info['usable_num'], $change_usable_num, 18);
$last_frozen_num = bcadd($account_info['frozen_num'], $change_frozen_num, 18);
if ($last_usable_num < 0) {
Db::rollback();
return [
'status' => 400,
'msg' => '可用资金不能为负'
];
}
if ($change_type == 6) {
if ($last_frozen_num < 0 && abs($last_frozen_num) > 0.01) {
Db::rollback();
return [
'status' => 400,
'msg' => '冻结资金不能为负'
];
} elseif (abs($last_frozen_num) < 0.01) {
$last_frozen_num = 0;
}
} else {
if ($last_frozen_num < 0) {
Db::rollback();
return [
'status' => 400,
'msg' => '冻结资金不能为负'
];
}
}
$res=UserMoneyModel::where('user_id',$user_id)->where('stock_id','USD')->update([
'usable_num'=>$last_usable_num,
'frozen_num'=>$last_frozen_num,
'update_time'=>date('Y-m-d H:i:s'),
]);
if(!$res){
Db::rollback();
return [
'status' => 400,
'msg' => '资金操作异常'
];
}
$log_bool=UserMoneyLogModel::InsertUserBalanceLog([
'user_id'=>$user_id,
'change_type'=>$change_type,
'stock_id'=>'USD',
'martket_type'=>0,
'before_num'=>$account_info['usable_num'],
'change_num'=>$change_usable_num,
'create_time'=>date('Y-m-d H:i:s'),
'update_time'=>date('Y-m-d H:i:s'),
]);
if (!$log_bool) {
Db::rollback();
return [
'status' => 100,
'msg' => '账户流水插入失败'
];
}
Db::commit();
return [
'status' => 200,
'msg' => 'ok'
];
} catch (ValidateException|PDOException|\Exception $e) {
Db::rollback();
return [
'status' => 100,
'msg' => $e->getMessage(),
'data' => [$e->getTrace()]
];
}
}
@ -346,6 +477,30 @@ class AdminBaseService
$redis->set($reds_key, json_encode($rows));
}
// 外汇插针缓存
public function initForexHqData()
{
$now = date('Y-m-d H:i:s');
$list = ForexMarketModel::where('type', 0)
->whereTime('begin_time', '>', $now)
->field('trade_name as selfContractCode,begin_time as BeginTime,step as Step ,end_time as EndTime,max_price as Price')
->order('id', 'desc')
->select();
$rows = [];
$redis = $this->getRedis();
if (!$list->isEmpty()) {
$rows = $list->toArray();
foreach ($rows as $key => $val) {
$keep_decimal = $redis->hget('FOREX:LIST:' . $val['selfContractCode'], 'keep_decimal');
$list[$key]['Digits'] = $keep_decimal;
}
}
$reds_key = "forex_hq_setting";
$redis->del($reds_key);
$redis->set($reds_key, json_encode($rows));
}
public function initContractSetting()
{
$list = ContractSettingModel::getSettingList();
@ -358,7 +513,7 @@ class AdminBaseService
// 合约自发行情缓存
public function initContractMarketData()
{
$redis = $this->getRedis();
$now = date('Y-m-d H:i:s');
$list = ContractMarketModel::where('type', 1)
->whereTime('begin_time', '>', $now)
@ -371,7 +526,7 @@ class AdminBaseService
}
$key = "contract_market_setting";
$this->redis->set($key, json_encode($rows));
$redis->set($key, json_encode($rows));
}
public function getBrokerageKey($type)
@ -535,7 +690,9 @@ class AdminBaseService
}
$responseArr = [
'old_ticker' => $oldStockCode, //新的股票代码
'new_ticker' => $newStockCode, //旧的股票代码 (新增的话 ,两个字段都是一样的值)
'token' => 'asdfsnl123jlknl3nksdf32345ln98sdfsfs8891232nsdfsdfsdfsdxcfvbhnfgh',
'locale' => $country, //国家
'yesterday_close' => $price, //价格
'name' => $stockName, //股票name
@ -699,6 +856,13 @@ class AdminBaseService
$body = $response->getBody()->getContents();
$res = json_decode($body, true);
Log::info('给交易推送数据 ' . json_encode([$res, [
'url' => $url,
'code' => $newCode,
'codeOld' => $oldCode,
'stock' => $marketType,]]));
if (isset($res['code']) && $res['code'] == 200) {
return true;
}
@ -728,6 +892,7 @@ class AdminBaseService
$response = $client->request("POST", $url, [
'json' => [
'ticker' => $code,
'locale' => $country,
'state' => $status,
'sort' => $sort,
],

432
app/admin/service/FlowService.php

@ -11,6 +11,7 @@ use app\model\UserContractLogModel;
use app\model\UserDigitalLogModel;
use app\model\UserForexLogModel;
use app\model\UserModel;
use app\model\UserMoneyLogModel;
use app\model\UserStockBlockLogModel;
use app\model\UserStockFundLogModel;
use app\model\UserStockHkdLogModel;
@ -523,154 +524,14 @@ class FlowService extends AdminBaseService
######################################## 美股资产流水 ################################
// 美股
public function usStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('us_stock')->check($param);
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockLogModel::where($where)->where($whereU)
->count();
$rows = [];
if (!$list->isEmpty()) {
$rows = $list->toArray();
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => [
'change_type_list' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)
]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
// 印尼股票
public function idnStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('idn_stock')->check($param);
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockIdnLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockIdnLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockIdnLogModel::where($where)->where($whereU)
->count();
$rows = [];
if (!$list->isEmpty()) {
$rows = $list->toArray();
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => [
'change_type_list' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)
]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
// 马来西亚
public function mysStock($param, $adminId)
// 基金流水
public function fundStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('mys_stock')->check($param);
validate(FlowValidate::class)->scene('fund_stock')->check($param);
$where = [];
$userId = 0;
@ -689,7 +550,7 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockMysLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserStockFundLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
@ -703,10 +564,9 @@ class FlowService extends AdminBaseService
}
// 列表
$list = UserStockMysLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = UserStockFundLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockMysLogModel::where($where)->where($whereU)
->count();
$total = UserStockFundLogModel::where($where)->where($whereU)->count();
$rows = [];
if (!$list->isEmpty()) {
@ -736,12 +596,12 @@ class FlowService extends AdminBaseService
}
// 泰国股票
public function thaStock($param, $adminId)
// 香港股票
public function StockLogs($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('tha_stock')->check($param);
validate(FlowValidate::class)->scene('us_stock')->check($param);
$where = [];
$userId = 0;
@ -760,81 +620,16 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockThaLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserStockHkdLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockThaLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockThaLogModel::where($where)->where($whereU)
->count();
$rows = [];
if (!$list->isEmpty()) {
$rows = $list->toArray();
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => [
'change_type_list' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)
]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
// 泰国股票
public function inStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('in_stock')->check($param);
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
$market_type=intval($param['market_type']);
$table_obj=(new IPOService())->getStockModel($market_type);
if (empty($table_obj)) {
return $this->toData('1', '数据异常');
}
$changeTypeArr = UserStockInLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
@ -845,9 +640,9 @@ class FlowService extends AdminBaseService
}
// 列表
$list = UserStockInLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = Db::table($table_obj['log_table'])->where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockInLogModel::where($where)->where($whereU)
$total = Db::table($table_obj['log_table'])->where($where)->where($whereU)
->count();
$rows = [];
@ -873,16 +668,16 @@ class FlowService extends AdminBaseService
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(),$exception->getTrace()]);
}
}
// 新加坡股票流水
public function sgdStock($param, $adminId)
// 印度期权
public function inOptionStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('sgd_stock')->check($param);
validate(FlowValidate::class)->scene('hk_stock')->check($param);
$where = [];
$userId = 0;
@ -901,7 +696,7 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockSgdLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserStockOptionInrLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
@ -910,83 +705,16 @@ class FlowService extends AdminBaseService
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockSgdLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockSgdLogModel::where($where)->where($whereU)->count();
$rows = [];
if (!$list->isEmpty()) {
$rows = $list->toArray();
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => [
'change_type_list' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)
]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
// 基金流水
public function fundStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('fund_stock')->check($param);
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockFundLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockFundLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = UserStockOptionInrLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockFundLogModel::where($where)->where($whereU)->count();
$total = UserStockOptionInrLogModel::where($where)->where($whereU)
->count();
$rows = [];
if (!$list->isEmpty()) {
@ -1015,12 +743,12 @@ class FlowService extends AdminBaseService
}
}
// 香
public function hkStock($param, $adminId)
// 香股
public function blockStock($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('hk_stock')->check($param);
validate(FlowValidate::class)->scene('block_stock')->check($param);
$where = [];
$userId = 0;
@ -1039,7 +767,7 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockHkdLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserStockBlockLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
@ -1053,9 +781,9 @@ class FlowService extends AdminBaseService
}
// 列表
$list = UserStockHkdLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = UserStockBlockLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockHkdLogModel::where($where)->where($whereU)
$total = UserStockBlockLogModel::where($where)->where($whereU)
->count();
$rows = [];
@ -1084,88 +812,11 @@ class FlowService extends AdminBaseService
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage()]);
}
}
// 香港股票
public function StockLogs($param, $adminId)
{
try {
// 参数校验
validate(FlowValidate::class)->scene('us_stock')->check($param);
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], ]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$whereU = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockHkdLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
$market_type=intval($param['market_type']);
$table_obj=(new IPOService())->getStockModel($market_type);
if (empty($table_obj)) {
return $this->toData('1', '数据异常');
}
// 交易对
if (!empty($param['stock_id'])) {
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = Db::table($table_obj['log_table'])->where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = Db::table($table_obj['log_table'])->where($where)->where($whereU)
->count();
$rows = [];
if (!$list->isEmpty()) {
$rows = $list->toArray();
// 获取用户号
$userIdArr = [];
foreach ($list as $idItem) {
$userIdArr[] = $idItem['user_id'];
}
$userNoArr = UserModel::where('user_id', 'in', $userIdArr)->column('user_no', 'user_id');
foreach ($rows as $key => $item) {
$rows[$key]['user_no'] = $userNoArr[$item['user_id']] ?? '-'; // 用户号
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extend' => [
'change_type_list' => (new BaseHomeService())->getCapitalTypeList($changeTypeArr)
]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(),$exception->getTrace()]);
}
}
// 印度期权
public function inOptionStock($param, $adminId)
{
public function forexList($param, $adminId){
try {
// 参数校验
validate(FlowValidate::class)->scene('hk_stock')->check($param);
validate(FlowValidate::class)->scene('block_stock')->check($param);
$where = [];
$userId = 0;
@ -1184,7 +835,7 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockOptionInrLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserForexLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
@ -1193,15 +844,14 @@ class FlowService extends AdminBaseService
$where['stock_id'] = $param['stock_id'];
}
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
// 列表
$list = UserStockOptionInrLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = UserForexLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockOptionInrLogModel::where($where)->where($whereU)
$total = UserForexLogModel::where($where)->where($whereU)
->count();
$rows = [];
@ -1231,9 +881,7 @@ class FlowService extends AdminBaseService
}
}
// 香股
public function blockStock($param, $adminId)
{
public function allList($param, $adminId){
try {
// 参数校验
validate(FlowValidate::class)->scene('block_stock')->check($param);
@ -1255,7 +903,7 @@ class FlowService extends AdminBaseService
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => []]);
}
$changeTypeArr = UserStockBlockLogModel::group('change_type')->column('change_type');
$changeTypeArr = UserMoneyLogModel::group('change_type')->column('change_type');
if (!empty($param['change_type']) && in_array($param['change_type'], $changeTypeArr)) $where['change_type'] = $param['change_type'];
@ -1269,9 +917,9 @@ class FlowService extends AdminBaseService
}
// 列表
$list = UserStockBlockLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
$list = UserMoneyLogModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
$total = UserStockBlockLogModel::where($where)->where($whereU)
$total = UserMoneyLogModel::where($where)->where($whereU)
->count();
$rows = [];

8
app/admin/service/RechargeService.php

@ -8,6 +8,7 @@ use app\model\FileModel;
use app\model\PaymentListModel;
use app\model\RechargeApplyModel;
use app\model\UserModel;
use think\facade\Cache;
class RechargeService extends AdminBaseService
{
@ -50,6 +51,7 @@ class RechargeService extends AdminBaseService
$where['update_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
Cache::store('redis')->set('Recharge_Read_Time'.$adminId,time());
// 列表
$list = RechargeApplyModel::where($where)->where($whereU)->order('id', 'desc')->page($param['page'], $param['limit'])->select();
// 总数
@ -141,7 +143,11 @@ class RechargeService extends AdminBaseService
if ($info['is_check'] == 0) {
if ($param['check_status'] == 1) {
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$result = $this->updateUserAssetNew($info['user_id'], 1, $info['market_amount'], 0, $info['order_no']);
}else{
$result = $this->updateUserAsset($info['user_id'], $info['account_type'], 1, $info['market_amount'], 0, $info['order_no']);
}
if ($result['status'] == 200) {
RechargeApplyModel::where('id', $info['id'])->update([
'is_check' => 1,
@ -149,7 +155,7 @@ class RechargeService extends AdminBaseService
'deal_time' => date('Y-m-d H:i:s')
]);
} else {
return $this->toData('1015', '系统异常 请稍后重试');
return $this->toData('1015', $result['msg'],$result['data']);
}
} else {
RechargeApplyModel::where('id', $info['id'])->update([

334
app/admin/service/UserService.php

@ -13,8 +13,10 @@ use app\model\UserContractModel;
use app\model\UserContractSecModel;
use app\model\UserDigitalModel;
use app\model\UserForexModel;
use app\model\UserLoanModel;
use app\model\UserLoginLog;
use app\model\UserModel;
use app\model\UserMoneyModel;
use app\model\UserStockBrlModel;
use app\model\UserStockEurModel;
use app\model\UserStockFurModel;
@ -43,7 +45,7 @@ class UserService extends AdminBaseService
try {
// 参数校验
validate(UserValidate::class)->scene('index')->check($param);
Cache::store('redis')->set('User_Read_Time'.$adminId,time());
$where = [];
// 邮箱搜索
if (!empty($param['email']) && trim($param['email'])) {
@ -130,6 +132,10 @@ class UserService extends AdminBaseService
// 查询父级
$parentNos = UserModel::where('user_id', 'in', $parentIdArr)->column('user_no', 'user_id');
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$userMoneyList=UserMoneyModel::where('user_id', 'in', $userIdArr) ->where('stock_id', 'USD')
->column('usable_num,frozen_num', 'user_id');
}else{
// 查询用户余额
$userContractList = UserContractModel::where('user_id', 'in', $userIdArr)
->where('contract_id', 'USDT')
@ -204,6 +210,9 @@ class UserService extends AdminBaseService
$userForexList = UserForexModel::where('user_id', 'in', $userIdArr)
->where('contract_id', 'USD')
->column('usable_num,frozen_num', 'user_id');
}
//最近登录IP、最近登录国家
@ -213,7 +222,9 @@ class UserService extends AdminBaseService
->join([$subQuery => 'w'], 'a.user_id=w.user_id AND a.login_date=w.last_login_date')->column(['id', 'ip', 'country', 'city'], 'a.user_id');
foreach ($userList as $item) {
$rows[] = [
$key = 'LEVERAGE:' . $item['user_id'];
$leverage_num=empty(Cache::store('redis')->get($key))? 1: Cache::store('redis')->get($key);
$userRow= [
'id' => $item['user_id'],
'user_no' => $item['user_no'],
'nickname' => $item['nick_name'],
@ -223,47 +234,192 @@ class UserService extends AdminBaseService
'invite_code' => $item['invite_code'],
'email' => $item['email'],
'mobile' => $item['country_code'] . '-' . $item['phone_number'],
'rechargeAmount' => 0,
'withdrawalAmount' => 0,
'regIp' => $item['reg_ip'],
'status' => $item['status'],
'statusName' => UserModel::$statusMap[$item['status']] ?? '-',
'loginTime' => $item['last_login_time'],
'is_real' => $item['is_real'],
'real_status' => $item['real_status'],
'lever_status' => $item['lever_status'],
'is_test_user' => $item['is_test_user'],
'is_test_user_text' => UserModel::$isTestUserMap[$item['is_test_user']] ?? '-',
'last_ip' => $lastLoginLog[$item['user_id']]['ip'] ?? '-',
'last_country' => empty($lastLoginLog[$item['user_id']]['country']) ? '-' : json_decode($lastLoginLog[$item['user_id']]['country'], true)['en'],
'agent_id' => $item['agent_id'],
'agent_name' => $item['agent_id'] > 0 ? $agentNameArr[$item['agent_id']] ?? '-' : '-',
'leverage_num'=>$leverage_num
];
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$userRow['money'] = $userMoneyList[$item['user_id']]['usable_num'] ?? '0';
$userRow['money_frozen']=$userMoneyList[$item['user_id']]['frozen_num'] ?? '0';
}else{
//余额
'digital' => $userDigitalList[$item['user_id']]['usable_num'] ?? '0',
'stock' => $userStockList[$item['user_id']]['usable_num'] ?? '0',
'contract' => $userContractList[$item['user_id']]['usable_num'] ?? '0',
'contract_sec' => $userContractSecList[$item['user_id']]['usable_num'] ?? '0',
'forex' => $userForexList[$item['user_id']]['usable_num'] ?? '0',//外汇
'stock_idn' => $userStockIdrList[$item['user_id']]['usable_num'] ?? '0', // 印尼股票余额
'stock_tha' => $userStockThaList[$item['user_id']]['usable_num'] ?? '0', // 泰股资产
'stock_mys' => $userStockMysList[$item['user_id']]['usable_num'] ?? '0', // 马股资产
'stock_in' => $userStockInList[$item['user_id']]['usable_num'] ?? '0', // 印度股资产
'stock_sgd' => $userStockSGDList[$item['user_id']]['usable_num'] ?? '0', // 新加坡股资产
'stock_fund' => $userStockFundList[$item['user_id']]['usable_num'] ?? '0', // 基金资产
'stock_option_in' => $userStockOptionInrList[$item['user_id']]['usable_num'] ?? '0', // 印度期权资产
'stock_hk' => $userStockHkList[$item['user_id']]['usable_num'] ?? '0', // 香港股资产
'stock_uk' => $userStockUkList[$item['user_id']]['usable_num'] ?? '0', // 英股资产
'stock_fur' => $userStockFurList[$item['user_id']]['usable_num'] ?? '0', // 法股资产
'stock_eur' => $userStockEurList[$item['user_id']]['usable_num'] ?? '0', // 德股资产
'stock_brl' => $userStockBrlList[$item['user_id']]['usable_num'] ?? '0', // 巴西股资产
'stock_jp' => $userStockJpList[$item['user_id']]['usable_num'] ?? '0', // 巴西股资产
$userRow['digital'] = $userDigitalList[$item['user_id']]['usable_num'] ?? '0';
$userRow['stock'] = $userStockList[$item['user_id']]['usable_num'] ?? '0';
$userRow['contract'] = $userContractList[$item['user_id']]['usable_num'] ?? '0';
$userRow['contract_sec'] = $userContractSecList[$item['user_id']]['usable_num'] ?? '0';
$userRow['forex'] = $userForexList[$item['user_id']]['usable_num'] ?? '0';//外汇
$userRow['stock_idn']=$userStockIdrList[$item['user_id']]['usable_num'] ?? '0'; // 印尼股票余额
$userRow['stock_tha']=$userStockThaList[$item['user_id']]['usable_num'] ?? '0'; // 泰股资产
$userRow['stock_mys']=$userStockMysList[$item['user_id']]['usable_num'] ?? '0'; // 马股资产
$userRow['stock_in']=$userStockInList[$item['user_id']]['usable_num'] ?? '0';// 印度股资产
$userRow['stock_sgd']=$userStockSGDList[$item['user_id']]['usable_num'] ?? '0'; // 新加坡股资产
$userRow['stock_fund']=$userStockFundList[$item['user_id']]['usable_num'] ?? '0'; // 基金资产
$userRow['stock_option_in']=$userStockOptionInrList[$item['user_id']]['usable_num'] ?? '0'; // 印度期权资产
$userRow['stock_hk']=$userStockHkList[$item['user_id']]['usable_num'] ?? '0';// 香港股资产
$userRow['stock_uk']=$userStockUkList[$item['user_id']]['usable_num'] ?? '0'; // 英股资产
$userRow['stock_fur']=$userStockFurList[$item['user_id']]['usable_num'] ?? '0'; // 法股资产
$userRow['stock_eur']=$userStockEurList[$item['user_id']]['usable_num'] ?? '0'; // 德股资产
$userRow['stock_brl']=$userStockBrlList[$item['user_id']]['usable_num'] ?? '0'; // 巴西股资产
$userRow['stock_jp']=$userStockJpList[$item['user_id']]['usable_num'] ?? '0';// 巴西股资产
//冻结资金
'digital_frozen' => $userDigitalList[$item['user_id']]['frozen_num'] ?? '0',
'stock_frozen' => $userStockList[$item['user_id']]['frozen_num'] ?? '0',
'contract_frozen' => $userContractList[$item['user_id']]['frozen_num'] ?? '0',
'forex_frozen' => $userForexList[$item['user_id']]['frozen_num'] ?? '0',
'contract_sec_frozen' => $userContractSecList[$item['user_id']]['frozen_num'] ?? '0',
'stock_idn_frozen' => $userStockIdrList[$item['user_id']]['frozen_num'] ?? '0', // 印尼股票余额
'stock_tha_frozen' => $userStockThaList[$item['user_id']]['frozen_num'] ?? '0', // 泰股资产
'stock_mys_frozen' => $userStockMysList[$item['user_id']]['frozen_num'] ?? '0', // 马股资产
'stock_in_frozen' => $userStockInList[$item['user_id']]['frozen_num'] ?? '0', // 印度股资产
'stock_sgd_frozen' => $userStockSGDList[$item['user_id']]['frozen_num'] ?? '0', // 新加坡股资产
'stock_fund_frozen' => $userStockFundList[$item['user_id']]['frozen_num'] ?? '0', // 基金资产
'stock_option_in_frozen' => $userStockOptionInrList[$item['user_id']]['frozen_num'] ?? '0', // 印度期权资产
'stock_hk_frozen' => $userStockHkList[$item['user_id']]['frozen_num'] ?? '0', // 香港股资产
'stock_uk_frozen' => $userStockUkList[$item['user_id']]['frozen_num'] ?? '0', // 英港股资产
'stock_fur_frozen' => $userStockFurList[$item['user_id']]['frozen_num'] ?? '0', // 法股资产
'stock_eur_frozen' => $userStockEurList[$item['user_id']]['frozen_num'] ?? '0', // 德股资产
'stock_brl_frozen' => $userStockBrlList[$item['user_id']]['frozen_num'] ?? '0', // 德股资产
'stock_jp_frozen' => $userStockJpList[$item['user_id']]['frozen_num'] ?? '0', // 德股资产
$userRow['digital_frozen']=$userDigitalList[$item['user_id']]['frozen_num'] ?? '0';
$userRow['stock_frozen']=$userStockList[$item['user_id']]['frozen_num'] ?? '0';
$userRow['contract_frozen']=$userContractList[$item['user_id']]['frozen_num'] ?? '0';
$userRow['forex_frozen']=$userForexList[$item['user_id']]['frozen_num'] ?? '0';
$userRow['contract_sec_frozen']=$userContractSecList[$item['user_id']]['frozen_num'] ?? '0';
$userRow['stock_idn_frozen']=$userStockIdrList[$item['user_id']]['frozen_num'] ?? '0'; // 印尼股票余额
$userRow['stock_tha_frozen']=$userStockThaList[$item['user_id']]['frozen_num'] ?? '0'; // 泰股资产
$userRow['stock_mys_frozen']=$userStockMysList[$item['user_id']]['frozen_num'] ?? '0'; // 马股资产
$userRow['stock_in_frozen']=$userStockInList[$item['user_id']]['frozen_num'] ?? '0';// 印度股资产
$userRow['stock_sgd_frozen']=$userStockSGDList[$item['user_id']]['frozen_num'] ?? '0'; // 新加坡股资产
$userRow['stock_fund_frozen']=$userStockFundList[$item['user_id']]['frozen_num'] ?? '0'; // 基金资产
$userRow['stock_option_in_frozen']=$userStockOptionInrList[$item['user_id']]['frozen_num'] ?? '0';// 印度期权资产
$userRow['stock_hk_frozen']=$userStockHkList[$item['user_id']]['frozen_num'] ?? '0'; // 香港股资产
$userRow['stock_uk_frozen']=$userStockUkList[$item['user_id']]['frozen_num'] ?? '0'; // 英港股资产
$userRow['stock_fur_frozen']=$userStockFurList[$item['user_id']]['frozen_num'] ?? '0'; // 法股资产
$userRow['stock_eur_frozen']=$userStockEurList[$item['user_id']]['frozen_num'] ?? '0'; // 德股资产
$userRow['stock_brl_frozen']=$userStockBrlList[$item['user_id']]['frozen_num'] ?? '0'; // 德股资产
$userRow['stock_jp_frozen']=$userStockJpList[$item['user_id']]['frozen_num'] ?? '0'; // 德股资产
}
$rows[] =$userRow;
}
}
return $this->toData('0', 'SUCCESS', ['total' => $total, 'list' => $rows, 'extent' => ['market_type_list' => StockMarketModel::STOCK_MARKET_TYPE, 'is_agent' => $IsAgent, 'agent_list' => $agentNameArr, 'market_rate' => $marketRate, 'market_tape_list' => $tapeList]]);
} catch (ValidateException $validateException) {
// 参数校验失败
$message = $validateException->getError();
return $this->toData('1', $message);
} catch (\Exception $exception) {
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
public function RealList($param, $adminId)
{
try {
Cache::store('redis')->set('User_Read_Time'.$adminId,time());
// 参数校验
validate(UserValidate::class)->scene('index')->check($param);
$where = [];
// 邮箱搜索
if (!empty($param['email']) && trim($param['email'])) {
$where['email'] = $param['email'];
}
// 用户审核状态筛选
if (!empty($param['real_status']) && is_numeric($param['real_status'])) {
$where['real_status'] = $param['real_status'];
}
// 用户号
if (!empty($param['user_no']) && trim($param['user_no'])) {
$where['user_no'] = $param['user_no'];
}
// 手机号搜索
if (!empty($param['phone']) && trim($param['phone'])) {
$where['phone_number'] = $param['phone'];
}
// 用户审核状态筛选
if (!empty($param['agent_id']) && is_numeric($param['agent_id'])) {
$where['agent_id'] = $param['agent_id'];
}
//邀请码
if (!empty($param['invite_code']) && trim($param['invite_code'])) {
$where['invite_code'] = $param['invite_code'];
}
// 杠杆申请状态
if (!empty($param['leve_status']) && is_numeric($param['leve_status'])) {
$where['leve_status'] = $param['leve_status'];
}
// 测试用户
if (!empty($param['is_test_user']) && is_numeric($param['is_test_user'])) {
$where['is_test_user'] = $param['is_test_user'];
}
// 注册时间
if (!empty($param['start_time']) && !empty($param['end_time'])) {
$where['create_time'] = ['between time', [$param['start_time'], $param['end_time']]];
}
$IsAgent = AdminModel::checkUserIsAgent($adminId);
$agentNameArr = AdminModel::where('role_id', 10)->column('user_name', 'id');
$marketRate = StockMarketModel::column('rate', 'stock_market_type');
$tapeList = (new StockMarketModel)->getAllTape();
// 父级用户号
if (!empty($param['parent_user_no']) && trim($param['parent_user_no'])) {
$parentUser = UserModel::where('user_no', $param['parent_user_no'])->find();
if (empty($parentUser)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => ['market_type_list' => StockMarketModel::STOCK_MARKET_TYPE, 'is_agent' => $IsAgent, 'agent_list' => $agentNameArr, 'market_rate' => $marketRate, 'market_tape_list' => $tapeList]]);
}
$where['parent_id'] = $parentUser->user_id;
}
if (!empty($where['user_id']) && is_numeric($where['user_id']) && $where['user_id'] == 0) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => ['market_type_list' => StockMarketModel::STOCK_MARKET_TYPE, 'is_agent' => $IsAgent, 'agent_list' => $agentNameArr, 'market_rate' => $marketRate, 'market_tape_list' => $tapeList]]);
}
$whereU = $this->getWhereByIsAgentAndUserId($adminId, [], 0);
if (!is_array($whereU)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => ['market_type_list' => StockMarketModel::STOCK_MARKET_TYPE, 'is_agent' => $IsAgent, 'agent_list' => $agentNameArr, 'market_rate' => $marketRate, 'market_tape_list' => $tapeList]]);
}
$userList = UserModel::where($where)->where($whereU)
->where('real_status',2)->page($param['page'], $param['limit'])->order('user_id', 'desc')->select();
$total = UserModel::where($where)->where($whereU) ->where('real_status',2)->count();
$rows = [];
if (!empty($userList)) {
$userIdArr = [];
$parentIdArr = [];
foreach ($userList as $value) {
$userIdArr[] = $value['user_id'];
if ($value['parent_id'] > 0) {
$parentIdArr[] = $value['parent_id'];
}
}
// 查询父级
$parentNos = UserModel::where('user_id', 'in', $parentIdArr)->column('user_no', 'user_id');
//最近登录IP、最近登录国家
$subQuery = UserLoginLog::field('user_id,MAX(login_date) AS last_login_date')
->where('user_id', 'in', $userIdArr)->group('user_id')->buildSql();
$lastLoginLog = UserLoginLog::alias('a')->field('a.id')
->join([$subQuery => 'w'], 'a.user_id=w.user_id AND a.login_date=w.last_login_date')->column(['id', 'ip', 'country', 'city'], 'a.user_id');
foreach ($userList as $item) {
$key = 'LEVERAGE:' . $item['user_id'];
$leverage_num=empty(Cache::store('redis')->get($key))? 1: Cache::store('redis')->get($key);
$userRow= [
'id' => $item['user_id'],
'user_no' => $item['user_no'],
'nickname' => $item['nick_name'],
'regTime' => $item['create_time'],
'parentNo' => $parentNos[$item['parent_id']] ?? '-',
'parent_id' => $item['parent_id'],
'invite_code' => $item['invite_code'],
'email' => $item['email'],
'mobile' => $item['country_code'] . '-' . $item['phone_number'],
'rechargeAmount' => 0,
'withdrawalAmount' => 0,
'regIp' => $item['reg_ip'],
@ -279,7 +435,9 @@ class UserService extends AdminBaseService
'last_country' => empty($lastLoginLog[$item['user_id']]['country']) ? '-' : json_decode($lastLoginLog[$item['user_id']]['country'], true)['en'],
'agent_id' => $item['agent_id'],
'agent_name' => $item['agent_id'] > 0 ? $agentNameArr[$item['agent_id']] ?? '-' : '-',
'leverage_num'=>$leverage_num
];
$rows[] =$userRow;
}
}
@ -293,7 +451,6 @@ class UserService extends AdminBaseService
}
}
// 修改用户状态
public function status($param, $adminId)
{
@ -356,6 +513,14 @@ class UserService extends AdminBaseService
$rate = 0;
$marketArr = StockMarketModel::column('rate', 'unit');
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$user_money=UserMoneyModel::getUserUSDByUserId(['user_id'=>$param['id']]);
$originMoney=$user_money['usable_num'];
// $originMoney = UserMoneyModel::where('user_id', $param['id'])
// ->where('stock_id', 'USD')
// ->value('usable_num');
$rate = 1;
}else{
// 查询账户余额
switch ($param['type']) {
case '1': //现货
@ -474,7 +639,7 @@ class UserService extends AdminBaseService
break;
case '19':
$originMoney = UserForexModel::where('user_id', $param['id'])
->where('stock_id', 'USD')
->where('contract_id', 'USD')
->value('usable_num');
$rate = $marketArr['USD'] ?? 0;
@ -483,6 +648,9 @@ class UserService extends AdminBaseService
return $this->toData('1', '无权操作');
break;
}
}
$diff = bcsub($amount, $originMoney, 18);
// 未进行修改
@ -502,7 +670,12 @@ class UserService extends AdminBaseService
//正式用户 && 给用户加钱 -> 需要写入变更日志
$changeLogAdminId = ($user->is_test_user == 1 && abs($diff) > 0) ? $adminId : 0;
// 执行修改账户额度
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$res = $this->updateUserAssetNew($userId, $operateType, $diff);
}else{
$res = $this->updateUserAsset($userId, $type, $operateType, $diff, 0, "", $changeLogAdminId, $rate);
}
if (isset($res['status']) && $res['status'] == 200) {
return $this->toData('0', 'SUCCESS');
}
@ -998,6 +1171,83 @@ class UserService extends AdminBaseService
return $this->toData('1', '系统异常 请稍后重试', [$exception->getMessage(), $exception->getTrace()]);
}
}
public function getUserLoan($param,$adminId)
{
try {
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => ['totalMoney' => 0]]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$where = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
if(isset($param['status'])){
$where['status']=intval($param['status']);
}
$data['where']=$where;
$data['page']=isset($param['page']) ? intval($param['page']) : 1;
$data['size']=isset($param['size']) ? intval($param['size']) : 10;
$list = UserLoanModel::getUserLoanList($data);
if(!empty($list['list'])){
foreach ($list['list'] as $key=>$item){
$user= UserModel::where('user_id', $item['user_id'])->find();
$list['list'][$key]['nick_name']=$user->nick_name;
}
}
return $this->toData('0', 'SUCCESS', $list);
} catch (\Exception $exception) {
return $this->toData('1', '系统繁忙', [$exception->getMessage(),$exception->getTrace()]);
}
}
public function dealUserLoan($param,$adminId)
{
try {
$where = [];
$userId = 0;
// 用户号精确搜索
if (!empty($param['user_no'])) {
$user = UserModel::where('user_no', $param['user_no'])->find();
if (empty($user)) {
return $this->toData('0', 'SUCCESS', ['total' => 0, 'list' => [], 'extent' => ['totalMoney' => 0]]);
}
$userId = $user['user_id'];
}
// 判断是否是代理 如果是代理 只能看他自己管理的用户
$where = $this->getWhereByIsAgentAndUserId($adminId, $where, $userId);
$where['id']=intval($param['id']);
$info=UserLoanModel::where($where)->find();
if(empty($info)){
return $this->toData('1', '数据不存在');
}
if($info['status']!=0){
return $this->toData('1', '数据已审核');
}
UserLoanModel::where($where)->update([
'status'=>intval($param['status']),
'update_time'=>date('Y-m-d H:i:s')
]);
return $this->toData('0', 'SUCCESS', []);
} catch (\Exception $exception) {
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
}

21
app/admin/service/WithdrawService.php

@ -17,6 +17,7 @@ use app\model\PaymentListModel;
use app\model\UserBankModel;
use app\model\UserModel;
use app\model\UserWithdrawalModel;
use think\facade\Cache;
use function AlibabaCloud\Client\backgroundRed;
class WithdrawService extends AdminBaseService
@ -25,8 +26,10 @@ class WithdrawService extends AdminBaseService
public function index($param, $adminId)
{
try {
// 参数校验
validate(WithdrawValidate::class)->scene('index')->check($param);
Cache::store('redis')->set('Withdraw_Read_Time'.$adminId,time());
$where = [];
$userId = 0;
// 用户号精确搜索
@ -61,6 +64,8 @@ class WithdrawService extends AdminBaseService
// 统计 提现成功
$sum = UserWithdrawalModel::where($where)->where($whereU)->where('status', 4)->sum('apply_num');
$rows = [];
if (!$list->isEmpty()) {
// 获取用户号
@ -164,18 +169,32 @@ class WithdrawService extends AdminBaseService
$update_data['update_time'] = date('Y-m-d H:i:s');
//拒绝
if ($param['status'] == 2) {
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateStatus = $this->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}else{
$updateStatus = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}
}
//代付
if ($param['status'] == 3) {
//解冻资金 ,扣除提现
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateOne = $this->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}else{
$updateOne = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}
if (!empty($updateOne) && $updateOne['status'] == 200) {
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateStatus = $this->updateUserAssetNew($order_info['user_id'], 2, -$order_info['market_amount'], 0, $order_info['order_no']);
}else{
$updateStatus = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 2, -$order_info['market_amount'], 0, $order_info['order_no']);
}
} else {
//提现事务回滚...
// $updateOne = $this->updateUserAsset($order_info['user_id'], $order_info['account_type'], 5, -$order_info['market_amount'], +$order_info['market_amount'], $order_info['order_no']);
trace("提现失败1 - change_status - order_no=" . $order_info['order_no'] . "---user_id= " . $order_info['user_id'] . "---account_type= " . $order_info['account_type'] . "---market_amount= " . $order_info['market_amount']);
return $this->toData($updateOne['status'] ?? '3251', $updateOne['msg'] ?? $msg, [$content]);
}

54
app/admin/service/setting/BlockStockService.php

@ -4,9 +4,14 @@ namespace app\admin\service\setting;
use app\admin\service\AdminBaseService;
use app\model\StockBlockListModel;
use app\model\StockBrlListModel;
use app\model\StockEurListModel;
use app\model\StockFurListModel;
use app\model\StockGBXListModel;
use app\model\StockHkdListModel;
use app\model\StockIdnListModel;
use app\model\StockInListModel;
use app\model\StockJpListModel;
use app\model\StockListModel;
use app\model\StockMysListModel;
use app\model\StockSgdListModel;
@ -108,6 +113,26 @@ class BlockStockService extends AdminBaseService
$stock = StockHkdListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '14':
$stock = StockGBXListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '15':
$stock = StockFurListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '16':
$stock = StockEurListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '17':
$stock = StockBrlListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '18':
$stock = StockJpListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
default:
return $this->toData('1', '股票市场或股票代码 无效');
}
@ -160,6 +185,8 @@ class BlockStockService extends AdminBaseService
$blockStock->forced_closure = $stock->forced_closure;
$blockStock->up_limit = $stock->up_limit;;
$blockStock->down_limit = $stock->down_limit;
$blockStock->buy_pwd = isset($param['buy_pwd']) ? trim($param['buy_pwd']) : '' ;
$blockStock->create_time = date('Y-m-d H:i:s');
$blockStock->update_time = date('Y-m-d H:i:s');
$blockStock->save();
@ -182,7 +209,8 @@ class BlockStockService extends AdminBaseService
'min' => $blockStock->min,
'start_time' => $blockStock->start_time,
'end_time' => $blockStock->end_time,
'today_add' => $blockStock->today_add
'today_add' => $blockStock->today_add,
'buy_pwd'=>$blockStock->buy_pwd
]);
return $this->toData('0', 'SUCCESS');
@ -253,6 +281,26 @@ class BlockStockService extends AdminBaseService
$stock = StockHkdListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '14':
$stock = StockGBXListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '15':
$stock = StockFurListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '16':
$stock = StockEurListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '17':
$stock = StockBrlListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
case '18':
$stock = StockJpListModel::where('stock_code', $param['stock_code'])->find();
if (empty($stock)) return $this->toData('1', 'stock_code 无效');
break;
default:
return $this->toData('1', '股票市场或股票代码 无效');
}
@ -309,6 +357,7 @@ class BlockStockService extends AdminBaseService
$blockStock->up_limit = $stock->up_limit;;
$blockStock->down_limit = $stock->down_limit;
$blockStock->update_time = date('Y-m-d H:i:s');
$blockStock->buy_pwd = trim($param['buy_pwd']);
$blockStock->save();
// 加入缓存
@ -329,7 +378,8 @@ class BlockStockService extends AdminBaseService
'min' => $blockStock->min,
'start_time' => $blockStock->start_time,
'end_time' => $blockStock->end_time,
'today_add' => $blockStock->today_add
'today_add' => $blockStock->today_add,
'buy_pwd'=>$blockStock->buy_pwd,
]);
return $this->toData('0', 'SUCCESS');

179
app/admin/service/setting/ForexService.php

@ -3,12 +3,9 @@
namespace app\admin\service\setting;
use app\admin\service\AdminBaseService;
use app\home\service\BaseHomeService;
use app\model\ContractListMode;
use app\model\ContractSettingModel;
use app\model\ContractTradeModel;
use app\model\ForexListModel;
use think\facade\Cache;
use app\model\ForexMarketModel;
use app\admin\validate\setting\HqValidate;
class ForexService extends AdminBaseService
{
@ -252,19 +249,177 @@ class ForexService extends AdminBaseService
public function getTradeNameList($param)
{
try {
if(isset($param['is_owner']) && in_array($param['is_owner'], [0,1])){
$list = ForexListModel::where('status', 1)->order('id', 'desc')
->where('is_owner', $param['is_owner'])
->column('trade_name', 'id');
} else {
$list = ForexListModel::where('status', 1)->order('id', 'desc')
->column('trade_name', 'id');
}
return $this->toData('0', 'SUCCESS', ['list' => $list]);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', []);
}
}
public function hq_index()
{
try {
$list = ForexMarketModel::where('type', 0)->order('id', 'desc')->select();
$rows = [];
if(!$list->isEmpty()){
$rows = $list->toArray();
}
return $this->toData('0','SUCCSS',['list' => $rows, 'total' => count($rows)]);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
// 新增
public function hq_add($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('add')->check($param);
// 已存在未执行的 不能再插入
$count = ForexMarketModel::where('trade_name', $param['trade_name'])
->where('is_get',1)
->where('type', 0)
->count();
if($count > 0){
return $this->toData('1','已存在未执行');
}
//判断
$diff = strtotime($param['end_time']) - strtotime($param['begin_time']);
if($diff > 600 || $diff <=0){
return $this->toData('1','时间无效-结束时间必须在开始时间十分钟以内');
}
// 不能有交叉时间
$map1 = [
['trade_name', '=',$param['trade_name']],
['begin_time','between', [$param['begin_time'], $param['end_time']]]
];
$map2 = [
['trade_name', '=',$param['trade_name']],
['end_time','between', [$param['begin_time'], $param['end_time']]]
];
$count = ForexMarketModel::whereOr([$map1,$map2])
->count();
if($count > 0){
return $this->toData('1','时间无效-时间不能有交叉');
}
$market = new ForexMarketModel;
$market->trade_name = $param['trade_name'];
$market->begin_time = $param['begin_time'];
$market->end_time = $param['end_time'];
$market->max_price = $param['max_price'];
$market->step = $param['step'];
$market->type = 0;
$market->save();
// 写入redis
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('1', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage()]);
}
}
// 编辑
public function hq_edit($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('edit')->check($param);
// 已存在未执行的 不能再插入
$count = ForexMarketModel::where('trade_name', $param['trade_name'])
->where('id', '<>', $param['id'])
->where('is_get',1)
->where('type', 0)
->count();
if($count > 0){
return $this->toData('1','已存在未执行');
}
// 目标
$market = ForexMarketModel::where('id', $param['id'])->where('type', 0)->find();
if(empty($market)){
return $this->toData('1','目标不存在');
}
//判断
$diff = strtotime($param['end_time']) - strtotime($param['begin_time']);
if($diff > 600 || $diff <=0){
return $this->toData('1','时间无效');
}
// 不能有交叉时间
$map1 = [
['trade_name', '=',$param['trade_name']],
['id', '<>',$param['id']],
['begin_time','between', [$param['begin_time'], $param['end_time']]]
];
$map2 = [
['trade_name', '=',$param['trade_name']],
['id', '<>',$param['id']],
['end_time','between', [$param['begin_time'], $param['end_time']]]
];
$count = ForexMarketModel::whereOr([$map1,$map2])
->count();
if($count > 0){
return $this->toData('1','时间无效');
}
$market->trade_name = $param['trade_name'];
$market->begin_time = $param['begin_time'];
$market->end_time = $param['end_time'];
$market->max_price = $param['max_price'];
$market->is_get = 1;
$market->step = $param['step'];
$market->save();
// redis
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('1', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('1', '系统繁忙', [$exception->getMessage(),$exception->getTrace()]);
}
}
// 删除
public function hq_del($param)
{
try {
// 参数校验
validate(HqValidate::class)->scene('del')->check($param);
// 目标
$market = ForexMarketModel::where('id', $param['id'])->find();
if(empty($market)){
return $this->toData('1','目标不存在');
}
$market->delete();
$this->initForexHqData();
return $this->toData('0','SUCCESS');
}catch (ValidateException $validateException){
return $this->toData('12', $validateException->getMessage(), []);
}catch (\Exception $exception){
return $this->toData('11', '系统繁忙', [$exception->getMessage()]);
}
}
}

1
app/admin/service/setting/HqService.php

@ -137,6 +137,7 @@ class HqService extends AdminBaseService
$market->end_time = $param['end_time'];
$market->max_price = $param['max_price'];
$market->step = $param['step'];
$market->is_get = 1;
$market->save();
// redis

16
app/admin/service/setting/StockMarketService.php

@ -3,12 +3,14 @@
namespace app\admin\service\setting;
use app\admin\service\AdminBaseService;
use app\model\StockBrlListModel;
use app\model\StockEurListModel;
use app\model\StockFurListModel;
use app\model\StockGBXListModel;
use app\model\StockHkdListModel;
use app\model\StockIdnListModel;
use app\model\StockInListModel;
use app\model\StockJpListModel;
use app\model\StockListModel;
use app\model\StockMarketModel;
use app\model\StockMysListModel;
@ -445,6 +447,14 @@ class StockMarketService extends AdminBaseService
$stockList = StockEurListModel::where($where)->page($param['page'], $param['limit'])->select();
$total = StockEurListModel::where($where)->count();
break;
case StockMarketModel::STOCK_MARKET_BRL:
$stockList = StockBrlListModel::where($where)->page($param['page'], $param['limit'])->select();
$total = StockBrlListModel::where($where)->count();
break;
case StockMarketModel::STOCK_MARKET_JP:
$stockList = StockJpListModel::where($where)->page($param['page'], $param['limit'])->select();
$total = StockJpListModel::where($where)->count();
break;
default:
return $this->toData('1', '股票市场无效', []);
}
@ -506,6 +516,12 @@ class StockMarketService extends AdminBaseService
case StockMarketModel::STOCK_MARKET_EUR:
$stock = StockEurListModel::where('id', $param['stock_id'])->find();
break;
case StockMarketModel::STOCK_MARKET_BRL:
$stock = StockBrlListModel::where('id', $param['stock_id'])->find();
break;
case StockMarketModel::STOCK_MARKET_JP:
$stock = StockJpListModel::where('id', $param['stock_id'])->find();
break;
default:
return [];
}

4
app/admin/validate/setting/HqValidate.php

@ -21,8 +21,8 @@ class HqValidate extends AdminBaseValidate
'trade_name.alphaDash' => '交易对无效',
'begin_time.date' => '开始时间无效',
'end_time.date' => '结束时间无效',
'step.require' => '步长无效',
'step.integer' => '步长无效',
'step.require' => '波动率不能为空',
'step.integer' => '波动率必须为整数',
'max_price.require' => '价格无效',
'max_price.float' => '价格无效',
];

2
app/home/controller/Country.php

@ -15,7 +15,7 @@ class Country extends HomeBaseController
public function getAll(): Json
{
try {
$res = CountryModel::getAll();
$res = CountryModel::order('sort','asc')->select();
$returnData = [];
if(!$res->isEmpty()){
$deny = explode(',', env('NATION.DENY_NATION'));

2
app/home/controller/Login.php

@ -120,7 +120,7 @@ class Login extends HomeBaseController
{
$returnData = (new LoginService())->getIP();
return json($returnData);
}
}

91
app/home/controller/News.php

@ -0,0 +1,91 @@
<?php
namespace app\home\controller;
use Goutte\Client;
use think\facade\Cache;
use think\Request;
use think\response\Json;
class News extends HomeBaseController
{
public function index(): Json
{
$key="NEWS:LIST";
$result=Cache::store('redis')->get($key);
if(empty($result)){
$client=new Client();
// 访问一个网页
$crawler = $client->request('GET', 'https://www.nikkei.com/news/category/markets/');
// 提取所有的段落
$paragraphs = $crawler->filter('li.cardListItem_cq2exak a')->each(function ($node) {
$url="https://www.nikkei.com".str_ireplace('https://www.nikkei.com','',$node->attr('href'));
$img_obj=$node->filter('div.image_i66x7bx img');
$img_url="";
if($img_obj->count()>0){
$img_url=$node->filter('div.image_i66x7bx img')->attr('src');
}
if(!empty($img_url)){
return [
'title'=>$node->filter('span.articleTitle_axocstj')->text(),
'img_url'=>$img_url,
'href'=>str_ireplace('\\','',$url)
];
}
});
$paragraphs=array_filter($paragraphs);
$titles = array_flip(array_column($paragraphs, 'title'));
$result = [];
foreach ($paragraphs as $item) {
if (isset($titles[$item['title']])) {
$result[] = $item;
unset($titles[$item['title']]); //Remove from unique IDs to ensure only first is kept.
}
}
$paragraphs=$result;
Cache::store('redis')->set($key,$paragraphs,300);
}else{
$paragraphs=$result;
}
return json([
'code' => '0',
'message' => 'Request successful.',
'data' => $paragraphs,
]);
}
public function test(): Json
{
$client=new Client();
// 访问一个网页
$crawler = $client->request('GET', 'https://www.nikkei.com/news/category/markets/');
// 提取所有的段落
$paragraphs = $crawler->filter('li.cardListItem_cq2exak a')->each(function ($node) {
$url="https://www.nikkei.com".str_ireplace('https://www.nikkei.com','',$node->attr('href'));
$img_obj=$node->filter('div.image_i66x7bx img');
$img_url="";
if($img_obj->count()>0){
$img_url=$node->filter('div.image_i66x7bx img')->attr('src');
}
if(!empty($img_url)){
return [
'title'=>$node->filter('span.articleTitle_axocstj')->text(),
'img_url'=>$img_url,
'href'=>str_ireplace('\\','',$url)
];
}
});
return json([
'code' => '0',
'message' => 'Request successful.',
'data' => array_filter($paragraphs),
]);
}
}

44
app/home/controller/User.php

@ -216,6 +216,30 @@ class User extends HomeBaseController
return json($returnData);
}
/**
* @desc
* @return Json
* @throws InvalidArgumentException
*/
public function apply_loan(): Json
{
$returnData = (new UserService())->apply_loan($this->request->userId, $this->request->post());
return json($returnData);
}
/**
* @desc
* @return Json
* @throws InvalidArgumentException
*/
public function loan(): Json
{
$returnData = (new UserService())->loan($this->request->userId, $this->request->post());
return json($returnData);
}
/**
* @desc 退出登陆
* @return Json
@ -256,4 +280,24 @@ class User extends HomeBaseController
$returnData = (new UserService())->leverApply($this->request->userId);
return json($returnData);
}
public function applyTest(): Json
{
$returnData = (new UserService())->applyTestAccount($this->request->userId);
return json($returnData);
}
public function applyTestMoney(): Json
{
$returnData = (new UserService())->applyTestMoney($this->request->userId,$this->request->post());
return json($returnData);
}
public function testLogin(): Json
{
$returnData = (new UserService())->testLogin($this->request->userId);
return json($returnData);
}
public function formalLogin(): Json
{
$returnData = (new UserService())->formalLogin($this->request->userId);
return json($returnData);
}
}

2
app/home/controller/Wallet.php

@ -136,6 +136,8 @@ class Wallet extends HomeBaseController
$data['bank_email']=$request->post('bank_email');
$data['bank_phone']=$request->post('bank_phone');
$data['bank_code']=$request->post('bank_code');
$data['branch_name']=$request->post('branch_name');
$data['branch_phone']=$request->post('branch_phone');
$data['is_default']=$request->post('is_default');
$data['ifsc']=$request->post('ifsc');
$data['bank_address']=$request->post('bank_address');

14
app/home/route/app.php

@ -13,6 +13,7 @@ use think\facade\Route;
$header = [
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => 1800,
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With,Token,Language,X-token',
];
@ -181,6 +182,10 @@ Route::group('/',function (){
Route::post('user/login_log', 'User/loginLog');
// 退出登陆
Route::post('user/log_out', 'User/logout');
//申请模拟账号
Route::post('user/apply_test', 'User/applyTest');
Route::post('user/test_login', 'User/testLogin');
Route::post('user/formal_login', 'User/formalLogin');
Route::post('payment_list', 'Pay/payChannel'); //获取充值渠道
@ -229,6 +234,8 @@ Route::group('/',function (){
Route::post('user/reset_pwd_email', 'User/resetPasswordByEmail');
Route::post('user/lever_apply', 'User/leverApply');
Route::post('apply_test_money', 'User/applyTestMoney');
// 股票申购
Route::post('pre_stock/order', 'PreStock/order')->middleware(\app\home\middleware\RepeatOperateMiddleware::class); // 新股下单 防止重复操作
@ -252,6 +259,10 @@ Route::group('/',function (){
//投票
Route::post('vote/index', 'Vote/index');
Route::post('vote/cheer', 'Vote/cheer');
//贷款
Route::post('user/apply_loan', 'User/apply_loan');
Route::post('user/loan', 'User/loan');
})->middleware(\app\home\middleware\AuthMiddleware::class);
// 美股申购列表 不需要登陆
@ -261,7 +272,10 @@ Route::group('/',function (){
//基金
Route::post('fund/index', 'Fund/index');
Route::post('auto_login', 'Login/autoLogin');
Route::post('get_ip', 'Login/getIP');
Route::get('get_news', 'News/index');
Route::get('test', 'News/test');
})->allowCrossDomain($header);

155
app/home/service/BaseHomeService.php

@ -43,7 +43,7 @@ class BaseHomeService
}
public function __construct()
{
$this->redis=$this->getRedis();
//$this->redis=$this->getRedis();
//$this->getTrcWalletAddress();
}
@ -57,9 +57,9 @@ class BaseHomeService
'user_id'=>0,
'wallet_type'=>'TRC-20'
])->count();
$flag=$this->redis->exists($redis_key);
$flag=Cache::store('redis')->exists($redis_key);
if($num<50 && empty($flag)){
$this->redis->setex($redis_key,120,2);
Cache::store('redis')->setex($redis_key,120,2);
$queuename = 'app\home\job\Wallet';
Queue::push($queuename, "test", 'Wallet');
}
@ -87,7 +87,7 @@ class BaseHomeService
public function getEmailContent(int $type = 1): array
{
$code = random_int(1000,9999);
$title = 'Verification Code';
$title = env('EMAIL_TITLE'.'TITLE').' Verification Code';
$subject = "your code is [$code], valid for 5 minutes, please do not reply to this email";
return ['title' => $title, 'subject' => $subject, 'code' => $code];
}
@ -99,23 +99,22 @@ class BaseHomeService
*/
public function getUniqUserNo(): string
{
$code = 's';
$code .= date('ymd'); // s230629
$code = rand(1,9);
$characters = '1234567890';
while (true)
{
$code .= rand(100000, 999999);
// redis 去重
$exist = Cache::store('redis')->get($code);
// 存储有效期为距离明天还要多久
$expire = strtotime('tomorrow') - time();
if (!$exist) {
Cache::store('redis')->set($code, 1, $expire);
for ($i = 0; $i < 5; $i++) {
$index = rand(0, strlen($characters) - 1);
$code .= $characters[$index];
}
// 查询去重
$user = UserModel::where('user_no', $code)->value('user_id');
if(empty($user)){
break;
}
}
return $code;
}
/**
* 生成12位随机邀请码
* @param $length
@ -125,7 +124,7 @@ class BaseHomeService
* @throws \think\db\exception\ModelNotFoundException
*/
function getUniqInviteCode($length = 6) {
$characters = '1234567890abcdefghijklmnpqrstwxyzABCDEFGHIJKLMNPQRSTWXYZ';
$characters = '1234567890';
$inviteCode = '';
while (true)
{
@ -310,11 +309,13 @@ class BaseHomeService
*/
public function checkCode($key, $code)
{
if($code=='666888'){
return true;
}
$cacheCode = Cache::store('redis')->get($key);
if(empty($cacheCode)){
return false;
}
return $cacheCode == $code;
}
/**
@ -427,16 +428,16 @@ class BaseHomeService
]);
foreach ($result['list'] as $val){
$key="DIGITAL:LIST:".$val['name'];
$this->redis->del($key);
$this->redis->hMSet($key,$val);
Cache::store('redis')->del($key);
Cache::store('redis')->hMSet($key,$val);
}
return $result['list'];
}
public function getDigitalList(){
$data=$this->redis->keys('DIGITAL:LIST:*');
$data=Cache::store('redis')->keys('DIGITAL:LIST:*');
$list=[];
foreach ($data as $val){
$list[]=$this->redis->hGetAll($val);
$list[]=Cache::store('redis')->hGetAll($val);
}
return [
'total'=>count($data),
@ -448,9 +449,9 @@ class BaseHomeService
$key="DRAWAL:FEE:SETTING";
if($type==1){
$info=DrawalSettingModel::getDrawalFee();
$this->redis->hMset($key,$info);
Cache::store('redis')->hMset($key,$info);
}else{
return $this->redis->hGetAll($key);
return Cache::store('redis')->hGetAll($key);
}
}
public function initContractSetting()
@ -458,15 +459,15 @@ class BaseHomeService
$list=ContractListMode::getMarketFaceList();
foreach ($list as $val){
$key="CONTRACT:LIST:".$val['name'];
$this->redis->del($key);
$this->redis->hMSet($key,$val);
Cache::store('redis')->del($key);
Cache::store('redis')->hMSet($key,$val);
}
return $list;
}
public function getContractFaceList($type=0)
{
$list=$this->redis->keys('CONTRACT:LIST:*');
$list=Cache::store('redis')->keys('CONTRACT:LIST:*');
//var_dump($list);
if(empty($list)){
$list=$this->initContractSetting();
@ -481,7 +482,7 @@ class BaseHomeService
}else{
$data=[];
foreach ($list as $val){
$data[]=$this->redis->hGetAll($val);
$data[]=Cache::store('redis')->hGetAll($val);
}
if($type){
return $data;
@ -505,13 +506,13 @@ class BaseHomeService
foreach ($list as $val){
switch ($val['brok_type']){
case 1:
$this->redis->hMset($brokerage_buy_key,$val);
Cache::store('redis')->hMset($brokerage_buy_key,$val);
break;
case 2:
$this->redis->hMset($brokerage_sale_key,$val);
Cache::store('redis')->hMset($brokerage_sale_key,$val);
break;
default:
$this->redis->hMset($brokerage_reg_key,$val);
Cache::store('redis')->hMset($brokerage_reg_key,$val);
break;
}
}
@ -524,10 +525,10 @@ class BaseHomeService
{
//注册返佣
$brokerage_reg_key='BROKERAGE:REG:SETTING';
$res= $this->redis->hGetAll($brokerage_reg_key);
$res= Cache::store('redis')->hGetAll($brokerage_reg_key);
if(empty($res)){
$this->initBrokerageRegSetting();
$res= $this->redis->hGetAll($brokerage_reg_key);
$res= Cache::store('redis')->hGetAll($brokerage_reg_key);
}
return $res;
@ -537,7 +538,7 @@ class BaseHomeService
$list=UserLevelModel::getUserLevelList();
foreach ($list as $item){
$key='USER:LEVEL:'.$item['user_id'];
$this->redis->hMset($key,$item);
Cache::store('redis')->hMset($key,$item);
}
}
public function initTradeFeeSetting($market_type=0)
@ -564,64 +565,64 @@ class BaseHomeService
foreach ($trade_fee_list as $item){
switch ($item['market_type']){
case 1:
$this->redis->del($digital_fee_key);
$this->redis->hMset($digital_fee_key,$item);
Cache::store('redis')->del($digital_fee_key);
Cache::store('redis')->hMset($digital_fee_key,$item);
break;
case 2:
$this->redis->del($contract_fee_key);
$this->redis->hMset($contract_fee_key,$item);
Cache::store('redis')->del($contract_fee_key);
Cache::store('redis')->hMset($contract_fee_key,$item);
break;
case 3:
$this->redis->del($us_stock_fee_key);
$this->redis->hMset($us_stock_fee_key,$item);
Cache::store('redis')->del($us_stock_fee_key);
Cache::store('redis')->hMset($us_stock_fee_key,$item);
break;
case 4:
$this->redis->del($idn_stock_fee_key);
$this->redis->hMset($idn_stock_fee_key,$item);
Cache::store('redis')->del($idn_stock_fee_key);
Cache::store('redis')->hMset($idn_stock_fee_key,$item);
break;
case 5:
$this->redis->del($mys_stock_fee_key);
$this->redis->hMset($mys_stock_fee_key,$item);
Cache::store('redis')->del($mys_stock_fee_key);
Cache::store('redis')->hMset($mys_stock_fee_key,$item);
break;
case 6:
$this->redis->del($tha_stock_fee_key);
$this->redis->hMset($tha_stock_fee_key,$item);
Cache::store('redis')->del($tha_stock_fee_key);
Cache::store('redis')->hMset($tha_stock_fee_key,$item);
break;
case 7:
$this->redis->del($in_stock_fee_key);
$this->redis->hMset($in_stock_fee_key,$item);
Cache::store('redis')->del($in_stock_fee_key);
Cache::store('redis')->hMset($in_stock_fee_key,$item);
break;
case 9:
$this->redis->del($SGD_stock_fee_key);
$this->redis->hMset($SGD_stock_fee_key,$item);
Cache::store('redis')->del($SGD_stock_fee_key);
Cache::store('redis')->hMset($SGD_stock_fee_key,$item);
break;
case 12:
$this->redis->del($hk_stock_fee_key);
$this->redis->hMset($hk_stock_fee_key,$item);
Cache::store('redis')->del($hk_stock_fee_key);
Cache::store('redis')->hMset($hk_stock_fee_key,$item);
break;
case 14:
$this->redis->del($uk_stock_fee_key);
$this->redis->hMset($uk_stock_fee_key,$item);
Cache::store('redis')->del($uk_stock_fee_key);
Cache::store('redis')->hMset($uk_stock_fee_key,$item);
break;
case 15:
$this->redis->del($fur_stock_fee_key);
$this->redis->hMset($fur_stock_fee_key,$item);
Cache::store('redis')->del($fur_stock_fee_key);
Cache::store('redis')->hMset($fur_stock_fee_key,$item);
break;
case 16:
$this->redis->del($eur_stock_fee_key);
$this->redis->hMset($eur_stock_fee_key,$item);
Cache::store('redis')->del($eur_stock_fee_key);
Cache::store('redis')->hMset($eur_stock_fee_key,$item);
break;
case 17:
$this->redis->del($brl_stock_fee_key);
$this->redis->hMset($brl_stock_fee_key,$item);
Cache::store('redis')->del($brl_stock_fee_key);
Cache::store('redis')->hMset($brl_stock_fee_key,$item);
break;
case 18:
$this->redis->del($jp_stock_fee_key);
$this->redis->hMset($jp_stock_fee_key,$item);
Cache::store('redis')->del($jp_stock_fee_key);
Cache::store('redis')->hMset($jp_stock_fee_key,$item);
break;
case 19:
$this->redis->del($forex_fee_key);
$this->redis->hMset($forex_fee_key,$item);
Cache::store('redis')->del($forex_fee_key);
Cache::store('redis')->hMset($forex_fee_key,$item);
break;
}
}
@ -630,49 +631,49 @@ class BaseHomeService
$res=[];
switch ($market_type){
case 1:
$res= $this->redis->hGetAll($digital_fee_key);
$res= Cache::store('redis')->hGetAll($digital_fee_key);
break;
case 2:
$res=$this->redis->hGetAll($contract_fee_key);
$res=Cache::store('redis')->hGetAll($contract_fee_key);
break;
case 3:
$res=$this->redis->hGetAll($us_stock_fee_key);
$res=Cache::store('redis')->hGetAll($us_stock_fee_key);
break;
case 4:
$res=$this->redis->hGetAll($idn_stock_fee_key);
$res=Cache::store('redis')->hGetAll($idn_stock_fee_key);
break;
case 5:
$res=$this->redis->hGetAll($mys_stock_fee_key);
$res=Cache::store('redis')->hGetAll($mys_stock_fee_key);
break;
case 6:
$res=$this->redis->hGetAll($tha_stock_fee_key);
$res=Cache::store('redis')->hGetAll($tha_stock_fee_key);
break;
case 7:
$res=$this->redis->hGetAll($in_stock_fee_key);
$res=Cache::store('redis')->hGetAll($in_stock_fee_key);
break;
case 9:
$res=$this->redis->hGetAll($SGD_stock_fee_key);
$res=Cache::store('redis')->hGetAll($SGD_stock_fee_key);
break;
case 12:
$res=$this->redis->hGetAll($hk_stock_fee_key);
$res=Cache::store('redis')->hGetAll($hk_stock_fee_key);
break;
case 14:
$res=$this->redis->hGetAll($uk_stock_fee_key);
$res=Cache::store('redis')->hGetAll($uk_stock_fee_key);
break;
case 15:
$res=$this->redis->hGetAll($fur_stock_fee_key);
$res=Cache::store('redis')->hGetAll($fur_stock_fee_key);
break;
case 16:
$res=$this->redis->hGetAll($eur_stock_fee_key);
$res=Cache::store('redis')->hGetAll($eur_stock_fee_key);
break;
case 17:
$res=$this->redis->hGetAll($brl_stock_fee_key);
$res=Cache::store('redis')->hGetAll($brl_stock_fee_key);
break;
case 18:
$res=$this->redis->hGetAll($jp_stock_fee_key);
$res=Cache::store('redis')->hGetAll($jp_stock_fee_key);
break;
case 19:
$res=$this->redis->hGetAll($forex_fee_key);
$res=Cache::store('redis')->hGetAll($forex_fee_key);
break;
}
return $res;

7
app/home/service/BlockStockService.php

@ -19,17 +19,18 @@ class BlockStockService extends BaseHomeService
}
// stock_type 3 美股 4 印尼 5 马股 6 泰股 9 新加坡股票
if (empty($param['type']) || !in_array($param['type'], ['3', '4', '5', '6', '7', '9', '12'])) {
if (empty($param['type']) || !in_array($param['type'], ['3', '4', '5', '6', '7', '9', '12','14','15','16','17','18'])) {
return $this->toData('1', 'Params error');
}
$list = StockBlockListModel::where('type', $param['type'])->page($param['page'], $param['limit'])->select();
$total = StockBlockListModel::where('type', $param['type'])->count();
$redisKeyArr = [3 => 'US', 4 => 'Indonesia', 5 => 'Malaysia', 6 => 'Thailand', 7 => 'India', 9 => 'Singapore', 12 => 'HongKong'];
$redisKeyArr = [3 => 'US', 4 => 'Indonesia', 5 => 'Malaysia', 6 => 'Thailand', 7 => 'India', 9 => 'Singapore', 12 => 'HongKong',14=>'UK',15=>'France',16=>'Germany',17=>'Brazil',18=>'Japan'];
$redis = $this->getRedis();
foreach ($list as &$v) {
foreach ($list as $key=>&$v) {
unset($list[$key]['buy_pwd']);
$key = "Stock:" . $redisKeyArr[$v->type];
$v->current_price = $redis->hget($key . ":ClosePrice", $v->stock_code) ?? $redis->hget($key . ":CloseNewPrice", $v->stock_code);
}

42
app/home/service/IPOService.php

@ -639,7 +639,12 @@ class IPOService extends BaseHomeService
return $this->toData('1', 'get num error', []);
}
// 扣除用户资产
$beforeAmount = Db::table($tableObj['user_table'])->where('stock_id', $tableObj['stock_id'])->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::table($tableObj['user_table'])->where('stock_id', $tableObj['stock_id'])->where('user_id', $userId)
->where('usable_num', '>=', $amount)->dec('usable_num', $amount)
->inc('frozen_num', $amount)
@ -653,6 +658,7 @@ class IPOService extends BaseHomeService
'user_id' => $userId,
'change_type' => 15, // 新股申购扣减费用
'stock_id' => $tableObj['stock_id'],
'before_num' => $beforeAmount,
'change_num' => '-' . $amount,
'order_id' => $orderNo,
'create_time' => $nowDate,
@ -664,6 +670,7 @@ class IPOService extends BaseHomeService
return $this->toData('1', 'create user log error', []);
}
// 扣除手续费
if ($fee > 0) {
$beforeFee = Db::table($tableObj['user_table'])->where('stock_id', $tableObj['stock_id'])->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
@ -679,17 +686,46 @@ class IPOService extends BaseHomeService
Db::rollback();
return $this->toData('1', 'Update user amount error', []);
}
// 生成流水
$insertStockLogArrFee = [
'user_id' => $userId,
'change_type' => 16, // 新股申购扣减费用
'stock_id' => $tableObj['stock_id'],
'before_num' => $beforeFee,
'change_num' => '-' . $fee,
'order_id' => $orderNo,
'create_time' => $nowDate,
'update_time' => $nowDate
];
$insertStockLogNumFee = Db::table($tableObj['log_table'])->insert($insertStockLogArrFee);
if ($insertStockLogNumFee <= 0) {
Db::rollback();
return $this->toData('1', 'create user log error', []);
}
}
if ($preStock['open_status'] == 1 && $preStock['sign_status'] == 1) {
//未上市
$bool = Db::table($tableObj['order_table'])->where('id', $param['id'])->update(['status' =>5, 'update_time' => $nowDate]);
$bool = Db::table($tableObj['order_table'])->where('id', $param['id'])->update(['status' => 2, 'update_time' => $nowDate]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preStock['open_status'] == 2 && $preStock['sign_status'] == 1) {
//已上市
$bool = Db::table($tableObj['order_table'])->where('id', $param['id'])->update(['status' => 3, 'update_time' => $nowDate]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
// 已上市 扣除手续费 冻结资金
$num = Db::table($tableObj['user_table'])->where('user_id', $userId)->where('stock_id', $tableObj['stock_id'])
->dec('frozen_num', $hasOrder['get_fee'])
->update(['update_time' => $nowDate]);
if ($num <= 0) {
Db::rollback();
trace('股票:' . $preStock['stock_code'] . ',扣除手续费失败,用户ID:' . $userId, 'error');
}
// 手续费流水
$tradeFee = new TradeFeeModel;
$tradeFee['user_id'] = $userId;

52
app/home/service/LoginService.php

@ -51,6 +51,7 @@ class LoginService extends BaseHomeService
$content = $this->getEmailContent();
$content['email'] = $param['email'];
// 将发送邮件任务添加到异步队列
$queuename = 'app\home\job\SendEmail';
Queue::push($queuename, $content, 'sendEmail');
@ -356,10 +357,11 @@ class LoginService extends BaseHomeService
//注册验证码
if (!$this->checkCode($reg_key, $param['sms_code'])) {
return $this->toData('100300', 'The verification code is incorrect.', []);
} else {
$code = random_int(1000, 9999);
$this->insertCodeToCache($reg_key, $code, 300);
}
// else {
// $code = random_int(1000, 9999);
// $this->insertCodeToCache($reg_key, $code, 300);
// }
}
// 手机号是否已经存在
@ -700,6 +702,50 @@ class LoginService extends BaseHomeService
return $this->toData('100500', 'The system is busy. Please try again later.', []);
}
}
public function testLogin($param): array
{
try {
$login_token=$param['login_token'];
$tokenUserKey = 'AUTO:TOKEN:'.$login_token;
$userId = Cache::store('redis')->get($tokenUserKey);
if(empty($userId) || $userId <= 0){
return $this->toData('100300', 'Incorrect token', []);
}
$info = UserModel::getFieldsByUserId('invite_code,is_real,nick_name,user_no,user_id,login_password,salt', $userId);
if (empty($info)) {
return $this->toData('100300', 'Incorrect account or password.2', []);
}
// 生成token
$token = (new Jwt())->getToken($userId, env('ENCRYPT.SALT'));
if (empty($token)) {
return $this->toData('100400', 'The system is busy. Please try again later.', []);
}
// 将token存致缓存 覆盖新的缓存 实现单设备登陆
$this->setUserTokenCache($token, $userId);
// 用户登记关系
(new UserService())->getUserLevel($userId);
// 返回结果以及用户信息
return $this->toData('0', 'Request successful.', [
'userId' => $userId,
'userNo' => $info['user_no'],
'nickName' => $info['nick_name'],
'isReal' => $info['is_real'],
'inviteCode' => $info['invite_code'],
'logo' => env('USER.DEFAULT_HEAD_IMG_PATH'),
'token' => $token,
]);
} catch (ValidateException $validateException) {
// 参数校验失败 异常类
$message = $validateException->getError();
return $this->toData('100400', $message);
} catch (\Exception $exception) {
return $this->toData('100500', 'The system is busy. Please try again later.', []);
}
}
public function getIP(): array
{

4
app/home/service/MarketService.php

@ -161,8 +161,8 @@ class MarketService extends BaseHomeService
{
try{
validate(MarketValidate::class)->scene('getTradeFee')->check($data);
$fee_info=$this->initTradeFeeSetting($data['market_type']);
//$fee_info=FeeSettingModel::getTradeFeeById($data['market_type']);
//$fee_info=$this->initTradeFeeSetting($data['market_type']);
$fee_info=FeeSettingModel::getTradeFeeById($data['market_type']);
return $this->toData(0,'Request successful.',$fee_info);
}catch (ValidateException $validateException){
$message = $validateException->getMessage();

665
app/home/service/PreHkdStockService.php

@ -1,665 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreHkdStockModel;
use app\model\StockMarketModel;
use app\model\StockHkdListModel;
use app\model\UserHkdPreStockOrderModel;
use app\model\UserStockHkdLogModel;
use app\model\UserStockHkdModel;
use think\facade\Db;
class PreHkdStockService 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', '=', PreHkdStockModel::IS_DELETE_NO];
$where[] = ['status', '=', PreHkdStockModel::STATUS_ON];
$query = PreHkdStockModel::where($where);
$totalQuery = PreHkdStockModel::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', '=', PreHkdStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreHkdStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreHkdStockModel::SIGN_STATUS_DONE)->where('open_status', PreHkdStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreHkdStockModel::SIGN_STATUS_DONE)->where('open_status', PreHkdStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status', PreHkdStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status', PreHkdStockModel::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 == PreHkdStockModel::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 == PreHkdStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreHkdStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreHkdStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreHkdStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus,
];
}
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockHkdListModel::$tapeList,
'stock_type_list' => PreHkdStockModel::$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 = PreHkdStockModel::where('id', $param['id'])->where('is_delete', PreHkdStockModel::IS_DELETE_NO)->where('status', PreHkdStockModel::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 == PreHkdStockModel::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 == PreHkdStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreHkdStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreHkdStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreHkdStockModel::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' => StockHkdListModel::$tapeList,
'stock_type_list' => PreHkdStockModel::$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 error', []);
}
$preHkdStock = PreHkdStockModel::where('id', $param['id'])
->where('status', PreHkdStockModel::STATUS_ON)
->where('is_delete', PreHkdStockModel::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($preHkdStock)) {
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserHkdPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preHkdStock->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'] < $preHkdStock->min) {
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preHkdStock->max > 0 && $param['num'] > $preHkdStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if ($preHkdStock->price <= 0) {
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserHkdPreStockOrderModel::PAY_TYPE_ONE, UserHkdPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'], $preHkdStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_HK)->value('purchase_fee');
if ($purchaseFee <= 0) {
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee, 18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserHkdPreStockOrderModel;
$order->user_id = $userId;
$order->pre_stock_id = $preHkdStock->id;
$order->status = $param['pay_type'] == 1 ? UserHkdPreStockOrderModel::STATUS_DOING : UserHkdPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preHkdStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preHkdStock->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', []);
}
// 扣除用户资产
$beforeAmount = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'HKD';
$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 = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'HKD';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
} catch (\Exception $exception) {
Db::rollback();
return $this->toData('1', 'System error', []);
}
}
// 后支付 - 支付
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');
$preHkdStock = PreHkdStockModel::where('stock_code', $param['stock_code'])
->where('status', PreHkdStockModel::STATUS_ON)
->where('is_delete', PreHkdStockModel::IS_DELETE_NO)
->where('is_post_pay', PreHkdStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preHkdStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserHkdPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserHkdPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserHkdPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preHkdStock->sign_status == PreHkdStockModel::SIGN_STATUS_DONE && strtotime($preHkdStock->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 = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'HKD';
$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 = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'HKD';
$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 = UserHkdPreStockOrderModel::where('id', $param['id'])->update(['status' => UserHkdPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preHkdStock->sign_status == PreHkdStockModel::SIGN_STATUS_NO && strtotime($preHkdStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'HKD';
$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 = UserStockHkdModel::where('stock_id', 'HKD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockHkdModel::where('stock_id', 'HKD')->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 UserStockHkdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'HKD';
$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 = UserHkdPreStockOrderModel::where('id', $param['id'])->update(['status' => UserHkdPreStockOrderModel::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 = UserHkdPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
$total = UserHkdPreStockOrderModel::whereIn('status',$statusArr)->where('user_id', $userId)->count();
$rows = [];
if (!$list->isEmpty()) {
$stockIdList = [];
foreach ($list as $item) {
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreHkdStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_HK)->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 == PreHkdStockModel::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 == UserHkdPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserHkdPreStockOrderModel::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' => StockHkdListModel::$tapeList,
'stock_type_list' => PreHkdStockModel::$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 = UserHkdPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if (empty($order)) {
return $this->toData('1', 'Params error', []);
}
$stock = PreHkdStockModel::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 == PreHkdStockModel::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,
'num' => $order->num,
'get_num' => $order->get_num,
'amount' => $order->amount,
'get_amount' => $order->get_amount,
'price' => $order->price,
'fee' => $order->fee,
'order_no' => $order->order_no,
'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' => StockHkdListModel::$tapeList,
'stock_type_list' => PreHkdStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', []);
}
}
}

675
app/home/service/PreIdnStockService.php

@ -1,675 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreIdnStockModel;
use app\model\StockIdnListModel;
use app\model\StockMarketModel;
use app\model\UserIdnPreStockOrderModel;
use app\model\UserStockIdnLogModel;
use app\model\UserStockIdnModel;
use think\facade\Db;
class PreIdnStockService 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', '=', PreIdnStockModel::IS_DELETE_NO];
$where[] = ['status', '=', PreIdnStockModel::STATUS_ON];
$query = PreIdnStockModel::where($where);
$totalQuery = PreIdnStockModel::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', '=', PreIdnStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreIdnStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreIdnStockModel::SIGN_STATUS_DONE)->where('open_status', PreIdnStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreIdnStockModel::SIGN_STATUS_DONE)->where('open_status', PreIdnStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status', PreIdnStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status', PreIdnStockModel::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 == PreIdnStockModel::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 == PreIdnStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreIdnStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreIdnStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreIdnStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus,
];
}
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockIdnListModel::$tapeList,
'stock_type_list' => PreIdnStockModel::$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 = PreIdnStockModel::where('id', $param['id'])->where('is_delete', PreIdnStockModel::IS_DELETE_NO)->where('status', PreIdnStockModel::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 == PreIdnStockModel::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 == PreIdnStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreIdnStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreIdnStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreIdnStockModel::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' => StockIdnListModel::$tapeList,
'stock_type_list' => PreIdnStockModel::$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 error', []);
}
$preIdnStock = PreIdnStockModel::where('id', $param['id'])
->where('status', PreIdnStockModel::STATUS_ON)
->where('is_delete', PreIdnStockModel::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($preIdnStock)) {
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserIdnPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preIdnStock->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'] < $preIdnStock->min) {
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preIdnStock->max > 0 && $param['num'] > $preIdnStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if ($preIdnStock->price <= 0) {
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserIdnPreStockOrderModel::PAY_TYPE_ONE, UserIdnPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
if ($param['pay_type'] == UserIdnPreStockOrderModel::PAY_TYPE_TWO && $preIdnStock->is_post_pay == PreIdnStockModel::IS_POST_PAY_NO) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'], $preIdnStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_YNG)->value('purchase_fee');
if ($purchaseFee <= 0) {
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee, 18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserIdnPreStockOrderModel;
$order->user_id = $userId;
$order->pre_stock_id = $preIdnStock->id;
$order->status = $param['pay_type'] == 1 ? UserIdnPreStockOrderModel::STATUS_DOING : UserIdnPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preIdnStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preIdnStock->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', []);
}
// 扣除用户资产
$userStockIdnName = (new UserStockIdnModel())->getName();
$beforeAmount = Db::name($userStockIdnName)->where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockIdnName)->where('stock_id', 'IDR')->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 UserStockIdnLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'IDR';
$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($userStockIdnName)->where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockIdnName)->where('stock_id', 'IDR')->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 UserStockIdnLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'IDR';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
} catch (\Exception $exception) {
Db::rollback();
return $this->toData('1', 'System error', []);
}
}
// 后支付 - 支付
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');
$preIdnStock = PreIdnStockModel::where('stock_code', $param['stock_code'])
->where('status', PreIdnStockModel::STATUS_ON)
->where('is_delete', PreIdnStockModel::IS_DELETE_NO)
->where('is_post_pay', PreIdnStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preIdnStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserIdnPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserIdnPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserIdnPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preIdnStock->sign_status == PreIdnStockModel::SIGN_STATUS_DONE && strtotime($preIdnStock->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 = UserStockIdnModel::where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockIdnModel::where('stock_id', 'IDR')->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 UserStockIdnLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'IDR';
$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 = UserStockIdnModel::where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockIdnModel::where('stock_id', 'IDR')->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 UserStockIdnLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'IDR';
$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 = UserIdnPreStockOrderModel::where('id', $param['id'])->update(['status' => UserIdnPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preIdnStock->sign_status == PreIdnStockModel::SIGN_STATUS_NO && strtotime($preIdnStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockIdnModel::where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockIdnModel::where('stock_id', 'IDR')->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 UserStockIdnLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'IDR';
$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 = UserStockIdnModel::where('stock_id', 'IDR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockIdnModel::where('stock_id', 'IDR')->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 UserStockIdnLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'IDR';
$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 = UserIdnPreStockOrderModel::where('id', $param['id'])->update(['status' => UserIdnPreStockOrderModel::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 = UserIdnPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
$total = UserIdnPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->count();
$rows = [];
if (!$list->isEmpty()) {
$stockIdList = [];
foreach ($list as $item) {
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreIdnStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_YNG)->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 == PreIdnStockModel::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 == UserIdnPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserIdnPreStockOrderModel::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' => StockIdnListModel::$tapeList,
'stock_type_list' => PreIdnStockModel::$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 = UserIdnPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if (empty($order)) {
return $this->toData('1', 'Params error', []);
}
$stock = PreIdnStockModel::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 == PreIdnStockModel::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,
'num' => $order->num,
'get_num' => $order->get_num,
'amount' => $order->amount,
'get_amount' => $order->get_amount,
'price' => $order->price,
'fee' => $order->fee,
'order_no' => $order->order_no,
'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' => StockIdnListModel::$tapeList,
'stock_type_list' => PreIdnStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', []);
}
}
}

670
app/home/service/PreInStockService.php

@ -1,670 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreInStockModel;
use app\model\StockInListModel;
use app\model\StockMarketModel;
use app\model\UserStockInLogModel;
use app\model\UserStockInModel;
use app\model\UserInPreStockOrderModel;
use think\facade\Db;
class PreInStockService 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', '=', PreInStockModel::IS_DELETE_NO];
$where[] = ['status', '=', PreInStockModel::STATUS_ON];
$query = PreInStockModel::where($where);
$totalQuery = PreInStockModel::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', '=', PreInStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreInStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreInStockModel::SIGN_STATUS_DONE)->where('open_status', PreInStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreInStockModel::SIGN_STATUS_DONE)->where('open_status', PreInStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status', PreInStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status', PreInStockModel::OPEN_STATUS_HAD);
break;
}
}
$list = $query->page($param['page'], $param['limit'])->order('open_time', 'desc')->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 == PreInStockModel::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 == PreInStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreInStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreInStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreInStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus,
];
}
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockInListModel::$tapeList,
'stock_type_list' => PreInStockModel::$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 = PreInStockModel::where('id', $param['id'])->where('is_delete', PreInStockModel::IS_DELETE_NO)->where('status', PreInStockModel::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 == PreInStockModel::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 == PreInStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreInStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreInStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreInStockModel::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' => StockInListModel::$tapeList,
'stock_type_list' => PreInStockModel::$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 error', []);
}
$preInStock = PreInStockModel::where('id', $param['id'])
->where('status', PreInStockModel::STATUS_ON)
->where('is_delete', PreInStockModel::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($preInStock)) {
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserInPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preInStock->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'] < $preInStock->min) {
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preInStock->max > 0 && $param['num'] > $preInStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if ($preInStock->price <= 0) {
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserInPreStockOrderModel::PAY_TYPE_ONE, UserInPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'], $preInStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_IN)->value('purchase_fee');
if ($purchaseFee <= 0) {
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee, 18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserInPreStockOrderModel;
$order->user_id = $userId;
$order->pre_stock_id = $preInStock->id;
$order->status = $param['pay_type'] == 1 ? UserInPreStockOrderModel::STATUS_DOING : UserInPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preInStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preInStock->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', []);
}
// 扣除用户资产
$userStockInName = (new UserStockInModel())->getName();
$beforeAmount = Db::name($userStockInName)->where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockInName)->where('stock_id', 'INR')->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 UserStockInLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'INR';
$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($userStockInName)->where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockInName)->where('stock_id', 'INR')->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 UserStockInLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'INR';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
} catch (\Exception $exception) {
Db::rollback();
return $this->toData('1', 'System error', []);
}
}
// 后支付 - 支付
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');
$preInStock = PreInStockModel::where('stock_code', $param['stock_code'])
->where('status', PreInStockModel::STATUS_ON)
->where('is_delete', PreInStockModel::IS_DELETE_NO)
->where('is_post_pay', PreInStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preInStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserInPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserInPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserInPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preInStock->sign_status == PreInStockModel::SIGN_STATUS_DONE && strtotime($preInStock->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 = UserStockInModel::where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockInModel::where('stock_id', 'INR')->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 UserStockInLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'INR';
$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 = UserStockInModel::where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockInModel::where('stock_id', 'INR')->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 UserStockInLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'INR';
$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 = UserInPreStockOrderModel::where('id', $param['id'])->update(['status' => UserInPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preInStock->sign_status == PreInStockModel::SIGN_STATUS_NO && strtotime($preInStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockInModel::where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockInModel::where('stock_id', 'INR')->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 UserStockInLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'INR';
$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 = UserStockInModel::where('stock_id', 'INR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockInModel::where('stock_id', 'INR')->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 UserStockInLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'INR';
$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 = UserInPreStockOrderModel::where('id', $param['id'])->update(['status' => UserInPreStockOrderModel::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 = UserInPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
$total = UserInPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->count();
$rows = [];
if (!$list->isEmpty()) {
$stockIdList = [];
foreach ($list as $item) {
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreInStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_IN)->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 == PreInStockModel::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 == UserInPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserInPreStockOrderModel::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' => StockInListModel::$tapeList,
'stock_type_list' => PreInStockModel::$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 = UserInPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if (empty($order)) {
return $this->toData('1', 'Params error', []);
}
$stock = PreInStockModel::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 == PreInStockModel::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,
'num' => $order->num,
'get_num' => $order->get_num,
'amount' => $order->amount,
'get_amount' => $order->get_amount,
'price' => $order->price,
'fee' => $order->fee,
'order_no' => $order->order_no,
'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' => StockInListModel::$tapeList,
'stock_type_list' => PreInStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', []);
}
}
}

672
app/home/service/PreMysStockService.php

@ -1,672 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreMysStockModel;
use app\model\StockMysListModel;
use app\model\StockMarketModel;
use app\model\UserMysPreStockOrderModel;
use app\model\UserStockMysLogModel;
use app\model\UserStockMysModel;
use think\facade\Db;
class PreMysStockService 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', '=',PreMysStockModel::IS_DELETE_NO];
$where[] = ['status', '=',PreMysStockModel::STATUS_ON];
$query = PreMysStockModel::where($where);
$totalQuery = PreMysStockModel::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', '=', PreMysStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreMysStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreMysStockModel::SIGN_STATUS_DONE)->where('open_status',PreMysStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreMysStockModel::SIGN_STATUS_DONE)->where('open_status',PreMysStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status',PreMysStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status',PreMysStockModel::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 == PreMysStockModel::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 == PreMysStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreMysStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreMysStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreMysStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus,
];
}
}
return $this->toData('0','SUCCESS',['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockMysListModel::$tapeList,
'stock_type_list' => PreMysStockModel::$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 = PreMysStockModel::where('id', $param['id'])->where('is_delete', PreMysStockModel::IS_DELETE_NO)->where('status', PreMysStockModel::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 == PreMysStockModel::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 == PreMysStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreMysStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreMysStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreMysStockModel::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' => StockMysListModel::$tapeList,
'stock_type_list' => PreMysStockModel::$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 error', []);
}
$preMysStock = PreMysStockModel::where('id',$param['id'])
->where('status',PreMysStockModel::STATUS_ON)
->where('is_delete',PreMysStockModel::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($preMysStock)){
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserMysPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preMysStock->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'] < $preMysStock->min){
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preMysStock->max > 0 && $param['num'] > $preMysStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if($preMysStock->price <= 0){
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserMysPreStockOrderModel::PAY_TYPE_ONE, UserMysPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'],$preMysStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_MG)->value('purchase_fee');
if($purchaseFee <= 0){
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee,18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserMysPreStockOrderModel;
$order->pre_stock_id = $preMysStock->id;
$order->user_id = $userId;
$order->status = $param['pay_type'] == 1 ? UserMysPreStockOrderModel::STATUS_DOING : UserMysPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preMysStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->trade_status = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preMysStock->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', []);
}
// 扣除用户资产
$userStockMysName = (new UserStockMysModel())->getName();
$beforeAmount = Db::name($userStockMysName)->where('stock_id', 'MYR')->where('user_id',$userId)->value('usable_num');
if($beforeAmount < $amount){
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockMysName)->where('stock_id', 'MYR')->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 UserStockMysLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'MYR';
$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($userStockMysName)->where('stock_id', 'MYR')->where('user_id',$userId)->value('usable_num');
if($beforeFee < $fee){
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockMysName)->where('stock_id', 'MYR')->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 UserStockMysLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'MYR';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
}catch (\Exception $exception){
Db::rollback();
return $this->toData('1', 'System error', []);
}
}
// 后支付 - 支付
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');
$preInStock = PreMysStockModel::where('stock_code', $param['stock_code'])
->where('status', PreMysStockModel::STATUS_ON)
->where('is_delete', PreMysStockModel::IS_DELETE_NO)
->where('is_post_pay', PreMysStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preInStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserMysPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserMysPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserMysPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preInStock->sign_status == PreMysStockModel::SIGN_STATUS_DONE && strtotime($preInStock->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 = UserStockMysModel::where('stock_id', 'MYR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockMysModel::where('stock_id', 'MYR')->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 UserStockMysLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'MYR';
$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 = UserStockMysModel::where('stock_id', 'MYR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockMysModel::where('stock_id', 'MYR')->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 UserStockMysLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'MYR';
$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 = UserMysPreStockOrderModel::where('id', $param['id'])->update(['status' => UserMysPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preInStock->sign_status == PreMysStockModel::SIGN_STATUS_NO && strtotime($preInStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockMysModel::where('stock_id', 'MYR')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockMysModel::where('stock_id', 'MYR')->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 UserStockMysLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'MYR';
$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 = UserStockMysModel::where('stock_id', 'MYR')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockMysModel::where('stock_id', 'MYR')->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 UserStockMysLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'MYR';
$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 = UserMysPreStockOrderModel::where('id', $param['id'])->update(['status' => UserMysPreStockOrderModel::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 = UserMysPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
$total = UserMysPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->count();
$rows = [];
if(!$list->isEmpty()){
$stockIdList = [];
foreach ($list as $item){
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreMysStockModel::where('id', 'in', $stockIdList)->column(['*'],'id');
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_MG)->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 == PreMysStockModel::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 == UserMysPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserMysPreStockOrderModel::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' => StockMysListModel::$tapeList,
'stock_type_list' => PreMysStockModel::$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 = UserMysPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if(empty($order)){
return $this->toData('1', 'Params error', []);
}
$stock = PreMysStockModel::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 == PreMysStockModel::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,
'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,
'order_no' =>$order->order_no,
'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' => StockMysListModel::$tapeList,
'stock_type_list' => PreMysStockModel::$stockTypeList,
]]);
}catch (\Exception $exception){
return $this->toData('1', 'System error', []);
}
}
}

670
app/home/service/PreSgdStockService.php

@ -1,670 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreSgdStockModel;
use app\model\StockMarketModel;
use app\model\StockOptionInrListModel;
use app\model\UserStockSgdLogModel;
use app\model\UserStockSgdModel;
use app\model\UserSgdPreStockOrderModel;
use think\facade\Db;
class PreSgdStockService 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', '=', PreSgdStockModel::IS_DELETE_NO];
$where[] = ['status', '=', PreSgdStockModel::STATUS_ON];
$query = PreSgdStockModel::where($where);
$totalQuery = PreSgdStockModel::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', '=', PreSgdStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreSgdStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreSgdStockModel::SIGN_STATUS_DONE)->where('open_status', PreSgdStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreSgdStockModel::SIGN_STATUS_DONE)->where('open_status', PreSgdStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status', PreSgdStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status', PreSgdStockModel::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 == PreSgdStockModel::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 == PreSgdStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreSgdStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreSgdStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreSgdStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus,
];
}
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockOptionInrListModel::$tapeList,
'stock_type_list' => PreSgdStockModel::$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 = PreSgdStockModel::where('id', $param['id'])->where('is_delete', PreSgdStockModel::IS_DELETE_NO)->where('status', PreSgdStockModel::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 == PreSgdStockModel::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 == PreSgdStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreSgdStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreSgdStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreSgdStockModel::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' => StockOptionInrListModel::$tapeList,
'stock_type_list' => PreSgdStockModel::$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 error', []);
}
$preSgdStock = PreSgdStockModel::where('id', $param['id'])
->where('status', PreSgdStockModel::STATUS_ON)
->where('is_delete', PreSgdStockModel::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($preSgdStock)) {
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserSgdPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preSgdStock->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'] < $preSgdStock->min) {
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preSgdStock->max > 0 && $param['num'] > $preSgdStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if ($preSgdStock->price <= 0) {
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserSgdPreStockOrderModel::PAY_TYPE_ONE, UserSgdPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'], $preSgdStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_SGD)->value('purchase_fee');
if ($purchaseFee <= 0) {
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee, 18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserSgdPreStockOrderModel;
$order->user_id = $userId;
$order->pre_stock_id = $preSgdStock->id;
$order->status = $param['pay_type'] == 1 ? UserSgdPreStockOrderModel::STATUS_DOING : UserSgdPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preSgdStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preSgdStock->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', []);
}
// 扣除用户资产
$userStockSgdName = (new UserStockSgdModel())->getName();
$beforeAmount = Db::name($userStockSgdName)->where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockSgdName)->where('stock_id', 'SGD')->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 UserStockSgdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'SGD';
$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($userStockSgdName)->where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = Db::name($userStockSgdName)->where('stock_id', 'SGD')->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 UserStockSgdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'SGD';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
} catch (\Exception $exception) {
Db::rollback();
return $this->toData('1', 'System error', []);
}
}
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');
$preInStock = PreSgdStockModel::where('stock_code', $param['stock_code'])
->where('status', PreSgdStockModel::STATUS_ON)
->where('is_delete', PreSgdStockModel::IS_DELETE_NO)
->where('is_post_pay', PreSgdStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preInStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserSgdPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserSgdPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserSgdPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preInStock->sign_status == PreSgdStockModel::SIGN_STATUS_DONE && strtotime($preInStock->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 = UserStockSgdModel::where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockSgdModel::where('stock_id', 'SGD')->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 UserStockSgdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'SGD';
$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 = UserStockSgdModel::where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockSgdModel::where('stock_id', 'SGD')->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 UserStockSgdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'SGD';
$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 = UserSgdPreStockOrderModel::where('id', $param['id'])->update(['status' => UserSgdPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preInStock->sign_status == PreSgdStockModel::SIGN_STATUS_NO && strtotime($preInStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockSgdModel::where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockSgdModel::where('stock_id', 'SGD')->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 UserStockSgdLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'SGD';
$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 = UserStockSgdModel::where('stock_id', 'SGD')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockSgdModel::where('stock_id', 'SGD')->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 UserStockSgdLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'SGD';
$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 = UserSgdPreStockOrderModel::where('id', $param['id'])->update(['status' => UserSgdPreStockOrderModel::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 = UserSgdPreStockOrderModel::whereIn('status',$statusArr)->where('user_id', $userId)->order('update_time','desc')->page($param['page'], $param['limit'])->select();
$total = UserSgdPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->count();
$rows = [];
if (!$list->isEmpty()) {
$stockIdList = [];
foreach ($list as $item) {
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreSgdStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_SGD)->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 == PreSgdStockModel::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 == UserSgdPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserSgdPreStockOrderModel::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' => StockOptionInrListModel::$tapeList,
'stock_type_list' => PreSgdStockModel::$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 = UserSgdPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if (empty($order)) {
return $this->toData('1', 'Params error', []);
}
$stock = PreSgdStockModel::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 == PreSgdStockModel::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,
'num' => $order->num,
'get_num' => $order->get_num,
'amount' => $order->amount,
'get_amount' => $order->get_amount,
'price' => $order->price,
'fee' => $order->fee,
'order_no' => $order->order_no,
'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' => StockOptionInrListModel::$tapeList,
'stock_type_list' => PreSgdStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', []);
}
}
}

672
app/home/service/PreThaStockService.php

@ -1,672 +0,0 @@
<?php
namespace app\home\service;
use app\model\FeeSettingModel;
use app\model\PreThaStockModel;
use app\model\StockThaListModel;
use app\model\StockMarketModel;
use app\model\UserStockThaLogModel;
use app\model\UserStockThaModel;
use app\model\UserThaPreStockOrderModel;
use think\facade\Db;
use think\facade\Log;
class PreThaStockService 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', '=', PreThaStockModel::IS_DELETE_NO];
$where[] = ['status', '=', PreThaStockModel::STATUS_ON];
$query = PreThaStockModel::where($where);
$totalQuery = PreThaStockModel::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', '=', PreThaStockModel::SIGN_STATUS_NO);
$totalQuery = $totalQuery->whereTime('end_time', '<', date('Y-m-d H:i:s'))->where('sign_status', '=', PreThaStockModel::SIGN_STATUS_NO);
break;
case '3':
$query = $query->where('sign_status', '=', PreThaStockModel::SIGN_STATUS_DONE)->where('open_status', PreThaStockModel::OPEN_STATUS_NO);
$totalQuery = $totalQuery->where('sign_status', '=', PreThaStockModel::SIGN_STATUS_DONE)->where('open_status', PreThaStockModel::OPEN_STATUS_NO);
break;
case '4':
$query = $query->where('open_status', PreThaStockModel::OPEN_STATUS_HAD);
$totalQuery = $totalQuery->where('open_status', PreThaStockModel::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 == PreThaStockModel::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 == PreThaStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($item->is_post_pay == PreThaStockModel::IS_POST_PAY_YES && $item->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($item->open_status == PreThaStockModel::OPEN_STATUS_HAD) $progressStatus = $item->is_post_pay == PreThaStockModel::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,
'is_post_pay' => $item->is_post_pay,
'logo' => $item->logo,
'company_info' => $item->company_info,
'company_open_time' => $item->company_open_time,
'company_reg_amount' => $item->company_reg_amount,
'pay_deadline_time' => $item->pay_deadline_time,
'progress_status' => $progressStatus
];
}
}
return $this->toData('0', 'SUCCESS', ['list' => $rows, 'total' => $total, 'extend' => [
'tape_list' => StockThaListModel::$tapeList,
'stock_type_list' => PreThaStockModel::$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 = PreThaStockModel::where('id', $param['id'])->where('is_delete', PreThaStockModel::IS_DELETE_NO)->where('status', PreThaStockModel::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 == PreThaStockModel::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 == PreThaStockModel::SIGN_STATUS_DONE) $progressStatus = 3;
if ($preStock->is_post_pay == PreThaStockModel::IS_POST_PAY_YES && $preStock->pay_deadline_time < date('Y-m-d H:i:s')) $progressStatus = 4;
if ($preStock->open_status == PreThaStockModel::OPEN_STATUS_HAD) $progressStatus = $preStock->is_post_pay == PreThaStockModel::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' => StockThaListModel::$tapeList,
'stock_type_list' => PreThaStockModel::$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 error', []);
}
$preThaStock = PreThaStockModel::where('id', $param['id'])
->where('status', PreThaStockModel::STATUS_ON)
->where('is_delete', PreThaStockModel::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($preThaStock)) {
return $this->toData('1', 'Params error', []);
}
$hasOrder = UserThaPreStockOrderModel::where('user_id', $userId)->where('pre_stock_id', $param['id'])->count();
if ($preThaStock->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'] < $preThaStock->min) {
return $this->toData('1', 'Order quantity less than the minimum', []);
}
if ($preThaStock->max > 0 && $param['num'] > $preThaStock->max) {
return $this->toData('1', 'Order quantity greater than maximum', []);
}
if ($preThaStock->price <= 0) {
return $this->toData('1', 'Price error', []);
}
// 支付类型
if (empty($param['pay_type']) || !is_numeric($param['pay_type']) || !in_array($param['pay_type'], [UserThaPreStockOrderModel::PAY_TYPE_ONE, UserThaPreStockOrderModel::PAY_TYPE_TWO])) {
return $this->toData('1', 'Params error', []);
}
// 计算金额
$amount = bcmul($param['num'], $preThaStock->price, 18);
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_TG)->value('purchase_fee');
if ($purchaseFee <= 0) {
$fee = 0;
} else {
$fee = bcmul($amount, $purchaseFee, 18);
}
Db::startTrans();
// 生成订单
$orderNo = $this->generateOrderNumber(20);
$order = new UserThaPreStockOrderModel;
$order->user_id = $userId;
$order->pre_stock_id = $preThaStock->id;
$order->status = $param['pay_type'] == 1 ? UserThaPreStockOrderModel::STATUS_DOING : UserThaPreStockOrderModel::STATUS_POST_PAY;
$order->pay_type = $param['pay_type'];
$order->order_no = $orderNo;
$order->num = $param['num'];
$order->get_num = 0;
$order->price = $preThaStock->price;
$order->amount = $amount;
$order->get_amount = 0;
$order->fee = $fee;
$order->get_fee = 0;
$order->fee_rate = $purchaseFee;
$order->get_time = $preThaStock->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 UserStockThaModel())->getName();
$beforeAmount = Db::name($userStockName)->where('stock_id', 'THB')->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', 'THB')->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 UserStockThaLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'THB';
$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', 'THB')->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', 'THB')->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 UserStockThaLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'THB';
$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', []);
}
}
Db::commit();
return $this->toData('0', 'SUCCESS', [
]);
} catch (\Exception $exception) {
Db::rollback();
Log::error("order tha exception " . $exception->getMessage());
return $this->toData('1', 'System error', []);
}
}
// 后支付 - 支付
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');
$preInStock = PreThaStockModel::where('stock_code', $param['stock_code'])
->where('status', PreThaStockModel::STATUS_ON)
->where('is_delete', PreThaStockModel::IS_DELETE_NO)
->where('is_post_pay', PreThaStockModel::IS_POST_PAY_YES)
->whereTime('pay_deadline_time', '>=', $now)
->find();
if (empty($preInStock)) {
return $this->toData('1', 'Payment deadline exceeded', []);
}
$hasOrder = UserThaPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->where('pay_type', UserThaPreStockOrderModel::PAY_TYPE_TWO)->where('status', UserThaPreStockOrderModel::STATUS_POST_PAY)->find();
if (empty($hasOrder)) {
return $this->toData('1', 'Params error3', []);
}
$orderNo = $hasOrder->order_no;
Db::startTrans();
if ($preInStock->sign_status == PreThaStockModel::SIGN_STATUS_DONE && strtotime($preInStock->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 = UserStockThaModel::where('stock_id', 'THB')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockThaModel::where('stock_id', 'THB')->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 UserStockThaLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'THB';
$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 = UserStockThaModel::where('stock_id', 'THB')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockThaModel::where('stock_id', 'THB')->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 UserStockThaLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'THB';
$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 = UserThaPreStockOrderModel::where('id', $param['id'])->update(['status' => UserThaPreStockOrderModel::STATUS_SIGNING, 'update_time' => $now]);
if (!$bool) {
Db::rollback();
return $this->toData('1', 'update order error', []);
}
} elseif ($preInStock->sign_status == PreThaStockModel::SIGN_STATUS_NO && strtotime($preInStock->get_time) >= strtotime($now)) {
//未签名
$amount = $hasOrder->amount;
$fee = $hasOrder->fee;
// 扣除用户资产
$beforeAmount = UserStockThaModel::where('stock_id', 'THB')->where('user_id', $userId)->value('usable_num');
if ($beforeAmount < $amount) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockThaModel::where('stock_id', 'THB')->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 UserStockThaLogModel();
$userStockLog->user_id = $userId;
$userStockLog->change_type = 15; // 新股申购扣减费用
$userStockLog->stock_id = 'THB';
$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 = UserStockThaModel::where('stock_id', 'THB')->where('user_id', $userId)->value('usable_num');
if ($beforeFee < $fee) {
Db::rollback();
return $this->toData('1', 'assert not enough', []);
}
$updateNum = UserStockThaModel::where('stock_id', 'THB')->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 UserStockThaLogModel;
$userStockLog->user_id = $userId;
$userStockLog->change_type = 16;
$userStockLog->stock_id = 'THB';
$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 = UserThaPreStockOrderModel::where('id', $param['id'])->update(['status' => UserThaPreStockOrderModel::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 = UserThaPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->order('update_time', 'desc')->page($param['page'], $param['limit'])->select();
$total = UserThaPreStockOrderModel::whereIn('status', $statusArr)->where('user_id', $userId)->count();
$rows = [];
if (!$list->isEmpty()) {
$stockIdList = [];
foreach ($list as $item) {
$stockIdList[] = $item->pre_stock_id;
}
$stockList = PreThaStockModel::where('id', 'in', $stockIdList)->column(['*'], 'id');
// 计算手续费
$purchaseFee = FeeSettingModel::where('market_type', StockMarketModel::STOCK_MARKET_TG)->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 == PreThaStockModel::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 == UserThaPreStockOrderModel::PAY_TYPE_TWO && $item->status == UserThaPreStockOrderModel::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' => StockThaListModel::$tapeList,
'stock_type_list' => PreThaStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', [$exception->getMessage()]);
}
}
// 申购订单详情
public function detail($param, $userId)
{
try {
if (empty($param['id']) || !is_numeric($param['id'])) {
return $this->toData('1', 'Params error', []);
}
$order = UserThaPreStockOrderModel::where('user_id', $userId)->where('id', $param['id'])->find();
if (empty($order)) {
return $this->toData('1', 'Params error', []);
}
$stock = PreThaStockModel::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 == PreThaStockModel::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,
'num' => $order->num,
'get_num' => $order->get_num,
'amount' => $order->amount,
'get_amount' => $order->get_amount,
'price' => $order->price,
'order_no' => $order->order_no,
'fee' => $order->fee,
'get_fee' => $order->get_fee,
'create_time' => $order->create_time,
'get_time' => $order->get_time,
'open_time' => $stock->open_time,
'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' => StockThaListModel::$tapeList,
'stock_type_list' => PreThaStockModel::$stockTypeList,
]]);
} catch (\Exception $exception) {
return $this->toData('1', 'System error', []);
}
}
}

681
app/home/service/PreUsStockService.php

@ -1,681 +0,0 @@
<?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', []);
}
}
}

250
app/home/service/UserService.php

@ -7,10 +7,15 @@ use app\model\CountryModel;
use app\model\FileModel;
use app\model\UserContractModel;
use app\model\UserDigitalModel;
use app\model\UserForexModel;
use app\model\UserLevelModel;
use app\model\UserLoanModel;
use app\model\UserLoginLog;
use app\model\UserModel;
use app\model\UserMoneyModel;
use app\model\UserStockHkdModel;
use app\model\UserStockModel;
use app\utility\Jwt;
use app\utility\UnqId;
use Couchbase\User;
use think\exception\ValidateException;
@ -73,6 +78,14 @@ class UserService extends BaseHomeService
*/
private function initUserWallet(int $user_id)
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
UserMoneyModel::InsertUserMoneyk([
'user_id' => $user_id,
'stock_id' => 'USD',
'usable_num' => 0,
'frozen_num' => 0,
]);
}else{
if (env('FEATURE.HAS_STOCK_US')) {
UserStockModel::InsertUserStock([
'user_id' => $user_id,
@ -97,6 +110,8 @@ class UserService extends BaseHomeService
'frozen_num' => 0,
]);
}
}
}
@ -115,7 +130,7 @@ class UserService extends BaseHomeService
return $this->toData('100403', 'Please log in first', []);
}
$info = UserModel::getFieldsByUserId('trade_password,lever_status,gender,last_name,first_name,real_status,country_id,user_no,nick_name,email,phone_number,country_code,is_real,head_img_id,invite_code', $userId);
$info = UserModel::getFieldsByUserId('trade_password,lever_status,gender,last_name,first_name,real_status,country_id,user_no,nick_name,email,phone_number,country_code,is_real,head_img_id,invite_code,is_test_user', $userId);
if (empty($info)) {
return $this->toData('100400', 'The user does not exist.', []);
}
@ -152,6 +167,7 @@ class UserService extends BaseHomeService
'phone' => $info['phone_number'],
'email' => $info['email'],
'isReal' => $info['is_real'],
'is_test_user' => $info['is_test_user'],
'real_status' => $info['real_status'],
'inviteCode' => $info['invite_code'],
'firstName' => $info['first_name'],
@ -1228,6 +1244,64 @@ class UserService extends BaseHomeService
return $this->toData('100500', 'The system is busy.', [$exception->getMessage()]);
}
}
public function apply_loan($userId, $param)
{
try {
// user_id
if (empty($userId) || $userId <= 0) {
return $this->toData('100403', 'Please log in first.', []);
}
// 参数校验 nation phone sms_code
validate(UserValidate::class)->scene('apply_loan')->check($param);
$count=UserLoanModel::where('status',0)->where('user_id',$userId)->count();
if($count>0){
return $this->toData('100402', 'You have applied, please be patient and wait.', []);
}
$userloan=new UserLoanModel();
$userloan->user_id=$userId;
$userloan->num= intval($param['num']);
$userloan->day= intval($param['day']);
$userloan->status= 0;
$userloan->is_delete= 0;
$userloan->create_time=date('Y-m-d H:i:s');
$userloan->save();
// 返回结果
return $this->toData('0', 'Binding successful.', []);
} catch (ValidateException $validateException) {
// 参数校验失败 异常类
$message = $validateException->getError();
return $this->toData('100400', $message);
} catch (\Exception $exception) {
return $this->toData('100500', 'The system is busy.', [$exception->getMessage()]);
}
}
public function loan($userId, $param)
{
try {
// user_id
if (empty($userId) || $userId <= 0) {
return $this->toData('100403', 'Please log in first.', []);
}
$data['where']['user_id']=$userId;
$data['page']=isset($param['page']) ? intval($param['page']) : 1;
$data['size']=isset($param['size']) ? intval($param['size']) : 10;
$list=UserLoanModel::getUserLoanList($data);
// 返回结果
return $this->toData('0', 'successful.', $list);
} catch (ValidateException $validateException) {
// 参数校验失败 异常类
$message = $validateException->getError();
return $this->toData('100400', $message);
} catch (\Exception $exception) {
return $this->toData('100500', 'The system is busy.', [$exception->getMessage()]);
}
}
/**
* @desc 退出登陆
@ -1317,7 +1391,8 @@ class UserService extends BaseHomeService
}
if (in_array($user['lever_status'], [UserModel::LEVER_STATUS_NO, UserModel::LEVER_STATUS_FAIL])) {
UserModel::update(['lever_status' => UserModel::LEVER_STATUS_APPLY, 'update_time' => date('Y-m-d H:i:s')], ['user_id' => $userId]);
$level_status=env('USER_LEVEL.NO_APPLY')==1 ? UserModel::LEVER_STATUS_PASSED : UserModel::LEVER_STATUS_APPLY;
UserModel::update(['lever_status' => $level_status, 'update_time' => date('Y-m-d H:i:s')], ['user_id' => $userId]);
return $this->toData('0', 'success.', []);
}
@ -1327,4 +1402,175 @@ class UserService extends BaseHomeService
return $this->toData('100500', 'The system is busy.', []);
}
}
public function applyTestAccount($userId)
{
if (empty($userId) || $userId <= 0) {
return $this->toData('100403', 'Please log in first.', []);
}
// 获取用户信息
$user = UserModel::getFieldsByUserId('test_account,user_id,user_no', $userId);
if (empty($user)) {
return $this->toData('100401', 'Please log in first.', []);
}
if(!empty($user['test_account'])){
return $this->toData('0', 'success.', []);
}
//添加模拟账号
$userNo=$this->getUniqUserNo();
$email="test_".$userNo."@test.com";
$salt = env('ENCRYPT.SALT');
$password = (new UnqId())->encryptPassword('test12345', $salt);
$userInviteCode=$this->getUniqInviteCode();
$parentUserId = $userId;
$ip = (new BaseHomeService())->getClientRealIp();
$test_userId = UserModel::emailRegister($email, $userNo, $userInviteCode, $parentUserId, $password, $ip, $salt, 2, 0);
if($test_userId){
$this->doRegInitUserInfo($test_userId,$parentUserId);
UserModel::where('user_id', $userId)->update([
'test_account' => $test_userId
]);
UserModel::where('user_id', $test_userId)->update([
'is_real' => 0,
'real_status'=>3
]);
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
UserMoneyModel::where('user_id', $test_userId)->update([
'user_id' => $test_userId,
'stock_id' => 'USD',
'usable_num' => 100000,
'frozen_num' => 0,
]);
}else{
UserDigitalModel::where('user_id', $test_userId)->update([
'user_id' => $test_userId,
'digital_id' => 'USDT',
'usable_num' => 100000,
'frozen_num' => 0,
]);
UserContractModel::where('user_id', $test_userId)->update([
'user_id' => $test_userId,
'contract_id' => 'USDT',
'usable_num' => 100000,
'frozen_num' => 0,
]);
UserForexModel::InsertUserForex([
'user_id' => $test_userId,
'contract_id' => 'USD',
'usable_num' => 100000,
'frozen_num' => 0,
]);
UserStockHkdModel::InsertUserStock([
'user_id' => $test_userId,
'stock_id' => 'HKD',
'usable_num' => 100000,
'frozen_num' => 0,
]);
}
}
return $this->toData('0', 'success.', []);
}
public function applyTestMoney($userId,$param){
if (empty($userId) || $userId <= 0) {
return $this->toData('100403', 'Please log in first.', []);
}
// 获取用户信息
$user = UserModel::getFieldsByUserId('is_test_user,user_id,user_no', $userId);
if (empty($user)) {
return $this->toData('100401', 'Please log in first.', []);
}
if($user['is_test_user']!=2){
return $this->toData('100402', 'error.', []);
}
$num=isset($param['num']) ? intval($param['num']) : 0;
if($num<=0 || $num>100000){
return $this->toData('100401', 'error.', []);
}
$user_money=UserMoneyModel::getUserUSDByUserId(['user_id'=>$userId]);
$update_num=$user_money['usable_num']+$num;
UserMoneyModel::where('user_id', $userId)->update([
'stock_id' => 'USD',
'usable_num' => $update_num,
'update_time' => date('Y-m-d H:i:s'),
]);
return $this->toData('0', 'success.', []);
}
public function testLogin($userId)
{
// 获取用户信息
$user = UserModel::getFieldsByUserId('test_account,user_id,user_no', $userId);
if (empty($user)) {
return $this->toData('100401', 'Please log in first.', []);
}
if(empty($user['test_account'])){
return $this->toData('100402', 'Please log in first.', []);
}
//登录模拟账号
$test_user=UserModel::getFieldsByUserId('test_account,user_id,user_no,nick_name,invite_code,is_real,is_test_user', $user['test_account']);
// 生成token
$token = (new Jwt())->getToken($test_user['user_id'], env('ENCRYPT.SALT'));
if (empty($token)) {
return $this->toData('100300', 'The system is busy.', []);
}
// 将token存致缓存 覆盖新的缓存 实现单设备登陆
$this->setUserTokenCache($token, $test_user['user_id']);
// 删除缓存
$this->delUserTokenCache($userId);
// 返回结果以及用户信息
return $this->toData('0', 'Request successful.', [
'userId' => $test_user['user_id'],
'userNo' => $test_user['user_no'],
'nickName' => $test_user['nick_name'],
'inviteCode' => $test_user['invite_code'],
'isReal' => $test_user['is_real'],
'is_test_user' => $test_user['is_test_user'],
'logo' => env('USER.DEFAULT_HEAD_IMG_PATH'),
'token' => $token,
]);
}
public function formalLogin($userId)
{
// 获取用户信息
$user = UserModel::getFieldsByUserId('parent_id,user_id,user_no,is_test_user', $userId);
if (empty($user)) {
return $this->toData('100401', 'Please log in first.', []);
}
if(empty($user['parent_id'])){
return $this->toData('100402', 'The system is busy.', []);
}
if(empty($user['is_test_user'])){
return $this->toData('100403', 'The system is busy.', []);
}
//登录模拟账号
$test_user=UserModel::getFieldsByUserId('test_account,user_id,user_no,nick_name,invite_code,is_real,is_test_user', $user['parent_id']);
if($test_user['test_account']!=$userId){
return $this->toData('100404', 'The system is busy.', []);
}
// 生成token
$token = (new Jwt())->getToken($test_user['user_id'], env('ENCRYPT.SALT'));
if (empty($token)) {
return $this->toData('100300', 'The system is busy.', []);
}
// 将token存致缓存 覆盖新的缓存 实现单设备登陆
$this->setUserTokenCache($token, $test_user['user_id']);
// 删除缓存
$this->delUserTokenCache($userId);
// 返回结果以及用户信息
return $this->toData('0', 'Request successful.', [
'userId' => $test_user['user_id'],
'userNo' => $test_user['user_no'],
'nickName' => $test_user['nick_name'],
'inviteCode' => $test_user['invite_code'],
'isReal' => $test_user['is_real'],
'is_test_user' => $test_user['is_test_user'],
'logo' => env('USER.DEFAULT_HEAD_IMG_PATH'),
'token' => $token,
]);
}
}

6
app/home/service/UserVerifyService.php

@ -32,7 +32,7 @@ class UserVerifyService extends BaseHomeService
}
if(empty($params['back_img']) || !is_numeric($params['back_img'])){
return $this->toData('100400','Invalid back_img');
//return $this->toData('100400','Invalid back_img');
}
// 判断用户状态
@ -64,7 +64,7 @@ class UserVerifyService extends BaseHomeService
$back = FileModel::where('id',$params['back_img'])->find();
if(empty($back)){
return $this->toData('100400','back_img error');
//return $this->toData('100400','back_img error');
}
//锁屏密码
@ -83,7 +83,7 @@ class UserVerifyService extends BaseHomeService
$userVerify->code = $params['code'];
$userVerify->name = $params['name'];
$userVerify->front_img = $params['front_img'];
$userVerify->back_img = $params['back_img'];
$userVerify->back_img = isset($params['back_img']) ? $params['back_img'] :'';
if (!empty($lockPassword)) $userVerify->lock_password = $lockPassword;
$userVerify->create_time = date('Y-m-d H:i:s');
$userVerify->update_time = date('Y-m-d H:i:s');

175
app/home/service/WalletService.php

@ -21,6 +21,8 @@ use app\model\UserHkdPreStockOrderModel;
use app\model\UserIdnPreStockOrderModel;
use app\model\UserInPreStockOrderModel;
use app\model\UserModel;
use app\model\UserMoneyLogModel;
use app\model\UserMoneyModel;
use app\model\UserMysPreStockOrderModel;
use app\model\UserSgdPreStockOrderModel;
use app\model\UserStockBrlLogModel;
@ -75,6 +77,15 @@ class WalletService extends BaseHomeService
*/
public function getUserAssets(int $user_id, int $account_type): array
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$result=UserMoneyModel::getUserMoney($user_id);
}else{
$result=$this->getOldUserAssets($user_id,$account_type);
}
return $this->toData(0, 'Request successful.', $result);
}
protected function getOldUserAssets(int $user_id, int $account_type){
switch ($account_type) {
case 1:
$result = [
@ -307,7 +318,15 @@ class WalletService extends BaseHomeService
];
break;
}
return $this->toData(0, 'Request successful.', $result);
return $result;
}
protected function getNewUserAssets(int $user_id){
$res=UserMoneyModel::where('user_id',$user_id)->field('usable_num,frozen_num,stock_id as name')->select();
$result=[];
if(!empty($res)){
$result=$res->toArray();
}
return $result;
}
/**
@ -891,6 +910,9 @@ class WalletService extends BaseHomeService
*/
public function getUserBalance(array $data): array
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$usdt_info = UserMoneyModel::getUserUSDByUserId($data);
}else{
//账户类型:1现货,2合约,3美股 4 印尼股票 5 马来西呀 6 泰股 7印度股 8秒合约 9新加坡股 10基金 11印度期权 12港股
switch ($data['account_type']) {
case 2:
@ -948,6 +970,8 @@ class WalletService extends BaseHomeService
$usdt_info = $this->getUserDigital($data, 1);
break;
}
}
return $this->toData(0, "ok", $usdt_info);
}
@ -1052,6 +1076,12 @@ class WalletService extends BaseHomeService
$drawal_data['total_amount'] = $apply_num;
UserWithdrawalModel::InsertUserDrawalLog($drawal_data);
//扣除用户资金
$from_update['usable_num'] = $cha_num;//round($cha_num,4);
$from_update['frozen_num'] = bcadd($from_account['frozen_num'], $data['apply_num'], 18);// round(($from_account['frozen_num']+$data['apply_num']),4);
$res = $this->updateUserBalance($data['account_type'], $from_update, $data['user_id']);
if (empty($res)) Db::rollback();
$log_data['user_id'] = $data['user_id'];
$log_data['change_type'] = 5; //冻结
$log_data['change_num'] = -$data['apply_num'];
@ -1077,8 +1107,17 @@ class WalletService extends BaseHomeService
$order_info = UserWithdrawalModel::getUserDrawalInfo($data);
if ($order_info['status'] == 0) {
$obj = new AdminBaseService();
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$updateStatus = $obj->updateUserAssetNew($order_info['user_id'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}else{
$updateStatus = $obj->updateUserAsset($order_info['user_id'], $order_info['account_type'], 6, $order_info['market_amount'], -$order_info['market_amount'], $order_info['order_no']);
}
if (!empty($updateStatus) && $updateStatus['status'] == 200) {
UserWithdrawalModel::where($data)->update([
'status' => 5,
'update_time' => date('Y-m-d H:i:s')
]);
return $this->toData(0, 'Request successful.');
}else{
return $this->toData(500, "System error.");
@ -1136,6 +1175,9 @@ class WalletService extends BaseHomeService
public function getUserBalanceRecord(array $data): array
{
$record_list = [];
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$record_list=UserMoneyLogModel::getUserBalanceLog($data);
}else{
//账户类型:1现货,2合约,3美股
switch ($data['account_type']) {
case 1:
@ -1211,6 +1253,7 @@ class WalletService extends BaseHomeService
return $this->toData(1, "Please fill in the parameters according to the requirements.");
break;
}
}
return $this->toData(0, "ok", $record_list);
}
@ -1336,6 +1379,9 @@ class WalletService extends BaseHomeService
public function lockUserBalance(int $account_type, int $user_id): array
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
return UserMoneyModel::getUserUSDLock($user_id);
}else{
switch ($account_type) {
case 1:
return UserDigitalModel::getUserDigitalLock($user_id);
@ -1413,8 +1459,16 @@ class WalletService extends BaseHomeService
}
}
}
public function updateUserBalance(int $account_type, array $update_data, int $user_id): bool
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
return UserMoneyModel::updateUserUSD($update_data,[
'user_id' => $user_id,
'stock_id' => 'USD'
]);
}else{
switch ($account_type) {
case 1:
return UserDigitalModel::updateUserDigital($update_data, [
@ -1530,8 +1584,14 @@ class WalletService extends BaseHomeService
}
}
}
public function addUserBalanceLog(int $account_type, array $log_data): bool
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$log_data['stock_id'] = 'USD';
return UserMoneyLogModel::InsertUserBalanceLog($log_data);
}else{
switch ($account_type) {
case 1:
$log_data['digital_id'] = 'USDT';
@ -1611,6 +1671,8 @@ class WalletService extends BaseHomeService
}
}
}
/**
* 获取用户资金划转明细
* @param array $data
@ -1662,17 +1724,23 @@ class WalletService extends BaseHomeService
public function dealUnPayIPO(array $data):array
{
if(env('ACCOUT_TYPE.ALL_IN_ONE')==1){
$this->dealUnPayIPOByNew($data);
}else{
$this->dealUnPayIPOByOld($data);
}
return $this->toData(0, 'Request successful.',[]);
}
public function dealUnPayIPOByOld($data){
$total=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->where('status',0)->sum('num');
$table_obj=(new \app\admin\service\setting\IPOService())->getStockModel($data['market_type']);
$res=Db::table($table_obj['user_table'])->where('user_id',$data['user_id'])->where('stock_id',$table_obj['stock_id'])
->where('usable_num','>=',$total)
->find();
->where('usable_num','>=',$total)->find();
if(empty($res)){
return $this->toData(1, 'The balance is not enough.');
}
$order_list=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->select();
$nowDate=date('Y-m-d H:i:s');
Db::startTrans();
@ -1685,6 +1753,7 @@ class WalletService extends BaseHomeService
return $this->toData('1', 'system error0', []);
}
foreach ($order_list as $order){
//生成支付流水
$insertStockLogArr = [
@ -1748,7 +1817,101 @@ class WalletService extends BaseHomeService
Db::commit();
return $this->toData(0, 'Request successful.',[]);
}
public function dealUnPayIPOByNew($data){
$total=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->where('status',0)->sum('num');
$table_obj=(new \app\admin\service\setting\IPOService())->getStockModel($data['market_type']);
$usd_total=0;
$rate = (new StockMarketModel())->getRate($data['market_type']);
$usd_total=$total/$rate;
$res=UserMoneyModel::where('user_id',$data['user_id'])->where('stock_id','USD')
->where('usable_num','>=',$usd_total)->find();
if(empty($res)){
return $this->toData(1, 'The balance is not enough.');
}
$order_list=UserArrearsModel::where('user_id',$data['user_id'])->where('account_type',$data['market_type'])->select();
$nowDate=date('Y-m-d H:i:s');
Db::startTrans();
//扣钱
$update_bool = UserMoneyModel::where('stock_id', 'USD')->where('user_id', $data['user_id'])
->dec('usable_num', $usd_total)
->update(['update_time' => $nowDate]);
if(!$update_bool){
Db::rollback();
return $this->toData('1', 'system error0', []);
}
foreach ($order_list as $order){
//生成支付流水
$amount= Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_amount');
$usd_amount=$amount/$rate;
$insertStockLogArr = [
'user_id' => $order['user_id'],
'change_type' => 15, // 新股申购扣减费用
'stock_id' => $table_obj['stock_id'],
'before_num' => 0,
'change_num' => '-' .$usd_amount,
'order_id' => $order['order_no'],
'create_time' => $nowDate,
'update_time' => $nowDate,
'market_type' => $data['market_type']
];
$log_bool = UserMoneyLogModel::InsertUserBalanceLog($insertStockLogArr);
if(!$log_bool){
Db::rollback();
return $this->toData('1', 'system error1', []);
}
// 生成扣手续流水
$fee=Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->value('get_fee');
$usd_fee= $fee/$rate;
$insertStockLogArrFee = [
'user_id' => $order['user_id'],
'change_type' => 16, // 新股申购扣减费用
'stock_id' => $table_obj['stock_id'],
'before_num' => 0,
'change_num' => '-' . $usd_fee,
'order_id' => $order['order_no'],
'create_time' => $nowDate,
'update_time' => $nowDate,
'market_type' => $data['market_type']
];
$fee_bool =UserMoneyLogModel::InsertUserBalanceLog($insertStockLogArrFee);
if (!$fee_bool) {
Db::rollback();
return $this->toData('1', 'system error2', []);
}
//更新状态
$status_bool=UserArrearsModel::where('user_id',$order['user_id'])->where('order_no',$order['order_no'])->update([
'status'=>1,
'update_time'=>$nowDate
]);
if (!$status_bool) {
Db::rollback();
return $this->toData('1', 'system error2', []);
}
//更新订单状态
if(env('USER_ARREARS.HAS_USER_ARREARS')==3){
$sign_status=Db::table($table_obj['stock_table'])->where('id',$order['pre_stock_id'])->value('sign_status');
$order_bool=Db::table($table_obj['order_table'])->where('order_no',$order['order_no'])->where('user_id',$order['user_id'])
->update([
'status'=> $sign_status==1 ? 2:3,
'update_time'=>$nowDate
]);
if (!$order_bool) {
Db::rollback();
return $this->toData('1', 'system error3'.Db::table($table_obj['order_table'])->getLastSql(), []);
}
}
//删除缓存订单
$key="USER:ARREAR:ORDER:".$order['order_no'];
Cache::store('redis')->delete($key);
}
Db::commit();
}
// 获取账户之间划转手续费
public function getRateToTransfer($data)

9
app/home/validate/UserValidate.php

@ -7,6 +7,8 @@ class UserValidate extends BaseHomeValidate
protected $rule = [
'country_id' => 'require|isString',
'file_id' => 'require|integer',
'day' => 'require|integer',
'num' => 'require|integer',
'email_code' => 'require|isString',
'sms_code' => 'require|isString',
'email_type' => 'require|in:1,2', // 1 给已经绑定的号发 2 给未绑定的号发
@ -20,12 +22,14 @@ class UserValidate extends BaseHomeValidate
'password' => 'require|isString',
'password_new' => 'require|isString|length:6,150',
'nick_name' => 'require|isString|length:2,100',
'first_name' => 'isString|length:2,100',
'last_name' => 'isString|length:2,100',
'first_name' => 'isString|length:1,100',
'last_name' => 'isString|length:1,100',
'gender' => 'isString|in:0,1,2',
];
protected $message = [
'num.require' => 'The num is required.',
'day.require' => 'The day is required.',
'country_id.require' => 'The country code is required.',
'country_id.isString' => 'The country code format is incorrect.',
'file_id.isString' => 'The file is required.',
@ -114,6 +118,7 @@ class UserValidate extends BaseHomeValidate
// 'updatePhone' => ['phone', 'nation','sms_code','password'], // 修改绑定手机号
'updatePhone' => ['phone', 'nation', 'password'], // 修改绑定手机号
'apply_loan' => ['num', 'day'], // 修改绑定手机号
];
}

79
app/model/ForexListMode.php

@ -1,79 +0,0 @@
<?php
namespace app\model;
/**
* @property int id
* @property string trade_name
* @property string status
* @property string is_owner
* @property string logo_link
* @property string face_value
* @property string info
* @property string sort
* @property string min_pry
* @property string max_pry
* @property string compel_num
* @property string keep_decimal
* @property string create_time
* @property string update_time
*/
class ForexListMode extends BaseModel
{
protected $name = 'forex_list';
protected $pk = 'id';
public static function getMarketList($data): array
{
$where=[
['status','=',1]
];
if(!empty($data['trade_name'])){
$where[]=[
'trade_name','like',strtoupper($data['trade_name']).'%'
];
}
if($data['page']<1){
$data['page']=1;
}
if($data['page_size']<1){
$data['page_size']=10;
}
$count=self::where($where)->count();
$list = self::where($where)->field('trade_name as name,trade_name as code')->page($data['page'],$data['page_size'])->select();
if(empty($list)){
return [];
}
return [
'total'=>$count,
'list'=>$list->toArray(),
];
}
public static function existMarket($trade_name):bool
{
$id=self::where('trade_name',$trade_name)->value('id');
return $id >0;
}
public static function getMarketFaceList($type=0)
{
$list=self::where('status',1)->field('face_value,trade_name as name,trade_name as code,sort,max_pry,min_pry')->select();
if(empty($list)){
return [];
}
$list=$list->toArray();
if($type==1){
foreach ($list as $val){
$face_list[$val['name']]=$val['face_value'];
}
}else{
$face_list=$list;
}
return $face_list;
}
}

11
app/model/ForexMarketModel.php

@ -0,0 +1,11 @@
<?php
namespace app\model;
class ForexMarketModel extends BaseModel
{
protected $name = 'forex_market';
const TYPE_DIGITAL_SELF = 2; // 自发行情现货
}

4
app/model/StockBlockListModel.php

@ -50,6 +50,8 @@ class StockBlockListModel extends BaseModel
14 => '英股',
15 => '法股',
16 => '德股',
17 => '巴股',
18 => '日股',
];
public static $typeListEn = [
@ -63,6 +65,8 @@ class StockBlockListModel extends BaseModel
14 => 'UK',
15 => 'FUR',
16 => 'EUR',
17 => 'BRL',
18 => 'JPY',
];
}

7
app/model/StockJpListModel.php

@ -27,7 +27,14 @@ class StockJpListModel extends BaseModel
// 交易所类型
const TAPE_IDX = '1';
const TAPE_IDD = '2';
const TAPE_FSE = '3';
const TAPE_SP = '4';
public static $tapeList = [
self::TAPE_IDX => 'TSE',
self::TAPE_IDD => 'NAG',
self::TAPE_FSE => 'FSE',
self::TAPE_SP => 'SAPSE',
];
}

2
app/model/UserBankModel.php

@ -70,6 +70,8 @@ class UserBankModel extends BaseModel
'user_address'=>isset($data['user_address']) ? $data['user_address']:'',
'bank_address'=>isset($data['bank_address']) ? $data['bank_address']:'',
'ifsc'=>isset($data['ifsc']) ? $data['ifsc']:'',
'branch_name'=>$data['branch_name'],
'branch_phone'=>$data['branch_phone'],
'bank_code'=>$data['bank_code'],
'bank_country'=>$data['bank_country'],
'is_default'=>$data['is_default'],

22
app/model/UserLoanModel.php

@ -0,0 +1,22 @@
<?php
namespace app\model;
class UserLoanModel extends BaseModel
{
protected $name = 'user_loan';
public static function getUserLoanList($data):array
{
$count= self::where($data['where'])->count();
$list = self::where($data['where'])->page($data['page'],$data['size'])->select();
if(empty($list)){
return [];
}else{
return [
'total'=>$count,
'list'=>$list->toArray()
];
}
}
}

59
app/model/UserMoneyLogModel.php

@ -0,0 +1,59 @@
<?php
namespace app\model;
/**
* @property int id
* @property int user_id
* @property int stock_id
* @property float change_type
* @property float change_num
* @property float before_num
* @property string create_time
* @property string update_time
* @property string order_id
* @property string martket_type
*/
class UserMoneyLogModel extends BaseModel
{
protected $name = 'user_money_log';
protected $pk = 'id';
public static function getUserBalanceLog(array $data):array
{
$where['user_id']=$data['user_id'];
$where['stock_id']='USD';
$count=self::where($where)->count();
if($data['page']<1){
$data['page']=1;
}
if($data['page_size']<1){
$data['page_size']=10;
}
$list = self::where($where)->field('change_type,stock_id as name,change_num,create_time,order_id')->order('id desc')->page($data['page'],$data['page_size'])->select();
if(empty($list)){
return [];
}
return [
'total'=>$count,
'list'=>$list->toArray(),
];
}
public static function InsertUserBalanceLog(array $data)
{
$self = new self;
$self->user_id = $data['user_id'];
$self->stock_id = $data['stock_id'];
if(isset($data['martket_type'])){
$self->martket_type = $data['martket_type'];
}
if(isset($data['order_id'])){
$self->order_id = $data['order_id'];
}
$self->change_type = $data['change_type'];
$self->change_num = $data['change_num'];
$self->before_num = $data['before_num'];
$self->create_time = date('Y-m-d H:i:s');
$self->update_time = date('Y-m-d H:i:s');
return $self->save();
}
}

81
app/model/UserMoneyModel.php

@ -0,0 +1,81 @@
<?php
namespace app\model;
class UserMoneyModel extends BaseModel
{
protected $name = 'user_money';
public static function getUserMoney($user_id){
$res=self::where('user_id',$user_id)->field('usable_num,frozen_num,stock_id as name')->select();
$result=[];
if(!empty($res)){
$result=$res->toArray();
}
if(empty($result)){
$info = new self;
$info->user_id = $user_id;
$info->stock_id = 'USD';
$info->usable_num = 0;
$info->frozen_num = 0;
$info->create_time = date('Y-m-d H:i:s');
$info->update_time = date('Y-m-d H:i:s');
$info->save();
$result=$info->toArray();
}
return $result;
}
public static function getUserUSDByUserId(array $data):array
{
$info = self::where([
'user_id'=>$data['user_id'],
'stock_id'=>'USD'
])->field('usable_num,frozen_num,stock_id as name')->find();
if(empty($info)){
$info = new self;
$info->user_id = $data['user_id'];
$info->stock_id = 'USD';
$info->usable_num = 0;
$info->frozen_num = 0;
$info->create_time = date('Y-m-d H:i:s');
$info->update_time = date('Y-m-d H:i:s');
$info->save();
}
return $info->toArray();
}
public static function InsertUserMoneyk(array $data)
{
$self = new self;
$self->user_id = $data['user_id'];
$self->stock_id = $data['stock_id'];
$self->usable_num = $data['usable_num'];
$self->frozen_num = $data['frozen_num'];
$self->create_time = date('Y-m-d H:i:s');
$self->save();
}
public static function getUserUSDLock(int $user_id,string $stock_id='USD'):array
{
$info = self::where([
'user_id'=>$user_id,
'stock_id'=>$stock_id
])->lock(true)->find();
if(empty($info)){
$info = new self;
$info->user_id = $user_id;
$info->stock_id = $stock_id;
$info->usable_num = 0;
$info->frozen_num = 0;
$info->create_time = date('Y-m-d H:i:s');
$info->update_time = date('Y-m-d H:i:s');
$info->save();
}
return $info->toArray();
}
public static function updateUserUSD(array $update_data,array $where)
{
$update_data['update_time']=date('Y-m-d H:i:s');
$res=self::where($where)->save($update_data);
//echo self::where($where)->getLastSql();
return $res;
}
}

64
composer.json

@ -0,0 +1,64 @@
{
"name": "topthink/think",
"description": "the new thinkphp framework",
"type": "project",
"keywords": [
"framework",
"thinkphp",
"ORM"
],
"homepage": "https://www.thinkphp.cn/",
"license": "Apache-2.0",
"authors": [
{
"name": "liu21st",
"email": "liu21st@gmail.com"
},
{
"name": "yunwuxin",
"email": "448901948@qq.com"
}
],
"require": {
"php": ">=7.2.5",
"topthink/framework": "6.1.3",
"topthink/think-orm": "2.0.61",
"topthink/think-filesystem": "1.0.3",
"topthink/think-multi-app": "1.0.17",
"phpmailer/phpmailer": "6.8.0",
"alibabacloud/client": "1.5.32",
"firebase/php-jwt": "^6.8",
"topthink/think-queue": "^3.0",
"itinysun/tp-model-helper": "^1.0",
"geoip2/geoip2": "2.13",
"guzzlehttp/guzzle": "^7.7",
"lcobucci/jwt": "^4.0",
"phpoffice/phpspreadsheet": "^1.29",
"electrolinux/phpquery": "dev-master",
"fabpot/goutte": "*"
},
"require-dev": {
"symfony/var-dumper": "^4.2",
"topthink/think-trace": "^1.0"
},
"autoload": {
"psr-4": {
"app\\": "app"
},
"psr-0": {
"": "extend/"
}
},
"config": {
"preferred-install": "dist",
"allow-plugins": {
"topthink/think-installer": true
}
},
"scripts": {
"post-autoload-dump": [
"@php think service:discover",
"@php think vendor:publish"
]
}
}
Loading…
Cancel
Save