194 lines
6.6 KiB
PHP
194 lines
6.6 KiB
PHP
<?php
|
||
/**
|
||
* Created by PhpStorm.
|
||
* User: yancheng<cheng@love.xiaoyan.me>
|
||
* Date: 2019/6/19
|
||
* Time: 5:47 PM
|
||
*/
|
||
|
||
namespace app\service;
|
||
|
||
|
||
use app\model\EvaluationHistory;
|
||
use app\model\UserDetail;
|
||
use app\util\DataStatus;
|
||
use app\util\ListCountData;
|
||
use think\facade\Config;
|
||
use think\facade\Db;
|
||
|
||
class EvaluationService
|
||
{
|
||
/**
|
||
* @param int $id
|
||
* @return EvaluationHistory|null
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public static function findRecord(int $id)
|
||
{
|
||
return EvaluationHistory::find($id);
|
||
}
|
||
|
||
private static $results = [
|
||
['未患有急性高原反应', ''],
|
||
['属于轻度高反', '适当休息,每天自评一次'],
|
||
['属于中度高反', '就近就诊(基层医疗机构)'],
|
||
['属于重度高反', '联系120,医院急诊留观或进入抢救室'],
|
||
];
|
||
|
||
public static function findById(int $id){
|
||
$evaluation = EvaluationHistory::find($id);
|
||
if(empty($evaluation)) return null;
|
||
return self::parseEvaluationData($evaluation->toArray());
|
||
}
|
||
public static function parseEvaluationData($item)
|
||
{
|
||
$data = [];
|
||
$subjects = Config::get('app.evaluation.subject');
|
||
$results = self::$results;
|
||
if (!empty($item)) {
|
||
$data = [
|
||
'score' => $item['score'],
|
||
'options' => [],
|
||
'create_time' => $item['create_time'],
|
||
];
|
||
foreach ($subjects as $key => $sub) {
|
||
$data['options'][] = array_merge([
|
||
'subject' => $sub['subject'],
|
||
], $sub['options'][$item[$key]]);
|
||
//$data['score'] += $sub['options'][$item[$key]]['score'];
|
||
}
|
||
$level = 0;
|
||
|
||
if ($item['headache'] >= 1 && $item['score'] >= 3) {
|
||
if ($data['score'] < 3) $level = 0;
|
||
elseif ($data['score'] <= 5) $level = 1;
|
||
elseif ($data['score'] <= 9) $level = 2;
|
||
else $level = 3;
|
||
}
|
||
$data['level'] = $level;
|
||
$data['result'] = $results[$level][0];
|
||
$data['suggest'] = $results[$level][1];
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
public static function findByUser(int $uid)
|
||
{
|
||
$data = EvaluationHistory::where('uid', $uid)
|
||
->where(DataStatus::NormalCondition())
|
||
->order('id','desc')
|
||
->select()->toArray();
|
||
foreach ($data as $k => $v) {
|
||
//array_merge(['raw' => $v], self::parseEvaluationData($v));
|
||
$data[$k] = self::parseEvaluationData($v);
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
const ResultAll = -1;
|
||
const ResultNone = 0;
|
||
const ResultLight = 1;
|
||
const ResultModerate = 2;
|
||
const ResultSerious = 3;
|
||
|
||
const SortByTime = 'create_time';
|
||
const SortByScore = 'score';
|
||
|
||
public static function search(int $result = self::ResultAll, string $username = null,
|
||
string $sort = null, $page = 1, $pageSize = 20)
|
||
{
|
||
if (empty($sort) || !in_array($sort, [self::SortByTime, self::SortByScore])) {
|
||
$sort = self::SortByTime;
|
||
}
|
||
//全部结构范围
|
||
$resultType = [0, 12];
|
||
|
||
if ($result == self::ResultNone) $resultType = [0, 2];
|
||
if ($result == self::ResultLight) $resultType = [3, 5];
|
||
if ($result == self::ResultModerate) $resultType = [6, 9];
|
||
if ($result == self::ResultSerious) $resultType = [10, 12];
|
||
|
||
$evaluation = new EvaluationHistory();
|
||
$userDetail = new UserDetail();
|
||
//连表查询
|
||
$model = $evaluation->db()->alias('e')
|
||
->join($userDetail->getTableName() . ' d', 'e.uid = d.uid');
|
||
//没有高反的情况
|
||
if ($result == self::ResultNone) { // 查询没有高反数据
|
||
$model->where(function ($query) use ($resultType) {
|
||
$query->whereBetween('score', $resultType)->whereOr('headache', 0);
|
||
});
|
||
} elseif($result != self::ResultAll) { // 查询有高反数据
|
||
$model->whereBetween('score', $resultType)
|
||
->where('headache', '>', '0');
|
||
}
|
||
// ->where(DataStatus::FieldKey, DataStatus::Normal);
|
||
|
||
if ($username) { // 名字模糊查询
|
||
$model->whereLike('realname', "%{$username}%");
|
||
}
|
||
$dataArray = $model->limit(($page - 1) & $pageSize, $pageSize) // 分页
|
||
->order('e.' . $sort, 'desc') // 排序
|
||
->field('d.realname,e.*') // 查询字段
|
||
->select()->toArray(); // 获取结果
|
||
$count = $evaluation->count(); // 查询总页数
|
||
|
||
foreach ($dataArray as $k => $v) {
|
||
$dataArray[$k] = array_merge($v, self::parseAdminEvaluation($v));
|
||
}
|
||
return ListCountData::Create($count, $dataArray);
|
||
// return UserDetail::hasWhere('evaluations', $modelWhere)->limit(($page - 1) & $pageSize, $pageSize)->order($sort, 'desc')->select();
|
||
// return EvaluationHistory
|
||
}
|
||
|
||
private static function parseAdminEvaluation($item)
|
||
{
|
||
|
||
$data = [];
|
||
$subjects = Config::get('app.evaluation.subject');
|
||
$results = [
|
||
'未患高反',
|
||
'轻度高反', '中度高反', '重度高反'
|
||
];
|
||
if (!empty($item)) {
|
||
$data = [
|
||
'score' => $item['score'],
|
||
'create_time' => $item['create_time'],
|
||
];
|
||
foreach ($subjects as $key => $sub) {
|
||
$data[$key] = $sub['options'][$item[$key]]['text'] . '(' . $sub['options'][$item[$key]]['score'] . '分)';
|
||
//$data['score'] += $sub['options'][$item[$key]]['score'];
|
||
}
|
||
$level = 0;
|
||
|
||
if ($item['headache'] >= 1 && $item['score'] >= 3) {
|
||
if ($data['score'] < 3) $level = 0;
|
||
elseif ($data['score'] <= 5) $level = 1;
|
||
elseif ($data['score'] <= 9) $level = 2;
|
||
else $level = 3;
|
||
}
|
||
$data['result'] = $results[$level];
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 获取用户最后一次评估数据
|
||
* @param int $uid
|
||
* @return array|null
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
*/
|
||
public static function getLastEvaluationByUid(int $uid)
|
||
{
|
||
$evaluation = EvaluationHistory::where('uid',$uid)
|
||
->order('id','desc')->limit(1)->find();
|
||
if(empty($evaluation)) return null;
|
||
return self::parseEvaluationData($evaluation->toArray());
|
||
}
|
||
|
||
}
|