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

205 lines
7.3 KiB
PHP

<?php
namespace app\event;
use Exception;
use ParseError;
use Throwable;
use Error;
use libs\db\Db;
use libs\listener\Event;
class ExtScriptEvent extends Event
{
public function extScriptBegin($data)
{
// 判断计算脚本的开关是否开启
if(!config('mes.calculation_script_switch')){
return [];
}
$process_code = $data['process_code'];
$class_name_arr = explode('\\', $data['class_name']);
$class_arr = preg_split("/(?<=[a-z])(?![a-z])/", $class_name_arr[count($class_name_arr) - 1], -1, PREG_SPLIT_NO_EMPTY);
$class_str = strtolower(implode('_', $class_arr));
$script_path = config('mes.calculation_script_url') . "{$process_code}/{$class_str}/begin.script";
/**
* 注意:如果脚本需要返回数据,那么需要在脚本里面把内容放到$response['data_return']中统一返回
*/
$response = [
'ext_script_code' => 0,
'ext_script_msg' => '脚本执行成功',
'data_return' => [],
];
// 获取脚本是否启用
$sql = sprintf(
"SELECT status
FROM hf_mes_calculation_script
WHERE process_code='%s' AND interface_code='%s' AND interface_position='begin' LIMIT 1;",
$process_code,
$class_str
);
$ret = Db::fetch($sql);
if(empty($ret)){
$response['ext_script_code'] = 0;
$response['ext_script_msg'] = '脚本不存在配置数据,请先在后台配置';
return $response;
}
if($ret['status'] == 0){
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本的状态禁用中';
return $response;
}
if (!@fopen($script_path, 'r')) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本文件不存在';
return $response;
}
try {
// 使用file_get_contents()函数读取文件内容
$scriptContent = file_get_contents($script_path);
if (isJson($scriptContent)) {
$scriptContent = json_decode($scriptContent, true);
if (isset($scriptContent['code']) && $scriptContent['code'] == 404) {
throw new Exception('脚本文件不存在');
}
}
// 检查文件是否成功读取
if ($scriptContent !== false) {
@trigger_error('flag', E_USER_NOTICE);
// 执行脚本
eval($scriptContent);
// 获取 Notice 错误
$error = error_get_last();
if ($error['message'] != 'flag') {
$response['data_return'] = $error['message'];
}
} else {
// 如果文件读取失败,输出错误信息
throw new Exception('无法读取脚本内容');
}
} catch (ParseError $p) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $p->getMessage();
} catch (Throwable $e){
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $e->getMessage();
} catch (Exception $exp) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $exp->getMessage();
} catch (Error $err) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $err->getMessage();
}
return $response;
}
public function extScriptEnd($data)
{
// 判断计算脚本的开关是否开启
if(!config('mes.calculation_script_switch')){
return [];
}
$process_code = $data['process_code'];
$class_name_arr = explode('\\', $data['class_name']);
$class_arr = preg_split("/(?<=[a-z])(?![a-z])/", $class_name_arr[count($class_name_arr) - 1], -1, PREG_SPLIT_NO_EMPTY);
$class_str = strtolower(implode('_', $class_arr));
$script_path = config('mes.calculation_script_url') . "{$process_code}/{$class_str}/end.script";
/**
* 注意:如果脚本需要返回数据,那么需要在脚本里面把内容放到$response['data_return']中统一返回
*/
$response = [
'ext_script_code' => 0,
'ext_script_msg' => '脚本执行成功',
'data_return' => [],
];
// 获取脚本是否启用
$sql = sprintf(
"SELECT status
FROM hf_mes_calculation_script
WHERE process_code='%s' AND interface_code='%s' AND interface_position='end' LIMIT 1;",
$process_code,
$class_str
);
$ret = Db::fetch($sql);
if(empty($ret)){
$response['ext_script_code'] = 0;
$response['ext_script_msg'] = '脚本不存在配置数据,请先在后台配置';
return $response;
}
if($ret['status'] == 0){
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本的状态禁用中';
return $response;
}
if (!@fopen($script_path, 'r')) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本文件不存在';
return $response;
}
try {
// 使用file_get_contents()函数读取文件内容
$scriptContent = file_get_contents($script_path);
if (isJson($scriptContent)) {
$scriptContent = json_decode($scriptContent, true);
if (isset($scriptContent['code']) && $scriptContent['code'] == 404) {
throw new Exception('脚本文件不存在');
}
}
// 检查文件是否成功读取
if ($scriptContent !== false) {
@trigger_error('flag', E_USER_NOTICE);
// 执行脚本
eval($scriptContent);
// 获取 Notice 错误
$error = error_get_last();
if ($error['message'] != 'flag') {
$response['data_return'] = $error['message'];
}
} else {
// 如果文件读取失败,输出错误信息
throw new Exception('无法读取脚本内容');
}
} catch (ParseError $p) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $p->getMessage();
} catch (Throwable $e){
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $e->getMessage();
} catch (Exception $exp) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $exp->getMessage();
} catch (Error $err) {
$response['ext_script_code'] = 201;
$response['ext_script_msg'] = '脚本执行失败, 错误:' . $err->getMessage();
}
return $response;
}
}