205 lines
7.3 KiB
PHP
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;
|
|
}
|
|
}
|