ufutx.dma/app/Http/Controllers/App/FatController.php
2026-03-04 14:42:40 +08:00

431 lines
17 KiB
PHP

<?php
namespace App\Http\Controllers\App;
use App\Facades\CommonService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Models\FatKind;
use App\Models\FatLog;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class FatController extends Controller
{
use ResponseJson;
const WEIGHT_RATE = 2.2;
const WEIGHT_JIN_LB_RATE = 1.1;
const WEIGHT_JIN_KG_RATE = 2;
/**
* 获取最近一次体脂信息
* @param Request $request
*/
public function home(Request $request, $user_id=null)
{
if (empty($user_id)) {
$user = auth()->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'));
}
}