2022-07-07 01:27:45 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
namespace EdgeManager\EDataCapture;
|
|
|
|
|
|
|
|
|
|
|
|
class EDataCapture {
|
2022-07-09 14:30:23 +08:00
|
|
|
|
function __construct(
|
|
|
|
|
|
protected $dbconn,
|
|
|
|
|
|
protected $post = NULL,
|
2022-07-11 23:58:53 +08:00
|
|
|
|
protected $get = NULL,
|
|
|
|
|
|
public $check_res = NULL,
|
|
|
|
|
|
protected $working_subclass = NULL,
|
|
|
|
|
|
protected $code_type = [],
|
|
|
|
|
|
protected $data = []
|
|
|
|
|
|
) {
|
|
|
|
|
|
if (!is_null($this -> post)) {
|
|
|
|
|
|
if (!in_array(
|
|
|
|
|
|
$this -> post -> param -> working_subclass,
|
|
|
|
|
|
ENodeConfigure::get_working_subclasses($this -> dbconn)
|
|
|
|
|
|
)) {
|
|
|
|
|
|
$this -> check_res = 'WRONG_WORKING_SUBCLASS';
|
|
|
|
|
|
return;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$this -> working_subclass = $this -> post -> param -> working_subclass;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$res = pg_fetch_all(pg_query($this -> dbconn,
|
|
|
|
|
|
"SELECT code, type
|
|
|
|
|
|
FROM hf_mes_scada_data_capture_node_configure"
|
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
|
|
$code_type = &$this -> code_type;
|
|
|
|
|
|
array_walk($res, function(&$v, $k) use (&$code_type) {
|
|
|
|
|
|
$code_type[$v['code']] = $v['type'];
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2022-07-12 22:36:14 +08:00
|
|
|
|
foreach ($this -> post -> param -> data as &$row) {
|
|
|
|
|
|
if (($code_type[$row -> code]) === 'float' and is_int($row -> value))
|
|
|
|
|
|
$row -> value = (float) number_format((float) $row -> value, 1, '.', '');
|
2022-07-11 23:58:53 +08:00
|
|
|
|
$check_func = 'is_' . $code_type[$row -> code];
|
|
|
|
|
|
if (!$check_func($row -> value)) {
|
|
|
|
|
|
$this -> check_res = 'MISMATCH_TYPE';
|
|
|
|
|
|
return;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$this -> data[$row -> code][] = [
|
|
|
|
|
|
'value' => $row -> value,
|
|
|
|
|
|
'device_code' => $row -> device_code ?? NULL,
|
|
|
|
|
|
'batch' => $row -> batch ?? NULL
|
|
|
|
|
|
];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
unset($row);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-07-09 14:30:23 +08:00
|
|
|
|
|
2022-07-10 03:36:18 +08:00
|
|
|
|
function set_node_data() {
|
2022-07-11 23:58:53 +08:00
|
|
|
|
pg_query($this -> dbconn, "BEGIN");
|
|
|
|
|
|
foreach ($this -> data as $code => $value) {
|
|
|
|
|
|
foreach (array_chunk($value, 6710885, true) as $chunk) {
|
|
|
|
|
|
$sql_head = sprintf(
|
|
|
|
|
|
"INSERT INTO hf_mes_scada_data_capture_node_data_%s (code, v_%s, device_code, batch)
|
|
|
|
|
|
VALUES",
|
|
|
|
|
|
$this -> working_subclass,
|
|
|
|
|
|
$this -> code_type[$code]
|
2022-07-09 14:30:23 +08:00
|
|
|
|
);
|
2022-07-11 23:58:53 +08:00
|
|
|
|
foreach ($chunk as $row) {
|
|
|
|
|
|
$sql_values[] = sprintf(
|
2022-07-12 22:36:14 +08:00
|
|
|
|
"('%s', '%s', '%s', '%s')",
|
2022-07-11 23:58:53 +08:00
|
|
|
|
$code,
|
2022-07-12 22:36:14 +08:00
|
|
|
|
$row['value'] === false ? 'f' : $row['value'],
|
|
|
|
|
|
$row['device_code'] ?? NULL,
|
|
|
|
|
|
$row['batch'] ?? NULL
|
2022-07-11 23:58:53 +08:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
$res[] = pg_query($this -> dbconn, $sql_head . implode(',', $sql_values));
|
|
|
|
|
|
unset($row, $sql_values);
|
2022-07-09 14:30:23 +08:00
|
|
|
|
}
|
2022-07-11 23:58:53 +08:00
|
|
|
|
unset($chunk);
|
|
|
|
|
|
}
|
|
|
|
|
|
unset($code, $value);
|
|
|
|
|
|
|
|
|
|
|
|
if (in_array(false, $res)) {
|
|
|
|
|
|
pg_query($this -> dbconn, "ROLLBACK");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
pg_query($this -> dbconn, "COMMIT");
|
|
|
|
|
|
return true;
|
2022-07-09 14:30:23 +08:00
|
|
|
|
}
|
2022-07-07 01:27:45 +08:00
|
|
|
|
}
|
2022-07-10 03:36:18 +08:00
|
|
|
|
|
|
|
|
|
|
function get_node_data() {
|
2022-07-12 22:36:14 +08:00
|
|
|
|
// 先把code和name的对应关系拿到(快于OUTER JOIN)
|
|
|
|
|
|
$res = pg_fetch_all(pg_query($this -> dbconn, sprintf(
|
|
|
|
|
|
"SELECT code, name
|
2022-07-10 03:36:18 +08:00
|
|
|
|
FROM hf_mes_scada_data_capture_node_configure
|
2022-07-12 22:36:14 +08:00
|
|
|
|
WHERE working_subclass = '%s'",
|
|
|
|
|
|
$this -> get['working_subclass']
|
2022-07-10 03:36:18 +08:00
|
|
|
|
)));
|
2022-07-12 22:36:14 +08:00
|
|
|
|
|
|
|
|
|
|
$code_name = [];
|
|
|
|
|
|
array_walk($res, function(&$v, $k) use (&$code_name) {
|
|
|
|
|
|
$code_name[$v['code']] = $v['name'];
|
|
|
|
|
|
});
|
2022-07-10 03:36:18 +08:00
|
|
|
|
|
2022-07-12 22:36:14 +08:00
|
|
|
|
$sql_cmd = sprintf(
|
|
|
|
|
|
"SELECT id, code, COALESCE(v_string, v_int::text, v_float::text, v_bool::text) AS value, device_code, batch, capture_time
|
2022-07-10 03:36:18 +08:00
|
|
|
|
FROM hf_mes_scada_data_capture_node_data_%s
|
2022-07-12 22:36:14 +08:00
|
|
|
|
WHERE capture_time >= '%s' AND capture_time <= '%s'",
|
2022-07-10 03:36:18 +08:00
|
|
|
|
$this -> get['working_subclass'],
|
2022-07-12 22:36:14 +08:00
|
|
|
|
date("Y-m-d H:i:s", $this -> get['start_time'] / 1000),
|
|
|
|
|
|
date("Y-m-d H:i:s", $this -> get['end_time'] / 1000)
|
|
|
|
|
|
);
|
2022-07-10 03:36:18 +08:00
|
|
|
|
|
2022-07-12 22:36:14 +08:00
|
|
|
|
if (isset($this -> get['code']))
|
|
|
|
|
|
$sql_cmd .= sprintf(" AND code = '%s'", $this -> get['code']);
|
|
|
|
|
|
|
|
|
|
|
|
$res = pg_fetch_all(pg_query($this -> dbconn, $sql_cmd));
|
|
|
|
|
|
|
|
|
|
|
|
if (count($res) > 2e6)
|
|
|
|
|
|
return "TOO_MANY";
|
2022-07-10 03:36:18 +08:00
|
|
|
|
|
2022-07-12 22:36:14 +08:00
|
|
|
|
array_walk($res, function(&$v, $k) use ($code_name) {
|
|
|
|
|
|
$v['name'] = $code_name[$v['code']];
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2022-07-10 03:36:18 +08:00
|
|
|
|
return $res;
|
|
|
|
|
|
}
|
2022-07-09 14:30:23 +08:00
|
|
|
|
}
|