* 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; } }