SCTMES_V5/mes_in_sct/app/event/SendProcessResultParamsToScadaEvent.php

120 lines
4.7 KiB
PHP
Raw Permalink Normal View History

2025-06-14 18:55:09 +08:00
<?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;
}
}