* 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'; /** * @param int $result * @param string|null $username * @param string|null $sort * @param int $page * @param int $pageSize * @param null $fieldAll * @return ListCountData * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public static function search(int $result = self::ResultAll, string $username = null, string $sort = null, $page = 1, $pageSize = 20,$fieldAll = null) { 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}%"); } if($pageSize > 0){ $model->limit(($page - 1) * $pageSize, $pageSize); // 分页 } $searchField = 'd.realname,e.*'; if($fieldAll){ // $searchField .= 'd.address,d.gender,d.age,d.height,d.weight,d.smoke,d.drink,d.is_first_to_tibet,d.medical_history'; $searchField = 'd.*,e.*'; } $dataArray = $model->order('e.' . $sort, 'desc') // 排序 ->field($searchField) // 查询字段 ->select()->toArray(); // 获取结果 $count = $model->limit(0,1)->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 } public static function allCount() { return EvaluationHistory::count(); } 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()); } }