api/app/service/EvaluationService.php
2019-06-20 20:29:13 +08:00

171 lines
5.8 KiB
PHP
Raw 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
/**
* 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 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['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())
->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;
}
}