where('status', 2)->where('money_type', $money_type)->sum('money_num');
$all_cash = self::whereTime('trade_time', 'yesterday')->where('status', 2)->where('money_type', $money_type)->sum('all_price');
if ($all_money > 0)
return bcdiv($all_cash, $all_money, 8);
else
return "0";
}
/**
* @param $where
* @return self
*/
public static function setStatus($where)
{
if (is_array($where)) {
if (isset($where['status'])) {
$status = $where['status'];
} else {
return new self();
}
} else {
$status = $where;
}
switch ($status) {
case 1://挂出中
return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('trade_uid', null);
case 2://已完成
return self::where('status', 1);
case 3://挂出时间结束
return self::where('status', 'in', [0, -1, 2])->where('end_time', '<', time());
case 4://挂出时间结束,未领回
return self::where('status', 'in', [0, -1])->where('end_time', '<', time());
case 5://已领回
return self::where('status', 2);
case 6://交易中,已上传凭证
return self::where('status', 3);
case 7://未结束 但是关闭
return self::where('status', 'in', [0, -1])->where('end_time', '>', time())->where('close_time', '<', time());
default:
return new self();
}
}
/**
* @param $where
* @return array
*/
public static function getList($where)
{
$model = self::setStatus($where);
// if (isset($where['uid']) && $where['uid']) {
// $model = $model->where('uid|trade_uid', $where['uid']);
// }
if (isset($where['trade_type']) && $where['trade_type'] != '') {
if (isset($where['uid']) && $where['uid']) {
$model = $model->where(function ($query) use ($where) {
$query->where('trade_uid', $where['uid'])
->where('trade_type', $where['trade_type']);
})->whereOr(function ($query) use ($where) {
$query->where('uid', $where['uid'])
->where('trade_type', '<>', $where['trade_type']);
});
} else {
$model = $model->where('trade_type', $where['trade_type']);
}
}
if (isset($where['money_type']) && $where['money_type'] != '') {
$model = $model->where('money_type', $where['money_type']);
}
if (isset($where['order_id']) && $where['order_id'] != '') {
$model = $model->where('order_id', $where['order_id']);
}
if (isset($where['trade_uid']) && $where['trade_uid'] != '') {
$model = $model->where('trade_uid', $where['trade_uid']);
}
$count = $model->count();
// var_dump(self::getLastSql());
$list = $model->order('trade_start_time desc,add_time desc')->page((int)$where['page'], (int)$where['limit'])->select()
// var_dump(self::getLastSql());
->each(function ($item) {
$item['user'] = User::getUserInfo($item['uid']);
$item['_trade_user'] = $item['trade_uid'] === 0 ? '系统/0' : ($item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--');
$item['trade_user'] = $item['trade_uid'] === 0 ? [] : User::getUserInfo($item['trade_uid']);
// $item['_add_time'] = time_format($item['add_time']);
// $item['_end_time'] = time_format($item['end_time']);
// $item['_trade_time'] = time_format($item['trade_time']);
$money_type = init_money_type();
$item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
$item['bank'] = json_decode($item['bank_info'], true);
$item['_name_text'] = '--';
$item['_account_text'] = '--';
$item['_code_text'] = '--';
$item['_name'] = '--';
$item['_account'] = '--';
$item['_code'] = '--';
if ($item['bank']) {
if ($item['bank']['type'] == 1) {
$item['_name_text'] = '支付宝用户';
$item['_account_text'] = '支付宝账号';
$item['_code_text'] = '支付宝二维码';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = "";
} else if ($item['bank']['type'] == 2) {
$item['_name_text'] = '微信用户';
$item['_account_text'] = '微信账号';
$item['_code_text'] = '微信二维码';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = "";
} else {
$item['_name_text'] = '开户人';
$item['_account_text'] = '银行卡号';
$item['_code_text'] = '开户行';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = $item['bank']['code'];
}
}
$item['_add_time'] = time_format($item['add_time']);
$item['_end_time'] = $item['end_time'] ? time_format($item['end_time']) : '--';
$item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
$item['_money_type'] = $money_type[$item['money_type']];
$item['_trade_type'] = $item['trade_type'] == 2 ? '挂买' : '挂卖';
$item['_proof'] = $item['proof'] ? "" : '--';
switch ($item['status']) {
case -1:
$item['_status'] = '未支付';
break;
case 0:
$item['_status'] = '未完成';
break;
case 1:
$item['_status'] = '已完成';
break;
case 2:
$item['_status'] = '已收回';
break;
case 3:
$item['_status'] = '交易中【‘已提交交易凭证’】';
break;
default:
$item['_status'] = '未知';
break;
}
});
// var_dump($list);
return compact('count', 'list');
}
public static function getInfo($id)
{
$item = self::get($id);
$item['user'] = User::getUserInfo($item['uid']);
$item['_trade_user'] = $item['trade_uid'] === 0 ? '系统/0' : ($item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--');
$item['trade_user'] = $item['trade_uid'] === 0 ? [] : User::getUserInfo($item['trade_uid']);
// $item['_add_time'] = time_format($item['add_time']);
// $item['_end_time'] = time_format($item['end_time']);
// $item['_trade_time'] = time_format($item['trade_time']);
$money_type = init_money_type();
$item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
$item['bank'] = json_decode($item['bank_info'], true);
$item['_name_text'] = '--';
$item['_account_text'] = '--';
$item['_code_text'] = '--';
$item['_name'] = '--';
$item['_account'] = '--';
$item['_code'] = '--';
if ($item['bank']) {
if ($item['bank']['type'] == 1) {
$item['_name_text'] = '支付宝用户';
$item['_account_text'] = '支付宝账号';
$item['_code_text'] = '支付宝二维码';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = "";
} else if ($item['bank']['type'] == 2) {
$item['_name_text'] = '微信用户';
$item['_account_text'] = '微信账号';
$item['_code_text'] = '微信二维码';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = "";
} else {
$item['_name_text'] = '开户人';
$item['_account_text'] = '银行卡号';
$item['_code_text'] = '开户行';
$item['_name'] = $item['bank']['name'];
$item['_account'] = $item['bank']['account'];
$item['_code'] = $item['bank']['code'];
}
}
$item['_add_time'] = time_format($item['add_time']);
$item['_end_time'] = $item['end_time'] ? time_format($item['end_time']) : '--';
$item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
$item['_money_type'] = $money_type[$item['money_type']];
$item['_trade_type'] = $item['trade_type'] == 2 ? '挂买' : '挂卖';
$item['_proof'] = $item['proof'] ? "" : '--';
switch ($item['status']) {
case -1:
$item['_status'] = '未支付';
break;
case 0:
$item['_status'] = '未完成';
break;
case 1:
$item['_status'] = '已完成';
break;
case 2:
$item['_status'] = '已收回';
break;
case 3:
$item['_status'] = '交易中【‘已提交交易凭证’】';
break;
default:
$item['_status'] = '未知';
break;
}
return $item;
}
public static function getOneUserList($where)
{
$model = self::setStatus($where);
$model = $model->where('uid|trade_uid', $where['uid']);
// if (isset($where['trade_type']) && $where['trade_type'] != '') {
// if (isset($where['uid']) && $where['uid']) {
// $model = $model->where(function ($query) use ($where) {
// $query->where('trade_uid', $where['uid'])
// ->where('trade_type', $where['trade_type']);
// })->whereOr(function ($query) use ($where) {
// $query->where('uid', $where['uid'])
// ->where('trade_type', '<>', $where['trade_type']);
// });
// } else {
// $model = $model->where('trade_type', $where['trade_type']);
// }
// }
// if (isset($where['money_type']) && $where['money_type'] != '') {
// $model = $model->where('money_type', $where['money_type']);
// }
// $count = $model->count();
// var_dump(self::getLastSql());
$list = $model->page((int)$where['page'], (int)$where['limit'])->select()
// var_dump(self::getLastSql());
->each(function ($item) use ($where) {
$money_type = init_money_type();
$item['_user'] = User::getUserInfo($item['uid'])['nickname'] . '/' . $item['uid'];
$item['_trade_user'] = $item['trade_uid'] ? User::getUserInfo($item['trade_uid'])['nickname'] . '/' . $item['trade_uid'] : '--';
$item['_add_time'] = time_format($item['add_time']);
$item['_end_time'] = $item['_end_time'] ? time_format($item['end_time']) : '--';
$item['_trade_time'] = $item['trade_time'] ? time_format($item['trade_time']) : '--';
$item['_money_type'] = $money_type[$item['money_type']];
$item['_trade_type'] = $item['trade_type'] == 2 ? '挂买' : '挂卖';
$item['_proof'] = $item['proof'] ? "" : '--';
switch ($item['status']) {
case -1:
$item['_status'] = '未支付';
break;
case 0:
$item['_status'] = '未完成';
break;
case 1:
$item['_status'] = '已完成';
break;
case 2:
$item['_status'] = '已收回';
break;
case 3:
$item['_status'] = '交易中【‘已提交交易凭证’】';
break;
default:
$item['_status'] = '未知';
break;
}
});
return $list;
}
public static function hangSale($uid, $money_type, $money_num, $price, $hang_time, $bank_id)
{
$user = User::getUserInfo($uid);
if (!$user['sale_switch']) {
return self::setErrorInfo('当前用户不可挂卖!');
}
if (!$bank_id) {
return self::setErrorInfo('请选择收款方式!');
}
$bank = UserBanks::get($bank_id);
if (!$bank || $bank['uid'] != $uid) {
return self::setErrorInfo('收款方式错误!');
}
$money = UserMoney::initialUserMoney($uid, $money_type);
if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
$sum = bcmul($money_num, $price, 2);
BaseModel::beginTrans();
try {
$res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
if (!$res) {
return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
}
$res = self::create([
'order_id' => self::getOrderId(),
'uid' => $uid,
'money_type' => $money_type,
'money_num' => $money_num,
'price' => $price,
'all_price' => $sum,
'trade_type' => 1,
'add_time' => time(),
'hang_time' => $hang_time,
'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
'bank_info' => json_encode($bank)
]);
if ($res) {
BaseModel::commitTrans();
return $res;
} else {
return self::setErrorInfo('挂卖失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function fastSale($uid, $money_type, $money_num, $price, $bank_id)
{
// $user = User::getUserInfo($uid);
// if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
// return self::setErrorInfo('请先设置收款方式!');
// }
if (!$bank_id) {
return self::setErrorInfo('请选择收款方式!');
}
$bank = UserBanks::get($bank_id);
if (!$bank || $bank['uid'] != $uid) {
return self::setErrorInfo('收款方式错误!');
}
$money = UserMoney::initialUserMoney($uid, $money_type);
if ($money['money'] < $money_num) return self::setErrorInfo('账户不足!');
$sum = bcmul($money_num, $price, 2);
BaseModel::beginTrans();
try {
$res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
if (!$res) {
return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
}
$res = self::create([
'order_id' => self::getOrderId(),
'uid' => $uid,
'money_type' => $money_type,
'money_num' => $money_num,
'price' => $price,
'all_price' => $sum,
'trade_type' => 1,
'add_time' => time(),
'hang_time' => 0,
'trade_uid' => 0,
'status' => -1,
'end_time' => PHP_INT_MAX,
'bank_info' => json_encode($bank)
]);
if ($res) {
self::commitTrans();
return true;
} else {
return self::setErrorInfo('挂卖失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function hangBuy2($uid, $money_type, $money_num, $price, $hang_time)
{
$sum = bcmul($money_num, $price, 2);
BaseModel::beginTrans();
try {
// $res = UserMoney::expendMoney($uid, $money_type, $money_num, 'hang_sale', '挂卖', '挂卖' . $money_num);
// if (!$res) {
// return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
// }
$res = self::create([
'order_id' => self::getOrderId(),
'uid' => $uid,
'money_type' => $money_type,
'money_num' => $money_num,
'price' => $price,
'all_price' => $sum,
'trade_type' => 2,
'add_time' => time(),
'hang_time' => $hang_time,
'status' => -1,//未支付虚拟货币
'end_time' => bcadd(time(), bcmul($hang_time, 3600)),
]);
if ($res) {
BaseModel::commitTrans();
return $res;
} else {
return self::setErrorInfo('挂买失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function hangBuy($uid, $money_type, $money_num, $price, $hang_time)
{
$sum = bcmul($money_num, $price, 2);
BaseModel::beginTrans();
try {
$res = CashTradeOrderPayment::create([
'uid' => $uid,
'order_id' => CashTradeOrderPayment::getOrderId(),
'order_type' => 1,
'pay_money' => $sum,
'add_time' => time(),
'order_info' => json_encode([
'uid' => $uid,
'money_type' => $money_type,
'money_num' => $money_num,
'price' => $price,
'all_price' => $sum,
'trade_type' => 2,
'hang_time' => $hang_time,]),
]);
if ($res) {
BaseModel::commitTrans();
return $res;
} else {
return self::setErrorInfo('订单生成失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function getOrderId()
{
list($msec, $sec) = explode(' ', microtime());
$msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
do {
$str = 'ct' . $msectime . mt_rand(10000, 99999);
} while (self::be(['order_id' => $str]));
return $str;
}
public static function sale($uid, $id, $bank_id)
{
if (!$bank_id) {
return self::setErrorInfo('请选择收款方式!');
}
$bank = UserBanks::get($bank_id);
if (!$bank || $bank['uid'] != $uid) {
return self::setErrorInfo('收款方式错误!');
}
$order = self::setStatus(1)->where('id', $id)->find();
if (!$order) {
return self::setErrorInfo('订单不存在或已结束挂出');
}
// $user = User::getUserInfo($uid);
// if (!$user['bank_code'] && !$user['alipay_code'] && !$user['alipay_account'] && !$user['wechat_code'] && !$user['wechat_account']) {
// return self::setErrorInfo('请先设置收款方式!');
// }
$money = UserMoney::initialUserMoney($uid, $order['money_type']);
if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
BaseModel::beginTrans();
try {
$res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
if (!$res) {
return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
}
$res = self::where('id', $id)->update([
'status' => 0,
'trade_uid' => $uid,
'bank_info' => json_encode($bank),
'trade_start_time' => time(),
//'trade_way' => $order['pay_type'],
// 'trade_time' => time(),
]);
// $userInfo = User::getUserInfo($uid);
// $res = $res && UserMoney::incomeMoney($order['uid'], $order['money_type'], $order['money_num'], 'buy_success', '购币成功', '购币成功,出售方:' . $uid);
// $res = $res && (false !== User::bcInc($userInfo['uid'], 'now_money', $order['all_price'], 'uid'));
// $res = $res && UserBill::income('售币成功', $userInfo['uid'], 'now_money', 'sale_success', $order['all_price'], $order['id'], $userInfo['now_money'] + $order['all_price'], '售币成功,购买方:' . $order['uid']);
if ($res) {
BaseModel::commitTrans();
$user = User::getUserInfo($order['uid']);
ShortLetterRepositories::SMSSend($user['phone'], ['code' => 0], 'START_TRADE');
return $res;
} else {
return self::setErrorInfo('出售失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function buy($uid, $id)
{
$order = self::setStatus(1)->where('id', $id)->find();
if (!$order) {
return self::setErrorInfo('订单不存在或已结束挂出');
}
BaseModel::beginTrans();
try {
$res = CashTradeOrderPayment::create([
'uid' => $uid,
'order_id' => CashTradeOrderPayment::getOrderId(),
'bind_order' => $id,
'order_type' => 2,
'pay_money' => $order['all_price'],
'add_time' => time()
]);
if ($res) {
BaseModel::commitTrans();
return $res;
} else {
return self::setErrorInfo('订单生成失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function buy2($uid, $id)
{
$order = self::setStatus(1)->where('id', $id)->find();
if (!$order) {
return self::setErrorInfo('订单不存在或已结束挂出');
}
// $money = UserMoney::initialUserMoney($uid, $order['money_type']);
// if ($money['money'] < $order['money_num']) return self::setErrorInfo('账户不足!');
BaseModel::beginTrans();
try {
// $res = UserMoney::expendMoney($uid, $order['money_type'], $order['money_num'], 'sale', '售币成功', '售币成功,购买方:' . $order['uid']);
// if (!$res) {
// return self::setErrorInfo(UserMoney::getErrorInfo('支付失败'), true);
// }
$res = self::where('id', $id)->update([
'status' => -1,
'trade_uid' => $uid,
'close_time' => time() + 30 * 60,
'trade_start_time' => time(),
]);
if ($res) {
BaseModel::commitTrans();
return $res;
} else {
return self::setErrorInfo('申请购买失败', true);
}
} catch (Exception $e) {
return self::setErrorInfo($e->getMessage(), true);
}
}
public static function getBack()
{
$list = self::setStatus(4)->select();
BaseModel::beginTrans();
$res = true;
foreach ($list as $v) {
switch ($v['trade_type']) {
case 1:
//退回币
$res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
$res = $res && self::where('id', $v['id'])->update(['status' => 2]);
break;
case 2:
// $userInfo = User::getUserInfo($v['uid']);
// $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
// $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
// $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
if ($v['trade_uid'])
$res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_buy_send_back', '挂买退回', '挂买时间结束,退回钱包');
$res = $res && self::where('id', $v['id'])->update(['status' => 2]);
break;
default:
break;
}
}
BaseModel::checkTrans($res);
return $res;
}
public static function orderClose()
{
$list = self::setStatus(7)->select();
// var_dump($list);
BaseModel::beginTrans();
$res = true;
try {
foreach ($list as $v) {
switch ($v['trade_type']) {
case 1:
// var_dump(1111);
//退回币
// $res = $res && UserMoney::incomeMoney($v['uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
$res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => 0, 'close_time' => null, 'trade_start_time' => null,]);
break;
case 2:
// var_dump(2222);
// $userInfo
// = User::getUserInfo($v['uid']);
// $res = $res && (false !== User::bcInc($v['uid'], 'now_money', $v['all_price'], 'uid'));
// $res = $res && UserBill::income('售币成功', $v['uid'], 'now_money', 'hang_buy_send_back', $v['all_price'], $v['id'], $userInfo['now_money'] + $v['all_price'], '挂买时间结束,退回余额');
// $res = $res && self::where('id', $v['id'])->update(['status' => 2]);
if ($v['trade_uid'])
$res = $res && UserMoney::incomeMoney($v['trade_uid'], $v['money_type'], $v['money_num'], 'hang_sale_send_back', '挂卖退回', '挂卖时间结束,退回钱包');
$res = $res && self::where('id', $v['id'])->update(['trade_uid' => null, 'status' => -1, 'close_time' => null, 'trade_start_time' => null,]);
break;
default:
break;
}
}
} catch (Exception $e) {
BaseModel::rollbackTrans();
@file_put_contents('orderClose.error.log', '[' . date('Y-m-d H:i:s') . ']' . $e->getMessage() . PHP_EOL, FILE_APPEND);
}
BaseModel::commitTrans();
return $res;
}
public static function brokerage($id)
{
$info = self::get($id);
// if ($info['trade_uid'] !== 0) return true;
if ($info['trade_type'] == 2)
$user = User::getUserInfo($info['trade_uid']);
else
$user = User::getUserInfo($info['uid']);
$uper = User::getUserInfo($user['spread_uid']);
// var_dump($info);
// var_dump($user['uid']);
// var_dump($user['spread_uid']);
// exit;
$send = 0;
$res = true;
while ($uper) {
$ratio = bcdiv($uper['return_uper'], 100, 2);
if ($ratio > 0) {
$brokerage = bcmul($ratio, $info['money_num'], 8);
if ($brokerage > $send) {
$brokerage = bcsub($brokerage, $send, 8);
$res = $res && UserMoney::incomeMoney($uper['uid'], $info['money_type'], $brokerage, 'return_uper', '佣金', $user['nickname'] . '发生交易,获得佣金');
$send = bcadd($brokerage, $send, 8);
}
}
$uper = User::getUserInfo($uper['spread_uid']);
}
return $res;
}
}