You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

629 lines
20 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers;
use App\Models\AnalysisType;
use App\Models\Hospital;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Yo;
class ReportController extends Controller
{
public function down_pdf(Request $request)
{
$data = [
"体检号" => $request->post('rid'),
"查询密码" => $request->post('password'),
"文件Id" => $request->post('id')
];
$reportname=$request->post('reportname');
$username=$request->post('name');
$hospital_info = Hospital::where('id', $request->post('hospital'))->where('del', 2)->first();
if (!$hospital_info) Yo::error_echo(100000, ['机构/医院']);
$code = $hospital_info->code;
$peis = new PEISApiController();
$url = $peis::Api('报告文件下载', $code);
$data_string = json_encode($data, JSON_UNESCAPED_UNICODE);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data_string)
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$res_string = curl_exec($ch);
curl_close($ch);
if ($res_string == '无效URL') Yo::error_echo(200065);
$disk = Storage::disk('public');
$name = $request->post('id');
$date = $request->post('rid');
$name=$username.$data['体检号'].$reportname.'_'.$name;
$path = "/assets/upload/pdf/$date/$name.pdf";
$put = $disk->put($path, $res_string);
if (!$put) Yo::error_echo(100028, ['put']);
$save = "/storage/assets/upload/pdf/$date/$name.pdf";
return Yo::echo([
'url' => $save
]);
}
public function get_report($id)
{
$peis = new PEISApiController();
$report = $peis::Post('体检报告查询', request()->post('hospital'), [
"电话号码" => "",
"证件号码" => '',
"体检号" => $id
])['data'];
// Yo::error_exit(['message'=>"res",'code'=>200,'data'=>$report]);
return $report;
}
public function orderReport($report_data)
{
$report_data['收费项目列表'] = self::myUsort($report_data['收费项目列表'], ['收费项目顺序'], [0]);
foreach ($report_data['收费项目列表'] as $key => $report_datum) {
$report_data['收费项目列表'][$key]['基础项目列表'] = self::myUsort(
$report_data['收费项目列表'][$key]['基础项目列表'],
['基础项目顺序'],
[0]
);
}
return $report_data;
}
public function orderReportTime($res)
{
foreach ($res as $key => $re) {
$res[$key]['order_time'] = date('YmdHi', strtotime($re['登记时间']));
}
return self::myUsort($res, ['order_time'], [0]);
}
public function myUsort($array, $key_array, $sort)
{
if (count($key_array) != count($sort)) return $array;
usort($array, function ($a, $b) use ($key_array, $sort) {
foreach ($key_array as $index => $key) {
if ($a[$key] != $b[$key]) {
return ($sort[$index] ? $a[$key] < $b[$key] : $a[$key] > $b[$key])
? 1 : -1;
}
}
return 1;
});
return $array;
}
//报告预查询检查报告内容是否存在PrepareCheckReport
public function PrepareCheckReport(Request $request)
{
$id = $request->post('id');
$id_number = $request->post('id_number');
$date = $request->post('date');
$hospital = $request->post('hospital');
$analysis_type = AnalysisType::find($id);
$mark = $analysis_type->mark;
$peis = new PEISApiController();
$res = $peis::Post('体检报告查询', $hospital, [
"电话号码" => "",
"证件号码" => $id_number,
"体检号" => ""
])['data'];
$info = [
'title' => '',
'result' => '',
'name' => '',
'value' => '',
'date' => '',
'content' => '',
'table' => [
'name' => '',
'list' => []
],
];
$value = 0;
$unit = '';
$info['title'] = $analysis_type->name;
$info['content'] = $analysis_type->content;
$range_data = json_decode($analysis_type->range, true);
$range = $range_data['r'];
$label = $range_data['l'];
$step = $range_data['s'];
$color = ['#357e24', '#a7ea9b', '#95cde8', '#f0a93f', '#f0a93f', '#ec572c'];
$time = 0;
$range_str = '';
$data_arr = [];
$res_done_arr = [];
foreach ($res as $re) {
if ($re['体检状态'] == '报告已出') {
$res_done_arr[] = $re;
}
}
$res = $res_done_arr;
$res = self::orderReportTime($res);
$date_list = [];
$datetime = '';
foreach ($res as $item) {
$report_data = self::get_report($item['体检号']);
// Yo::error_exit([
// 'message' => "res",
// 'code' => 2001,
// 'data' => $report_data
// ]);
$report = false;
if (isset($report_data[0]['收费项目列表'])) {
$report = self::orderReport($report_data[0]);
}
if (!!$report) {
$datetime = explode('T', $report['登记时间'])[0];
foreach ($report['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
if ($i['基础项目代码'] == $mark) {
if ($i['结果类型'] == '数值' && !!$i['结果值范围']) {
$date_list[] = $datetime;
$result = '正常';
if ($i['异常标识'] == '↑') $result = '偏高';
if ($i['异常标识'] == '↓') $result = '偏低';
$range_str = $i['结果值范围'];
if (strtotime($datetime) > $time) {
$info['result'] = $result;
$info['value'] = $i['异常标识'] . $i['结果值'] . $i['结果值单位'];
$value = $i['结果值'];
$data_arr[] = [
'value' => $value,
'datetime' => $datetime,
];
$unit = $i['结果值单位'];
$info['date'] = $datetime;
$time = strtotime($datetime);
}
$info['name'] = $i['基础项目名称'];
$info['table']['name'] = $i['基础项目名称'];
$info['table']['list'][] = [
'date' => $datetime,
'value' => $i['异常标识'] . $i['结果值'],
'assess' => $result,
];
}
}
}
}
}
}
if ($date == '') $date = $datetime;
$rc = 0;
foreach ($res as $item) {
$report_data = self::get_report($item['体检号']);
$report = false;
if (isset($report_data[0]['收费项目列表'])) {
$report = self::orderReport($report_data[0]);
}
if (!!$report) {
$datetime = explode('T', $report['登记时间'])[0];
foreach ($report['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
if ($i['基础项目代码'] == $mark) {
$result = '正常';
if ($i['异常标识'] == '↑') $result = '偏高';
if ($i['异常标识'] == '↓') $result = '偏低';
if ($datetime == $date) {
$info['result'] = $result;
$info['value'] = $i['异常标识'] . $i['结果值'] . $i['结果值单位'];
$value = $i['结果值'];
$unit = $i['结果值单位'];
$info['date'] = $datetime;
$rc++;
}
$info['name'] = $i['基础项目名称'];
$info['table']['name'] = $i['基础项目名称'];
}
}
}
}
}
if ($rc == 0) Yo::error_echo(200081);
if (!$range_str) Yo::error_echo(200081);
return Yo::echo([
'status' => 'ok',
]);
}
public function analysis(Request $request)
{
$id = $request->post('id');
$id_number = $request->post('id_number');
$date = $request->post('date');
$hospital = $request->post('hospital');
$analysis_type = AnalysisType::find($id);
$mark = $analysis_type->mark;
$peis = new PEISApiController();
$res = $peis::Post('体检报告查询', $hospital, [
"电话号码" => "",
"证件号码" => $id_number,
"体检号" => ""
])['data'];
$info = [
'title' => '',
'result' => '',
'name' => '',
'value' => '',
'date' => '',
'content' => '',
'table' => [
'name' => '',
'list' => []
],
];
$value = 0;
$unit = '';
$info['title'] = $analysis_type->name;
$info['content'] = $analysis_type->content;
$range_data = json_decode($analysis_type->range, true);
$range = $range_data['r'];
$label = $range_data['l'];
$step = $range_data['s'];
$color = ['#357e24', '#a7ea9b', '#95cde8', '#f0a93f', '#f0a93f', '#ec572c'];
$time = 0;
$range_str = '';
$data_arr = [];
$res_done_arr = [];
foreach ($res as $re) {
if ($re['体检状态'] == '报告已出') {
$res_done_arr[] = $re;
}
}
$res = $res_done_arr;
$res = self::orderReportTime($res);
$date_list = [];
$datetime = '';
foreach ($res as $item) {
$report_data = self::get_report($item['体检号']);
$report = false;
if (isset($report_data[0]['收费项目列表'])) {
$report = self::orderReport($report_data[0]);
}
if (!!$report) {
$datetime = explode('T', $report['登记时间'])[0];
foreach ($report['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
if ($i['基础项目代码'] == $mark) {
if ($i['结果类型'] == '数值' && !!$i['结果值范围']) {
$date_list[] = $datetime;
$result = '正常';
if ($i['异常标识'] == '↑') $result = '偏高';
if ($i['异常标识'] == '↓') $result = '偏低';
$range_str = $i['结果值范围'];
if (strtotime($datetime) > $time) {
$info['result'] = $result;
$info['value'] = $i['异常标识'] . $i['结果值'] . $i['结果值单位'];
$value = $i['结果值'];
$data_arr[] = [
'value' => $value,
'datetime' => $datetime,
];
$unit = $i['结果值单位'];
$info['date'] = $datetime;
$time = strtotime($datetime);
}
$info['name'] = $i['基础项目名称'];
$info['table']['name'] = $i['基础项目名称'];
$info['table']['list'][] = [
'date' => $datetime,
'value' => $i['异常标识'] . $i['结果值'],
'assess' => $result,
];
}
}
}
}
}
}
if ($date == '') $date = $datetime;
$rc = 0;
foreach ($res as $item) {
$report_data = self::get_report($item['体检号']);
$report = false;
if (isset($report_data[0]['收费项目列表'])) {
$report = self::orderReport($report_data[0]);
}
if (!!$report) {
$datetime = explode('T', $report['登记时间'])[0];
foreach ($report['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
if ($i['基础项目代码'] == $mark) {
$result = '正常';
if ($i['异常标识'] == '↑') $result = '偏高';
if ($i['异常标识'] == '↓') $result = '偏低';
if ($datetime == $date) {
$info['result'] = $result;
$info['value'] = $i['异常标识'] . $i['结果值'] . $i['结果值单位'];
$value = $i['结果值'];
$unit = $i['结果值单位'];
$info['date'] = $datetime;
$rc++;
}
$info['name'] = $i['基础项目名称'];
$info['table']['name'] = $i['基础项目名称'];
}
}
}
}
}
if ($rc == 0) Yo::error_echo(200066);
$chart1_option = [
'show' => true,
'range' => [],
'min' => 0,
'max' => 0,
'value' => $value,
'label' => $label,
];
$chart2_option = [
'show' => true,
'data' => $data_arr,
'min' => 0,
'max' => 0,
'unit' => $unit,
'step' => $step,
'range' => [],
];
if (!$range_str) Yo::error_echo(200066);
$data_show = true;
if (!$range_str) {
$data_show = false;
$chart1_option['show'] = false;
$chart2_option['show'] = false;
} else if (strstr($range_str, '>') || strstr($range_str, '<')) {
$data_show = false;
$chart1_option['show'] = false;
$chart2_option['show'] = false;
} else {
$range_str = str_replace('~~', '-', $range_str);
$range_str = str_replace('--', '-', $range_str);
$range_str = str_replace('~', '-', $range_str);
$range_arr = explode('-', $range_str);
$min_index = array_search("min", $range);
$max_index = array_search("max", $range);
$range[$min_index] = $range_arr[0];
$range[$max_index] = $range_arr[1];
$chart1_option['min'] = $range_arr[0];
$chart1_option['max'] = $range_arr[1];
$chart2_option['range'] = $range_arr;
$chart2_option['min'] = $range[0];
$chart2_option['max'] = $range[count($range) - 1];
foreach ($range as $key => $item) {
$chart1_option['range'][] = [
'percent' => $item / ($range[count($range) - 1] - $range[0]),
'value' => $item,
'color' => $color[$key - $min_index + 1],
];
}
}
return Yo::echo([
'date' => $date,
'date_list' => $date_list,
'show' => $data_show,
'info' => $info,
'chart1_option' => $chart1_option,
'chart2_option' => $chart2_option,
]);
}
public function contrast(Request $request)
{
$ids = $request->post('ids');
$r1 = self::get_report($ids[0]);
$r2 = self::get_report($ids[1]);
if($r1[0]['体检状态']!='报告已出' or $r2[0]['体检状态']!='报告已出') Yo::error_echo(200090);
$res = self::orderReportTime([$r1[0], $r2[0]]);
$r1 = [$res[0]];
$r2 = [$res[1]];
$r1_datetime = '';
$r1_map = [];
if (count($r1) != 0) {
$r1_info = $r1[0];
foreach ($r1_info['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
$r1_datetime = explode('T', $r1_info['登记时间'])[0];
$r1_map[$i['基础项目代码']] = $i;
}
}
}
$r2_map = [];
$r2_datetime = '';
if (count($r2) != 0) {
$r2_info = $r2[0];
foreach ($r2_info['收费项目列表'] as $item) {
foreach ($item['基础项目列表'] as $i) {
$r2_datetime = explode('T', $r2_info['登记时间'])[0];
$r2_map[$i['基础项目代码']] = $i;
}
}
}
$clear_type1_list = [];
$clear_type2_list = [];
$id = 1;
foreach ($r1_map as $key => $item) {
$r2_data = isset($r2_map[$key]) ? [
'date' => $r2_datetime,
'content' => $r2_map[$key]['结果值'] . $r2_map[$key]['结果值单位'],
'icon' => $r2_map[$key]['异常标识'],
'desc' => $r2_map[$key]['结果值范围'],
] : [
'date' => $r2_datetime,
'content' => '',
'icon' => '',
'desc' => ''
];
$i = [
'id' => $id,
'title' => $item['基础项目名称'],
'r1' => [
'date' => $r1_datetime,
'content' => $item['结果值'] . $item['结果值单位'],
'icon' => $item['异常标识'],
'desc' => $item['结果值范围'],
],
'r2' => $r2_data
];
if ($item['结果类型'] == '数值') {
$clear_type2_list[$key] = $i;
} else {
$clear_type1_list[$key] = $i;
}
$id = $id + 1;
}
foreach ($r2_map as $key => $item) {
$r1_data = isset($r1_map[$key]) ? [
'date' => $r1_datetime,
'content' => $r1_map[$key]['结果值'] . $r1_map[$key]['结果值单位'],
'icon' => $r1_map[$key]['异常标识'],
'desc' => $r1_map[$key]['结果值范围'],
] : [
'date' => $r1_datetime,
'content' => '',
'icon' => '',
'desc' => '',
];
$i = [
'id' => $id,
'title' => $item['基础项目名称'],
'r1' => $r1_data,
'r2' => [
'date' => $r2_datetime,
'content' => $item['结果值'] . $item['结果值单位'],
'icon' => $item['异常标识'],
'desc' => $item['结果值范围'],
]
];
if ($item['结果类型'] == '数值') {
$clear_type2_list[$key] = $i;
} else {
$clear_type1_list[$key] = $i;
}
$id = $id + 1;
}
$report_type1_content = [];
$report_type2_content = [];
foreach ($clear_type1_list as $item) {
$report_type1_content[] = $item;
}
foreach ($clear_type2_list as $item) {
$report_type2_content[] = $item;
}
return Yo::echo([
'report_type1_content' => $report_type1_content,
'report_type2_content' => $report_type2_content,
]);
}
public function info(Request $request)
{
$id = $request->post('id');
$res = self::get_report($id);
$conclusion = [
'datetime' => '',
'doctor' => '',
'content' => '',
'suggestion' => '',
];
$content = [];
$list = [
'info' => [
'id' => '',
'password' => ''
],
'list' => []
];
if (count($res) != 0) {
if($res[0]['体检状态']!='报告已出' and $res[0]['体检状态']!='总检完成') Yo::error_echo(200090);
$info = self::orderReport($res[0]);
// Yo::error_exit([
// 'message' => "res",
// 'code' => 2001,
// 'data' => $res
// ]);
$list['info']['id'] = $info['体检号'];
$list['info']['name'] = $info['姓名'];
$list['info']['password'] = $info['查询密码'];
$list['list'] = $info['报告文件列表'];
$jielun=$info['总检结论'];
$jianyi=$info['总检建议'];
if(empty($info['总检结论'])){
foreach ($info['综述建议'] as $item) {
$jielun=$jielun.$item['综述'];
}
}
if(empty($info['总检建议'])){
foreach ($info['综述建议'] as $item) {
$jianyi=$jianyi.$item['建议'];
}
}
$conclusion = [
'datetime' => str_replace('T', ' ', $info['登记时间']),
'doctor' => $info['总检医生'],
'content' =>$jielun,
'suggestion' =>$jianyi,
];
foreach ($info['收费项目列表'] as $item) {
$content_list = [];
foreach ($item['基础项目列表'] as $i) {
$content_list[] = [
'title' => $i['基础项目名称'],
'content' => $i['结果值'] . $i['结果值单位'],
'icon' => $i['异常标识'],
'desc' => $i['结果值范围'],
];
}
$content[] = [
'title' => $item['收费项目名称'],
'datetime' => date('Y-m-d', strtotime($info['登记时间'])),
'doctor' => $item['检查医生'],
'list' => $content_list
];
}
}
return Yo::echo([
'conclusion' => $conclusion,
'content' => $content,
'list' => $list,
]);
}
public function list(Request $request)
{
$id_number = $request->post('id_number');
$hospital = Hospital::where('id', $request->post('hospital'))->where('del', 2)->first();
if (!$hospital) Yo::error_echo(100000, ['机构/医院']);
$peis = new PEISApiController();
$res = $peis::Post('体检报告查询', $hospital->id, [
"电话号码" => "",
"证件号码" => $id_number,
"体检号" => ''
])['data'];
$list = [];
foreach ($res as $item) {
$list[] = [
'id' => $item['体检号'],
'title' => explode('T', $item['登记时间'])[0] . ' 体检报告',
'desc' => $hospital->name,
];
}
return Yo::echo(['list' => $list]);
}
}