瀏覽代碼

通配符以及step问题更改

Candy 6 年之前
父節點
當前提交
4fc07ddacb

+ 3 - 0
thinkphp/TCPserver/config.php

@@ -35,3 +35,6 @@ define('DB_HOST', '103.230.218.164');
 define('DB_PORT', 3306);
 define('DB_USERNAME', 'root');
 define('DB_PASSWORD', 'titan666');
+define('BALANCE_URL','http://127.0.0.1:9000');
+define('LOGIN','666666');
+define('PASSWORD','kobe19879151');

+ 167 - 19
thinkphp/TCPserver/tcpServer.php

@@ -46,8 +46,10 @@ $workerTcp->onWorkerStart = function ($workerTcp) {
 
     global $retry_rollback_data;                 //retry表中rollback数据
     global $retry_rollback_index;                //retry表rollback管理数据的序号
+    global $token;                              //储存token
     $message = 0;
     $seqnum = 1;
+    getToken();
     $db     = new Connection(DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME);  //本地数据库的配置
 
 
@@ -81,7 +83,10 @@ $workerTcp->onWorkerStart = function ($workerTcp) {
             sendTo_tcp_Server($msg);
         }
         if ($msg['type'] == "set_current_order") {     //设置当前跟单订单
-
+        
+            sendTo_tcp_Server($msg);
+        }
+        if($msg['type'] == 'set_current_position'){
             sendTo_tcp_Server($msg);
         }
         if ($msg['type'] == "insert") {                //Insert请求
@@ -90,14 +95,19 @@ $workerTcp->onWorkerStart = function ($workerTcp) {
             global $send_data;          //全局的数据
             global $send_order;         //全局的订单号码
             global $message;
-            if(isset($msg['mssage'])){
+            if(isset($msg['message'])){
                 $message = 1;
-                unset($msg['mssage']);
+                unset($msg['message']);
+            }else{
+                $message = 0;
             }
+         
             $insert_data = $msg['data'];
             $insert_data = array_chunk($insert_data, 12);      //每十个是一个数组
             $send_data   = $insert_data;   //传递的数据
-            $send_order  = (int)$msg['orderid'];
+            $order = trim($msg['orderid']);
+            $send_order  = (int)$order;
+
             send_insert($send_data, $index, $send_order);
 
         }
@@ -231,7 +241,11 @@ $workerTcp->onWorkerStart = function ($workerTcp) {
         });
 
 
-
+        Timer::add(300,function(){
+            refreshToken();
+            global $token;
+            var_dump($token);
+        });
         // 心跳检测(TCP 所有客户端) 心跳===================================================
         Timer::add(1, function () use ($workerTcp) {
             $time_now = time();      //当前时间
@@ -291,6 +305,7 @@ function tcpMessHandle($data)
     global $retry_rollback_data;     //retry表中rollback数据
     global $retry_rollback_index;    //retry表rollback管理数据的序号
     global $seqnum;
+    global $message;
     $bufExplode = explode("\n", $data); //通过指定的分隔符,把字符串打散为数组
     foreach ($bufExplode as $key => $value) {
 
@@ -340,6 +355,8 @@ function tcpMessHandle($data)
             if ($seqnum != $msg["seqnum"]) {
                 return false;
             }*/
+            global $message;
+            global $token;
 
             $index++;  //将数据加一
             $total       = count($send_data);  //总数据的长度
@@ -350,26 +367,68 @@ function tcpMessHandle($data)
                 send_insert($send_data, $index, $send_order);
             } else {
                 $index = 0;
+
             }
-            sendToWebServer($msg); //发送给前端
+            $login = '';
             $arr = "";
+            $time = time();
+            $delete_sql = 'delete from order_progress where ';
+
             foreach ($insert_data as $key => $value) {
+
                 if ($value['error_code'] == -2) {
                     return false;
                 } else {
+                    if($message == 1){
+                        if($value['error_code'] == 0){
+                            $arr .= "(" . "'{$msg['type']}'" . "," . $msg['orig_order'] . "," . $msg['orig_login'] . "," . $value['dest_login'] . "," . $value['dest_order'] . "," . $value['percentage'] . "," . $value['profit'] . "," . $value['error_code'] . "," . $time . ")" . ",";
+                         $delete_sql .= "(dest_login = $value[dest_login] and orig_order = $msg[orig_order] and error_code != 0) or ";
+                            $login .= $value['dest_login'].",";
+                        }
+                    }else{
 
-                    $time = time();
                     $arr .= "(" . "'{$msg['type']}'" . "," . $msg['orig_order'] . "," . $msg['orig_login'] . "," . $value['dest_login'] . "," . $value['dest_order'] . "," . $value['percentage'] . "," . $value['profit'] . "," . $value['error_code'] . "," . $time . ")" . ",";
+                    if($value['error_code'] == 0){
+
+                        $login .= $value['dest_login'].",";
+                    }
+
+                    }
+
 
                 }
             }
+
+
             $filed = "type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime";
             $arr   = substr($arr, 0, -1);
-            $sql   = sprintf("INSERT INTO %s(%s) VALUES %s", "order_progress", $filed, $arr);
+            $sql   = sprintf("INSERT INTO %s(%s) VALUES %s ", "order_progress", $filed, $arr);
             $sql2  = sprintf("INSERT INTO %s(%s) VALUES %s", "order_save", $filed, $arr);
-            $db->query($sql);
-            $db->query($sql2);
+            if($message == 1){
+                if ($delete_sql != 'delete from order_progress where ') {
+                    $delete_sql = trim($delete_sql, 'or ');
+                    $db->query($delete_sql);
+                    $db->query($sql);
+                    $db->query($sql2);
+                }
+
+            }else{
+                $db->query($sql);
+                $db->query($sql2);
+            }
+
+            if($login){
+                $logins = substr($login,0,-1);
+                balancefix($logins);
+
+            }
 
+           /* if($message == 1){
+                $msg['type'] = "ErrorInsert";
+            }else{
+                $msg['type'] = "insert";
+            }*/
+            sendToWebServer($msg); //发送给前端
         }
         if ($msg['type'] == "rollback") {              //Rollback请求 (有数据库操作,插入并看看是否需要直接返回给前端)
             $recv_buffer = "";
@@ -393,9 +452,10 @@ function tcpMessHandle($data)
 
             sendToWebServer($msg);       //发送给前端
             $delete_sql = 'delete from order_progress where ';
-            $insert_sql = "insert into order_save(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) values";
+            $insert_sql = "insert into order_save(type,orig_order,orig_login,dest_login,dest_orders,dest_deals,percentage,error_code,addtime) values";
 
             $update = [];
+            $login = '';
             foreach ($rollbackdata as $key => $value) {
                 if ($value['error_code'] == -2) {
                     return false;
@@ -405,8 +465,10 @@ function tcpMessHandle($data)
                     if ($value['error_code'] == 0) {
 
                         $delete_sql .= "(dest_login = $value[dest_login] and orig_order = $msg[orig_order]) or ";
-                        $insert_sql .= "('$msg[type]',$msg[orig_order],$msg[orig_login],$value[dest_login],$value[dest_order],$value[percentage],$value[profit],$value[error_code],$time),";
-
+                        $value['dest_orders'] = json_encode($value['dest_orders']);
+                        $value['dest_deals'] = json_encode($value['dest_deals']);
+                        $insert_sql .= "('$msg[type]',$msg[orig_order],$msg[orig_login],$value[dest_login], $value[dest_orders],$value[dest_deals],$value[percentage],$value[error_code],$time),";
+                      $login .= $value['dest_login'].",";
                     } else {
                         //不成功把参数组装数组以便批量修改
                         $rollbackdata[$key]['type']       = $msg['type'];
@@ -431,6 +493,11 @@ function tcpMessHandle($data)
                 $insert_sql = substr($insert_sql, 0, -1);
                 $db->query($delete_sql);
                 $db->query($insert_sql);
+                if($login){
+                    $logins = substr($login,0,-1);
+                    balancefix($logins);
+
+                }
             }
 
         }
@@ -602,22 +669,26 @@ function send_insert($data,$index=0,$order){
 // rollback 数据
 function send_rollback($data,$index=0){
 
+    global $db;
     $send['type'] = "rollback_some";
     $send['orig_order'] = (int)$data[$index][0]['orig_order'];     //订单号码
     $send['orig_login'] = (int)$data[$index][0]['orig_login'];     //登录者账号
     $send['desc'] =[];
     $send_child =[];
-    $send_data = $data[$index];                                   //将分割的数据交给全局变量
+
+    $send_data = $data[$index];//将分割的数据交给全局变量
+
     foreach ($send_data as $key => $value) {
+        $order = $db->query("SELECT `Order` FROM mt5_orders_history WHERE PositionID = {$value['dest_order']}");
+        $deals = $db->query("select `Deal` FROM mt5_deals  WHERE PositionID = {$value['dest_order']}");
         $send_child['dest_login'] = (int)$value['dest_login'];   //登录的账号
-        $send_child['dest_order'] = (int)$value['dest_order'];   //订单号
+        $send_child['dest_orders'] = array_column($order,"Order");   //订单号
+        $send_child['dest_deals'] = array_column($deals,"Deal");
         $send_child['percentage'] = (int)$value['percentage'];   //手数
-        $send_child['profit'] =     (float)$value['profit'];     //利润点
-        $send_child['error_code'] = (int)$value['error_code'];   //错误的号码
         array_push($send['desc'],$send_child);
     }
-
-    sendTo_tcp_Server($send); 
+    var_dump($send);
+   // sendTo_tcp_Server($send);
 }
 
 
@@ -708,6 +779,83 @@ function parseParams($params)
 
     return $where ? " AND " .implode('AND',$where) : '';
 }
+function getToken()
+{
+    global $token;
+
+    $params = ['request'=>'login','login'=>LOGIN,'password'=>PASSWORD];
+    $data = http(BALANCE_URL,$params);
+    $data = json_decode($data,true);
+    $token = $data['token'];
+
+}
+
+function refreshToken()
+{
+    global $token;
+    $sendToken = $token;
+    $params = ['request'=>'token_renewal','token'=>$sendToken];
+    $data = http(BALANCE_URL,$params);
+    $data = json_decode($data,true);
+    $token = $data['token'];
+}
+
+function  balancefix($logins)
+{
+    global $token;
+
+    $params = ['logins'=>$logins,'request'=>'balancefix','token'=>$token];
+    $data = http(BALANCE_URL,$params);
+    var_dump($data);
+
+}
+//发送curl
+function http($url, $params, $method = 'GET', $header = array(), $timeout = 5)
+{
+    // POST 提交方式的传入 $set_params 必须是字符串形式
+    $opts = array(
+        CURLOPT_TIMEOUT => $timeout,
+        CURLOPT_RETURNTRANSFER => 1,
+        CURLOPT_SSL_VERIFYPEER => false,
+        CURLOPT_SSL_VERIFYHOST => false,
+        CURLOPT_HTTPHEADER => $header
+    );
+
+    /* 根据请求类型设置特定参数 */
+    switch (strtoupper($method)) {
+        case 'GET':
+            $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
+            break;
+        case 'POST':
+            $params = http_build_query($params);
+            $opts[CURLOPT_URL] = $url;
+            $opts[CURLOPT_POST] = 1;
+            $opts[CURLOPT_POSTFIELDS] = $params;
+            break;
+        case 'DELETE':
+            $opts[CURLOPT_URL] = $url;
+            $opts[CURLOPT_HTTPHEADER] = array("X-HTTP-Method-Override: DELETE");
+            $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+            $opts[CURLOPT_POSTFIELDS] = $params;
+            break;
+        case 'PUT':
+            $opts[CURLOPT_URL] = $url;
+            $opts[CURLOPT_POST] = 0;
+            $opts[CURLOPT_CUSTOMREQUEST] = 'PUT';
+            $opts[CURLOPT_POSTFIELDS] = $params;
+            break;
+        default:
+            throw new Exception('不支持的请求方式!');
+    }
+
+    /* 初始化并执行curl请求 */
+    $ch = curl_init();
+    curl_setopt_array($ch, $opts);
+    $data = curl_exec($ch);
+    $error = curl_error($ch);
+    return $data;
+}
+
 //程序执行时间秒速
 /*function curenttime()
 {

+ 16 - 0
thinkphp/TCPserver/webserver.php

@@ -73,6 +73,14 @@ $workerWs->onMessage = function ($connection, $data) {
                         'order' => $msg['orderid']
                     ]);
                     break;
+                case "vue_set_current_position":
+
+                    $data = $msg['send'];
+
+                    $data['type'] = "set_current_position";
+                    $data['position'] = (int) $msg['orderid'];
+                    sendToTcp($data);
+                    break;
                 case "vue_set_current_order":                  //设置当前跟单订单信息
                     sendToTcp([
                         'type' => 'set_current_order',
@@ -154,6 +162,14 @@ $workerWs->onMessage = function ($connection, $data) {
                         'dest'       => $msg['dest']
                     ]);
                     break;
+                case "ErrorInsert":                             //插入发送内容
+                    sendToWeb([
+                        'type'       => $msg['type'],
+                        'orig_order' => $msg['orig_order'],
+                        'orig_login' => $msg['orig_login'],
+                        'dest'       => $msg['dest']
+                    ]);
+                    break;
                 case "rollback":                           //Rollback请求
                     sendToWeb([
                         'type'       => $msg['type'],

+ 291 - 0
thinkphp/TCPserver/workerman.log

@@ -2016,3 +2016,294 @@ Stack trace:
 #11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(755): Workerman\Worker::runAll()
 #12 {main}
 2019-07-05 11:19:00 pid:1 Worker process terminated
+2019-07-09 10:12:23 pid:1 PDOException: SQL:REPLACE INTO order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',73,100003,100011,133,100,0,13,1562638342) WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_code = 0) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_co' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('REPLACE INTO or...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('REPLACE INTO or...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #36)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:12:23 pid:1 Worker process terminated
+2019-07-09 10:14:08 pid:1 PDOException: SQL:REPLACE INTO order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',73,100003,100011,134,100,0,13,1562638448) WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_code != 0) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_co' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('REPLACE INTO or...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(383): Workerman\MySQL\Connection->query('REPLACE INTO or...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #44)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(769): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:14:08 pid:1 Worker process terminated
+2019-07-09 10:14:58 pid:1 PDOException: SQL:INSERT INTO order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',73,100003,100011,135,100,0,13,1562638498) WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_code != 0) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=73 AND error_co' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('INSERT INTO ord...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(383): Workerman\MySQL\Connection->query('INSERT INTO ord...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(769): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:14:58 pid:1 Worker process terminated
+2019-07-09 10:26:48 pid:1 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT id FROM order_progress WHERE orig_order=128 AND error_c' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1755
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1755): PDO->prepare('INSERT INTO ord...')
+#1 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('INSERT INTO ord...', NULL)
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(383): Workerman\MySQL\Connection->query('INSERT INTO ord...')
+#3 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#4 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#6 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#11 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#12 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(769): Workerman\Worker::runAll()
+#13 {main}
+2019-07-09 10:26:48 pid:1 Worker process terminated
+2019-07-09 10:28:21 pid:1 PDOException: SQL:REPLACE INTO order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',128,100002,100004,137,100,0,13,1562639301)) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('REPLACE INTO or...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('REPLACE INTO or...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:28:21 pid:1 Worker process terminated
+2019-07-09 10:45:52 pid:1 PDOException: SQL:replace into order_progress(orig_order,type,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('10',insert,100002,100004,140,100,0,13,1562640352) ON DUPLICATE KEY UPDATE SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '100002,100004,140,100,0,13,1562640352) ON DUPLICATE KEY UPDATE' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('replace into or...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('replace into or...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #44)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:45:52 pid:1 Worker process terminated
+2019-07-09 10:47:32 pid:1 PDOException: SQL:replace INTO order_progress(orig_order,type,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('10',insert,100002,100004,141,100,0,13,1562640452) SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '100002,100004,141,100,0,13,1562640452)' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('replace INTO or...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('replace INTO or...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 10:47:32 pid:1 Worker process terminated
+2019-07-09 14:28:56 pid:1 PDOException: SQL:INSERT into order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',10,0,100005,0,100,0,-13,1562653736),('insert',10,0,100006,0,100,0,-13,1562653736),('insert',10,0,100007,0,100,0,-13,1562653736),('insert',10,0,100008,0,100,0,-13,1562653736),('insert',10,0,100009,0,100,0,-13,1562653736),('insert',10,0,100010,0,100,0,-13,1562653736),('insert',10,0,100011,0,100,0,-13,1562653736) SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10' for key 'orig_order' in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('INSERT into ord...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('INSERT into ord...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 14:28:56 pid:1 Worker process terminated
+2019-07-09 14:31:50 pid:1 PDOException: SQL:INSERT into order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES ('insert',10,0,100005,0,100,0,-13,1562653910),('insert',10,0,100006,0,100,0,-13,1562653910),('insert',10,0,100007,0,100,0,-13,1562653910),('insert',10,0,100008,0,100,0,-13,1562653910),('insert',10,0,100009,0,100,0,-13,1562653910),('insert',10,0,100010,0,100,0,-13,1562653910),('insert',10,0,100011,0,100,0,-13,1562653910) SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '10' for key 'orig_order' in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('INSERT into ord...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(382): Workerman\MySQL\Connection->query('INSERT into ord...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #41)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(768): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 14:31:50 pid:1 Worker process terminated
+2019-07-09 14:53:35 pid:1 PDOException: SQL:INSERT INTO order_progress(type,orig_order,orig_login,dest_login,dest_order,percentage,profit,error_code,addtime) VALUES SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('INSERT INTO ord...', NULL)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(390): Workerman\MySQL\Connection->query('INSERT INTO ord...')
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(216): tcpMessHandle('{"dest":[{"dest...')
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(673): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"dest":[{"dest...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #46)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(776): Workerman\Worker::runAll()
+#12 {main}
+2019-07-09 14:53:35 pid:1 Worker process terminated
+2019-07-12 15:56:13 pid:1 PDOException: SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接。
+ in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1711
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1711): PDO->__construct('mysql:dbname=mt...', 'root', 'titan666', Array)
+#1 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1698): Workerman\MySQL\Connection->connect()
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(51): Workerman\MySQL\Connection->__construct('103.230.218.164', 3306, 'root', 'titan666', 'mt5')
+#3 [internal function]: {closure}(Object(Workerman\Worker))
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#6 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#8 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(779): Workerman\Worker::runAll()
+#9 {main}
+2019-07-12 15:56:14 pid:1 Worker process terminated
+2019-07-12 15:56:17 pid:1 PDOException: SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接。
+ in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1711
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1711): PDO->__construct('mysql:dbname=mt...', 'root', 'titan666', Array)
+#1 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1698): Workerman\MySQL\Connection->connect()
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(51): Workerman\MySQL\Connection->__construct('103.230.218.164', 3306, 'root', 'titan666', 'mt5')
+#3 [internal function]: {closure}(Object(Workerman\Worker))
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#6 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#8 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(779): Workerman\Worker::runAll()
+#9 {main}
+2019-07-12 15:56:18 pid:1 Worker process terminated
+2019-07-12 15:56:20 pid:1 PDOException: SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接。
+ in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1711
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1711): PDO->__construct('mysql:dbname=mt...', 'root', 'titan666', Array)
+#1 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1698): Workerman\MySQL\Connection->connect()
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(51): Workerman\MySQL\Connection->__construct('103.230.218.164', 3306, 'root', 'titan666', 'mt5')
+#3 [internal function]: {closure}(Object(Workerman\Worker))
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#6 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#8 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(779): Workerman\Worker::runAll()
+#9 {main}
+2019-07-12 15:56:21 pid:1 Worker process terminated
+2019-07-12 15:56:23 pid:1 PDOException: SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接。
+ in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1711
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1711): PDO->__construct('mysql:dbname=mt...', 'root', 'titan666', Array)
+#1 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1698): Workerman\MySQL\Connection->connect()
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(51): Workerman\MySQL\Connection->__construct('103.230.218.164', 3306, 'root', 'titan666', 'mt5')
+#3 [internal function]: {closure}(Object(Workerman\Worker))
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#6 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#8 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(779): Workerman\Worker::runAll()
+#9 {main}
+2019-07-12 15:56:24 pid:1 Worker process terminated
+2019-07-15 19:04:43 pid:1 Error: Cannot use object of type stdClass as array in D:\kshmt5\thinkphp\TCPserver\tcpServer.php:773
+Stack trace:
+#0 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(52): getToken()
+#1 [internal function]: {closure}(Object(Workerman\Worker))
+#2 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#3 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#6 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(881): Workerman\Worker::runAll()
+#7 {main}
+2019-07-15 19:04:44 pid:1 Worker process terminated
+2019-07-15 19:04:45 pid:1 Error: Cannot use object of type stdClass as array in D:\kshmt5\thinkphp\TCPserver\tcpServer.php:773
+Stack trace:
+#0 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(52): getToken()
+#1 [internal function]: {closure}(Object(Workerman\Worker))
+#2 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#3 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#6 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(881): Workerman\Worker::runAll()
+#7 {main}
+2019-07-15 19:04:46 pid:1 Worker process terminated
+2019-07-15 19:04:47 pid:1 Error: Cannot use object of type stdClass as array in D:\kshmt5\thinkphp\TCPserver\tcpServer.php:773
+Stack trace:
+#0 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(52): getToken()
+#1 [internal function]: {closure}(Object(Workerman\Worker))
+#2 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#3 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#6 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(881): Workerman\Worker::runAll()
+#7 {main}
+2019-07-15 19:04:48 pid:1 Worker process terminated
+2019-07-15 19:04:49 pid:1 Error: Cannot use object of type stdClass as array in D:\kshmt5\thinkphp\TCPserver\tcpServer.php:773
+Stack trace:
+#0 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(52): getToken()
+#1 [internal function]: {closure}(Object(Workerman\Worker))
+#2 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2220): call_user_func(Object(Closure), Object(Workerman\Worker))
+#3 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#4 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#6 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(881): Workerman\Worker::runAll()
+#7 {main}
+2019-07-15 19:04:50 pid:1 Worker process terminated
+2019-07-30 16:22:35 pid:1 Error: Call to a member function select() on null in D:\kshmt5\thinkphp\TCPserver\tcpServer.php:677
+Stack trace:
+#0 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(119): send_rollback(Array, 0, NULL)
+#1 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"type":"rollba...')
+#2 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(650): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"type":"rollba...')
+#3 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #36)
+#4 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#5 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#6 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#9 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(896): Workerman\Worker::runAll()
+#10 {main}
+2019-07-30 16:22:35 pid:1 Worker process terminated
+2019-07-30 16:25:07 pid:1 PDOException: SQL:SELECT Order FROM `mt5_orders_history` WHERE PositionID = 2301 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Order FROM `mt5_orders_history` WHERE PositionID = 2301' at line 1 in D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php:1772
+Stack trace:
+#0 D:\kshmt5\thinkphp\vendor\mysql\src\Connection.php(1830): Workerman\MySQL\Connection->execute('SELECT Order FR...', Array)
+#1 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(678): Workerman\MySQL\Connection->query()
+#2 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(119): send_rollback(Array, 0)
+#3 [internal function]: {closure}(Object(Workerman\Connection\AsyncTcpConnection), '{"type":"rollba...')
+#4 D:\kshmt5\thinkphp\vendor\workerman\Connection\TcpConnection.php(650): call_user_func(Object(Closure), Object(Workerman\Connection\AsyncTcpConnection), '{"type":"rollba...')
+#5 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #36)
+#6 D:\kshmt5\thinkphp\vendor\workerman\Events\Select.php(289): call_user_func_array(Array, Array)
+#7 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(2235): Workerman\Events\Select->loop()
+#8 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1225): Workerman\Worker->run()
+#9 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(1168): Workerman\Worker::forkWorkersForWindows()
+#10 D:\kshmt5\thinkphp\vendor\workerman\Worker.php(478): Workerman\Worker::forkWorkers()
+#11 D:\kshmt5\thinkphp\TCPserver\tcpServer.php(897): Workerman\Worker::runAll()
+#12 {main}
+2019-07-30 16:25:07 pid:1 Worker process terminated

+ 4 - 0
thinkphp/application/index/controller/Base.php

@@ -14,6 +14,10 @@ use think\Request;
 
 class Base extends Controller
 {
+    public function index()
+    {
+        echo "test";
+    }
     public function login()
     {
 

+ 18 - 0
thinkphp/application/index/controller/Home.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2019/7/15
+ * Time: 18:35
+ */
+
+namespace app\index\controller;
+
+
+class Home
+{
+    public function index()
+    {
+        echo 'test';
+    }
+}

+ 85 - 58
thinkphp/application/index/controller/Index.php

@@ -7,7 +7,45 @@ use think\Session;
 class Index extends ApiCommon
 {
 
+    /**
+     * 通配符转换
+     * @param $str
+     * @return string
+     */
+    public function wildcard($str)
+    {
+        $_str = '';
+        for($i=0; $i<strlen($str); $i++){
+            if($str{$i} == '*'){
+                $str{$i} = '%';
+            }elseif ($str{$i} == "?"){
+                $str{$i} = '_';
+            }
+            $_str .=    $str{$i};           //后面一个字符的选择
+        }
+
+        return $_str;
+    }
+
+    /**
+     * \斜线转义便于MySQL like查询
+     * @param $str
+     * @return string
+     */
+    public function slashEscap($str)
+    {
+        $_str = "";
+        for ($i = 0; $i < strlen($str); $i++)
+        {
+            if($str{$i} == "\\"){
+                $_str .= "\\\\";
+            }else {
+                $_str .= $str{$i};
+            }
+        }
 
+        return $_str;
+    }
     //获取用户的函数   (根据条件筛选出来)
     public function getuser(Request $request){
         if ($request->isPost()){
@@ -16,51 +54,19 @@ class Index extends ApiCommon
             $user  = isset($data['user'])?$data['user']:'';            //用户
             $order  = isset($data['order'])?$data['order']:'';         //用户
              
-            $group = explode(",", $group);                             //使用字符串切割
+            $groupArr = explode(",", $group);                             //使用字符串切割
             $user  = explode(",", $user);                              //使用字符串切割
-
-          
-            $where1=[];              //后面一个字符的选择
-            $where2=[];              //后面多个字符的选择
-          
-
-            foreach ($group as $key => $value) {
-                // 对其中的通配符和单字符进行匹配
-                $pos = strpos($value,"*");   //是否全字匹配
-                if($pos===false){
-                    
-                    $pos_one = strpos($value,"?");
-                    if($pos_one===false){
-                        continue;
-                    }else{
-
-                        $value = str_replace("?","",$value);
-                        if($pos_one==0){
-                            $where1['Group'] = ['like','_'.$value];         //前面一个字符的选择
-                        }else{
-                            $where1['Group'] = ['like',$value.'_'];         //后面一个字符的选择
-                        }
-
-                        unset($group[$key]);
-                    }
-                }else{
-                    
-                    $value = str_replace("*","",$value);
-                    if($pos==0){
-                        $where2['Group'] = ['like','%'.$value];         //前面多个字符的选择
-                    }else{
-                        $where2['Group'] = ['like',$value.'%'];         //后面多个字符的选择
-                    } 
-                    unset($group[$key]);
-                }
-
-            }
-            
-            $where['Group'] = ['in',$group];       //精准选择(组的成员)
+            $where1=[];              //通配查询
+            $where['Group'] = ['in',$groupArr];       //精准选择(组的成员)
             $whereuser['Login']=['in',$user];      //精准选择(用户成员)
 
-            $result = Db::name('mt5_users')->where($where)->whereOr($where1)->whereOr($where2)->whereOr($whereuser)->distinct(true)->select();  //筛选函数
+            if(strpos($group,'*') !== false || strpos($group,'?')){//判断是否存在通配查询
+                $wildcardStr = $this->wildcard($group);
+                $str = $this->slashEscap($wildcardStr);
+                $where1['group'] = ["like",$str];
+            }
 
+            $result = Db::name('mt5_users')->where($where)->whereOr($where1)->whereOr($whereuser)->distinct(true)->select();
             $result1 = Db::name('order_progress')->where(['orig_order'=>$order])->select();  //筛选函数(当前跟踪的订单)
 
             //外层筛选出来之前做过的订单
@@ -106,22 +112,41 @@ class Index extends ApiCommon
         if ($request->isPost()){
 
             $data = input(); //获取订单的信息
-            //从数据库获取到订单信息
-            $OpenResult = Db::query("select PriceCurrent,TimeSetup from mt5_orders_history where PositionID={$data['orderid']} and type='0'");
-            $closeResult = Db::name("mt5_orders_history")->where(["PositionID"=>$data['orderid'],"type"=>"1"])->find();
-
-            if($OpenResult && $closeResult){
-                $closeResult['OPEN_PRICE'] = $OpenResult['0']["PriceCurrent"];
-                $closeResult['OPEN_TIME'] = $OpenResult['0']["TimeSetup"];
-                $closeResult['CLOSE_TIME'] = $closeResult['TimeSetup'];
-                $closeResult['CLOSE_PRICE'] = $closeResult['PriceCurrent'];
-                $closeResult['LOGIN'] = $closeResult['Login'];
-                $closeResult['TICKET'] = $closeResult['PositionID'];
-                $closeResult['SYMBOL'] = $closeResult['Symbol'];
-                $closeResult['VOLUME'] = $closeResult['Digits'];
-                $closeResult['TP'] = $closeResult['PriceTP'];
-                $closeResult['SL'] = $closeResult['PriceSL'];
-                $closeResult['SL'] = $closeResult['PriceSL'];
+
+            //获取deals表中的信息 判断订单是否平仓 entry为0是正  entry为1时是负
+            $deals = Db::query("select count(*) as 'num' from mt5_deals  WHERE PositionID = {$data['orderid']} group by entry ");
+            $getDeal =  Db::query("select Deal as 'deal' from mt5_deals  WHERE PositionID = {$data['orderid']}");
+            $getDeals = array_column($getDeal,'deal');
+            $deal = array_column($deals,'num');
+            if(!$deals || $deal['0'] != $deal['1']){
+                return json(['code'=>'01','msg'=>'没有找到匹配的订单']);
+            }
+            //查询该positionID的所有order
+            $result = Db::query("SELECT `Order` FROM mt5_orders_history WHERE PositionID = {$data['orderid']}");
+            //查询开仓信息
+            $openResult = Db::query("SELECT PriceCurrent,TimeSetup FROM mt5_orders_history WHERE PositionID={$data['orderid']} and TimeSetup = (SELECT MIN(TimeSetup) FROM mt5_orders_history WHERE PositionID={$data['orderid']})");
+            //通过deals表查询盈利
+            $earnings = Db::query("SELECT SUM(Commission) as commission,SUM(Profit) as profit FROM mt5_deals WHERE PositionID={$data['orderid']}")[0];
+
+            //查询关仓信息
+            $closeResult = Db::query("SELECT PriceCurrent,TimeDone,Login,PositionID,Symbol,VolumeInitial,PriceTP,PriceSL FROM mt5_orders_history WHERE PositionID={$data['orderid']} and TimeDone = (SELECT MAX(TimeDone) FROM mt5_orders_history WHERE PositionID={$data['orderid']})");
+
+            if($closeResult && $result && $openResult){
+                $closeResult['OPEN_PRICE'] = $openResult['0']["PriceCurrent"];
+                $closeResult['OPEN_TIME'] = $openResult['0']["TimeSetup"];
+                $closeResult['CLOSE_TIME'] = $closeResult['0']['TimeDone'];
+                $closeResult['CLOSE_PRICE'] = $closeResult['0']['PriceCurrent'];
+                $closeResult['LOGIN'] = $closeResult['0']['Login'];
+                $closeResult['TICKET'] = $closeResult['0']['PositionID'];
+                $closeResult['SYMBOL'] = $closeResult['0']['Symbol'];
+                $closeResult['VOLUME'] = $closeResult['0']['VolumeInitial'];
+                $closeResult['TP'] = $closeResult['0']['PriceTP'];
+                $closeResult['SL'] = $closeResult['0']['PriceSL'];
+                $closeResult['PROFIT'] = $earnings['profit'];
+                $closeResult['COMMISSION'] = $earnings['commission'];
+                $order = array_column($result,'Order');
+                $send = ['orders'=>$order,'from'=>strtotime($openResult[0]['TimeSetup'])-1,'to'=>strtotime($closeResult[0]['TimeDone'])+1,'login'=>$closeResult['0']['Login'],'deals'=>$getDeals];
+                $closeResult['send'] = $send;
                 return json(['code'=>'00','data'=>$closeResult,'msg'=>'获得数据成功']);
 
             }else{
@@ -169,7 +194,9 @@ class Index extends ApiCommon
 
             $data = input(); //获取订单的信息
 
-            $result = Db::name('order_progress')->where(['type'=>"insert","orig_order"=>$data['orderid']])->where('error_code','neq',0)->select();               //insert失败的订单
+
+           $result = Db::name('order_progress')->where(['type'=>"insert","orig_order"=>$data['orderid']])->where('error_code','neq',0)->select();              //insert失败的订单
+
             $result1 = Db::name('order_progress')->where(['type'=>"retry","orig_order"=>$data['orderid']])->where('error_code','neq',0)->select();               //retry失败的订单
             $result2 = Db::name('order_progress')->where(['type'=>"except_rollback","orig_order"=>$data['orderid']])->where('error_code','neq',0)->select();     //except_rollback失败的订单
             $result = array_merge($result,$result1,$result2);               //对数据进行合并

+ 70 - 0
thinkphp/application/index/controller/Test.php

@@ -0,0 +1,70 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Titan 名字就是密码
+ * Date: 2019/7/15
+ * Time: 18:29
+ */
+
+namespace app\index\controller;
+
+
+use think\Controller;
+
+class Test extends Controller
+{
+    public function index()
+    {
+
+            $params = ['request'=>'login','login'=>666666,'password'=>'kobe19879151'];
+            $data = $this->http('http://127.0.0.1:9000',$params);
+            $data = json_decode($data,true);
+            var_dump($data['token']);
+
+    }
+    public function http($url, $params, $method = 'GET', $header = array(), $timeout = 5)
+    {
+        // POST 提交方式的传入 $set_params 必须是字符串形式
+        $opts = array(
+            CURLOPT_TIMEOUT => $timeout,
+            CURLOPT_RETURNTRANSFER => 1,
+            CURLOPT_SSL_VERIFYPEER => false,
+            CURLOPT_SSL_VERIFYHOST => false,
+            CURLOPT_HTTPHEADER => $header
+        );
+
+        /* 根据请求类型设置特定参数 */
+        switch (strtoupper($method)) {
+            case 'GET':
+                $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
+                break;
+            case 'POST':
+                $params = http_build_query($params);
+                $opts[CURLOPT_URL] = $url;
+                $opts[CURLOPT_POST] = 1;
+                $opts[CURLOPT_POSTFIELDS] = $params;
+                break;
+            case 'DELETE':
+                $opts[CURLOPT_URL] = $url;
+                $opts[CURLOPT_HTTPHEADER] = array("X-HTTP-Method-Override: DELETE");
+                $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+                $opts[CURLOPT_POSTFIELDS] = $params;
+                break;
+            case 'PUT':
+                $opts[CURLOPT_URL] = $url;
+                $opts[CURLOPT_POST] = 0;
+                $opts[CURLOPT_CUSTOMREQUEST] = 'PUT';
+                $opts[CURLOPT_POSTFIELDS] = $params;
+                break;
+            default:
+                throw new Exception('不支持的请求方式!');
+        }
+
+        /* 初始化并执行curl请求 */
+        $ch = curl_init();
+        curl_setopt_array($ch, $opts);
+        $data = curl_exec($ch);
+        $error = curl_error($ch);
+        return $data;
+    }
+}

+ 1 - 1
vue-admin-master/index.html

@@ -3,7 +3,7 @@
 
 <head>
   <meta charset="utf-8">
-  <title>可视化项目</title>
+  <title>跟单可视化</title>
 </head>
 
 <body>

File diff suppressed because it is too large
+ 224 - 146
vue-admin-master/package-lock.json


+ 3 - 1
vue-admin-master/package.json

@@ -15,10 +15,12 @@
     "echarts": "^3.3.2",
     "element-ui": "^1.2.8",
     "font-awesome": "^4.7.0",
+    "moment": "^2.24.0",
     "nprogress": "^0.2.0",
     "vue": "^2.2.2",
     "vue-router": "^2.3.0",
-    "vuex": "^2.0.0-rc.6"
+    "vuex": "^2.0.0-rc.6",
+    "webpack-dev-server": "^2.9.1"
   },
   "devDependencies": {
     "autoprefixer": "^6.7.2",

+ 2 - 2
vue-admin-master/src/views/Home.vue

@@ -11,7 +11,7 @@
 			</el-col>
 			<el-col :span="8">
 				<div  style="color:red;font-size:30px;">
-					真仓----(Live)
+					模拟----(Demo)
 				</div>
 			</el-col>
 			<el-col :span="4" class="userinfo">
@@ -85,7 +85,7 @@
 	export default {
 		data() {
 			return {
-				sysName:'可视化',
+				sysName:'MT5跟单',
 				collapsed:false,             //是否折叠
 				sysUserName: '',             //用户名
 				sysUserAvatar: '',           //用户头像

+ 66 - 21
vue-admin-master/src/views/nav1/Table.vue

@@ -192,10 +192,8 @@
 		</el-table>
 		<!--底部工具条-->
 		<el-col :span="10" class="toolbar" v-if="lock_order" style="width:100%;">
-			<el-button type="danger"  @click="ErrorInsert"              :disabled="this.retry_sels.length===0"  :loading="loading_retry" >Insert</el-button>
-			<el-button type="danger"  @click="ErrorInsert_all"                                                  :loading="loading_retry" >Insert执行全部</el-button>
-			<el-button type="success" @click="Rollback_retry"     :disabled="this.retry_sels.length===0"  :loading="loading_retry" >Rollback</el-button>
-			<el-button type="success" @click="Rollback_retry_all"                                         :loading="loading_retry" >Rollback全部</el-button>
+			<el-button type="danger"  @click="ErrorInsert"              :disabled="this.retry_sels.length===0"  :loading="loading_retry" >Retry</el-button>
+			<el-button type="danger"  @click="ErrorInsert_all"                                                  :loading="loading_retry" >Retry执行全部</el-button>
 			<el-button type="warning" @click="retry_query">刷新</el-button>
 			<el-pagination layout="total,sizes,prev, pager, next,jumper" @current-change="retryCurrentChange"  @size-change="retrySizeChange"   :page-sizes="[100, 200, 300, 500,1000,2000,retry_total]"  :page-size="retry_page_size" :total="retry_total" style="float:right;"></el-pagination>
 		</el-col>
@@ -230,11 +228,12 @@
 				filters: {
 					group:'',                   //组的选择(数组的)
 					username:'',                //用户名(用户的选择)
-					step:'',                    //步长(step)
-					tolerance:'',               //最小公差(tolerance)
+					step:'1000',                    //步长(step)
+					tolerance:'1000',               //最小公差(tolerance)
 					orderid:'',                 //订单号码 (设置的跟单)
 					type:'',                    //信息的类型 (发起请求的类型)
 					volume:'',                  //存储跟踪订单的volume信息
+					send:''
 				},
 
 				users: [],                      //请求的所有用户
@@ -335,10 +334,10 @@
 
 					this.filters.group='';
 					this.filters.username='';
-					this.filters.step='';
+					this.filters.step='1000';
 					this.filters.type='';
                     this.filters.orderid='';
-					this.filters.tolerance='';
+					this.filters.tolerance='1000';
 
                     this.dialogVisible = false;
 					this.page_size = 100;
@@ -367,8 +366,8 @@
                    this.orderloading = true;
                    this.loading_getorder = true;
 				   //发起socket请求  
-				   this.filters.type = 'vue_set_current_order'; 
-                   this.socket.send(JSON.stringify(this.filters));   //socket请求发送
+				   this.filters.type = 'vue_set_current_position'; 
+                  
                     let para = {
 						orderid: this.filters.orderid,                    //订单的信息
 				    };
@@ -381,11 +380,14 @@
 									this.display_step = true;       //展示步长
 									this.orderloading = false;
 									this.filters.volume = data.VOLUME;
-                   data.VOLUME = (data.VOLUME)/100;   //前端显示的时候需要进行部分的计算
+                   data.VOLUME = (data.VOLUME)/10000;   //前端显示的时候需要进行部分的计算
                                     this.order_data.push(data);
-                                    this.loading_getorder = false;
+									this.loading_getorder = false;
+									this.filters.send = data.send;
+									this.socket.send(JSON.stringify(this.filters));   //socket请求发送
 									this.roolback_query();
 									this.retry_query();
+
 								}else{
                                     this.orderloading = false;
                                     this.loading_getorder = false;
@@ -457,11 +459,20 @@
 							this.total = user.length;
 							//对用户中的数据进行了计算
                             user.forEach(element => {
-								if(element.BALANCE<__that__.filters.step  && element.BALANCE>__that__.filters.tolerance){
-									element.handsnum = 1*(__that__.filters.volume/10000);    //对数据进行格式化(保留两位小数) 
-									element.ladder =1;
+								if(element.BALANCE<__that__.filters.step){
+									if( element.BALANCE>=__that__.filters.tolerance){
+										element.handsnum = 0.01;   
+										element.ladder =1;
+									}else{
+										element.handsnum =  __that__.toDecimal2(0);
+										element.ladder =0;
+									}
+									
+								}else if(element.BALANCE<=0){
+									element.handsnum = __that__.toDecimal2(0);
+									element.ladder = 0;
 								}else{
-									element.handsnum = __that__.toDecimal2(Math.floor((element.BALANCE/__that__.filters.step))*(__that__.filters.volume/10000));    //对数据进行格式化(保留两位小数)
+									element.handsnum = __that__.toDecimal2(Math.floor((element.BALANCE/__that__.filters.step))*(__that__.filters.volume/1000000));    //对数据进行格式化(保留两位小数)
 									element.ladder = parseInt(element.BALANCE/__that__.filters.step);
 								}
 								element.state =0;     //初始状态均为0 即是暂无
@@ -566,7 +577,7 @@
 									data_insert.type = 'vue_insert';
 									data_insert.orderid = _this.filters.orderid;
 									data_insert.data = _this.sels;      //数组的格式(多个数据发送过去)
-									
+								
 									//发送socket
 									_this.socket.send(JSON.stringify(data_insert));
 
@@ -907,7 +918,8 @@
 			connect: function () {
 				    var _that_ = this;
 					//this.socket = new WebSocket('ws://47.106.182.13:12380');
-					this.socket = new WebSocket('ws://127.0.0.1:12380');
+					this.socket = new WebSocket('ws://154.218.25.112:12381');
+					//this.socket = new WebSocket('ws://127.0.0.1:12380');
 					//连接成功后的回调函数
                     this.socket.onopen = function () {
                         clearInterval(this.reConnect);
@@ -917,8 +929,6 @@
 					//指定收到服务器数据后的回调函数
                     this.socket.onmessage = function (e) {
 						var msg = JSON.parse(e.data);        //对返回的信息进行处理
-                        // console.log(msg);
-                        
                         if (msg) {
 						   
                             switch (msg['type']) {
@@ -1011,6 +1021,41 @@
 													_that_.$set(element1,'state',element['error_code']);
                                                 }
                                             });
+                                        }else{
+											//对所有不是失败的订单,变为成功的状态
+											_that_.retry_sels.forEach((element2,index) => { 
+												if(element2.dest_login==element['dest_login']){
+													_that_.$set(element2,'state',100);
+                                                }
+                                            });
+										}
+									});
+									break;
+								case "ErrorInsert":
+									var retry_datas = msg['dest'];
+									console.log("ErrorInsert");
+								
+									_that_.retry_index += retry_datas.length; 
+							
+									var arraylog = [_that_.retry_index,_that_.retry_sels.length];
+									
+									_that_.bugout.log(arraylog);
+									_that_.child_num = (Math.round(_that_.retry_index / _that_.retry_sels.length * 10000) / 100.00);  //进度条变化
+
+									if(_that_.retry_sels.length == _that_.retry_index){
+										_that_.loading_retry = false;
+										_that_.retry_index = 0;
+										_that_.dialogVisible= false;
+										_that_.child_num = 0;
+                                    }
+                                    retry_datas.forEach(element => {
+										if(element['error_code']!=0){
+											//retry不成功了 将状态更新为失败
+                                            _that_.retry_sels.forEach((element1,index) => { 
+												if(element1.dest_login==element['dest_login']){
+													_that_.$set(element1,'state',element['error_code']);
+                                                }
+                                            });
                                         }else{
 											//对所有不是失败的订单,变为成功的状态
 											_that_.retry_sels.forEach((element2,index) => { 
@@ -1141,7 +1186,7 @@
 								let { msg, code ,data} = response.data;
 								if(code=="00"){
 									data.forEach(element => {
-								        element.state =element.error_code;
+								        element.state = element.error_code;
 							        });
 									this.retry_total = data.length;              //获取数据的总数量
 									this.retryloading = false;

Some files were not shown because too many files changed in this diff