feat: init project codebase

This commit is contained in:
sinde21
2026-09-14 16:32:07 +08:00
parent c4b2a15757
commit da20fde7fb
140 changed files with 27855 additions and 0 deletions
+402
View File
@@ -0,0 +1,402 @@
<?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;
}
}