user(); $user_id = $user->id; }else { $user = User::find($user_id); } $tested_at = $request->input('tested_at'); if (empty($tested_at)) { //最近一次测量日期 $tested_at = FatLog::where('user_id', $user_id)->groupBy('tested_at')->orderBy('tested_at', 'desc')->limit(1)->value('tested_at'); } $logs = FatLog::with('fatKind')->where(['user_id' => $user_id, 'tested_at' => $tested_at])->select('fat_name', 'fat_state', 'fat_data', 'unit', 'tested_at','user_id')->get()->toArray(); $score = [ 'weight'=>0, 'weight_unit'=>'kg', 'bodyfat'=>0, 'bodyfat_unit'=>'%', 'sinew'=>0, 'sinew_unit'=>'%', 'bmi'=>0, 'metabolism'=>0, 'metabolism_unit' => 'kcal', 'tested_at'=>$tested_at, ]; //判断用户信息 $user->unit = get_user_unit($user->language,$user->unit); $unit = $user->unit??'kg'; if (count($logs)) { foreach ($logs as &$log) { $log = $this->changeUnit($log, $unit,$user->language); $log = $this->changeKinds($log); if ($log['fat_name'] == '体重') { $score['weight'] = $log['fat_data']; $score['weight_unit'] = $unit; } if ($log['fat_name'] == 'BMI') { $score['bmi'] = $log['fat_data']; // }elseif ($log['fat_name'] == '脂肪占比') { }elseif (in_array($log['fat_name'],['脂肪占比','脂肪率'])) { $score['bodyfat'] = $log['fat_data']; $score['bodyfat_unit'] = $log['unit']; // }elseif ($log['fat_name'] == '肌肉占比') { }elseif (in_array($log['fat_name'],['肌肉占比','肌肉率'])) { $score['sinew'] = $log['fat_data']; $score['sinew_unit'] = $log['unit']; }elseif (in_array($log['fat_name'],['基础代谢'])) { $score['metabolism'] = $log['fat_data']; $score['metabolism_unit'] = $log['unit']; } } } $score['weight_unit'] = get_user_unit($user->language,$user->unit); return $this->success('ok', compact('logs', 'score', 'user')); } /** * 修改数据 * @param $log * @return mixed */ public function changeKinds($log){ $fat_names = [ '脂肪率'=>'脂肪占比', '水分率'=>'体内水分', '肌肉率'=>'肌肉占比', '卡路里'=>'基础代谢', '脂肪重量'=>'体脂重量', '蛋白质重量'=>'蛋白质', '体重控制量'=>'脂肪控制', ]; if(isset($fat_names[$log['fat_name']])){ $log['fat_kind'] = FatKind::where('fat_name',$fat_names[$log['fat_name']])->select('fat_name','icon','h_icon')->first(); $log['fat_kind']->fat_name = $log['fat_name']??''; } return $log; } /** * 获取两个时间的对比数据 * @param Request $request * @return \Illuminate\Http\JsonResponse|void */ public function getDaysCompare(Request $request){ try { if (empty($user_id)) { $user = auth()->user(); $user_id = $user->id; }else { $user = User::find($user_id); } $start_tested_at = $request->input('start_tested_at'); $end_tested_at = $request->input('end_tested_at'); if(empty($start_tested_at) || empty($end_tested_at)){ return $this->failure('请选择对比时间'); } //判断两个时间大小 if($start_tested_at > $end_tested_at){ $temp_tested_at = $start_tested_at; $start_tested_at = $end_tested_at; $end_tested_at = $temp_tested_at; } // $start_time = strtotime($start_tested_at); // $end_time = strtotime($end_tested_at); // $differ_day = floor(($end_time-$start_time)/86400); $start_date = new \DateTime($start_tested_at); $end_date = new \DateTime($end_tested_at); $interval = $start_date->diff($end_date); $differ_day = $interval->days; $start_logs = FatLog::with('fatKind') ->where(['user_id' => $user_id, 'tested_at' => $start_tested_at]) ->select('fat_name', 'fat_state', 'fat_data', 'unit', 'tested_at','user_id') ->orderBy('id', 'asc') ->get() ->toArray(); $end_logs = FatLog::with('fatKind') ->where(['user_id' => $user_id, 'tested_at' => $end_tested_at]) ->select('fat_name', 'fat_state', 'fat_data', 'unit', 'tested_at','user_id') ->orderBy('id', 'asc') ->get() ->toArray(); if(empty($start_logs) || empty($end_logs)){ return $this->failure('查询失败'); } //判断用户信息 $user->unit = get_user_unit($user->language,$user->unit); $unit = $user->unit??'kg'; foreach ($start_logs as &$start_log) { $start_log = $this->changeUnit($start_log, $unit,$user->language); $start_log = $this->changeKinds($start_log); } foreach ($end_logs as &$end_log) { $end_log = $this->changeUnit($end_log, $unit,$user->language); $end_log = $this->changeKinds($end_log); } //对比两个数组的差值 $merge_logs = []; foreach ($start_logs as $start){ foreach ($end_logs as $end){ if(!isset($start['fat_name']) || !isset($end['fat_name'])){ continue; } if($start['fat_name'] != $end['fat_name']){ continue; } $status = 0; $differ = '-'; $start['fat_data'] = floatval(str_replace(',', '', $start['fat_data'])); $end['fat_data'] = floatval(str_replace(',', '', $end['fat_data'])); if($start['fat_data'] < $end['fat_data']){ $status = 1; $differ = get_two_float(abs($end['fat_data'] - $start['fat_data']),2); } if($start['fat_data'] > $end['fat_data']){ $status = 2; $differ = get_two_float(abs($end['fat_data'] - $start['fat_data']),2); } $merge_logs[] = [ 'fat_name' => $start['fat_name'], 'status' => $status, 'differ' => $differ, 'unit' => $start['unit'] ]; } } //处理数组 $fat_names = []; foreach ($merge_logs as $item) { if (isset($item['fat_name'])) { $fat_names[] = $item['fat_name']; } } foreach ($start_logs as $sk=> $sv){ if(!in_array($sv['fat_name'],$fat_names)){ unset($start_logs[$sk]); } } foreach ($end_logs as $ek=> $ev){ if(!in_array($ev['fat_name'],$fat_names)){ unset($end_logs[$ek]); } } $start_logs = array_values($start_logs); $end_logs = array_values($end_logs); $data = []; $data['start_logs'] = $start_logs; $data['end_logs'] = $end_logs; $data['merge_logs'] = $merge_logs; $data['user'] = $user; $data['differ_day'] = $differ_day; return $this->success('ok',$data); }catch (\Exception $e){ Log::error('getDaysCompare:'.$e->getMessage()); return $this->failure('查询失败'); } } public function changeUnit($log, $unit,$language) { if ($log['unit'] == 'kg' && $unit == '斤' && $language == 0) { $log['fat_data'] = get_two_float($log['fat_data'] * 2, 2); $log['unit'] = '斤'; } if ($log['unit'] == 'kg' && $unit == '斤' && $language == 1) { $log['fat_data'] = get_two_float($log['fat_data'] * self::WEIGHT_RATE, 2); $log['unit'] = 'lb'; } if($log['unit'] == 'kg' && $unit == 'lb' && $language == 1){ $log['fat_data'] = get_two_float($log['fat_data'] * self::WEIGHT_RATE, 2); $log['unit'] = 'lb'; } if($log['unit'] == 'kg' && $unit == 'lb' && $language == 0){ $log['fat_data'] = get_two_float($log['fat_data'] * 2, 2); $log['unit'] = '斤'; } if($log['unit'] == 'lb' && $unit == 'kg' ){ $log['fat_data'] = get_two_float($log['fat_data'] / self::WEIGHT_RATE, 2); $log['unit'] = 'kg'; } if($log['unit'] == 'lb' && $unit == '斤' ){ $log['fat_data'] = get_two_float($log['fat_data'] / self::WEIGHT_JIN_LB_RATE, 2); $log['unit'] = '斤'; } return $log; } /** * 保存体脂信息 * @param Request $request */ public function storeFatLog(Request $request) { $user = auth()->user(); $user_id = $user->id; $tested_at = date('Y-m-d H:i:s'); $data = $request->input('data'); $type = $request->input('type'); $init_data = $request->input('init_data'); if(empty($data)){ return $this->failure('数据不为空'); } //是否完整资料 $is_complete_info = $user->baseUserInfo(); if (empty($is_complete_info)) return $this->failure("请先完善基本信息"); foreach ($data as $key => &$da) { if ($da['fat_name'] == "腰臀比") unset($data[$key]); $da['user_id'] = $user_id; $da['tested_at'] = $da['created_at'] = $da['updated_at'] = $tested_at; $da['unit'] = strtolower($da['unit']); if($type == 'lb'){ $da['unit'] = 'lb'; // $da['fat_data'] = get_two_float(floatval($da['fat_data'])/self::WEIGHT_RATE,2); } } //增加原始数值 foreach ($data as $index => $item){ $data[$index]['init_data'] = $init_data; } FatLog::insert($data); return $this->success('ok'); } /** * 体脂记录 * @param Request $request */ public function fatLogs(Request $request) { $unit = auth()->user()->unit; $language = auth()->user()->language; $logs = FatLog::where(['user_id' => auth()->id(), 'fat_name' => "体重"])->orderByDesc('id')->select('id', 'fat_name', 'fat_data', 'tested_at')->paginate(); foreach ($logs as $log) { $log->yearMonth = date('Y年m月', strtotime($log->tested_at)); $log->dayHour = date('d日 H:i', strtotime($log->tested_at)); $log->unit = get_user_unit($language,$unit); if ($unit != 'kg') { if(($unit == 'lb' || $unit == '斤') && $language == 1){ $log->fat_data = get_two_float($log->fat_data * self::WEIGHT_RATE, 2); }else{ $log->fat_data = get_two_float($log->fat_data * 2, 2); } } } return $this->success('ok', $logs); } public function fatLog(Request $request) { $tested_at = $request->input('tested_at'); if(empty($tested_at)) throw new \Exception("缺少参数.tested_at"); $unit = $request->input('unit'); $user_id = $request->input('user_id'); if (empty($user_id)) { $user_id = auth()->id(); $unit = auth()->user()->unit; } if(empty($unit)){ $user = User::where('id',$user_id)->first(); $unit = $user->unit; } $logs = FatLog::with('fatKind:fat_name,icon')->where(['user_id' => $user_id, 'tested_at' => $tested_at])->get()->toArray(); if (count($logs)) { foreach ($logs as &$log) { $log = $this->changeUnit($log, $unit,auth()->user()->language); $log = $this->changeKinds($log); } } return $this->success('ok', $logs); } /** * 删除体脂信息 * @param Request $request */ public function deleteFatLog(Request $request) { $tested_at = $request->input("tested_at"); if (empty($tested_at)) throw new \Exception("未获取到测量时间信息"); FatLog::where(['user_id'=>auth()->id(), 'tested_at'=>$tested_at])->delete(); return $this->success('ok'); } public function fatKinds(Request $request) { $kinds = FatKind::where(function ($sql) { $sql->where('icon', '!=', ''); })->get(); $user = auth()->user(); $fat_names = [ '脂肪占比'=>'脂肪率', '体内水分'=>'水分率', '肌肉占比'=>'肌肉率', '卡路里'=>'基础代谢', '体脂重量'=>'脂肪重量', '蛋白质'=>'蛋白质重量', '脂肪控制'=>'体重控制量', ]; foreach ($kinds as $kind) { if ($kind->unit == 'kg' && $user->unit != $kind->unit) { $kind->unit = change_unit($user->language,$user->unit); } if(isset($fat_names[$kind->fat_name])){ $kind->fat_name = $fat_names[$kind->fat_name]; } } return $this->success('ok', $kinds); } public function fatStat(Request $request) { $fat_name = $request->input('fat_name'); $start_date = $request->input('start_date'); $end_date = $request->input('end_date'); if ($start_date && $end_date) { $day_arr = CommonService::daliy($start_date, $end_date); }else { $day_arr = CommonService::daliy(date('Y-m-d', strtotime('-180 days')), date('Y-m-d')); //获取用户第一次称的时间 // $test_date = FatLog::where('user_id',auth()->id())->where('fat_name', $fat_name)->value('created_at'); // $day_arr = CommonService::daliy(date('Y-m-d', strtotime($test_date)), date('Y-m-d')); } $x_arr = []; $y_arr = []; $unit = auth()->user()->unit; //这只是为了兼容之前不好的旧结构设计,有缘人自己把整个结构改了,我没时间重构整个旧数据结构,将错就错 $fat_names = [ '脂肪率'=>['脂肪占比','脂肪率'], '水分率'=>['体内水分','水分率'], '肌肉率'=>['肌肉占比','肌肉率'], '卡路里'=>['基础代谢','卡路里'], '脂肪重量'=>['体脂重量','脂肪重量'], '蛋白质重量'=>['蛋白质','蛋白质重量'], '体重控制量'=>['脂肪控制','体重控制量'], ]; if(isset($fat_names[$fat_name])){ $fat_name = $fat_names[$fat_name]; }else{ $fat_name = explode(',',$fat_name); } foreach ($day_arr as $day) { $x_arr[] = date('m/d', strtotime($day)); $day_end = date('Y-m-d', strtotime($day) + 24 *3600); $log = FatLog::where('user_id', auth()->id())->whereIn('fat_name', $fat_name)->where('created_at', '>', $day)->where('created_at', '<', $day_end)->orderByDesc('id')->first(); $fat_data = 0; if ($log) { $log = $log->toArray(); if ($log['unit'] == 'kg') { $log = $this->changeUnit($log, $unit,auth()->user()->language); } $fat_data = $log['fat_data']; } $y_arr[] = $fat_data; } return $this->success('ok', compact('x_arr', 'y_arr')); } }