120 lines
4.7 KiB
PHP
120 lines
4.7 KiB
PHP
<?php
|
||
|
||
namespace app\event;
|
||
|
||
use Exception;
|
||
use Throwable;
|
||
use libs\db\Db;
|
||
use libs\listener\Event;
|
||
use \Workerman\Connection\AsyncTcpConnection;
|
||
|
||
class SendProcessResultParamsToScadaEvent extends Event
|
||
{
|
||
|
||
/*
|
||
{
|
||
"action": "set_node_data",
|
||
"param": {
|
||
"working_subclass":"ROUGHING",
|
||
"data": [
|
||
{
|
||
"code": "temperature",
|
||
"value": 1250.4,
|
||
"device_code": "",
|
||
"batch": ""
|
||
},
|
||
{
|
||
"code": "width",
|
||
"value": 29.45,
|
||
"device_code": "",
|
||
"batch": ""
|
||
}
|
||
]
|
||
}
|
||
}
|
||
*/
|
||
public function handle($data)
|
||
{
|
||
//检查env的转发ip是否已经配置
|
||
if(!envs("SCADA_IP") || !envs("SCADA_IP")){
|
||
echo 'ENV文件配置缺少SendProcessResultParamsToScadaEvent需要使用的SCADA_IP和SCADA_PORT配置,请先配置!';
|
||
return $data;
|
||
}
|
||
try{
|
||
|
||
list($workingsubclass,$params,$device_code,$batch) = [$data['workingsubclass'], $data['param'], $data['device_code'], $data['batch']];
|
||
//先查绑定表获取所有工序的绑定数据
|
||
$sql = "SELECT result_param_code,scada_node_code,scada_node_type FROM hf_mes_result_param_binding_scada_node WHERE working_subclass='".$workingsubclass."'";
|
||
$ret = Db::fetchAll($sql);
|
||
if(empty($ret)){
|
||
return $data;
|
||
}
|
||
//获取上传的所有结果参数取交集
|
||
$result_param_code = array_column($ret,null,'result_param_code');
|
||
$send_result_param_code = array_intersect_key($result_param_code, $params);
|
||
var_dump($params,$send_result_param_code);
|
||
//拼接发送SCADA接口的数据
|
||
$post_data = [];
|
||
foreach($send_result_param_code as $key=>$val){
|
||
if(is_array($params[array_keys($send_result_param_code)[0]]) ){
|
||
foreach($params[$val['result_param_code']] as $k => $v){
|
||
// 如果上传了时间,以上传时间为准
|
||
$collect_time_arr = [];
|
||
if(isset($params["FINISH_TIME"]) && !empty($params["FINISH_TIME"][$k])){
|
||
$collect_time_arr["collect_time"] = $params["FINISH_TIME"][$k];
|
||
}
|
||
$post_data[] = array_merge([
|
||
'code' => $val['scada_node_code'],
|
||
"value" =>$v,
|
||
"parent_device_code"=> $device_code,
|
||
"device_code"=>$device_code,
|
||
"batch"=> $batch
|
||
],$collect_time_arr);
|
||
}
|
||
}else{
|
||
// 如果上传了时间,以上传时间为准
|
||
$collect_time_arr = [];
|
||
if(isset($params["FINISH_TIME"]) && !empty($params["FINISH_TIME"])){
|
||
$collect_time_arr["collect_time"] = $params["FINISH_TIME"];
|
||
}
|
||
$post_data[] = array_merge([
|
||
'code' => $val['scada_node_code'],
|
||
"value" => $params[$val['result_param_code']],
|
||
"parent_device_code"=> $device_code,
|
||
"device_code"=>$device_code,
|
||
"batch"=> $batch
|
||
|
||
],$collect_time_arr);
|
||
}
|
||
}
|
||
$post_action_data = json_encode([
|
||
"action"=>"set_node_data",
|
||
"param"=>[
|
||
"working_subclass"=>$workingsubclass,
|
||
"data"=>$post_data
|
||
]
|
||
]);
|
||
$ip = envs("SCADA_IP");
|
||
$port = envs("SCADA_PORT");
|
||
//发送异步http post 请求
|
||
$connection = new AsyncTcpConnection("tcp://{$ip}:{$port}");
|
||
$headers = "POST / HTTP/1.1\r\n";
|
||
$headers .= "Host: {$ip}\r\n";
|
||
$headers .= "Content-Type: application/json\r\n";
|
||
$headers .= "Connection: close\r\n";
|
||
$headers .= "Content-Length: " . strlen($post_action_data) . "\r\n\r\n";
|
||
$connection->send($headers.$post_action_data);
|
||
$connection -> onMessage = function(AsyncTcpConnection $connection, $task_result){
|
||
$connection -> close();
|
||
};
|
||
// 执行异步连接
|
||
$connection->connect();
|
||
}catch(Throwable $t){
|
||
//捕获Exception和Throwable的异常,防止命令行报错导致接口无任何返回
|
||
return $data;
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
}
|