feat: 后端全量更新 - 含所有本次需求

- Contract.php: 返回合约账户余额(balance_contract)
- My.php: 地址管理增加BTC/ETH
- AppContract.php: 一键平仓(closeall)
- AppProxy.php: 代理专属注册链接 + 分级权限(L1/L2)
- site.php: 手续费减半(0.018→0.009)
- agent_permission_setup.sql: 代理权限SQL
- crypto_news_crawler.py: 新闻自动采集脚本
This commit is contained in:
li
2026-03-30 20:16:32 +08:00
commit 1b24994e74
6721 changed files with 1308571 additions and 0 deletions
+584
View File
@@ -0,0 +1,584 @@
<?php
namespace app\admin\controller\app;
use app\admin\controller\kefu\Config;
use app\common\controller\Backend;
use think\Db;
use think\Config as Configs;
/**
* 客户订单管理
*
* @icon fa fa-circle-o
*/
class Order extends Backend
{
/**
* Order模型对象
* @var \app\admin\model\app\Order
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\app\Order;
$this->view->assign("symbolList", $this->model->getSymbolList());
$this->view->assign("riseOrFallList", $this->model->getRiseOrFallList());
$this->view->assign("setLossList", $this->model->getSetLossList());
}
public function import()
{
parent::import();
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
/**
* 查看
*/
public function index()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isAjax())
{
//如果发送的来源是Selectpage,则转发到Selectpage
if ($this->request->request('keyField'))
{
return $this->selectpage();
}
// list($where, $sort, $order, $offset, $limit) = $this->buildparams();
$offset = $this->request->get("offset", 0);
$limit = $this->request->get("limit", 0);
$params = json_decode(input('filter'),true);
$op = json_decode(input('op'),true);
if(count($params) > 0){
$new_params = $new_op = [];
foreach ($params as $key => $value) {
if($key == 'mobile')
{
$new_params['u.' . $key] = $value;
$new_op['u.' . $key] = $op[$key];
}else if($key == 'user_name'){
$new_params['u.username'] = $value;
$new_op['u.username'] = $op[$key];
}elseif ($key == 'daili_name') {
$new_params['e.nickname'] = $value;
$new_op['e.nickname'] = $op[$key];
}else {
$new_params['a.' . $key] = $value;
$new_op['a.' . $key] = $op[$key];
}
}
$w = $this->rewriteQuery($new_params, $new_op);
}else{
$w['a.id'] = array('>', 0);
}
$admin_id = $this->auth->id;
if($admin_id > 1){
$user = Db::name("user")->where("admin_id",$admin_id)->find();
if($user){
$w['u.path'] = array("like",$user['path']."%");
}
}
$total = Db::name('order')
->alias('a')
->field('a.*,u.username as user_name,e.nickname as daili_name')
->join('fa_user u', 'a.user_id = u.id')
->join('admin e', 'u.p_admin_id = e.id' , 'left')
->where($w)
->count();
$list = Db::name('order')
->alias('a')
->field('a.*,u.username as user_name,e.nickname as daili_name')
->join('fa_user u', 'a.user_id = u.id')
->join('admin e', 'u.p_admin_id = e.id' , 'left')
->where($w)
->order('a.id', 'desc')
->limit($offset, $limit)
->select();
$extend['risenum'] = Db::name('order')
->alias('a')
->field('a.*')
->where('rise_or_fall','rise')
->sum('trade_num');
$extend['fallnum'] = Db::name('order')
->alias('a')
->field('a.*')
->where('rise_or_fall','fall')
->sum('trade_num');
$extend['risewin'] = Db::name('order')
->alias('a')
->field('a.*')
->where('rise_or_fall','rise')
->sum('expect_income');
$extend['fallwin'] = Db::name('order')
->alias('a')
->field('a.*')
->where('rise_or_fall','fall')
->sum('expect_income');
$coindata = Db::name('app_rate')
->whereIn('symbol','btcusdt,ethusdt,eosusdt,bchusdt,ltcusdt')->select();
$extend['coin'] = array_column($coindata,'open','name');
$extend['nowtime'] = time();
$result = array("total" => $total, "rows" => $list,'extend' => $extend);
return json($result);
}
return $this->view->fetch();
}
//生成价格
public function createPrice()
{
$params = $this->request->post();
if(empty($params['symbols']))
{
$this->error('请选择币种');
}
if(empty($params['zhouqi']))
{
$this->error('请选择周期');
}
if(empty($params['rise_or_falls']))
{
$this->error('请选择涨跌类型');
}
if(empty($params['prices']) || !is_numeric($params['prices']))
{
$this->error('请输入波动价格');
}
if(empty($params['createstime']))
{
$this->error('请选择下单时间');
}
$tstime = strtotime($params['createstime']);
$symbols = str_replace('usdt','',$params['symbols']);
$newprice1 = Db::name('hb_1s_'.$symbols)
->where('ts',"<=",$tstime-2)
->order('ts','desc')->find();
$newprice2 = Db::name('hb_1s_'.$symbols)
->where('ts',"<=",$tstime-1)
->order('ts','desc')->find();
$newprice3 = Db::name('hb_1s_'.$symbols)
->where('ts',"<=",$tstime)
->order('ts','desc')->find();
$newprice4 = Db::name('hb_1s_'.$symbols)
->where('ts',"<=",$tstime+1)
->order('ts','desc')->find();
$newprice5 = Db::name('hb_1s_'.$symbols)
->where('ts',"<=",$tstime+2)
->order('ts','desc')->find();
if(!$newprice5)
{
$this->error('该时间段无效未获取到价格');
}
$randprice1 = $this->randomFloat(0,$params['prices'],2);
$randprice2 = $this->randomFloat(0,$params['prices'],2);
$randprice3 = $this->randomFloat(0,$params['prices'],2);
$randprice4 = $this->randomFloat(0,$params['prices'],2);
$randprice5 = $this->randomFloat(0,$params['prices'],2);
if($params['rise_or_falls'] == 'rise')
{
$data = [
'newprice1' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']-2),
'price' => sprintf('%.2f',($randprice1+$newprice1['price']))
],
'newprice2' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']-1),
'price' => sprintf('%.2f',($randprice2+$newprice2['price']))
],
'newprice3' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']),
'price' => sprintf('%.2f',($randprice3+$newprice3['price']))
],
'newprice4' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']+1),
'price' => sprintf('%.2f',($randprice4+$newprice4['price']))
],
'newprice5' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']+2),
'price' => $newprice5['price']
],
];
}else{
$data = [
'newprice1' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']-2),
'price' => sprintf('%.2f',($newprice1['price']-$randprice1))
],
'newprice2' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']-1),
'price' => sprintf('%.2f',($newprice2['price']-$randprice2))
],
'newprice3' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']),
'price' => sprintf('%.2f',($newprice3['price']-$randprice3))
],
'newprice4' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']+1),
'price' => sprintf('%.2f',($newprice4['price']-$randprice4))
],
'newprice5' => [
'times' => date('Y-m-d H:i:s', $tstime+$params['zhouqi']+2),
'price' => $newprice5['price']
],
];
}
$data['openprice'] = $newprice3['price'];
$this->success('success','',$data);
}
//创建价格
public function buildPrice()
{
$params = $this->request->post();
if (empty($params['symbols'])) {
$this->error('请选择币种');
}
if (empty($params['zhouqi'])) {
$this->error('请选择周期');
}
if (empty($params['rise_or_falls'])) {
$this->error('请选择涨跌类型');
}
if (empty($params['prices']) || !is_numeric($params['prices'])) {
$this->error('请输入波动价格');
}
if (empty($params['createstime'])) {
$this->error('请选择下单时间');
}
$insertdata = [
[
'symbol' => $params['symbols'],
'ts' => strtotime($params['newpricetime1']),
'price' => $params['newprice1'],
'amount' => 0,
'createtime' => time()
],
[
'symbol' => $params['symbols'],
'ts' => strtotime($params['newpricetime2']),
'price' => $params['newprice2'],
'amount' => 0,
'createtime' => time()
],
[
'symbol' => $params['symbols'],
'ts' => strtotime($params['newpricetime3']),
'price' => $params['newprice3'],
'amount' => 0,
'createtime' => time()
],
[
'symbol' => $params['symbols'],
'ts' => strtotime($params['newpricetime4']),
'price' => $params['newprice4'],
'amount' => 0,
'createtime' => time()
],
[
'symbol' => $params['symbols'],
'ts' => strtotime($params['newpricetime5']),
'price' => $params['newprice5'],
'amount' => 0,
'createtime' => time()
],
];
$ret = Db::name('hb_ctrl')->insertAll($insertdata);
if($ret){
$result = http_curl('http://149api.ms2722.com/crest/hbmarket/syncCtrl?token=datrade');
$this->success('添加成功',$result);
}else{
$this->error('系统繁忙');
}
}
//清除价格
public function cleanPrice()
{
$ret = Db::name('hb_ctrl')
->where('id','>',0)
->delete();
if($ret){
$result = http_curl('http://149api.ms2722.com/crest/hbmarket/cancelSyncCtrl?token=datrade');
$this->success('已取消所有调控价格');
}else{
$this->error('系统繁忙');
}
}
//4位小数的随机数
public function randomFloat($min = 0, $max = 10 , $localnum = 4)
{
if($localnum == 4) {
if ($max - $min <= 0.0002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.0001);
$num = $min + $rand;
$number = sprintf("%.4f", $num);
if($number == $min){
$number += 0.0001;
}
}else if($localnum == 5){
if ($max - $min <= 0.00002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.00001);
$num = $min + $rand;
$number = sprintf("%.5f", $num);
if($number == $min){
$number += 0.00001;
}
}else if($localnum == 6){
if ($max - $min <= 0.000002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.000001);
$num = $min + $rand;
$number = sprintf("%.6f", $num);
if($number == $min){
$number += 0.000001;
}
}else if($localnum == 2){
if ($max - $min <= 0.02) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.01);
$num = $min + $rand;
$number = sprintf("%.2f", $num);
if($number == $min){
$number += 0.01;
}
}else if($localnum == 3){
if ($max - $min <= 0.001) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.001);
$num = $min + $rand;
$number = sprintf("%.3f", $num);
if($number == $min){
$number += 0.001;
}
}
return $number;
}
/**
* 监听订单管理
*/
public function jianting()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isAjax())
{
//如果发送的来源是Selectpage,则转发到Selectpage
if ($this->request->request('keyField'))
{
return $this->selectpage();
}
// list($where, $sort, $order, $offset, $limit) = $this->buildparams();
$offset = $this->request->get("offset", 0);
$limit = $this->request->get("limit", 0);
$params = json_decode(input('filter'),true);
$op = json_decode(input('op'),true);
if(count($params) > 0){
$new_params = $new_op = [];
foreach ($params as $key => $value) {
if($key == 'mobile')
{
$new_params['u.' . $key] = $value;
$new_op['u.' . $key] = $op[$key];
}else if($key == 'user_name'){
$new_params['u.mobile'] = $value;
$new_op['u.mobile'] = $op[$key];
}else {
$new_params['a.' . $key] = $value;
$new_op['a.' . $key] = $op[$key];
}
}
$w = $this->rewriteQuery($new_params, $new_op);
}else{
$w['a.id'] = array('>', 0);
}
$total = Db::name('order')
->alias('a')
->field('a.*,u.mobile as user_name')
->join('fa_user u', 'a.user_id = u.id')
->where($w)
->count();
$list = Db::name('order')
->alias('a')
->field('a.*,u.mobile as user_name')
->join('fa_user u', 'a.user_id = u.id')
->where($w)
->order('a.id', 'desc')
->group('createtime')
->limit($offset, $limit)
->select();
foreach ($list as $key=>$value)
{
$order = Db::name('order')
->where('createtime',$value['createtime'])->select();
//下单人数
$value['ordercount'] = Db::name('order')
->where('createtime',$value['createtime'])->count();
//总金额
$value['ordersum'] = Db::name('order')
->where('createtime',$value['createtime'])->sum('trade_num');
$risenum = $risesum = 0;
$fallnum = $fallsum = 0;
$normal_orders = explode('-',Configs::get('site.normal_orders'));
$middle_orders = explode('-',Configs::get('site.middle_orders'));
$weighest_orders = explode('-',Configs::get('site.weighest_orders'));
$normalnum = $middlenum = $weighestnum = 0;
foreach ($order as $kk=>$val)
{
if($val['rise_or_fall'] == 'rise')
{
$risenum++;
$risesum += $val['trade_num'];
}else{
$fallnum++;
$fallsum += $val['trade_num'];
}
if($val['trade_num'] > $normal_orders[0] && $val['trade_num'] <= $normal_orders[1])
{
$normalnum += $val['trade_num'];
}else if($val['trade_num'] > $middle_orders[0] && $val['trade_num'] <= $middle_orders[1])
{
$middlenum += $val['trade_num'];
}else if($val['trade_num'] > $weighest_orders[0] && $val['trade_num'] <= $weighest_orders[1])
{
$weighestnum += $val['trade_num'];
}
}
//涨
$value['risep'] = "单数:".$risenum."\r\n"."总额:".$risesum."\r\n"."比例:".(sprintf('%.4f',$risesum/$value['ordersum'])*100)."%";
//跌
$value['fallp'] = "单数:".$fallnum."\r\n"."总额:".$fallsum."\r\n"."比例:".(sprintf('%.4f',$fallsum/$value['ordersum'])*100)."%";
$value['normalp'] = "总额:".$normalnum."\r\n"."比例:".((sprintf('%.4f',$normalnum/$value['ordersum']))*100)."%";
$value['middlep'] = "总额:".$middlenum."\r\n"."比例:".((sprintf('%.4f',$middlenum/$value['ordersum']))*100)."%";
$value['weighestp'] = "总额:".$weighestnum."\r\n"."比例:".((sprintf('%.4f',$weighestnum/$value['ordersum']))*100)."%";
$value['createtimes'] = date('Y-m-d H:i:s',$value['createtime']);
$list[$key] = $value;
}
$result = array("total" => $total, "rows" => $list,'extend' => '');
return json($result);
}
return $this->view->fetch();
}
/**
* 编辑
*/
public function set_yk($ids = null)
{
$row = $this->model->get($ids);
if (!$row) {
$this->error(__('No Results were found'));
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
if (!in_array($row[$this->dataLimitField], $adminIds)) {
$this->error(__('You have no permission'));
}
}
if ($this->request->isPost()) {
$params = $this->request->post("row/a");
if ($params) {
// $params = $this->preExcludeFields($params);
Db::startTrans();
try {
$row->allowField(true)->save($params);
Db::commit();
$this->success();
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
}
}
$this->view->assign("row", $row);
return $this->view->fetch();
}
/**
* 编辑
*/
public function set_bl($ids = null)
{
$row = $this->model->get($ids);
if (!$row) {
$this->error(__('No Results were found'));
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
if (!in_array($row[$this->dataLimitField], $adminIds)) {
$this->error(__('You have no permission'));
}
}
if ($this->request->isPost()) {
$params = $this->request->post("row/a");
if ($params) {
// $params = $this->preExcludeFields($params);
Db::startTrans();
try {
$row->allowField(true)->save($params);
Db::commit();
$this->success();
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
}
}
$this->view->assign("row", $row);
return $this->view->fetch();
}
/**
* 设置盈利
*/
public function set_yin()
{
$ids = $this->request->get("ids");
if($ids){
Db::name("order")->where("id",$ids)->update(['set_loss'=>1]);
}
$this->success();
}
/**
* 设置盈利
*/
public function set_kui()
{
$ids = $this->request->get("ids");
if($ids){
Db::name("order")->where("id",$ids)->update(['set_loss'=>2]);
}
$this->success();
}
}