Initial Commit

main
Matthew 2 years ago
commit abdacbba38

@ -0,0 +1,48 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$fileId = isset($_GET['id']) ? intval($_GET['id']) : 0;
if ($fileId === 0)
{
header("HTTP/1.1 404 Not Found");
die;
}
$sql = "SELECT * FROM mntn_uploads WHERE `id`=:fileId";
$stmt = $db->prepare($sql);
if (!$stmt->execute(array('fileId' => $fileId)))
{
error_log(print_r($stmt->errorInfo(), true));
header("HTTP/1.1 404 Not Found");
die;
}
$row = $stmt->fetch();
if (!$row)
{
header("HTTP/1.1 404 Not Found");
die;
}
$dest = $config['term_logs_root'] . $row['path'];
if (!file_exists($dest))
{
header("HTTP/1.1 404 Not Found");
die;
}
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: " . $row['file_size']);
Header("Content-Disposition: attachment; filename=" . $row['file_name']);
readfile($dest);
exit();

@ -0,0 +1,124 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$body = @file_get_contents('php://input');
$debugMode = isset($_GET['dbg']) && ($_GET['dbg'] != 0);
header ('Content-type: application/json; charset=utf-8');
$result = array('yw' => 0, 'kxt' => 0, 'sj' => 0, 'isUpgrade' => 0);
// error_log($body);
$request = json_decode($body, true);
if ($debugMode)
{
$request['id'] = 'XY-SIMULATOR-0001';
}
if (!$debugMode && !$request)
{
// $res = $stmt10->execute(array('termId' => 0, 'cmdName' => 'err1_' . time(), 'cmd' => '', 'cmdDesc' => ''));
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$sql = 'SELECT `id` FROM terminals WHERE cmdid=:cmdid';
$stmt = $db->prepare($sql);
if (!$stmt->execute(array('cmdid' => $request['id'])))
{
// $res = $stmt10->execute(array('termId' => 0, 'cmdName' => 'err2_' . time(), 'cmd' => '', 'cmdDesc' => ''));
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$term = $stmt->fetch();
if (!$term)
{
// $res = $stmt10->execute(array('termId' => 0, 'cmdName' => 'err3_' . time(), 'cmd' => '', 'cmdDesc' => ''));
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$stmt = $db->prepare("SELECT in_maintain,quick_hb FROM mntn_status WHERE term_id=:termid");
$stmt->execute(array('termid' => $term['id']));
$termStatus = $stmt->fetch();
$stmt = null;
$result['yw'] = (isset($termStatus['in_maintain']) && ($termStatus['in_maintain'] != 0)) ? 1 : 0;
$result['kxt'] = (isset($termStatus['quick_hb']) && ($termStatus['quick_hb'] != 0)) ? 1 : 0;
$sql = "SELECT * FROM mntn_cmds WHERE term_id=:termid ORDER BY id LIMIT 1";
$stmt = $db->prepare($sql);
if (!$stmt->execute(array('termid' => $term['id'])))
{
// $res = $stmt10->execute(array('termId' => 0, 'cmdName' => 'err4_' . time(), 'cmd' => print_r($stmt->errorInfo(), true), 'cmdDesc' => ''));
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$stmt = $db->prepare("INSERT INTO mntn_raw_reports(term_id, content) VALUES(:termid,:content)");
$stmt->execute(array('termid' => $term['id'], 'content' => $body));
$sql = "SELECT * FROM mntn_cmds WHERE term_id=:termid ORDER BY id LIMIT 1";
$stmt = $db->prepare($sql);
if (!$stmt->execute(array('termid' => $term['id'])))
{
// $res = $stmt10->execute(array('termId' => 0, 'cmdName' => 'err5_' . time(), 'cmd' => print_r($stmt->errorInfo(), true), 'cmdDesc' => ''));
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$rows = $stmt->fetchAll();
if (!$rows || count($rows) == 0)
{
echo json_encode($result, JSON_UNESCAPED_UNICODE);
exit();
}
$sql = "DELETE FROM mntn_cmds WHERE id=:id";
$stmt = $db->prepare($sql);
foreach ($rows as $row)
{
// kxt: quick heartbeat
$cmdData = empty($row['cmd']) ? array() : json_decode($row['cmd'], true);
if ($row['name'] == 'upgrade')
{
if (!empty($cmdData['url']))
{
$pos = strpos($cmdData['url'], '?');
if ($pos !== false)
{
$cmdData['url'] .= '?termId=' . urlencode($row['term_id']);
}
else
{
$cmdData['url'] .= '&termId=' . urlencode($row['term_id']);
}
$result['isUpgrade'] = 1;
$result['sj'] = 1;
$result['url'] = $cmdData['url'];
}
}
else
{
$result['cmd'] = $row['name'];
if (!empty($row['cmd']))
{
$result = array_merge($result, $cmdData);
}
}
if (!$debugMode)
{
$stmt->execute(array('id' => $row['id']));
}
}
// {"kxt":1,"yw":1,"sj":1,"cmd"."*,"isUpgrade":1, "url":"http://180.166.218.222:40011/ds yunWei_0826value str".vv4.2.50.apk,NN"value int:2}
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,75 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
if (isset($_FILES))
{
$termIds = array(); // cmdid => id
$paramTermId = isset($_GET['termId']) ? intval($_GET['termId']) : 0;
$sql = "INSERT INTO mntn_uploads(term_id,`file_name`,`path`,`file_size`) VALUES(:termId,:fileName,:path,:fileSize)";
$stmt = $db->prepare($sql);
$stmt2 = null;
foreach ($_FILES as $file)
{
$cmdid = '';
$pos = strpos($file['name'], '_');
if ($pos !== false)
{
$cmdid = substr($file['name'], 0, $pos);
}
$termId = $paramTermId;
if ($termId === 0)
{
if (isset($termIds[$cmdid]))
{
$termId = $termIds[$cmdid];
}
else
{
if ($stmt2 == null)
{
$sql = "SELECT `id` FROM terminals WHERE cmdid=:cmdid";
$stmt2 = $db->prepare($sql);
}
if ($stmt2->execute(array('cmdid' => $cmdid)))
{
$row = $stmt2->fetch();
if ($row)
{
$termIds[$cmdid] = $row['id'];
$termId = $row['id'];
}
}
}
}
$fileName = date('Ymd') . '_' . uniqid('log_');
$dest = $config['term_logs_root'] . $fileName;
if (!move_uploaded_file($file['tmp_name'], $dest))
{
// error_log("move_uploaded_file failed: " . $dest);
continue;
}
$res = $stmt->execute(array('termId' => $termId, 'fileName' => $file['name'], 'path' => $fileName, 'fileSize' => $file['size']));
if (!$res)
{
// error_log(print_r($stmt->errorInfo(), true));
}
}
}
$result['code'] = 0;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,156 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$action = isset($_GET['act']) ? $_GET['act'] : '';
$termId = isset($_GET['termId']) ? intval($_GET['termId']) : 0;
$termIdsStr = isset($_GET['termIds']) ? $_GET['termIds'] : '';
$mntnMode = isset($_GET['mntn']) ? intval($_GET['mntn']) : 0;
$quickHeartbeat = isset($_GET['quickhb']) ? intval($_GET['quickhb']) : 0;
if (!$termId && !$termIdsStr)
{
exit();
}
$termIds = array();
if (!empty($termIdsStr))
{
$termIds = explode('-', $termIdsStr);
}
else
{
$termIds[] = $termId;
}
$sql = "DELETE FROM mntn_cmds WHERE term_id=:termid AND `name`=:cmdName";
$stmt1 = $db->prepare($sql);
$sql = "INSERT INTO mntn_cmds(term_id,`name`,`cmd`,`desc`) VALUES(:termId,:cmdName,:cmd,:cmdDesc)";
$stmt2 = $db->prepare($sql);
$sql = "UPDATE mntn_status SET `quick_hb`=:qhb,`in_maintain`=:mntn,`mode_time`=CURRENT_TIMESTAMP() WHERE term_id=:termId";
$stmt3 = $db->prepare($sql);
header("qhb:" . $quickHeartbeat);
header("mntn:" . $mntnMode);
$result = array('code' => 0, 'data' => array());
foreach($termIds as $termId)
{
$termId = intval($termId);
$values = array('termId' => $termId, 'cmd' => '', 'cmdDesc' => '', 'cmdName' => '');
if ($action == 'reset')
{
$values['cmdName'] = 'yw_cmd_android_reboot';
}
else if ($action == 'reset-mcu')
{
$values['cmdName'] = 'yw_cmd_mcu_reboot';
}
else if ($action == 'upload-logs')
{
$values['cmdName'] = 'yw_cmd_upload_i1_zip_log';
$values['cmd'] = json_encode(array('url' => $_GET['url']));
}
else if ($action == 'set-cma')
{
$values['cmdName'] = 'i1_cmd_set_i1_server_ip_port';
$values['cmd'] = json_encode(array('value_str' => $_GET['ip'], 'value_int' => intval($_GET['port'])));
}
else if ($action == 'set-mntn-svr')
{
$values['cmdName'] = 'i1_cmd_set_xy_yw_ip_port';
$values['cmd'] = json_encode(array('value_str' => $_GET['ip'], 'value_int' => intval($_GET['port'])));
}
else if ($action == 'set-hb')
{
$values['cmdName'] = 'i1_cmd_set_i1_heart_beat_time';
$values['cmd'] = json_encode(array('value_int' => intval($_GET['hb'])));
}
else if ($action == 'upload-logs')
{
$values['cmdName'] = 'yw_cmd_upload_i1_zip_log';
$values['cmd'] = json_encode(array('url' => intval($_GET['url'])));
}
else if ($action == 'upgrade')
{
$values['cmdName'] = 'upgrade';
$md5 = empty($_GET['md5']) ? '' : $_GET['md5'];
$values['cmd'] = json_encode(array('url' => intval($_GET['url']), 'md5' => $md5));
}
else if ($action == 'start-frpc')
{
$values['cmdName'] = 'yw_cmd_start_frpc';
// $frpc['cmd_state'] = 1;
$frpc['server_addr'] = empty($_GET['server_addr']) ? '' : $_GET['server_addr'];
$frpc['server_port'] = empty($_GET['server_port']) ? '0' : intval($_GET['server_port']) . '';
$frpc['frpc_type'] = empty($_GET['frpc_type']) ? '' : $_GET['frpc_type'];
$frpc['type'] = empty($_GET['type']) ? '' : $_GET['type'];
$frpc['local_ip'] = empty($_GET['local_ip']) ? '' : $_GET['local_ip'];
$frpc['local_port'] = empty($_GET['local_port']) ? '0' : intval($_GET['local_port']) . '';
$frpc['remote_port'] = empty($_GET['remote_port']) ? '0' : intval($_GET['local_port']) . '';
$frpc_str = json_encode($frpc);
$values['cmd'] = json_encode(array('frpc' => $frpc));
}
else if ($action == 'stop-frpc')
{
$values['cmdName'] = 'yw_cmd_stop_frpc';
}
else if ($action == 'stop-aging-test')
{
$values['cmdName'] = 'i1_cmd_stop_aging_test';
}
else
{
// continue;
}
$res = $stmt3->execute(array('termId' => $termId, 'mntn' => $mntnMode, 'qhb' => $quickHeartbeat));
if (!$res)
{
print_r($stmt3->errorInfo());
}
if (!empty($action))
{
$res = $stmt1->execute(array('termid' => $termId, 'cmdName' => $values['cmdName']));
if (!$res)
{
// print_r($stmt1->errorInfo());
}
$res = $stmt2->execute($values);
if (!$res)
{
// print_r($stmt2->errorInfo());
}
}
if ($res)
{
$result['data'][] = $termId;
}
// i1_cmd_set_i1_server_ip_port //参数 value_str:ip value_int:port
// i1_cmd_set_xy_yw_ip_port //参数 value_str:ip value_int:port
// i1_cmd_set_i1_heart_beat_time ////参数 value_int:心跳间隔
}
header ('Content-type: application/json; charset=utf-8');
// $result['code'] = $res ? 0 : 1;
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,18 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$result = array('res' => 0, 'data' => array());
$stmt = $db->prepare("SELECT t1.`id`,t1.`name`,t2.`name` AS vname FROM `lines` AS t1 JOIN dy_level AS t2 ON t1.`dy_level_id`=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t2.`id`,t1.`id`");
$stmt->execute();
$result['data'] = $stmt->fetchAll();
$stmt = null;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,80 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$terminals = array();
$ts = time();
$result = array('res' => 0, 'data' => array());
$startTime = isset($_GET['st']) ? intval($_GET['st']) : ($ts - 86400);
$endTime = isset($_GET['et']) ? intval($_GET['et']) : $ts;
$lineId = isset($_GET['lineId']) ? intval($_GET['lineId']) : 0;
$stmt = $db->prepare("SELECT term_id,count(*) AS photo_count FROM terminal_photos WHERE photo_time BETWEEN ? AND ? GROUP BY term_id");
$stmt->bindValue(1 , $startTime);
$stmt->bindValue(2 , $endTime);
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
$terminal_mapper = array();
foreach ($rows as $row)
{
$terminal_mapper[$row['term_id']] = $row['photo_count'];
}
$stmt = $db->prepare("SELECT term_id,max(recv_time) AS recv_time,min(photo_time) AS min_photo_time FROM terminal_photos WHERE photo_time BETWEEN ? AND ? GROUP BY term_id");
$stmt->bindValue(1 , $startTime);
$stmt->bindValue(2 , $endTime);
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
$recv_time_mapper = array();
foreach ($rows as $row)
{
$recv_time_mapper[$row['term_id']] = $row; //['recv_time'];
}
$stmt = $db->query("SELECT term_id,count(*) AS cnt FROM terminal_basic_info_history WHERE update_time BETWEEN " . $startTime . " AND " . $endTime . " GROUP BY term_id");
$rows = $stmt->fetchAll();
foreach ($rows as $row)
{
$reboot_mapper[$row['term_id']] = $row['cnt'];
}
$lineCondtion = $lineId ? ' WHERE t3.`id`=' . $lineId : '';
$sql = "SELECT t1.id, t1.cmdid,t1.`display_name`,t1.`protocol`,t2.`name` AS tower_name,t3.`name` AS line_name, FROM_UNIXTIME(t4.last_heartbeat) AS last_heartbeat,FROM_UNIXTIME(t4.boot_time) AS boot_time FROM terminals AS t1 JOIN towers AS t2 ON t1.tower_id=t2.id JOIN `lines` AS t3 ON t2.line_id=t3.id";
$sql .= " LEFT JOIN terminal_status AS t4 ON t1.id=t4.term_id " . $lineCondtion . " ORDER BY t2.line_id,t1.cmdid";
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
$stmt = null;
foreach ($rows as $row)
{
if (!isset($terminal_mapper[$row['id']]))
{
continue;
}
$row['cnt'] = $terminal_mapper[$row['id']];
$row['reboot_cnt'] = isset($reboot_mapper[$row['id']]) ? $reboot_mapper[$row['id']] : 0;
$row['recv_time'] = isset($recv_time_mapper[$row['id']]) ? date('Y-m-d H:i:s', $recv_time_mapper[$row['id']]['recv_time']) : '';
$row['min_photo_time'] = isset($recv_time_mapper[$row['id']]) ? date('H:i:s', $recv_time_mapper[$row['id']]['min_photo_time']) : '';
$result['data'][] = $row;
}
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,94 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$result = array('res' => 0, 'data' => array());
$conditions = array();
$values = array();
if (isset($_GET['towerId']) && intval($_GET['towerId']) > 0)
{
$conditions[] = "t2.`id`=:towerid";
$values['towerid'] = intval($_GET['towerId']);
}
else if (isset($_GET['lineId']) && intval($_GET['lineId']) > 0)
{
$conditions[] = "t3.`id`=:lineid";
$values['lineid'] = intval($_GET['lineId']);
}
if (!empty($_GET['cmdid']))
{
$conditions[] = "t1.`cmdid` LIKE :cmdid";
$values['cmdid'] = '%' . $_GET['cmdid'] . '%';
}
$conditionStr = '';
if (count($conditions) > 0)
{
$conditionStr = ' WHERE ' . implode($conditions, ' AND ');
}
$sql = "SELECT t1.id, t1.cmdid,t1.`display_name`,t1.`protocol`,t2.`name` AS tower_name,t3.`name` AS line_name, t4.last_raw_report AS raw_report,FROM_UNIXTIME(t4.raw_report_time) AS last_heartbeat,t4.in_maintain,t4.quick_hb,t4.mode_time";
$sql .= " FROM terminals AS t1 JOIN towers AS t2 ON t1.tower_id=t2.id JOIN `lines` AS t3 ON t2.line_id=t3.id";
$sql .= " LEFT JOIN mntn_status AS t4 ON t1.id=t4.term_id " . $conditionStr . " ORDER BY t2.line_id,t2.`order`,t1.cmdid";
$stmt = $db->prepare($sql);
$stmt->execute($values);
$result['data'] = $stmt->fetchAll();
$stmt = null;
// "安徽欣影ds2-2x/4x,yw:0829_4.2.502, i1:ahxy_0829_4.2.502, cam:4.2.1, ai:1.1.0_1, i1服务器:47.96.238.157:6891 ,心跳间隔:1 ,
// 电池:6.3V\/0.2V\/87% ,系统重启:1 ,i1重启:13 ,收:10:52 ,拍:48\/44 ,成:44 ,败:0 ,传:44 ,
// 心跳累计:142 ,网络异常:139 ,信号1:4\/99 ,信号2:4\/99 ,卡1:898604F5122380159566,卡2: ,mcu:MTK_MCU_V3.2.5 Aug 9 2023"
$keyMapper = array('i1服务器' => 'cma', '心跳间隔' => 'heartbeatDuration', 'i1' => 'i1Version', 'yw' => 'maintainVersion', '电池' => 'battery', '系统重启' => 'rebootTimes',
'i1重启' => 'i1RebootTimes', '收' => 'recv', '拍' => 'photoTimes', '成' => 'success', '败' => 'failure', '传' => 'uploads', '心跳累计' => 'numberOfHb',
'网络异常' => 'networkError', '信号1' => 'signature1', '信号2' => 'signature2', '卡1' => 'simcard1', '卡2' => 'simcard2', 'mcu' => 'mcu', 'ai' => 'aiVersion', 'cam' => 'cameraService');
$obj = new \stdClass;
foreach($result['data'] as &$row)
{
$row['last_heartbeat_time'] = empty($row['last_heartbeat']) ? '' : substr($row['last_heartbeat'], 11);
if (empty($row['raw_report']))
{
$row['raw_report'] = $obj;
}
else
{
$row['raw_report'] = json_decode($row['raw_report'], true);
if (!empty($row['raw_report']['msg']))
{
$msgs = array();
// "安徽欣影ds2-2x/4x,yw:0829_4.2.502, i1:ahxy_0829_4.2.502, cam:4.2.1, ai:1.1.0_1, i1服务器:47.96.238.157:6891 ,心跳间隔:1 ,
// 电池:6.3V\/0.2V\/87% ,系统重启:1 ,i1重启:13 ,收:10:52 ,拍:48\/44 ,成:44 ,败:0 ,传:44 ,心跳累计:142 ,网络异常:139 ,信号1:4\/99 ,信号2:4\/99 ,卡1:898604F5122380159566,卡2: ,mcu:MTK_MCU_V3.2.5 Aug 9 2023"
$items = explode(',', $row['raw_report']['msg']);
foreach ($items as $item)
{
$pos = strpos($item, ':');
if ($pos === false)
{
continue;
}
$key = trim(substr($item, 0, $pos));
if (isset($keyMapper[$key]))
{
$key = $keyMapper[$key];
}
$msgs[$key] = trim(substr($item, $pos + 1));
}
$row['raw_report']['msgs'] = $msgs;
}
}
}
unset($row);
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,24 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
header ('Content-type: application/json; charset=utf-8');
$lineId = isset($_GET[lineId]) ? intval($_GET[lineId]) : 0;
$result = array('res' => 0, 'data' => array());
if (!$lineId)
{
echo json_encode($result, JSON_UNESCAPED_UNICODE);
}
$stmt = $db->prepare("SELECT `id`,`name` FROM `towers` WHERE line_id=:lineid AND `status`=1 ORDER BY `order`,`id`");
$stmt->execute(array('lineid' => $lineId));
$result['data'] = $stmt->fetchAll();
$stmt = null;
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,22 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
$result = array('res' => 0, 'data' => array());
$sql = "SELECT t1.cmdid,t1.`display_name`,t1.`protocol`,t2.`name` AS tower_name,t3.`name` AS line_name, t4.`id`,t4.term_id,t4.file_name,t4.`path`,t4.file_size,t4.create_time";
$sql .= " FROM terminals AS t1 JOIN towers AS t2 ON t1.tower_id=t2.id JOIN `lines` AS t3 ON t2.line_id=t3.id";
$sql .= " JOIN mntn_uploads AS t4 ON t1.id=t4.term_id ORDER BY t4.`id` DESC";
$stmt = $db->prepare($sql);
$stmt->execute();
$result['data'] = $stmt->fetchAll();
$stmt = null;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,503 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>运维系统</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery-3.7.1.min.js"></script>
<script language="javascript" type="text/javascript" src="js/common.js"></script>
</head>
<body>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%" style="position: sticky; z-index: 10000;" >
<tr style="background-color: aqua;">
<td>
<select id="lines">
<option value="0"> 全部线路 </option>
</select>
&nbsp;&nbsp;
<select id="towers">
<option value="0"> 全部杆塔 </option>
</select>
&nbsp;&nbsp;
<input type="text" id="cmdid" />
&nbsp;&nbsp;
<input type="button" id="btn-search" value=" 搜索 " />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
<span id="term-cnt"></span>
</td>
<td align="right">
<span id="last-refresh-time"></span>
&nbsp; &nbsp;
<input type="checkbox" id="btn-auto-refresh">自动刷新
&nbsp; &nbsp;
<input type="button" id="btn-refresh" value="强制刷新" onclick="javascript:loadData();">
&nbsp; &nbsp;
<a href="uploads.html">上传日志列表</a> &nbsp; &nbsp;
</td>
</tr>
<tr height="48px">
<td>
<select id="act" onchange="javascript:ChangeAction(this);">
<option value="">运维操作</option>
<option value="reset">重启</option>
<option value="reset-mcu">重启MCU</option>
<option value="set-cma">设置I1服务器</option>
<option value="set-mntn">设置运维服务器</option>
<option value="set-hb">设置心跳周期</option>
<option value="upload-logs">上传日志</option>
<option value="upgrade">升级</option>
<option value="start-frpc">开启frpc</option>
<option value="stop-frpc">停止frpc</option>
<option value="stop-aging-test">停止老化测试</option>
</select>
&nbsp; &nbsp; <input type="checkbox" id="mntn-mode" value="1">运维模式 <input type="checkbox" id="quick-hb-mode" value="1">快心跳模式
&nbsp; &nbsp; &nbsp;
<input type="button" id="btn-send" value=" 下发命令 " />
</td>
<td id="action-area">
<div class="mntn-detail hid-area" id="dlg-cma">
<label for="cma-ip">CMA IP&nbsp;&nbsp;</label>
<input type="text" id="cma-ip"> &nbsp; &nbsp;
<label for="cma-port">CMA Port</label>
<input type="number" id="cma-port" size="8">
</div>
<div class="mntn-detail hid-area" id="dlg-mntn">
<label for="mntn-ip">运维服务器IP</label>
<input type="text" id="mntn-ip"> &nbsp; &nbsp;
<label for="mntn-port">运维服务器Port</label>
<input type="number" id="mntn-port" size="8">
</div>
<div class="mntn-detail hid-area" id="dlg-hb">
<label for="hb-duration">心跳周期:</label>
<input type="number" id="hb-duration" size="8" > 分钟
</div>
<div class="mntn-detail hid-area" id="dlg-upload-logs">
<label for="upload-logs-url">上传URL</label>
<input type="text" id="upload-logs-url" size="64" >
</div>
<div class="mntn-detail hid-area" id="dlg-upgrade">
<label for="upgrade-url">升级包URL</label>
<input type="text" id="upgrade-url" size="64" >
<label for="upgrade-md5">升级包MD5</label>
<input type="text" id="upgrade-md5" size="64" >
</div>
<div class="mntn-detail hid-area" id="dlg-start-frpc">
<label for="frpc-server-addr">Server Address</label>
<input type="text" id="frpc-server-addr" size="24" value="" >
<label for="frpc-server-port">Server Port</label>
<input type="number" id="frpc-server-port" size="6" >
<label for="frpc-type">Frpc Type</label>
<select id="frpc-type">
<option value="ssh" selected> SSH </option>
<option value="adb"> ADB </option>
</select>
<label for="frpc-nw-type">Type</label>
<select id="frpc-nw-type">
<option value="tcp" selected> TCP </option>
<option value="udp"> UDP </option>
</select>
<label for="frpc-local-ip">Local IP</label>
<input type="text" id="frpc-local-ip" size="24" >
<label for="frpc-local-port">Local Port</label>
<input type="number" id="frpc-local-port" size="6" >
<label for="frpc-remote-port">Remote Port</label>
<input type="number" id="frpc-remote-port" size="6" >
</div>
<!--
server_addr = 127.0.0.1server_port = 7000[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 6000*
server_addr;
server_port;
frpc_type;// ssh adb
type;
local_ip;
local_port;
remote_port;
-->
</td>
</tr>
</table>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#DCDCDC" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0" class="thinborder fixedheader">
<thead>
<tr>
<th rowspan="2" align="center"><input type="checkbox" id="btn-toggle-all"></th>
<th rowspan="2" align="center">Id</th>
<th rowspan="2" align="center">装置编号</th>
<th rowspan="2" align="center"><br></th>
<th rowspan="2" align="center"><br><br></th>
<th rowspan="2" align="center">规约</th>
<th colspan="4" align="center">心跳信息</th>
<th rowspan="2" align="center">电池状态</th>
<th colspan="3" align="center">拍照</th>
<th colspan="3" align="center">网络信号</th>
<th colspan="2" align="center">重启次数</th>
<th rowspan="2" align="center">CMA服务器</th>
<th rowspan="2" align="center">SIM卡</th>
<th rowspan="2" align="center">版本</th>
</tr>
<tr>
<th align="center">最后心跳</th>
<th align="center"><span title="当天心跳总次数">次数</span></th>
<th align="center"><span title="心跳周期">周期</span></th>
<th align="center">CMA消息</th>
<th align="center"><span title="当天计划拍照数">计划</span>/<span title="当天实际拍照数">实际</span></th>
<th align="center"><span title="成功拍照数">成功</span></th>
<th align="center">上传</th>
<th align="center">卡1</th>
<th align="center">卡2</th>
<th align="center">错误</th>
<th align="center">系统</th>
<th align="center">I1</th>
</tr>
</thead>
<tbody id="tbody-result"></tbody>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
$('#btn-search').click(function() {
loadData();
});
$('#btn-toggle-all').click(function() {
$('.toggle-btn').prop('checked', $('#btn-toggle-all').prop('checked'));
});
function loadData() {
var lineId = $("#lines").val();
var towerId = $("#towers").val();
var cmdid = $("#cmdid").val();
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 2)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var urlTarget = 'api/queryTerms.php';
var params = {'lineId': lineId, 'towerId': towerId, 'cmdid': cmdid};
$.getJSON(urlTarget, params, function(result) {
$('#term-cnt').text("装置数量:" + result.data.length);
var tableResult = $('#tbody-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var item = result.data[idx];
var msgsObj = {};
if ('msgs' in item.raw_report)
{
msgsObj = item.raw_report.msgs;
}
var td1 = '<input type="checkbox" id="btn-toggle-' + item.id + '" class="toggle-btn" termId="' + item.id + '">' + (idx + 1);
var td2 = item.id;
// var detailUrl = "photoDetail.html?term_id=" + item.id + "&cmdid=" + item.cmdid + "&st=" + startTime + "&et=" + endTime;
// var td11 = "<a href=\"" + detailUrl + "\" target=\"_blank\">" + item.cmdid + "</a>";
var text = '';
if (item.display_name)
{
text += item.display_name + "\r\n";
}
if (item.line_name)
{
text += item.line_name + "\r\n";
}
if (item.tower_name)
{
text += item.tower_name + "\r\n";
}
var td3 = '<span id="cmdid-' + item.id + '" class="cmdid" title="' + text + '">' + item.cmdid + '</span>';
var td4 = (item.in_maintain == 0) ? '否' : '是';
var td5 = (item.quick_hb == 0) ? '否' : '是';
var td6 = ConvertProtocolName(item.protocol);
// var hbDetailUrl = "hb.html?term_id=" + item.id + "&cmdid=" + item.cmdid + "&st=" + startTime + "&et=" + endTime;
var td7 = item.last_heartbeat_time;
var td8 = (('numberOfHb' in msgsObj) ? msgsObj.numberOfHb : '');
var td9 = (('heartbeatDuration' in msgsObj) ? msgsObj.heartbeatDuration : '');
var td10 = ('recv' in msgsObj) ? msgsObj.recv : '';
var td11 = ('battery' in msgsObj) ? msgsObj.battery : '';
// 计划/实际
var td12 = ('photoTimes' in msgsObj) ? msgsObj.photoTimes : '';
var td13 = (('success' in msgsObj) ? msgsObj.success : '');
var td14 = (('uploads' in msgsObj) ? msgsObj.uploads : '');
var td15 = (('signature1' in msgsObj) ? msgsObj.signature1 : '');
var td16 = (('signature2' in msgsObj) ? msgsObj.signature2 : '');
var td17 = ('networkError' in msgsObj) ? msgsObj.networkError : '';
var td18 = ('rebootTimes' in msgsObj) ? msgsObj.rebootTimes : '';
var td19 = ('i1RebootTimes' in msgsObj) ? msgsObj.i1RebootTimes : '';
var td20 = ('cma' in msgsObj) ? msgsObj.cma : '';
var td21 = (('simcard1' in msgsObj) ? ('<span title="卡1">' + msgsObj.simcard1 + '</span>') : '') + '<br>' + (('simcard2' in msgsObj) ? ('<span title="卡2">' + msgsObj.simcard2 + '</span>') : '');
var version = '';
if ('i1Version' in msgsObj)
{
version += '<b>I1</b>:' + msgsObj.i1Version;
}
if ('maintainVersion' in msgsObj)
{
version += '&nbsp; <b>运维</b>:' + msgsObj.maintainVersion;
}
if ('cameraService' in msgsObj)
{
version += '&nbsp; <b>Camera</b>:' + msgsObj.cameraService;
}
version += '<br>';
if ('aiVersion' in msgsObj)
{
version += '<b>AI</b>:' + msgsObj.aiVersion;
}
if ('mcu' in msgsObj)
{
version += '&nbsp; <b>MCU</b>:' + msgsObj.mcu;
}
var td22 = version;
// "安徽欣影ds2-2x/4x,yw:0829_4.2.502, i1:ahxy_0829_4.2.502, cam:4.2.1, ai:1.1.0_1, i1服务器:47.96.238.157:6891 ,心跳间隔:1 ,
// 电池:6.3V\/0.2V\/87% ,系统重启:1 ,i1重启:13 ,收:10:52 ,拍:48\/44 ,成:44 ,败:0 ,传:44 ,
// 心跳累计:142 ,网络异常:139 ,信号1:4\/99 ,信号2:4\/99 ,卡1:898604F5122380159566,卡2: ,mcu:MTK_MCU_V3.2.5 Aug 9 2023"
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11, td12, td13, td14, td15, td16, td17, td18, td19, td20, td21, td22);
if ((item.in_maintain != 0) || (item.quick_hb != 0))
{
tr.classList.add("in_maintain");
}
}
});
}
function ChangeAction(src) {
var act = $('#act').val();
var currentId = '';
if (act == 'set-cma') {
currentId = 'dlg-cma';
} else if (act == 'set-mntn') {
currentId = 'dlg-mntn';
} else if (act == 'set-hb') {
currentId = 'dlg-hb';
} else if (act == 'upload-logs') {
currentId = 'dlg-upload-logs';
} else if (act == 'upgrade') {
currentId = 'dlg-upgrade';
} else if (act == 'start-frpc') {
currentId = 'dlg-start-frpc';
}
var root = document.querySelector('#action-area');
var elements = root.querySelectorAll(".mntn-detail");
// console.log("length = " + elements.length);
for (var idx = 0; idx < elements.length; idx++) {
var item = elements[idx];
if (item.id == currentId) {
if (!item.classList.contains('vis-area')) {
item.classList.add('vis-area');
}
if (item.classList.contains('hid-area')) {
item.classList.remove('hid-area');
}
} else {
if (item.classList.contains('vis-area')) {
item.classList.remove('vis-area');
}
if (!item.classList.contains('hid-area')) {
item.classList.add('hid-area');
}
}
}
}
$('#btn-send').click(function() {
var act = $('#act').val();
if ((act == null || act == '') && !$('#mntn-mode').prop('checked') && !$('#quick-hb-mode').prop('checked')) {
alert("请选择运维指令或者运维模式。");
return;
}
var params = {'act': act};
if (act == 'set-cma') {
params['ip'] = $('#cma-ip').val();
if (params['ip'] == null || params['ip'] == '') {
alert('请输入CMA IP。');
$('#cma-ip').focus();
return;
}
params['port'] = $('#cma-port').val();
if (params['port'] == null || params['port'] == '') {
alert('请输入CMA Port。');
$('#cma-port').focus();
return;
}
} else if (act == 'set-mntn') {
params['ip'] = $('#mntn-ip').val();
if (params['ip'] == null || params['ip'] == '') {
alert('请输入运维服务器IP。');
$('#mntn-ip').focus();
return;
}
params['port'] = $('#mntn-port').val();
if (params['port'] == null || params['port'] == '') {
alert('请输入运维服务器Port。');
$('#mntn-port').focus();
return;
}
} else if (act == 'set-hb') {
params['hb'] = $('#hb-duration').val();
if (params['hb'] == null || params['hb'] == '') {
alert('请输入心跳周期。');
$('#hb-duration').focus();
return;
}
} else if (act == 'upload-logs') {
params['url'] = $('#upload-logs-url').val();
if (params['url'] == null || params['url'] == '') {
alert('请输入日志上传URL。');
$('#upload-logs-url').focus();
return;
}
}
else if (act == 'upgrade') {
params['url'] = $('#upgrade-url').val();
if (params['url'] == null || params['url'] == '') {
alert('请输入升级包URL。');
$('#upgrade-url').focus();
return;
}
}
else if (act == 'start-frpc') {
params['server_addr'] = $('#frpc-server-addr').val();
if (params['server_addr'] == null || params['server_addr'] == '') {
alert('请输入Server Address。');
$('#frpc-server-addr').focus();
return;
}
params['server_port'] = $('#frpc-server-port').val();
if (params['server_port'] == null || params['server_port'] == '') {
alert('请输入Server Port。');
$('#frpc-server-port').focus();
return;
}
params['local_ip'] = $('#frpc-local-ip').val();
if (params['local_ip'] == null || params['local_ip'] == '') {
alert('请输入Local IP。');
$('#frpc-local-ip').focus();
return;
}
params['local_port'] = $('#frpc-local-port').val();
if (params['local_port'] == null || params['local_port'] == '') {
alert('请输入Local Port。');
$('#frpc-local-port').focus();
return;
}
params['remote_port'] = $('#frpc-remote-port').val();
if (params['remote_port'] == null || params['remote_port'] == '') {
alert('请输入Remote Port。');
$('#frpc-local-ip').focus();
return;
}
params['frpc_type'] = $('#frpc-type').val();
params['type'] = $('#frpc-nw-type').val();
}
var termIds = new Array();
$('.toggle-btn').each(function(index) {
if ($(this).prop('checked')) {
termIds.push($(this).attr("termId"));
}
});
if (termIds.length == 0) {
alert("至少选中一个设备。");
return;
}
params['quickhb'] = $('#quick-hb-mode').prop('checked') ? 1 : 0;
params['mntn'] = $('#mntn-mode').prop('checked') ? 1 : 0;
var urlTarget = 'api/doAction.php';
params['termIds'] = termIds.join('-');
$(".cmdid").removeClass("sent");
$.getJSON(urlTarget, params, function(result) {
for (var idx = 0; idx < result.data.length; idx++)
{
$("#cmdid-" + result.data[idx]).addClass("sent");
}
});
});
$("#lines").change(function () {
var lineId = $("#lines").val();
$("select[name='type'] option:gt(0)").remove();
if (lineId == 0) {
return;
}
var urlTarget = 'api/queryTower.php';
var params = {'lineId': lineId};
$.getJSON(urlTarget, params, function(result) {
for (var idx = 0; idx < result.data.length; idx++)
{
$("#towers").append("<option value='" + result.data[idx].id + "'>" + result.data[idx].name + "</option>");
}
});
});
$(document).ready(function(){
$('#btn-search').click();
var urlTarget = 'api/queryLine.php';
var params = {};
$.getJSON(urlTarget, params, function(result) {
for (var idx = 0; idx < result.data.length; idx++)
{
$("#lines").append("<option value='" + result.data[idx].id + "'>" + result.data[idx].vname + " - " + result.data[idx].name + "</option>");
}
});
});
// -->
</script>
</html>

@ -0,0 +1,66 @@
<!--
function ConvertProtocolName(p)
{
if (p == 0)
{
return "Unknown";
}
else if (p == 0xFF00)
{
return "I1";
}
else if (p == 0xFF01)
{
return "安徽";
}
else if (p == 0xFF02)
{
return "江苏";
}
else if (p == 0xFF03)
{
return "湖南";
}
else if (p == 0xFF04)
{
return "浙江";
}
else if (p == 0xFF05)
{
return "河南";
}
else if (p == 0xFF06)
{
return "郑州";
}
else if (p == 0xFF10)
{
return "陕西";
}
return "";
}
function getUrlParameter(name)
{
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
//-->

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -0,0 +1,211 @@
A
{
font-size: 9pt;
line-height: 150%;
}
A:link
{
color: midnightblue;
text-decoration: none
}
A:visited
{
color: midnightblue;
text-decoration: none
}
A:hover
{
color: red;/*#6600CC;*/
text-decoration: underline
}
BODY
{
font-family: tahoma,sans-serif;
font-size: 9pt;
background-color: white;
/*margin: 2 2 0 0;*/
}
DIV
{
font-family: tahoma,sans-serif;
font-size: 9pt
}
TABLE
{
font-family: tahoma,sans-serif;
font-size: 9pt;
color: black;
}
th
{
font-family: tahoma,sans-serif;
font-weight:normal;
font-size: 9pt;
padding: 4px;
}
TD
{
font-family: tahoma,sans-serif;
font-size: 9pt;
color: black;
padding: 4px;
}
.title
{
font-size: 9pt;
font-weight: 700;
}
TR.title
{
height: 28px;
background-image: url(images/table_title_bg.gif);
background-repeat: repeat-x;
background-color: #D3DCE3;
color: white;
text-align: center;
}
TR.light
{
background-color: #CEE9E4;
}
TR.green TD
{
color: blue;
}
table.thinborder
{
border-top: 1px solid #DCDCDC;
border-left: 1px solid #DCDCDC;
border-right: 0px;
border-bottom: 0px;
}
.thinborder TD, .thinborder TH
{
border-top: 1px solid #FFFFFF;
border-left: 1px solid #FFFFFF;
border-right: 1px solid #DCDCDC;
border-bottom: 1px solid #DCDCDC;
}
MARQUEE
{
font-size: 9pt;
}
table.fixedheader {
width: 100%;
}
table.fixedheader thead {
position:sticky;
top: 0;
}
table.fixedheader thead
{
background-color: #DCDCDC;
opacity: 1.0;
}
table.fixedheader thead tr th
{
background-color: #DCDCDC;
opacity: 1.0;
}
.thinborder.fixedheader TH
{
border-top: 1px solid #FFFFFF;
border-left: 1px solid #FFFFFF;
border-right: 1px solid #DCDCDC;
border-bottom: 1px solid #DCDCDC;
}
TD.merged
{
background-color: #ADD8E6;
}
TD.merged-dark
{
background-color: #FFFFFF;
}
.text
{
font-size: 9pt;
}
.submenu
{
left: 0;
background-color: #C0C0C0;
position: absolute;
text-align: left;
padding: 12px;
/*border-style: solid solid solid none;*/
}
.left {
margin-top: 10px;
margin-bottom: 10px;
margin-left: 5px;
}
.dialog {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border: 1px solid black;
padding: 10px;
background-color: white;
}
.mntn-detail
{
padding: 10px;
}
.hid-area
{
display:none;
}
.vis-area
{
display:block;
}
.sent
{
color: green;
}
tr.in_maintain
{
background-color: red;
}
tr.in_maintain td
{
color: yellow;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,96 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>日志</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery-3.7.1.min.js"></script>
<script language="javascript" type="text/javascript" src="js/common.js"></script>
</head>
<body>
<table border=0 borderColorLight="#DCDCDC" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%" >
<tr>
<td>
<a href="./index.html">返回首页</a>
</td>
<td align="left">
</td>
</tr>
</table>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0">
<thead>
<tr>
<th align="center">Id</th>
<th align="center">装置编号</th>
<th align="center">文件名</th>
<th align="center">文件大小</th>
<th align="center">上传时间</th>
</tr>
</thead>
<tbody id="tbody-result">
</tbody>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function loadData() {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var urlTarget = 'api/queryUploads.php';
var params = {};
$.getJSON(urlTarget, params, function(result) {
$('#term-cnt').text("日志数量:" + result.data.length);
var tableResult = $('#tbody-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var item = result.data[idx];
var td2 = item.id;
var td3 = item.cmdid;
var dlUrl = "/dl/?id=" + item.id;
var td4 = "<a href=\"" + dlUrl + "\" target=\"_blank\">" + item.file_name + "</a>";
var td5 = parseInt(item.file_size / 1024) + "K";
var td6 = item.create_time;
var tr = AppendTable(tableResult, td2, td3, td4, td5, td6);
if ((item.in_maintain != 0) || (item.quick_hb != 0))
{
}
}
});
}
$(document).ready(function(){
loadData();
});
// -->
</script>
</html>

@ -0,0 +1,103 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>装置工作状态历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="8" cellspacing="0" width="100%">
<tr>
<td>报警编号</td>
<td>装置编号</td>
<td>通道号</td>
<td>预置位</td>
<td>报警时间</td>
<td>照片</td>
<td>报警内容</td>
</tr>
</table>
<br>
<div id="div-result">
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
$(document).ready(function() {
loadData();
});
function loadData(startTime, endTime) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var params = null;
var urlTarget = '/rpts/api/queryAIAlarms.php';
$.getJSON(urlTarget, params, function(result) {
var portStr = (location.port == null || location.port == "" || location.port == 80 || location.port == 443) ? "" : (":" + location.port);
for (var idx = 0; idx < result.length; idx++)
{
var td1 = result[idx].id;
var td2 = result[idx].cmdid;
var td3 = result[idx].channel_id;
var td4 = result[idx].preset_id;
var td5 = result[idx].alarm_time;
var imgUrl = location.protocol + "//" + location.hostname + portStr + "/photos/" + result[idx].path;
var td6 = "<a href=\"" + imgUrl + "\" target=\"_blank\"><img src=\"" + imgUrl + "!180x180\" width=\"180\" loading=\"lazy\" /></a>";
var alarm_info = "";
for (var idx2 = 0; idx2 < result[idx].alarm_info.list.length; idx2++)
{
var item = result[idx].alarm_info.list[idx2];
alarm_info += "名称:" + item.nameCn + "<br />";
alarm_info += "Prob" + item.prob + "<br />";
alarm_info += "Label" + item.label + "<br />";
alarm_info += "位置:(" + item.x + "," + item.y + ")-" + "(" + item.width + "," + item.height + ")<br />";
}
var td7 = alarm_info;
console.log(alarm_info);
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7);
}
});
}
$(document).ready(function(){
$('#btn-refresh').click();
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,73 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$terminals = array();
$ts = time();
$result = array('res' => 0, 'data' => array());
$lineId = isset($_POST['lineId']) ? intval($_POST['lineId']) : 0;
$cmdids = isset($_POST['cmdids']) ? $_POST['cmdids'] : '';
$channels = isset($_POST['channels']) ? intval($_POST['channels']) : 1;
$protocol = isset($_POST['protocol']) ? intval($_POST['protocol']) : 0;
$contents = str_replace("\r\n", "\n", $cmdids);
$contents = str_replace("\n\r", "\n", $contents);
$contents = str_replace("\r", "\n", $contents);
$cmdids = explode("\n", $contents);
$stmt = $db->prepare("SELECT * FROM `lines` WHERE `id`=" . $lineId);
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
$lineName = '';
if ($rows)
{
$lineName = $rows[0]['name'];
}
$ids = array();
$rows = array();
foreach ($cmdids as $cmdid)
{
$cmdid = trim($cmdid);
if (empty($cmdid)) continue;
$db->query("INSERT INTO `towers`(`line_id`, `name`) VALUES($lineId, '" . $cmdid . "')");
$tower_id = $db->lastInsertId();
$db->query("INSERT INTO `terminals`(`line_id`, `tower_id`, `cmdid`, `protocol`) VALUES($lineId, " . $tower_id . ",'" . $cmdid . "'," . $protocol . ")");
$term_id = $db->lastInsertId();
for ($channel = 1; $channel <= $channels; $channel++)
{
$db->query("INSERT INTO `terminal_channel_mapper`(`term_id`, `channel_id`) VALUES(" . $term_id . "," . $channel . ")");
}
$ids[] = $term_id;
$row['id'] = $term_id;
$row['cmdid'] = $cmdid;
$row['protocol'] = $protocol;
$row['line_name'] = $lineName;
$row['tower_name'] = $cmdid;
$row['display_name'] = '';
$rows[] = $row;
unset($row);
}
$result['data'] = $rows;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,21 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$result = array('res' => 0, 'data' => array());
$term_id = isset($_GET['term_id']) ? intval($_GET['term_id']) : 0;
$cmdid = isset($_GET['cmdid']) ? $_GET['cmdid'] : '';
$stmt = $db->prepare("DELETE FROM terminal_photos WHERE term_id=?");
$stmt->bindValue(1 , $term_id);
$stmt->execute();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,26 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$termId = intval($_GET['termid']);
$stmt = $db->prepare("INSERT INTO maintain_cmds(term_id, `name`,`cmd`) VALUES(0,'Test',:cmd)");
$cmd['get'] = $_GET;
$cmd['request'] = $_REQUEST;
$cmd = print_r($cmd, true);
$result = array('code' => 0, "data" => "");
if (!$stmt->execute(array('cmd' => $cmd)))
{
$result['err'] = $stmt->errorInfo();
}
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,24 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$stmt = $db->query("SELECT t1.id,t1.term_id,t1.channel_id,t1.preset_id,FROM_UNIXTIME(t1.alarm_time) AS alarm_time,alarm_info,t2.cmdid,t3.path FROM terminal_img_alarms AS t1 JOIN terminals AS t2 ON t1.term_id=t2.id JOIN terminal_photos AS t3 ON t1.photo_org_id=t3.orginal_id AND t1.term_id=t3.term_id ORDER BY t1.id desc LIMIT 20");
$rows = $stmt->fetchAll();
foreach ($rows as &$row)
{
$alarm_info = json_decode($row['alarm_info'], true);
$row['alarm_info'] = $alarm_info;
// print_r($alarm_info);
// exit;
}
unset($row);
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,20 @@
<?php
include('config.inc.php');
$ts = time();
$startTime = isset($_GET['st']) ? intval($_GET['st']) : ($ts - 86400 * 7);
$endTime = isset($_GET['et']) ? intval($_GET['et']) : $ts;
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$termId = intval($_GET['termid']);
$stmt = $db->query("SELECT term_id,cmdid,version,bs_id,FROM_UNIXTIME(update_time) AS update_time FROM terminal_basic_info_history WHERE term_id=" . $termId . " AND update_time BETWEEN " . $startTime . " AND " . $endTime . " ORDER BY update_time desc");
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,16 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$termId = intval($_GET['termid']);
$stmt = $db->query("SELECT id,term_id,coordinate_type,radius,latitude,longitude,FROM_UNIXTIME(update_time) AS update_time FROM terminal_position_history WHERE term_id=" . $termId . " ORDER BY update_time desc LIMIT 100");
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,27 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$term_id = intval($_GET['term_id']);
$st = intval($_GET['st']);
$et = intval($_GET['et']);
$result = array('res' => 0, 'data' => array());
$sql = "SELECT FROM_UNIXTIME(heartbeat_time) AS heartbeat_time,heartbeat_ip,heartbeat_port FROM terminal_heartbeat_history WHERE term_id="
. $term_id . " AND heartbeat_time BETWEEN " . $st . " AND " . $et . " ORDER BY heartbeat_time DESC";
header ('SQL: ' . $sql);
$stmt = $db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,16 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$termId = intval($_GET['termid']);
$stmt = $db->query("SELECT id,term_id,coordinate_type,radius,latitude,longitude,FROM_UNIXTIME(update_time) AS update_time FROM terminal_position_history WHERE term_id=" . $termId . " ORDER BY update_time desc LIMIT 100");
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,28 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$terminals = array();
$ts = time();
$result = array('res' => 0, 'data' => array());
$startTime = isset($_GET['st']) ? intval($_GET['st']) : ($ts - 86400);
$endTime = isset($_GET['et']) ? intval($_GET['et']) : $ts;
$stmt = $db->prepare("SELECT t1.`id`,t1.`name`,t2.`name` AS vname FROM `lines` AS t1 JOIN dy_level AS t2 ON t1.`dy_level_id`=t2.`id` WHERE t1.`status`=1 AND t2.`status`=1 ORDER BY t2.`id`,t1.`id`");
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,25 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$term_id = intval($_GET['term_id']);
$ts = intval($_GET['ts']);
$channel = intval($_GET['ch']);
$result = array('res' => 0, 'data' => array());
$sql = "SELECT id,orginal_id,channel_id,preset_id,media_type, FROM_UNIXTIME(photo_time) AS photo_time,`path`,`thumb`,FROM_UNIXTIME(`recv_time`) AS recv_time FROM terminal_photos WHERE term_id="
. $term_id . " AND recv_time >= " . $ts . " AND channel_id=" . $channel . " AND media_type<>2 ORDER BY photo_time DESC";
$stmt = $db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,104 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$terminals = array();
$ts = time();
$result = array('res' => 0, 'data' => array());
$startTime = isset($_GET['st']) ? intval($_GET['st']) : ($ts - 86400);
$endTime = isset($_GET['et']) ? intval($_GET['et']) : $ts;
$lineId = isset($_GET['lineId']) ? intval($_GET['lineId']) : 0;
$channel = isset($_GET['channel']) ? intval($_GET['channel']) : 0;
if ($channel === 0)
{
$sql = "SELECT term_id,count(*) AS photo_count FROM terminal_photos WHERE photo_time BETWEEN ? AND ? GROUP BY term_id";
}
else
{
$sql = "SELECT term_id,count(*) AS photo_count FROM terminal_photos WHERE photo_time BETWEEN ? AND ? AND channel_id=? GROUP BY term_id";
}
$stmt = $db->prepare($sql);
$stmt->bindValue(1 , $startTime);
$stmt->bindValue(2 , $endTime);
if ($channel > 0)
{
$stmt->bindValue(3, $channel);
}
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
$terminal_mapper = array();
foreach ($rows as $row)
{
$terminal_mapper[$row['term_id']] = $row['photo_count'];
}
if ($channel == 0)
{
$sql = "SELECT term_id,max(recv_time) AS recv_time,min(photo_time) AS min_photo_time FROM terminal_photos WHERE photo_time BETWEEN ? AND ? AND media_type<>2 GROUP BY term_id";
}
else
{
$sql = "SELECT term_id,max(recv_time) AS recv_time,min(photo_time) AS min_photo_time FROM terminal_photos WHERE photo_time BETWEEN ? AND ? AND channel_id=? AND media_type<>2 GROUP BY term_id";
}
$stmt = $db->prepare($sql);
$stmt->bindValue(1 , $startTime);
$stmt->bindValue(2 , $endTime);
if ($channel > 0)
{
$stmt->bindValue(3, $channel);
}
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt = null;
$recv_time_mapper = array();
foreach ($rows as $row)
{
$recv_time_mapper[$row['term_id']] = $row; //['recv_time'];
}
$stmt = $db->query("SELECT term_id,count(*) AS cnt FROM terminal_basic_info_history WHERE update_time BETWEEN " . $startTime . " AND " . $endTime . " GROUP BY term_id");
$rows = $stmt->fetchAll();
foreach ($rows as $row)
{
$reboot_mapper[$row['term_id']] = $row['cnt'];
}
$lineCondtion = $lineId ? ' WHERE t3.`id`=' . $lineId : '';
$sql = "SELECT t1.id, t1.cmdid,t1.`display_name`,t1.`protocol`,t2.`name` AS tower_name,t3.`name` AS line_name, FROM_UNIXTIME(t4.last_heartbeat) AS last_heartbeat,FROM_UNIXTIME(t4.boot_time) AS boot_time FROM terminals AS t1 JOIN towers AS t2 ON t1.tower_id=t2.id JOIN `lines` AS t3 ON t2.line_id=t3.id";
$sql .= " LEFT JOIN terminal_status AS t4 ON t1.id=t4.term_id " . $lineCondtion . " ORDER BY t2.line_id,t1.cmdid";
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
$stmt = null;
foreach ($rows as $row)
{
if (!isset($terminal_mapper[$row['id']]))
{
continue;
}
$row['cnt'] = $terminal_mapper[$row['id']];
$row['reboot_cnt'] = isset($reboot_mapper[$row['id']]) ? $reboot_mapper[$row['id']] : 0;
$row['recv_time'] = isset($recv_time_mapper[$row['id']]) ? date('Y-m-d H:i:s', $recv_time_mapper[$row['id']]['recv_time']) : '';
$row['min_photo_time'] = isset($recv_time_mapper[$row['id']]) ? date('H:i:s', $recv_time_mapper[$row['id']]['min_photo_time']) : '';
$result['data'][] = $row;
}
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,31 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$term_id = intval($_GET['term_id']);
$st = intval($_GET['st']);
$et = intval($_GET['et']);
$channel = isset($_GET['channel']) ? intval($_GET['channel']) : 0;
$result = array('res' => 0, 'data' => array());
$channelCond = '';
if ($channel > 0)
{
$channelCond = ' AND channel_id=' . $channel;
}
$sql = "SELECT id,orginal_id,channel_id,preset_id,media_type, FROM_UNIXTIME(photo_time) AS photo_time,`path`,`thumb`,FROM_UNIXTIME(`recv_time`) AS recv_time " .
"FROM terminal_photos WHERE term_id=" . $term_id . " AND photo_time BETWEEN " . $st . " AND " . $et . $channelCond . " AND media_type<>2 ORDER BY photo_time DESC";
$stmt = $db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,16 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$termId = intval($_GET['termid']);
$stmt = $db->query("SELECT term_id,signal_strength_4g,signal_strength_2g,remaining_ram,remaining_rom,FROM_UNIXTIME(boot_time) AS boot_time,FROM_UNIXTIME(rs_update_time) AS rs_update_time FROM terminal_running_status_history WHERE term_id=" . $termId . " ORDER BY rs_update_time desc LIMIT 100");
$rows = $stmt->fetchAll();
header ('Content-type: application/json; charset=utf-8');
echo json_encode($rows, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,119 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$filter = isset($_GET['filter']) ? $_GET['filter'] : '';
$dy_mapper = array();
$line_mapper = array();
$line_dy_mapper = array();
$tower_mapper = array();
$tower_line_mapper = array();
$stmt = $db->query("SELECT * FROM dy_level WHERE status=1");
$rows = $stmt->fetchAll();
$stmt = null;
$result = array();
foreach ($rows as $row)
{
$dy_mapper[$row['id']] = count($result);
$row['lines'] = array();
array_push($result, $row);
}
$stmt = $db->query("SELECT * FROM `lines` WHERE status=1");
$rows = $stmt->fetchAll();
$stmt = null;
foreach ($rows as $row)
{
$dy_id = intval($row['dy_level_id']);
if (!isset($dy_mapper[$dy_id]))
{
continue;
}
$line_id = intval($row['id']);
$dy_idx = $dy_mapper[$dy_id];
$line_mapper[$line_id] = count($result[$dy_idx]['lines']);
$line_dy_mapper[$line_id] = $dy_id;
$row['towers'] = array();
array_push($result[$dy_idx]['lines'], $row);
}
$stmt = $db->query("SELECT * FROM towers WHERE status=1");
$rows = $stmt->fetchAll();
$stmt = null;
$towers = array();
foreach ($rows as $row)
{
$line_id = intval($row['line_id']);
if (!isset($line_mapper[$line_id]))
{
continue;
}
$tower_id = intval($row['id']);
$tower_line_mapper[$tower_id] = $line_id;
$dy_id = intval($line_dy_mapper[$line_id]);
$dy_idx = $dy_mapper[$dy_id];
$line_idx = $line_mapper[$line_id];
$tower_mapper[$tower_id] = count($result[$dy_idx]['lines'][$line_idx]['towers']);
$row['terminals'] = array();
array_push($result[$dy_idx]['lines'][$line_idx]['towers'], $row);
}
$sql = "SELECT * FROM terminals WHERE status=1";
if ($filter == 'ws')
{
$sql = "SELECT t1.* FROM terminals AS t1 JOIN terminal_status AS t2 ON t1.id=t2.term_id WHERE t1.status=1 AND t2.ws_update_time <>0";
}
else if ($filter == 'rs')
{
$sql = "SELECT t1.* FROM terminals AS t1 JOIN terminal_status AS t2 ON t1.id=t2.term_id WHERE t1.status=1 AND t2.rs_update_time <>0";
}
else if ($filter == 'bi')
{
$sql = "SELECT * FROM terminals WHERE id IN (SELECT distinct term_id FROM terminal_basic_info_history) AND status=1";
}
else if ($filter == 'gps')
{
$sql = "SELECT * FROM terminals WHERE id IN (SELECT distinct term_id FROM terminal_position_history) AND status=1";
}
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
$stmt = null;
foreach ($rows as $row)
{
$tower_id = intval($row['tower_id']);
if (!isset($tower_mapper[$tower_id]))
{
continue;
}
$tower_idx = $tower_mapper[$tower_id];
$line_id = $tower_line_mapper[$tower_id];
$line_idx = $line_mapper[$line_id];
$dy_id = $line_dy_mapper[$line_id];
$dy_idx = $dy_mapper[$dy_id];
array_push($result[$dy_idx]['lines'][$line_idx]['towers'][$tower_idx]['terminals'], $row);
}
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,38 @@
<?php
include('config.inc.php');
$db = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['database'], $config['dbuser'], $config['password'], [
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]);
// $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
$result = array('res' => 0, 'data' => array());
$action = isset($_GET['act']) ? $_GET['act'] : '';
if ($_GET['act'] == 'list')
{
$lineId = isset($_GET['lineId']) ? intval($_GET['lineId']) : 0;
$lineCondtion = $lineId ? ' WHERE t3.`id`=' . $lineId : '';
$sql = "SELECT t1.id, t1.cmdid,t1.`display_name`,t1.`protocol`,t2.`name` AS tower_name,t3.`name` AS line_name, FROM_UNIXTIME(t4.last_heartbeat) AS last_heartbeat,FROM_UNIXTIME(t4.boot_time) AS boot_time";
$sql .= ",t4.battery_voltage,t4.op_temperature,t4.battery_capacity,t4.floating_charge,t4.total_working_time,t4.working_time,t4.connection_state,FROM_UNIXTIME(t4.ws_update_time) AS ws_update_time";
$sql .= " FROM terminals AS t1 JOIN towers AS t2 ON t1.tower_id=t2.id JOIN `lines` AS t3 ON t2.line_id=t3.id";
$sql .= " LEFT JOIN terminal_status AS t4 ON t1.id=t4.term_id " . $lineCondtion . " ORDER BY t2.line_id,t1.cmdid";
$stmt = $db->query($sql);
$rows = $stmt->fetchAll();
$result['data'] = $rows;
$stmt = null;
}
else
{
$termId = intval($_GET['termid']);
$stmt = $db->query("SELECT term_id,battery_voltage,op_temperature,battery_capacity,floating_charge,total_working_time,working_time,connection_state,FROM_UNIXTIME(ws_update_time) AS ws_update_time FROM terminal_working_status_history WHERE term_id=" . $termId . " ORDER BY ws_update_time desc LIMIT 100");
$result['data'] = $stmt->fetchAll();
}
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,16 @@
<?php
include('config.inc.php');
$cmdid = isset($_GET['cmdid']) ? $_GET['cmdid'] : '';
$channel = isset($_GET['ch']) ? intval($_GET['ch']) : 1;
$result['ts'] = time();
$cmd = "/usr/local/bin/xympadmn --server=127.0.0.1 --port=6891 --act=capture --channel=" . $channel . " --preset=255 --cmdid=" . $cmdid;
exec($cmd, $output, $result_code);
$result['output'] = $output;
$result['cmd'] = $cmd;
$result['result_code'] = $result_code;
header ('Content-type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE);

@ -0,0 +1,204 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>装置基本信息历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=0 cellspacing=0 width="100%" style="height: 100vh;">
<tr>
<td valign="top" width="20%">
<div style="max-height: 100vh; overflow-y: scroll; margin: 16px;">
<ul id="tree-container">
</ul>
<p>&nbsp;</p>
</div>
</td>
<td valign="top" width="80%" style="margin: 16px;">
<span id="current-term"></span>
<br /><br />
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="8" cellspacing="0" width="80%">
<tr>
<td>采集时间</td>
<td>装置编号</td>
<td>版本号</td>
<td>出厂编号</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<div id="div-result">
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
};
function clickTerm(src, termid)
{
$('#current-term').text($('#term-' + termid).attr("cmdid") );
var urlTarget = '/rpts/api/queryBasicInfo.php';
var params = {"termid" : termid};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.length; idx++)
{
var td1 = result[idx].update_time;
var td2 = result[idx].cmdid;
var td3 = result[idx].version;
var td4 = result[idx].bs_id;
var tr = AppendTable(tableResult, td1, td2, td3, td4);
}
});
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryTerms.php';
var params = {"filter" : 'bi'};
$.getJSON(urlTarget, params, function(result) {
var html = '';
for (var idx = 0; idx < result.length; idx++)
{
var dy = result[idx];
if (dy.lines.length == 0) continue;
var head1 = '<li id="dy-"' + dy.id + '>' + dy.name + '<ul id="dyc-"' + dy.id + '>';
var tail1 = '</ul></li>';
var html1 = '';
for (var idx2 = 0; idx2 < dy.lines.length; idx2++)
{
var line = dy.lines[idx2];
if (line.towers.length == 0) continue;
var head2 = '<li id="line-"' + line.id + '>' + line.name + '<ul id="linec-"' + line.id + '>';
var tail2 = '</ul></li>';
var html2 = '';
for (var idx3 = 0; idx3 < line.towers.length; idx3++)
{
var tower = line.towers[idx3];
if (tower.terminals.length != 1) continue;
var term = tower.terminals[0];
html2 += '<li id="tower-"' + tower.id + '"><a id="term-' + term.id + '" href="javascript:clickTerm(this,' + term.id + ');" cmdid="' + term.cmdid + '">' + term.cmdid + '</a></li>';
}
html1 += head2 + html2 + tail2;
}
html += head1 + html1 + tail1;
}
$('#tree-container').append(html);
});
var termId= getUrlParameter("term_id");
var st = getUrlParameter("st");
var et = getUrlParameter("et");
if (termId == null || st == null || et == null)
{
return;
}
var urlTarget = '/rpts/api/queryBasicInfo.php';
var params = {"termid" : termId, "st": st, "et": et};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.length; idx++)
{
var td1 = result[idx].update_time;
var td2 = result[idx].cmdid;
var td3 = result[idx].version;
var td4 = result[idx].bs_id;
var tr = AppendTable(tableResult, td1, td2, td3, td4);
}
});
});
$('#btn-refresh').click(function() {
var dt = new Date();
var endTime = parseInt(dt.getTime() / 1000);
dt.setHours(0, 0, 0);
var startTime = parseInt(dt.getTime() / 1000);
loadData(startTime, endTime);
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,185 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>GPS历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body style="margin: 16px;">
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td valign="top" width="20%">
<ul id="tree-container">
</ul>
</td>
<td valign="top" width="80%">
<span id="current-term"></span>
<br /><br />
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="8" cellspacing="0" width="80%">
<tr>
<td>采集时间</td>
<td>坐标类型</td>
<td>半径</td>
<td>纬度</td>
<td>经度</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<div id="div-result">
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function GetCoordinateType(ct)
{
if (ct == 0)
{
return "没有坐标";
}
else if (ct == 1)
{
return "GPS 坐标";
}
else if (ct == 2)
{
return "辅助坐标";
}
return "";
}
function clickTerm(src, termid)
{
$('#current-term').text($('#term-' + termid).attr("cmdid") );
var urlTarget = '/rpts/api/queryGps.php';
var params = {"termid" : termid};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.length; idx++)
{
var td1 = result[idx].update_time;
var td2 = GetCoordinateType(result[idx].coordinate_type);
var td3 = result[idx].radius;
var td4 = result[idx].latitude;
var td5 = result[idx].longitude;
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5);
}
});
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryTerms.php';
var params = {"filter" : 'gps'};
$.getJSON(urlTarget, params, function(result) {
var html = '';
for (var idx = 0; idx < result.length; idx++)
{
var dy = result[idx];
if (dy.lines.length == 0) continue;
var head1 = '<li id="dy-"' + dy.id + '>' + dy.name + '<ul id="dyc-"' + dy.id + '>';
var tail1 = '</ul></li>';
var html1 = '';
for (var idx2 = 0; idx2 < dy.lines.length; idx2++)
{
var line = dy.lines[idx2];
if (line.towers.length == 0) continue;
var head2 = '<li id="line-"' + line.id + '>' + line.name + '<ul id="linec-"' + line.id + '>';
var tail2 = '</ul></li>';
var html2 = '';
for (var idx3 = 0; idx3 < line.towers.length; idx3++)
{
var tower = line.towers[idx3];
if (tower.terminals.length != 1) continue;
var term = tower.terminals[0];
html2 += '<li id="tower-"' + tower.id + '"><a id="term-' + term.id + '" href="javascript:clickTerm(this,' + term.id + ');" cmdid="' + term.cmdid + '">' + term.cmdid + '</a></li>';
}
html1 += head2 + html2 + tail2;
}
html += head1 + html1 + tail1;
}
$('#tree-container').append(html);
});
});
$('#btn-refresh').click(function() {
var dt = new Date();
var endTime = parseInt(dt.getTime() / 1000);
dt.setHours(0, 0, 0);
var startTime = parseInt(dt.getTime() / 1000);
loadData(startTime, endTime);
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,93 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>心跳历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<br>
<div id="div-result">
<span id="current-term"></span> &nbsp; &nbsp; 总数:<span id="current-cnt"></span>
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0">
<tr>
<td>心跳时间</td>
<td>IP</td>
<td>端口</td>
</tr>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
};
function loadData(term_id, startTime, endTime) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var urlTarget = '/rpts/api/queryHeartbeat.php';
var params = {'term_id': term_id, "st": startTime, "et": endTime};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
$('#current-cnt').text(result.length);
// var portStr = (location.port == null || location.port == "" || location.port == 80 || location.port == 443) ? "" : (":" + location.port);
for (var idx = 0; idx < result.length; idx++)
{
var td1 = "&nbsp;" + result[idx].heartbeat_time + "&nbsp;";
var td2 = result[idx].heartbeat_ip;
var td3 = result[idx].heartbeat_port;
var tr = AppendTable(tableResult, td1, td2, td3);
}
});
}
$(document).ready(function(){
var term_id = getUrlParameter("term_id");
var st = getUrlParameter("st");
var et = getUrlParameter("et");
var cmdid = getUrlParameter("cmdid");
$('#current-term').text(cmdid);
loadData(term_id, st, et);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,24 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Report</title>
</head>
<body style="margin-left: 24px; margin-top: 24px;">
<p>&nbsp;</p>
<p><a href="http://aliyun.xinyingpower.com/">主站</a>
&nbsp; &nbsp; &nbsp; <a href="photos.html">照片报表</a>
&nbsp; &nbsp; &nbsp; <a href="basicinfo.html">基本信息历史</a>
&nbsp; &nbsp; &nbsp; <a href="ws.html">工作状态历史</a>
&nbsp; &nbsp; &nbsp; <a href="rs.html">运行状态历史</a>
&nbsp; &nbsp; &nbsp; <a href="gps.html">GPS</a>
&nbsp; &nbsp; &nbsp; <a href="aialarm.html">AI报警</a>
</p>
</body>
</html>

File diff suppressed because one or more lines are too long

9404
reports/js/jquery.js vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,226 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>照片统计</title>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<br>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=0 cellspacing=0 width="100%">
<tr>
<td>
<span id="current-term"></span> &nbsp; &nbsp; 总数:<span id="current-cnt"></span> &nbsp; <span id="cur-channel"></span>
</td>
<td align="right">
<input type="button" id="btn-take-photo" value="通道1" />
&nbsp; &nbsp;
<input type="button" id="btn-take-photo2" value="通道2" />
&nbsp; &nbsp;
</td>
</tr>
</table>
<div id="div-result">
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=0 cellspacing=0 width="100%" class="fixedheader thinborder">
<thead>
<tr height="36">
<th>&nbsp;</th>
<th>编号</th>
<th>照片Id</th>
<th>通道号</th>
<th>预置位</th>
<th>收到时间</th>
<th>拍照时间</th>
<th>类型</th>
<th>照片</th>
</tr>
</thead>
<tbody id="tbody-result">
</tbody>
</table>
<p>
<input type="button" id="btn-clean-photos" value="清除照片" />
</p>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
};
function loadData(term_id, startTime, endTime, channel) {
var tableResult = $('#tbody-result')[0];
while (tableResult.rows.length > 0)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var urlTarget = '/rpts/api/queryPhotoDetail.php';
var params = {'term_id': term_id, "st": startTime, "et": endTime, 'channel': channel};
$.getJSON(urlTarget, params, function(result) {
$('#current-cnt').text(result.length);
InsertPhotos(result, true);
});
}
function InsertPhotos(result, isAppend)
{
var tableResult = $('#tbody-result')[0];
var portStr = (location.port == null || location.port == "" || location.port == 80 || location.port == 443) ? "" : (":" + location.port);
for (var idx = 0; idx < result.length; idx++)
{
var td1 = idx + 1;
var td2 = result[idx].id;
var td3 = result[idx].orginal_id;
var td4 = result[idx].channel_id;
var td5 = result[idx].preset_id;
var td6 = result[idx].recv_time;
var td7 = result[idx].photo_time;
var td8 = result[idx].media_type == 0 ? "照片" : "视频";
var pathPrev = result[idx].media_type == 0 ? "/photos/" : "/videos/";
var imgUrl = location.protocol + "//" + location.hostname + portStr + pathPrev + (result[idx].media_type == 0 ? result[idx].path : result[idx].thumb);
var targetImgUrl = location.protocol + "//" + location.hostname + portStr + pathPrev + result[idx].path;
var td9 = "<a href=\"" + targetImgUrl + "\" target=\"_blank\"><img src=\"" + imgUrl + "!180x180\" width=\"120\" loading=\"lazy\"/></a>";
if (isAppend)
{
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9);
}
else
{
var tr = InsertTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9);
}
}
}
function takePhoto(channel) {
var term_id = getUrlParameter("term_id");
var cmdid = $('#current-term').text();
var urlTarget = '/rpts/api/takePhoto.php';
var params = {'term_id': term_id, "ch": channel, "cmdid": cmdid};
$.getJSON(urlTarget, params, function(result) {
queryPhoto(term_id, channel, result.ts);
});
}
function queryPhoto(term_id, channel, ts)
{
var waitTid = window.setInterval(() => {
var urlTarget = '/rpts/api/queryNewPhoto.php';
var params = {'term_id': term_id, "ch": channel, "ts": ts};
$.getJSON(urlTarget, params, function(result) {
if (result.length == 0)
{
return false;
}
window.clearInterval(waitTid);
var cnt = parseInt($('#current-cnt').text());
$('#current-cnt').text(cnt + result.length);
InsertPhotos(result, false);
});
}, 2000);
}
$('#btn-take-photo').click( function() {
takePhoto(1);
});
$('#btn-take-photo2').click( function() {
takePhoto(2);
});
$('#btn-clean-photos').click( function() {
var term_id = getUrlParameter("term_id");
var cmdid = $('#current-term').text();
var urlTarget = '/rpts/api/cleanPhoto.php';
var params = {'term_id': term_id, "cmdid": cmdid};
$.getJSON(urlTarget, params, function(result) {
});
});
$(document).ready(function(){
var term_id = getUrlParameter("term_id");
var st = getUrlParameter("st");
var et = getUrlParameter("et");
var cmdid = getUrlParameter("cmdid");
var channel = getUrlParameter("channel");
if (channel == '0')
{
$('#cur-channel').text('所有通道');
}
else
{
$('#cur-channel').text('通道' + channel);
}
$('#current-term').text(cmdid);
loadData(term_id, st, et, channel);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
function InsertTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,322 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>照片统计</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td colspan="2">
<input type="datetime-local" id="start-time" /> - <input type="datetime-local" id="end-time" value="" />
<select id="dt" onclick="javascript:ChangeDateTime(this);">
<option value="0"> &nbsp; &nbsp; 今天 &nbsp; &nbsp; </option>
<option value="86400"> &nbsp; &nbsp; 昨天</option>
<option value="172800"> &nbsp; &nbsp; 前天</option>
<option value="259200"> &nbsp; &nbsp; 前2天</option>
<option value="345600"> &nbsp; &nbsp; 前3天</option>
<option value="432000"> &nbsp; &nbsp; 前4天</option>
<option value="518400"> &nbsp; &nbsp; 前5天</option>
<option value="604800"> &nbsp; &nbsp; 前6天</option>
<option value="691200"> &nbsp; &nbsp; 前7天 &nbsp; &nbsp; </option>
</select>
&nbsp; &nbsp;
<select id="lines">
<option value="0"> &nbsp; &nbsp; 全部线路 &nbsp; &nbsp; </option>
</select>
<select id="channels">
<option value="0"> &nbsp; &nbsp; 全部通道 &nbsp; &nbsp; </option>
<option value="1"> &nbsp; &nbsp; 通道1 &nbsp; &nbsp; </option>
<option value="2"> &nbsp; &nbsp; 通道2 &nbsp; &nbsp; </option>
<option value="3"> &nbsp; &nbsp; 通道3 &nbsp; &nbsp; </option>
<option value="4"> &nbsp; &nbsp; 通道4 &nbsp; &nbsp; </option>
</select>
&nbsp; &nbsp;
<input type="button" id="btn-refresh" value=" 查询 " />
&nbsp; &nbsp; &nbsp; &nbsp;
<span id="term-cnt"></span><span id="rpt-date"></span>
</td>
</tr>
</table>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#DCDCDC" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0" class="fixedheader thinborder">
<thead>
<tr>
<th>序号</th>
<th>Id</th>
<th>线路</th>
<th>杆塔</th>
<th>装置名称</th>
<th>规约</th>
<th>最后心跳时间</th>
<th>当天第一张照片时间</th>
<th>照片最后接收时间</th>
<th>重启次数</th>
<th>最后重启时间</th>
<th>装置Id</th>
<th>照片数量</th>
</tr>
</thead>
<tbody id="tbody-result"></tbody>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
var xhr = null;
$('#btn-refresh').click(function() {
loadData();
});
$('#channels').change(function() {
loadData();
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
$('#lines').change(function() {
loadData();
});
function ChangeDateTime(src)
{
var offset = $(src).val() * 1000;
var dt = new Date();
var timezone = dt.getTimezoneOffset() * 60000;
dt.setHours(0, 0, 0);
var ts = dt.getTime();
ts -= ts % 1000;
var endTime = parseInt(dt.getTime() / 1000);
document.querySelector('#start-time').valueAsNumber = ts - timezone - offset;
document.querySelector('#end-time').valueAsNumber = ts - timezone + 86399000 - offset;
loadData();
}
function ConvertProtocolName(p)
{
if (p == 0)
{
return "Unknown";
}
else if (p == 0xFF00)
{
return "I1";
}
else if (p == 0xFF01)
{
return "安徽";
}
else if (p == 0xFF02)
{
return "江苏";
}
else if (p == 0xFF03)
{
return "湖南";
}
else if (p == 0xFF04)
{
return "浙江";
}
else if (p == 0xFF05)
{
return "河南";
}
else if (p == 0xFF06)
{
return "郑州";
}
else if (p == 0xFF10)
{
return "陕西";
}
return "";
}
function loadData() {
var dt = new Date();
var startTime = parseInt(document.querySelector('#start-time').valueAsNumber / 1000);
var endTime = parseInt(document.querySelector('#end-time').valueAsNumber / 1000);
startTime += dt.getTimezoneOffset() * 60;
endTime += dt.getTimezoneOffset() * 60 + 1;
// console.log(startTime + " endTime=" + endTime + " timezone=" + dt.getTimezoneOffset());
var line_id = $("#lines").val();
var channel = $('#channels').val();
localStorage.setItem("startTime", startTime);
localStorage.setItem("endTime", endTime - 1);
localStorage.setItem("lineId", line_id);
localStorage.setItem("channel", channel);
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var dt = new Date(startTime * 1000);
$('#term-cnt').text();
// $('#rpt-date').text(dt.getFullYear() + '-' + (dt.getMonth() + 1) + '-' + dt.getDate());
var urlTarget = '/rpts/api/queryPhoto.php';
var params = {'st': startTime, 'et': endTime, 'lineId': line_id, 'channel': channel};
if (xhr != null) {
xhr.abort();
}
xhr = $.getJSON(urlTarget, params, function(result) {
$('#term-cnt').text("装置数量:" + result.data.length);
var tableResult = $('#tbody-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = idx + 1;
var td2 = result.data[idx].id;
var td3 = '<span class="longtext" title="' + result.data[idx].line_name + '">' + result.data[idx].line_name + '</span>';
var td4 = '<span class="longtext" title="' + result.data[idx].tower_name + '">' + result.data[idx].tower_name + '</span>';
var td5 = result.data[idx].display_name;
var td6 = ConvertProtocolName(result.data[idx].protocol);
var hbDetailUrl = "hb.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
var td7 = "<a href=\"" + hbDetailUrl + "\" target=\"_blank\">" + result.data[idx].last_heartbeat + "</a>";
var td8 = result.data[idx].min_photo_time;
var td9 = result.data[idx].recv_time;
var td10 = result.data[idx].reboot_cnt;
var str = '';
if (result.data[idx].boot_time != null)
{
str += result.data[idx].boot_time;
}
var biDetailUrl = "basicinfo.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime + "&channel=" + channel;
var td11 = "<a href=\"" + biDetailUrl + "\" target=\"_blank\">" + str + "</a>";
var detailUrl = "photoDetail.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime + "&channel=" + channel;
var td12 = "<a href=\"" + detailUrl + "\" target=\"_blank\">" + result.data[idx].cmdid + "</a>";
var td13 = result.data[idx].cnt;
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11, td12, td13);
if (result.data[idx].min_photo_time != '' && result.data[idx].min_photo_time.substr(0, 2) != '00')
{
tr.classList.add('green')
}
}
});
}
$(document).ready(function(){
var dt = new Date();
var timezone = dt.getTimezoneOffset() * 60000;
var startTime = localStorage.getItem("startTime");
var endTime = localStorage.getItem("endTime");
if (startTime != null && endTime != null) {
document.querySelector('#start-time').valueAsNumber = startTime * 1000 - timezone;
document.querySelector('#end-time').valueAsNumber = endTime * 1000 - timezone;
} else {
dt.setHours(0, 0, 0);
var ts = dt.getTime();
ts -= ts % 1000;
document.querySelector('#start-time').valueAsNumber = ts - timezone;
document.querySelector('#end-time').valueAsNumber = ts - timezone + 86399000;
}
var channel = localStorage.getItem("channel");
if (channel != null) {
$('#channels').val(channel);
}
var lineId = localStorage.getItem("lineId");
if (lineId == null || lineId == 0) {
$('#btn-refresh').click();
}
var urlTarget = '/rpts/api/queryLine.php';
var params = {};
$.getJSON(urlTarget, params, function(result) {
var existed = false;
for (var idx = 0; idx < result.length; idx++)
{
$("#lines").append("<option value='" + result[idx].id + "'>" + result[idx].vname + " - " + result[idx].name + "</option>");
if (result[idx].id == lineId) {
existed = true;
}
}
if (existed) {
$("#lines").val(lineId);
}
$('#btn-refresh').click();
});
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,190 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>照片统计</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0">
<tr>
<td>序号</td>
<td>装置内部Id</td>
<td>线路</td>
<td>杆塔</td>
<td>装置名称</td>
<td>装置Id</td>
<td>规约</td>
</tr>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
$('#btn-refresh').click(function() {
var dt = new Date();
var endTime = parseInt(dt.getTime() / 1000);
dt.setHours(0, 0, 0);
var startTime = parseInt(dt.getTime() / 1000);
loadData(startTime, startTime + 86400);
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
$('#btn-4th').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400 * 3, endTime - 86400 * 2);
});
$('#btn-5th').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400 * 4, endTime - 86400 * 3);
});
$('#btn-6th').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400 * 5, endTime - 86400 * 4);
});
$('#btn-7th').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400 * 6, endTime - 86400 * 5);
});
function loadData(startTime, endTime) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
var dt = new Date(startTime * 1000);
$('#term-cnt').text();
$('#rpt-date').text(dt.getFullYear() + '-' + (dt.getMonth() + 1) + '-' + dt.getDate());
var urlTarget = '/rpts/api/queryPhoto.php';
var params = {'st': startTime, 'et': endTime};
$.getJSON(urlTarget, params, function(result) {
$('#term-cnt').text("装置数量:" + result.data.length);
var tableResult = $('#tbl-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = idx + 1;
var td2 = result.data[idx].id;
var td3 = result.data[idx].line_name;
var td4 = result.data[idx].tower_name;
var td5 = result.data[idx].display_name;
var hbDetailUrl = "hb.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
var td6 = "<a href=\"" + hbDetailUrl + "\" target=\"_blank\">" + result.data[idx].last_heartbeat + "</a>";
var td7 = result.data[idx].min_photo_time;
var td8 = result.data[idx].recv_time;
var str = result.data[idx].reboot_cnt;
if (result.data[idx].boot_time != null)
{
str += "/" + result.data[idx].boot_time;
}
var biDetailUrl = "basicinfo.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
var td9 = "<a href=\"" + biDetailUrl + "\" target=\"_blank\">" + str + "</a>";
var detailUrl = "photoDetail.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
var td10 = "<a href=\"" + detailUrl + "\" target=\"_blank\">" + result.data[idx].cmdid + "</a>";
var td11 = result.data[idx].cnt;
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11);
if (result.data[idx].min_photo_time != '' && result.data[idx].min_photo_time.substr(0, 2) != '00')
{
tr.classList.add('green')
}
}
});
}
$(document).ready(function(){
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
dt = new Date(dt.getTime() - 86400000 * 3);
$('#btn-4th').val(dt.toLocaleDateString());
dt = new Date(dt.getTime() - 86400000);
$('#btn-5th').val(dt.toLocaleDateString());
dt = new Date(dt.getTime() - 86400000);
$('#btn-6th').val(dt.toLocaleDateString());
dt = new Date(dt.getTime() - 86400000);
$('#btn-7th').val(dt.toLocaleDateString());
$('#btn-refresh').click();
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,168 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>装置运行状态历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body style="margin: 16px;">
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td valign="top" width="20%">
<ul id="tree-container">
</ul>
</td>
<td valign="top" width="80%">
<span id="current-term"></span>
<br /><br />
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="8" cellspacing="0" width="80%">
<tr>
<td>采集时间</td>
<td>4G 信号强度</td>
<td>2G 信号强度</td>
<td>剩余运行内存</td>
<td>剩余存储内存</td>
<td>装置上次启动时间</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<div id="div-result">
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function clickTerm(src, termid)
{
$('#current-term').text($('#term-' + termid).attr("cmdid") );
var urlTarget = '/rpts/api/queryRs.php';
var params = {"termid" : termid};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.length; idx++)
{
var td1 = result[idx].rs_update_time;
var td2 = result[idx].signal_strength_4g;
var td3 = result[idx].signal_strength_2g;
var td4 = result[idx].remaining_ram;
var td5 = result[idx].remaining_rom;
var td6 = result[idx].boot_time;
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6);
}
});
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryTerms.php';
var params = {"filter" : 'rs'};
$.getJSON(urlTarget, params, function(result) {
var html = '';
for (var idx = 0; idx < result.length; idx++)
{
var dy = result[idx];
if (dy.lines.length == 0) continue;
var head1 = '<li id="dy-"' + dy.id + '>' + dy.name + '<ul id="dyc-"' + dy.id + '>';
var tail1 = '</ul></li>';
var html1 = '';
for (var idx2 = 0; idx2 < dy.lines.length; idx2++)
{
var line = dy.lines[idx2];
if (line.towers.length == 0) continue;
var head2 = '<li id="line-"' + line.id + '>' + line.name + '<ul id="linec-"' + line.id + '>';
var tail2 = '</ul></li>';
var html2 = '';
for (var idx3 = 0; idx3 < line.towers.length; idx3++)
{
var tower = line.towers[idx3];
if (tower.terminals.length != 1) continue;
var term = tower.terminals[0];
html2 += '<li id="tower-"' + tower.id + '"><a id="term-' + term.id + '" href="javascript:clickTerm(this,' + term.id + ');" cmdid="' + term.cmdid + '">' + term.cmdid + '</a></li>';
}
html1 += head2 + html2 + tail2;
}
html += head1 + html1 + tail1;
}
$('#tree-container').append(html);
});
});
$('#btn-refresh').click(function() {
var dt = new Date();
var endTime = parseInt(dt.getTime() / 1000);
dt.setHours(0, 0, 0);
var startTime = parseInt(dt.getTime() / 1000);
loadData(startTime, endTime);
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

File diff suppressed because one or more lines are too long

@ -0,0 +1,167 @@
A
{
font-size: 9pt;
line-height: 150%;
}
A:link
{
color: midnightblue;
text-decoration: none
}
A:visited
{
color: midnightblue;
text-decoration: none
}
A:hover
{
color: red;/*#6600CC;*/
text-decoration: underline
}
BODY
{
font-family: tahoma,sans-serif;
font-size: 9pt;
background-color: white;
/*margin: 2 2 0 0;*/
}
DIV
{
font-family: tahoma,sans-serif;
font-size: 9pt
}
TABLE
{
font-family: tahoma,sans-serif;
font-size: 9pt;
color: black;
}
TD
{
font-family: tahoma,sans-serif;
font-size: 9pt;
color: black;
padding: 4px;
}
table.fixedheader {
width: 100%;
}
table.fixedheader thead {
position:sticky;
top: 0;
}
table.fixedheader thead
{
background-color: #DCDCDC;
opacity: 1.0;
}
table.fixedheader thead tr th
{
background-color: #DCDCDC;
opacity: 1.0;
}
.thinborder.fixedheader TH
{
border-top: 1px solid #FFFFFF;
border-left: 1px solid #FFFFFF;
border-right: 1px solid #DCDCDC;
border-bottom: 1px solid #DCDCDC;
}
.thinborder TD, .thinborder TH
{
border-top: 1px solid #FFFFFF;
border-left: 1px solid #FFFFFF;
border-right: 1px solid #DCDCDC;
border-bottom: 1px solid #DCDCDC;
}
.title
{
font-size: 9pt;
font-weight: 700;
}
TR.title
{
height: 28px;
background-image: url(images/table_title_bg.gif);
background-repeat: repeat-x;
background-color: #D3DCE3;
color: white;
text-align: center;
}
TR.light
{
background-color: #CEE9E4;
}
TR.green TD
{
color: blue;
}
.longtext
{
display: inline-block;
max-width: 12em;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
MARQUEE
{
font-size: 9pt;
}
TD.merged
{
background-color: #ADD8E6;
}
TD.merged-dark
{
background-color: #FFFFFF;
}
.text
{
font-size: 9pt;
}
.submenu
{
left: 0;
background-color: #C0C0C0;
position: absolute;
text-align: left;
padding: 12px;
/*border-style: solid solid solid none;*/
}
.left {
margin-top: 10px;
margin-bottom: 10px;
margin-left: 5px;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,186 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>照片统计</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td colspan="2">
<p>线路:
<select id="lines">
</select>
</p>
<p>通道:
<select id="channels">
<option value="1">单目</option>
<option value="2" selected>双目</option>
<option value="3">三目</option>
<option value="4">四目</option>
<option value="5">五目</option>
<option value="6">六目</option>
</select>
</p>
<p>
规约:
<select id="protocol">
<option value="65280">I1</option>
<option value="65281" selected>安徽</option>
<option value="65282">江苏</option>
<option value="65283">湖南</option>
<option value="65284">浙江</option>
<option value="65285">河南</option>
<option value="65286">郑州</option>
<option value="65296">陕西</option>
</select>
</p>
<p>
<label>编号:(一行一个)</label>
<br>
<textarea id="cmdids" rows="12" cols="32"></textarea>
</p>
<input type="button" value="生成" id="build-terms">
</td>
</tr>
<tr>
<td>
<span id="term-cnt"></span>
</td>
<td>
<span id="rpt-date"></span>
</td>
</tr>
</table>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0">
<tr>
<td>序号</td>
<td>装置内部Id</td>
<td>线路</td>
<td>杆塔</td>
<td>装置名称</td>
<td>规约</td>
<td>装置Id</td>
</tr>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
$('#build-terms').click(function() {
var urlTarget = '/rpts/api/buildTerms.php';
var line_id = $("#lines").val();
var cmdids = $("#cmdids").val();
var channels = $("#channels").val();
var protocol = $("#protocol").val();
var params = {'lineId': line_id, 'cmdids': cmdids, 'channels': channels, "protocol": protocol};
$.post(urlTarget, params, function(result) {
$('#term-cnt').text("装置数量:" + result.data.length);
var tableResult = $('#tbl-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = idx + 1;
var td2 = result.data[idx].id;
var td3 = result.data[idx].line_name;
var td4 = result.data[idx].tower_name;
var td5 = result.data[idx].display_name;
var td6 = ConvertProtocolName(result.data[idx].protocol);
// var biDetailUrl = "basicinfo.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
var td7 = result.data[idx].cmdid;
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7);
}
});
});
function ConvertProtocolName(p)
{
if (p == 0)
{
return "Unknown";
}
else if (p == 0xFF00)
{
return "I1";
}
else if (p == 0xFF01)
{
return "安徽";
}
else if (p == 0xFF02)
{
return "江苏";
}
else if (p == 0xFF03)
{
return "湖南";
}
else if (p == 0xFF04)
{
return "浙江";
}
else if (p == 0xFF05)
{
return "河南";
}
else if (p == 0xFF06)
{
return "郑州";
}
else if (p == 0xFF10)
{
return "陕西";
}
return "";
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryLine.php';
var params = {};
$.getJSON(urlTarget, params, function(result) {
for (var idx = 0; idx < result.length; idx++)
{
$("#lines").append("<option value='" + result[idx].id + "'>" + result[idx].vname + " - " + result[idx].name + "</option>");
}
});
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,212 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>装置工作状态历史</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body style="margin: 16px;">
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td valign="top" width="20%">
<ul id="tree-container">
</ul>
</td>
<td valign="top" width="80%">
<span id="current-term"></span>
<br /><br />
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="8" cellspacing="0" width="80%">
<tr>
<td>采集时间</td>
<td>电源电压</td>
<td>工作温度</td>
<td>电池电量</td>
<td>浮充状态</td>
<td>工作总时间(小时)</td>
<td>本次连续工作时间(小时)</td>
<td>网络连接状态</td>
</tr>
</table>
</td>
</tr>
</table>
<br>
<div id="div-result">
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
};
function clickTerm(src, termid)
{
$('#current-term').text($('#term-' + termid).attr("cmdid") );
var urlTarget = '/rpts/api/queryWs.php';
var params = {"termid" : termid};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = result.data[idx].ws_update_time;
var td2 = result.data[idx].battery_voltage;
var td3 = result.data[idx].op_temperature;
var td4 = result.data[idx].battery_capacity;
var td5 = result.data[idx].floating_charge == 0 ? "充电" : "放电";
var td6 = result.data[idx].total_working_time;
var td7 = result.data[idx].working_time;
var td8 = result.data[idx].connection_state == 0 ? '正常' : '断开';
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8);
}
});
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryTerms.php';
var params = {"filter" : 'ws'};
$.getJSON(urlTarget, params, function(result) {
var html = '';
for (var idx = 0; idx < result.length; idx++)
{
var dy = result[idx];
if (dy.lines.length == 0) continue;
var head1 = '<li id="dy-"' + dy.id + '>' + dy.name + '<ul id="dyc-"' + dy.id + '>';
var tail1 = '</ul></li>';
var html1 = '';
for (var idx2 = 0; idx2 < dy.lines.length; idx2++)
{
var line = dy.lines[idx2];
if (line.towers.length == 0) continue;
var head2 = '<li id="line-"' + line.id + '>' + line.name + '<ul id="linec-"' + line.id + '>';
var tail2 = '</ul></li>';
var html2 = '';
for (var idx3 = 0; idx3 < line.towers.length; idx3++)
{
var tower = line.towers[idx3];
if (tower.terminals.length != 1) continue;
var term = tower.terminals[0];
html2 += '<li id="tower-"' + tower.id + '"><a id="term-' + term.id + '" href="javascript:clickTerm(this,' + term.id + ');" cmdid="' + term.cmdid + '">' + term.cmdid + '</a></li>';
}
html1 += head2 + html2 + tail2;
}
html += head1 + html1 + tail1;
}
$('#tree-container').append(html);
});
var termid = getUrlParameter("term_id");
if (termid != null)
{
var urlTarget = '/rpts/api/queryWs.php';
var params = {"termid" : termid};
$.getJSON(urlTarget, params, function(result) {
var tableResult = $('#tbl-result')[0];
while (tableResult.rows.length > 1)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = result.data[idx].ws_update_time;
var td2 = result.data[idx].battery_voltage;
var td3 = result.data[idx].op_temperature;
var td4 = result.data[idx].battery_capacity;
var td5 = result.data[idx].floating_charge == 0 ? "充电" : "放电";
var td6 = result.data[idx].total_working_time;
var td7 = result.data[idx].working_time;
var td8 = result.data[idx].connection_state == 0 ? '正常' : '断开';
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8);
}
});
}
});
$('#btn-refresh').click(function() {
var dt = new Date();
var endTime = parseInt(dt.getTime() / 1000);
dt.setHours(0, 0, 0);
var startTime = parseInt(dt.getTime() / 1000);
loadData(startTime, endTime);
});
$('#btn-yesterday').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 86400, endTime);
});
$('#btn-thedaybeforeyst').click(function() {
var dt = new Date();
dt.setHours(0, 0, 0);
var endTime = parseInt(dt.getTime() / 1000);
loadData(endTime - 172800, endTime - 86400);
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>

@ -0,0 +1,209 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>照片统计</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="styles/style.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script language="javascript" type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
<table border=0 borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding=4 cellspacing=0 width="100%">
<tr>
<td colspan="2">
<select id="lines">
<option value="0"> 全部线路 </option> &nbsp; &nbsp; &nbsp; <span id="term-cnt"></span>
</select>
</td>
</tr>
<tr>
<td>
</td>
<td>
<span id="rpt-date"></span>
</td>
</tr>
</table>
<br>
<div id="div-result">
<table id="tbl-result" border="1" borderColorLight="#99ccff" borderColorDark="#FFFFFF" cellpadding="16" cellspacing="0" class="fixedheader thinborder">
<thead>
<tr>
<th rowspan="2">序号</th>
<th rowspan="2">Id</th>
<th rowspan="2">线路</th>
<th rowspan="2">杆塔</th>
<th rowspan="2">装置名称</th>
<th rowspan="2">规约</th>
<th rowspan="2">最后心跳</th>
<th rowspan="2">采集时间</th>
<th rowspan="2">电源电压</th>
<th rowspan="2">工作温度</th>
<th colspan="2">电池状态</th>
<th colspan="2">工作时间(H)</th>
<th rowspan="2">网络状态</th>
</tr>
<tr>
<th>电量</th>
<th>浮充</th>
<th></th>
<th>连续</th>
</tr>
</thead>
<tbody id="tbody-result">
</tbody>
</table>
</div>
<br>
</body>
<script language="javascript" type="text/javascript">
<!--
$('#btn-refresh').click(function() {
loadData();
});
function ConvertProtocolName(p)
{
if (p == 0)
{
return "Unknown";
}
else if (p == 0xFF00)
{
return "I1";
}
else if (p == 0xFF01)
{
return "安徽";
}
else if (p == 0xFF02)
{
return "江苏";
}
else if (p == 0xFF03)
{
return "湖南";
}
else if (p == 0xFF04)
{
return "浙江";
}
else if (p == 0xFF05)
{
return "河南";
}
else if (p == 0xFF06)
{
return "郑州";
}
else if (p == 0xFF10)
{
return "陕西";
}
return "";
}
function loadData() {
var line_id = $("#lines").val();
var tableResult = $('#tbody-result')[0];
while (tableResult.rows.length > 0)
{
tableResult.deleteRow(tableResult.rows.length - 1);
}
$('#term-cnt').text();
var urlTarget = '/rpts/api/queryWs.php';
var params = {'act': 'list', 'lineId': line_id};
$.getJSON(urlTarget, params, function(result) {
$('#term-cnt').text("装置数量:" + result.data.length);
var tableResult = $('#tbody-result')[0];
for (var idx = 0; idx < result.data.length; idx++)
{
var td1 = idx + 1;
var td2 = result.data[idx].id;
var td3 = '<span class="longtext" title="' + result.data[idx].line_name + '">' + result.data[idx].line_name + '</span>';
var td4 = '<span class="longtext" title="' + result.data[idx].tower_name + '">' + result.data[idx].tower_name + '</span>';
var td5 = result.data[idx].display_name;
var td6 = ConvertProtocolName(result.data[idx].protocol);
// var hbDetailUrl = "hb.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid + "&st=" + startTime + "&et=" + endTime;
// var td7 = "<a href=\"" + hbDetailUrl + "\" target=\"_blank\">" + result.data[idx].last_heartbeat + "</a>";
if (result.data[idx].last_heartbeat == "1970-01-01 08:00:00") result.data[idx].last_heartbeat = '';
if (result.data[idx].ws_update_time == "1970-01-01 08:00:00") result.data[idx].ws_update_time = '';
var shortHbTime = result.data[idx].last_heartbeat == "" ? '' : result.data[idx].last_heartbeat.substr(5);
var td7 = '<span title="' + result.data[idx].last_heartbeat + '">' + shortHbTime + '</span>';
var shortUpdateTime = result.data[idx].ws_update_time == "" ? '' : result.data[idx].ws_update_time.substr(11);
var biDetailUrl = "ws-his.html?term_id=" + result.data[idx].id + "&cmdid=" + result.data[idx].cmdid;
var td8 = '<a href="' + biDetailUrl + '" target="_blank"><span title="' + result.data[idx].ws_update_time + '">' + shortUpdateTime + "</span></a>";
var td9 = result.data[idx].battery_voltage;
var td10 = result.data[idx].op_temperature;
var td11 = result.data[idx].battery_capacity;
var td12 = result.data[idx].floating_charge == 0 ? "充电" : "放电";
var td13 = result.data[idx].total_working_time;
var td14 = result.data[idx].working_time;
var td15 = result.data[idx].connection_state == 0 ? '正常' : '断开';
var tr = AppendTable(tableResult, td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11, td12,td13, td14, td15);
}
});
}
$(document).ready(function(){
var urlTarget = '/rpts/api/queryLine.php';
var params = {};
$.getJSON(urlTarget, params, function(result) {
for (var idx = 0; idx < result.length; idx++)
{
$("#lines").append("<option value='" + result[idx].id + "'>" + result[idx].vname + " - " + result[idx].name + "</option>");
}
});
loadData();
});
$("#lines").on("change", function () {
loadData();
});
function AppendTable(table)
{
if (arguments.length <= 1) return false;
var tr = table.insertRow(-1);
for (idx = 1; idx < arguments.length; idx++)
{
var td = tr.insertCell(-1);
td.innerHTML = arguments[idx];
}
return tr;
}
// -->
</script>
</html>
Loading…
Cancel
Save