SCTMES_V5/mes_in_sct/app/event/SendProcessResultParamsToScadaEvent.php
2025-06-14 18:55:09 +08:00

120 lines
4.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}