Files
2026-09-14 16:32:07 +08:00

403 lines
11 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
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* @author luoxuancai 2017/7/13
*/
class Index extends ApiController {
const TEST_SUFFIX = '-Test';
protected $_is_test = false;
public function __construct()
{
header('Access-Control-Allow-Credentials: true');
parent::__construct();
$this->load->model('sample_model');
$this->load->model('report_model');
}
public function index_get()
{
if(empty($_GET['id'])){
$this->setError('请求错误');
}
$id = trim($_GET['id']);
$id = $this->getDeviceId($id);
//报告文件
$ret = $this->report_model->get_result($id,$this->_is_test);
if(empty($ret)){
$this->setError('报告未生成');
die;
}
$this->setSuccess($ret);
}
//获取犬类疾病的列表,需要挂钩报告编号,以便显示锁定与解锁的疾病
protected function disease_list($need_category,$need_detail)
{
/*
* 从库中读取
$params = [];
//区分单基因/多基因
if(!empty($_GET['gene_type'])){
$params['gene_type'] = $_GET['gene_type'];
}
$this->load->model('disease_model');
$list = $this->disease_model->listing($params, 0,50000,'base.*');
*/
/*
* 从素材分类
$material = $this->report_model->get_material();
$info = [];
$list = array_merge($material['犬类单基因疾病'],$material['犬类复杂疾病']);
//类别描述删除多余字符
$searchStrOne = explode('|','类遗传疾病|类疾病|系统遗传病|遗传病|遗传疾病|疾病');
$searchStrTwo = explode('|','类|系统类|系统');
foreach ($list as $key=>$val) {
if(empty($val['所属类别'])){
$name = '其他';
}else{
//删除多余的描述
$name = str_replace($searchStrOne,'',$val['所属类别']);
$name = str_replace($searchStrTwo,'',$name);
}
$info[$name][] = [
'name'=>$key,
'lock'=>$lock && !in_array($key,$lockDisease)
];
}
*/
if(empty($_GET['id'])){
$this->setError('请求错误');
}
$id = trim($_GET['id']);
$id = $this->getDeviceId($id);
//样品及套餐信息
$this->load->model('sample_model');
$this->load->model('package_model');
$sample = $this->sample_model->get($id,'device_id');
if(empty($sample)){
$this->setError('样品不存在');
die;
}
//报告文件
$json = $this->report_model->get_report_json($id,$sample['pet_species']);
//套餐设置成1,上线后删除
//$sample['package_id'] = 1;
$package = $this->package_model->get($sample['package_id']);
if(!$package){
return [];
}
$gene_type = !empty($_GET['gene_type'])?$_GET['gene_type']:0;
return $this->report_model->get_disease_list($gene_type,$sample,$json,$package,$need_category,$need_detail);
}
//疾病列表
public function disease_list_get(){
$ret = $this->disease_list(!empty($_GET['need_category']),false);
if(!empty($_GET['need_category'])){
//需要分类的疾病是单基因疾病,将解锁的放前面
foreach ($ret as $category_name => $list) {
$lock = [];
$unlock = [];
foreach ($list as $key=>$val) {
if($val['lock']){
$lock[] = $val;
}else{
$unlock[] = $val;
}
}
$ret[$category_name] = array_merge($unlock,$lock);
}
}
$this->setSuccess($ret);
}
//疾病列表
public function disease_get()
{
/*
$this->load->model('disease_model');
$row = $this->disease_model->get($_GET['disease_name'],'base.name');
*/
if(empty($_GET['disease_name'])){
$this->setError('请求错误');
}
$ret = [];
$material = $this->disease_list(false,true);
foreach ($material as $item) {
if($item['name'] == $_GET['disease_name']){
$ret = $item;
break;
}
}
//根据基因类型,做低风险描述调整,未检测出时没有描述
if(!$ret['risk']){
$ret['risk_desc'] = $ret['gene_type'] == 1?'未检测到致病突变':'低发病风险';
}
$this->setSuccess($ret);
}
//证书图片信息
public function cert_health_list_get()
{
//疾病描述
$this->load->model('Cat_disease_desc_model');
$disease = [];
$material = $this->disease_list(false,true);
foreach ($material as $item) {
$description = $this->Cat_disease_desc_model->breeding_single_detail($item['name']);
if(empty($description)){
continue;
}
//风险等级
$risk_tag = 'N/N';
if($item['risk']){
$risk_tag = $item['risk_level'] == 1?'N/F':'F/F';
}
$disease[] = [
//疾病名称
'name'=>$item['name'],
//疾病N/N
'risk_tag'=>$risk_tag,
//结果说明
'risk_desc'=>$description['检测结果'][$risk_tag],
//检测手段
'method'=>$description['检测手段'],
//基因型
'gene_type'=>$description['基因型'],
//N/N
'NN'=>$description['结果说明']['N/N'],
'NF'=>$description['结果说明']['N/F'],
'FF'=>$description['结果说明']['F/F'],
];
}
$this->success($disease);
}
//证书图片单张
public function cert_health_get()
{
if(empty($_GET['name'])){
$this->setError('请求错误');
}
$disease = [];
$material = $this->disease_list(false,true);
foreach ($material as $item) {
if($item['name'] == $_GET['name']){
$disease = $item;
break;
}
}
//根据基因类型,做低风险描述调整,未检测出时没有描述
if(!$disease['risk']){
$disease['risk_desc'] = $disease['gene_type'] == 1?'未检测到致病突变':'低发病风险';
}
//样本信息
$id = trim($_GET['id']);
$id = $this->getDeviceId($id);
//样品及套餐信息
$this->load->model('sample_model');
$this->load->model('package_model');
$sample = $this->sample_model->get($id,'device_id');
if(empty($sample)){
$this->setError('样品不存在');
die;
}
//疾病描述
$this->load->model('Cat_disease_desc_model');
$description = $this->Cat_disease_desc_model->breeding_single_detail($_GET['name']);
if(empty($description)){
die('empty');
}
//证书文件如果有就直接输出
$this->load->library('uploads');
$id = strtoupper($id);
$upload_path = $this->uploads->get_upload_path();
$cert_img_path = $upload_path.Uploads::DIR_PER_CERT_IMG.DIRECTORY_SEPARATOR.$id.DIRECTORY_SEPARATOR;
$cert_file_name = $cert_img_path.$_GET['name'].'.jpg';
if(file_exists($cert_file_name)){
//声明需要创建的图层的图片格式
header("Content-Type:image/jpg");
echo file_get_contents($cert_file_name);
die();
}
//风险等级
$risk_tag = 'N/N';
if($disease['risk']){
$risk_tag = $disease['risk_level'] == 1?'N/F':'F/F';
}
//图片
header("Content-type: image/png");
$file = APPPATH."uahpet/cert_template/health.png";//图片跟路径
$font = APPPATH."uahpet/font/SourceHanSansCN-Regular.otf";
$font_bold = APPPATH."uahpet/font/SourceHanSansCN-Bold.otf";
$img = imagecreatefrompng($file);
$blue = imagecolorallocate($img, 17, 182, 179);
$black = imagecolorallocate($img, 62, 62, 62);
//名字
$sting = $sample['pet_name'];
imagettftext($img, 15, 0, 288, 705, $black, $font, $sting);
//养育人
$sting = $sample['name'];
imagettftext($img, 15, 0, 600, 705, $black, $font, $sting);
//测试日期
$sting = date('Y-m-d',$sample['create_time']);
imagettftext($img, 15, 0, 970, 705, $black, $font, $sting);
//疾病名称
$sting = $_GET['name'];
imagettftext($img, 27, 0, 186, 965, $blue, $font_bold, $sting);
//疾病N/N
$sting = $risk_tag;
imagettftext($img, 27, 0, 638, 965, $blue, $font_bold, $sting);
//结果说明
$sting = $description['检测结果'][$risk_tag] ;
imagettftext($img, 15, 0, 736, 960, $black, $font, $sting);
/* 证书左侧段落 */
//检测手段
$sting = '检测手段:'.$description['检测手段'];
imagettftext($img, 13, 0, 188, 1030, $black, $font, $sting);
//检测手段解释
$sting = '基 因 型:';
imagettftext($img, 13, 0, 188, 1061, $black, $font, $sting);
//检测手段解释
$sting_arr = explode("\n",$description['基因型']);
//右侧,处理换行
foreach ($sting_arr as $key=>$val) {
imagettftext($img, 13, 0, 188+85, 1061+$key*25, $black, $font, $val);
}
/* 证书右侧段落 */
//N/N
$sting = 'N/N'.$description['结果说明']['N/N'];
imagettftext($img, 13, 0, 644, 1030, $black, $font, $sting);
//N/F
//标题
$sting_arr = $this->cutImgString($description['结果说明']['N/F'],26);
$sting = 'N/F';
imagettftext($img, 13, 0, 644, 1061, $black, $font, $sting);
//右侧,处理换行
foreach ($sting_arr as $key=>$val) {
imagettftext($img, 13, 0, 644+45, 1061+$key*25, $black, $font, $val);
}
//F/F
$sting = 'F/F'.$description['结果说明']['F/F'];
imagettftext($img, 13, 0, 644, 1093+(count($sting_arr)-1)*16, $black, $font, $sting);
imagejpeg($img,$cert_file_name,75);
imagedestroy($img);
echo file_get_contents($cert_file_name);
exit;
}
public function cert_health_down_post()
{
//接口禁用
die('');
$data = $this->json_input();
if(empty($data) || empty($data['id'])){
$this->setError('请求错误');
}
//样本序列号
$device_id = trim($data['id']);
$device_id = $this->getDeviceId($device_id);
//接收血统证书,血统证书很难在服务器端生成
$base64_cert_lineage = trim($data['cert_lineage']);
$this->load->library('uploads');
$this->load->library('MakeZip');
//报告id
$device_id = strtoupper($device_id);
//图片
$pet_img = $this->uploads->save_cert_img_base64(
$base64_cert_lineage,
$device_id,
'健康证书'
);
if(!$pet_img){
$this->error('健康证书输出失败');
}
//压缩
$path = (Uploads::DIR).DIRECTORY_SEPARATOR;
$sourceDir = $path.(Uploads::DIR_PER_CERT_IMG).DIRECTORY_SEPARATOR.$device_id.DIRECTORY_SEPARATOR;
$targetFile = $path.(Uploads::DIR_PER_CERT_ZIP).DIRECTORY_SEPARATOR.uniqid().'.zip';
$res = $this->makezip->zip(FCPATH.$sourceDir,FCPATH.$targetFile);
if(!$res){
throw new Exception('压缩失败');
}
$this->success(['file'=>base_url().$targetFile]);
exit;
}
private function setError($err,$code = 0){
echo json_encode(['code'=>$code,'msg'=>$err]);
die;
}
private function setSuccess($data){
echo json_encode(['code'=>1,'msg'=>'','data'=>$data]);
die;
}
protected function getDeviceId($deviceID){
//是否预置了测试参数
$this->_is_test = substr($deviceID,-strlen(self::TEST_SUFFIX)) == self::TEST_SUFFIX;
if($this->_is_test){
return substr($deviceID,0,-strlen(self::TEST_SUFFIX));
}
return $deviceID;
}
//字数太长要折行,统计折行的行数
protected function cutImgString($str,$len){
if(mb_strlen($str)<$len){
return [$str];
}
$str_len = mb_strlen($str);
$count = ceil($str_len/$len);
$result = [];
for($x = 0; $x <= $count; $x++){
$result[] =mb_substr($str,$len*$x,$len);
}
return $result;
}
}