增加类型检查,且允许混合上传
This commit is contained in:
@@ -2,32 +2,85 @@
|
||||
namespace EdgeManager\EDataCapture;
|
||||
|
||||
class EDataCapture {
|
||||
// 我不主张在构造函数内实现类型检查,因为在请求过于密集、记录较多时会严重影响性能
|
||||
// 请使用SCADA系统的开发人员自觉遵守文档内规范
|
||||
function __construct(
|
||||
protected $dbconn,
|
||||
protected $post = NULL,
|
||||
protected $get = NULL
|
||||
) {}
|
||||
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'];
|
||||
});
|
||||
|
||||
foreach ($this -> post -> param -> data as $row) {
|
||||
$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);
|
||||
}
|
||||
}
|
||||
|
||||
function set_node_data() {
|
||||
foreach (array_chunk($this -> post -> param -> data, 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 -> post -> param -> working_subclass,
|
||||
$this -> post -> param -> type
|
||||
);
|
||||
foreach ($chunk as $row) {
|
||||
$sql_values[] = sprintf(
|
||||
"('%s', %s, %s, %s)",
|
||||
$row -> code,
|
||||
$row -> value,
|
||||
$row -> device_code ?? 'DEFAULT',
|
||||
$row -> batch ?? 'DEFAULT'
|
||||
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]
|
||||
);
|
||||
foreach ($chunk as $row) {
|
||||
$sql_values[] = sprintf(
|
||||
"('%s', '%s', %s, %s)",
|
||||
$code,
|
||||
$row['value'],
|
||||
$row['device_code'] ?? 'DEFAULT',
|
||||
$row['batch'] ?? 'DEFAULT'
|
||||
);
|
||||
}
|
||||
$res[] = pg_query($this -> dbconn, $sql_head . implode(',', $sql_values));
|
||||
unset($row, $sql_values);
|
||||
}
|
||||
return pg_query($this -> dbconn, $sql_head . implode(',', $sql_values));
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,8 +106,8 @@ class ENodeConfigure {
|
||||
return pg_fetch_all($res);
|
||||
}
|
||||
|
||||
function get_working_subclasses() {
|
||||
$res = pg_query($this -> dbconn, "SELECT DISTINCT ON (working_subclass) working_subclass FROM hf_mes_scada_data_capture_node_configure");
|
||||
static function get_working_subclasses($dbconn) {
|
||||
$res = pg_query($dbconn, "SELECT DISTINCT ON (working_subclass) working_subclass FROM hf_mes_scada_data_capture_node_configure");
|
||||
return pg_fetch_all_columns($res, 0);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user