SchoolPhysicalExamination/application/KitchenScale3/controller/app/Countfood.php

1576 lines
78 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
namespace app\KitchenScale3\controller\app;
use think\Db;
class Countfood extends Base{
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
protected $page_num = 10;
protected $kitchenscale_db_msg = [
'foodlist3'=>'app_z_national_standard_food_type_3_multilingual',//食材列表3
'foodlist4'=>'app_z_national_standard_food_type_4_multilingual',//食材列表3
'eat_log'=>'app_user_kcal_log_multilingual',//食材列表3
'user'=>'app_user_data_multilingual',//banner
];
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 添加每日摄入记录
public function add_intake_food($data=['token'=>'3e5876042361c8cb42bd48c46918f737','aud_id'=>6,'meals_type'=>'早餐','food_list'=>[['id'=>2778,'name'=>"啤酒X",'weight'=>'150','unit'=>'g']]]){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('aud_id', $data)){
return $this->msg(10001,'aud_id is miss');
}
if(!array_key_exists('food_list', $data)){
return $this->msg(10001,'food_list is miss');
}
if(!array_key_exists('time', $data)){
return $this->msg(10001,'food_list is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type is error');
}
if(!$this->verify_data_is_ok($data['time'],'datetime')){
return $this->msg(10005,'time type is error');
}
$return_data = $this->add_intake_food_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 获取记食器板块内容
public function get_countfoot_content(){
// 尝试捕获异常
// try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('aud_id', $data)){
return $this->msg(10001,'aud_id is miss');
}
if(!array_key_exists('time', $data)){
return $this->msg(10001,'time is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type is error');
}
if(!$this->verify_data_is_ok($data['time'],'datetime')){
return $this->msg(10005,'time type is error');
}
$return_data = $this->get_countfoot_content_action($data);
return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// // 记录日志
// $this->record_api_log($data, $logContent, null);
// return json(['status' => 'error', 'message' => '系统错误']);
// }
}
// 获取记食器记录
public function get_log_list($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','aud_id'=>1,'page'=>1]){
// 尝试捕获异常
// try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('aud_id', $data)){
return $this->msg(10001,'aud_id is miss');
}
if(!array_key_exists('page', $data)){
return $this->msg(10001,'page is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type is error');
}
if(!$this->verify_data_is_ok($data['page'],'intnum')){
return $this->msg(10005,'page type is error');
}
$return_data = $this->get_log_list_action($data);
return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// // 记录日志
// $this->record_api_log($data, $logContent, null);
// return json(['status' => 'error', 'message' => '系统错误']);
// }
}
// 计食器板块-设置内容
public function set_up_content($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','aud_id'=>61]){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('aud_id', $data)){
return $this->msg(10001,'aud_id is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type is error');
}
$return_data = $this->set_up_content_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
public function del_user_eat_log($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','aud_id'=>6,'eat_log_id'=>160]){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('aud_id', $data)){
return $this->msg(10001,'aud_id is miss');
}
if(!array_key_exists('eat_log_id', $data)){
return $this->msg(10001,'eat_log_id is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type is error');
}
if(!$this->verify_data_is_ok($data['eat_log_id'],'num')){
return $this->msg(10005,'eat_log_id type is error');
}
$return_data = $this->del_user_eat_log_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
public function del_user_eat_list_log(){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('time', $data)){
return $this->msg(10001,'time is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['time'],'datetime')){
return $this->msg(10005,'time type is error');
}
$return_data = $this->del_user_eat_list_log_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 本次添加食材的营养统计
public function current_food_statistics(){
// 尝试捕获异常
try {
$data = input('post.');
if(!array_key_exists('log_id', $data)){
return $this->msg(10001,'log_id is miss');
}
if(is_array($data['log_id'])){
foreach ($data['log_id'] as $key => $value) {
if(!$this->verify_data_is_ok($value,'intnum')){
return $this->msg(10005,'log_id type is error');
}
}
}else{
return $this->msg(10005,'log_id type is error');
}
$return_data = $this->current_food_statistics_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
#######################################################################action#######################################################################
#######################################################################action#######################################################################
#######################################################################action#######################################################################
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
public function add_intake_food_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["id"=>$data['aud_id']])
->field('weight,height,gender,age,is_use_set_kcal,set_kcal')
->find();
if(!$user_data){
return $this->msg(10003);
}
if(count($data['food_list']) <= 0){
return $this->msg(10001,'未选择食材');
}
// 统计食物的id
$food_id_arr = [];
foreach ($data['food_list'] as $key => $value) {
if(!array_key_exists('id', $value)){
return $this->msg(10001,'id is miss');
}
if(!array_key_exists('weight', $value)){
return $this->msg(10001,'weight is miss');
}
if(!array_key_exists('meals_type', $value)){
return $this->msg(10001,'meals_type is miss');
}
if(!$this->verify_data_is_ok($value['id'],'intnum')){
return $this->msg(10005,'id type is error');
}
// if(!$this->verify_data_is_ok($value['weight'],'num')){
// return $this->msg(10005,'weight type is error');
// }
if(!in_array($value['meals_type'],['早餐','午餐','晚餐','加餐'])){
return $this->msg(10005,'meals_type type is error');
}
foreach ($data['food_list'][$key] as $k => $v) {
if(!in_array($k,['id','weight','meals_type','unit'])){
unset($data['food_list'][$key][$k]);
}
}
array_push($food_id_arr,$value['id']);
$data['food_list'][$key]['weight_g'] = $this->convertWeightToGrams($value['weight'],$value['unit']);
}
// return $this->msg($data);
$food_content = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
->where("id in (".implode(',',$food_id_arr).")")
->field('id,food_name as name,Calorie_val as kcal,Carbohydrate_val as carbohydrate,Protein_val as protein,Fat_val as fat')
->select();
if(count($food_content) <= 0){
return $this->msg(10004,'未找到对应食材');
}
// 整理食物信息
$food_content_arr = [];
foreach ($food_content as $key => $value) {
$food_content_arr[$value['id']] = $value;
}
// $create_time = date('Y-m-d H:i:s');
foreach ($data['food_list'] as $key => $value) {
//获取每100g食物的比例
$proportion_num = bcdiv($value['weight_g'],100,2);
if(array_key_exists($value['id'], $food_content_arr)){
$data['food_list'][$key]['kcal_val'] = bcmul($food_content_arr[$value['id']]['kcal'],$proportion_num,2);
$data['food_list'][$key]['carbohydrate_val'] = bcmul($food_content_arr[$value['id']]['carbohydrate'],$proportion_num,2);
$data['food_list'][$key]['protein_val'] = bcmul($food_content_arr[$value['id']]['protein'],$proportion_num,2);
$data['food_list'][$key]['fat_val'] = bcmul($food_content_arr[$value['id']]['fat'],$proportion_num,2);
$data['food_list'][$key]['food_name'] = $food_content_arr[$value['id']]['name'];
$data['food_list'][$key]['aud_id'] = $data['aud_id'];
$data['food_list'][$key]['meals_type'] = $value['meals_type'];
$data['food_list'][$key]['create_time'] = $data['time'].date(' H:i:s');
$data['food_list'][$key]['food_id'] = $value['id'];
unset($data['food_list'][$key]['id']);
unset($data['food_list'][$key]['weight_g']);
}else{
unset($data['food_list'][$key]);
}
}
// dump($data['food_list']);
// die;
// 数据库数据字段id,aud_id,meals_type,food_id,food_name,weight,kcal_val,carbohydrate_val,protein_val,fat_val,create_time
// 启动事务
// return $this->msg($data['food_list']);
Db::startTrans();
try{
if(count($data['food_list']) > 1){
$result = $cfc->table($this->kitchenscale_db_msg['eat_log'])->insertAll($data['food_list']);//新增所有
if ($result !== count($data['food_list'])) {
Db::rollback();
return $this->msg(10002,'添加数据错误');
} else {
Db::commit();
return $this->msg([]);
}
}else{
$result = $cfc->table($this->kitchenscale_db_msg['eat_log'])->insertGetId($data['food_list'][0]);//新增1个
Db::commit();
return $this->msg(['id'=>$result]);
}
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002);
}
// dump($data);
// dump($food_id_arr);
// dump($food_content);
// die;
}
public function get_countfoot_content_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["id"=>$data['aud_id']])
// ->field('weight,height,gender,age,birthday,is_use_set_kcal,set_kcal')
->field('weight,height,gender,age,is_use_set_kcal,set_kcal,birthday,set_carbohydrate_v,set_carbohydrate_p,set_protein_v,set_protein_p,set_fat_v,set_fat_p,activity_level')
->find();
if(!$user_data){
return $this->msg(10003);
}
if($user_data['birthday']){
$user_data['age_num'] = $this->calculate_age($user_data['birthday']);
}else{
$user_data['age_num'] = $user_data['age'];
}
$nutrition_data = $this->count_user_nutrition_all($user_data);
if($user_data['is_use_set_kcal'] == 1){
// $proportion = bcdiv($user_data['set_kcal'],$nutrition_data['kcal'],20);
// $nutrition_data['kcal'] = $user_data['set_kcal'];
// $nutrition_data['carbohydrate'] = bcmul($nutrition_data['carbohydrate'],$proportion,2);
// $nutrition_data['protein'] = bcmul($nutrition_data['protein'],$proportion,2);
// $nutrition_data['fat'] = bcmul($nutrition_data['fat'],$proportion,2);
$nutrition_data['kcal'] = $user_data['set_kcal'] != 0?$user_data['set_kcal']:$nutrition_data['kcal'];
$nutrition_data['carbohydrate'] = $user_data['set_carbohydrate_v'] != null?$user_data['set_carbohydrate_v']:$nutrition_data['carbohydrate'];
$nutrition_data['protein'] = $user_data['set_protein_v'] != null?$user_data['set_protein_v']:$nutrition_data['protein'];
$nutrition_data['fat'] = $user_data['set_fat_v'] != null?$user_data['set_fat_v']:$nutrition_data['fat'];
$nutrition_data['carbohydrate_p'] = $user_data['set_carbohydrate_p'] != null?$user_data['set_carbohydrate_p']:bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = $user_data['set_protein_p'] != null?$user_data['set_protein_p']:bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = $user_data['set_fat_p'] != null?$user_data['set_fat_p']:bcmul($nutrition_data['fat_p'],100,2);
}else{
$nutrition_data['carbohydrate_p'] = bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = bcmul($nutrition_data['fat_p'],100,2);
}
$return_data = [
'date'=>$data['time'], //时间
'suggestion'=>[ //建议
'kcal'=>$nutrition_data['kcal'], //建议摄入卡路里量
'carbohydrate'=>$nutrition_data['carbohydrate'], //建议摄入碳水量
'protein'=>$nutrition_data['protein'], //建议摄入蛋白质量
'fat'=>$nutrition_data['fat'], //建议摄入脂肪量
],
'today_intake'=>[ //今日已摄入
'kcal'=>0, //今日已摄入卡路里量
'carbohydrate'=>0, //今日已摄入碳水量
'protein'=>0, //今日已摄入蛋白质量
'fat'=>0, //今日已摄入脂肪量
],
'remaining_kcal'=>$nutrition_data['kcal'], //剩下可摄入卡路里量
'details'=>[ //当天营养元素能量占比
'carbohydrate'=>['name'=>'碳水','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_carbohydrate.png','color'=>'#ED7886','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
'protein'=>['name'=>'蛋白质','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_protein.png','color'=>'#FFB169','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
'fat'=>['name'=>'脂肪','icon'=>'https://tc.pcxbc.com/kitchenscale_all/icon_fat.png','color'=>'#3CB383','val'=>0,'unit'=>'g','proportion'=>'0.00','rank_list'=>[['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank1.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank2.png','name'=>'','pic_url'=>'','weight'=>''],['icon'=>'https://tc.pcxbc.com/kitchenscale_all/rank3.png','name'=>'','pic_url'=>'','weight'=>'']]],
],
'trace_elements_all_day' => [
[
'name' => 'VitaminA',
'name_ch' => '维生素A',
'unit' => 'μg RAE',
'value' => 0
],
[
'name' => 'VitaminB1',
'name_ch' => '硫胺素',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB2',
'name_ch' => '核黄素',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB6',
'name_ch' => '维生素B6',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminB12',
'name_ch' => '维生素B12',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'VitaminD',
'name_ch' => '维生素D',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'VitaminK',
'name_ch' => '维生素K',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Niacin',
'name_ch' => '烟酸',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminC',
'name_ch' => '维生素C',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'VitaminE',
'name_ch' => '维生素E',
'unit' => 'mg α-TE',
'value' => 0
],
[
'name' => 'FolicAcid',
'name_ch' => '叶酸',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Biotin',
'name_ch' => '生物素',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'PantothenicAcid',
'name_ch' => '泛酸',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'TotalCholine',
'name_ch' => '总胆碱',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Ca',
'name_ch' => '钙',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Phosphorus',
'name_ch' => '磷',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Kalium',
'name_ch' => '钾',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Mg',
'name_ch' => '镁',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Na',
'name_ch' => '钠',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Fe',
'name_ch' => '铁',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Zn',
'name_ch' => '锌',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Se',
'name_ch' => '硒',
'unit' => 'μg',
'value' => 0
],
[
'name' => 'Cu',
'name_ch' => '铜',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Mn',
'name_ch' => '锰',
'unit' => 'mg',
'value' => 0
],
[
'name' => 'Iodine',
'name_ch' => '碘',
'unit' => 'μg',
'value' => 0
]
],
'list'=>[
[
'name'=>'早餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#0992B4',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_1.png',
'icon_home'=>'/static/1.png',
'bgimg_home'=>'/static/2.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'午餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#4F9211',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_2.png',
'icon_home'=>'/static/3.png',
'bgimg_home'=>'/static/4.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'晚餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#B354B0',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_3.png',
'icon_home'=>'/static/5.png',
'bgimg_home'=>'/static/6.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
[
'name'=>'加餐',
'val'=>0,
'unit'=>'kcal',
'color'=>'#C08433',
'icon'=>'https://tc.pcxbc.com/kitchenscale_all/meal_4.png',
'icon_home'=>'/static/7.png',
'bgimg_home'=>'/static/8.png',
'kcal_proportion'=>0,
"nutrients_four"=> [
[
'name'=>'卡路里',
'unit'=>'kcal',
'color'=>'',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'蛋白质',
'unit'=>'g',
'color'=>'#5180D8',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'脂肪',
'unit'=>'g',
'color'=>'#ED7886',
'value'=>0,
'proportion'=>0,
],
[
'name'=>'碳水化合物',
'unit'=>'g',
'color'=>'#FFB169',
'value'=>0,
'proportion'=>0,
],
],
'list'=>[],
],
],
];
// 查询用户今日摄入食物
$food_content = $cfc->table($this->kitchenscale_db_msg['eat_log'])
->alias('a')
->join('app_z_national_standard_food_type_3 b','a.food_id = b.id','LEFT')
->where("a.is_del = 0 AND a.aud_id = " . $data['aud_id'] . " AND CAST(a.create_time AS DATE) = CAST('" . $data['time'] . "' AS DATE)")
->field('a.meals_type,a.food_name,a.weight,a.unit,a.kcal_val,a.carbohydrate_val,a.protein_val,a.fat_val,a.id,\'https://tc.pcxbc.com\' + b.pic_url as pic_url,a.food_id')
->select();
if(count($food_content) > 0){ //计算营养物质
$food_content = $this->calculate_nutrients($food_content);
// return $this->msg($food_content);
foreach ($food_content as $key => $value) {
// dump($value['nutrients_four']);
$return_data['today_intake']['kcal'] = bcadd($return_data['today_intake']['kcal'],$value['kcal_val'],2);
$return_data['today_intake']['carbohydrate'] = bcadd($return_data['today_intake']['carbohydrate'],$value['carbohydrate_val'],2);
$return_data['today_intake']['protein'] = bcadd($return_data['today_intake']['protein'],$value['protein_val'],2);
$return_data['today_intake']['fat'] = bcadd($return_data['today_intake']['fat'],$value['fat_val'],2);
// 处理各餐
if($value['meals_type'] == '早餐'){
$return_data['list'][0]['val'] = bcadd($return_data['list'][0]['val'],$value['kcal_val'],2);
$return_data['list'][0]['nutrients_four'][0]['value'] = bcadd($return_data['list'][0]['nutrients_four'][0]['value'],$value['kcal_val'],2);
$return_data['list'][0]['nutrients_four'][1]['value'] = bcadd($return_data['list'][0]['nutrients_four'][1]['value'],$value['carbohydrate_val'],2);
$return_data['list'][0]['nutrients_four'][2]['value'] = bcadd($return_data['list'][0]['nutrients_four'][2]['value'],$value['protein_val'],2);
$return_data['list'][0]['nutrients_four'][3]['value'] = bcadd($return_data['list'][0]['nutrients_four'][3]['value'],$value['fat_val'],2);
array_push($return_data['list'][0]['list'],[
'name'=>$value['food_name'],
'weight'=>$value['weight'].' '.$value['unit'],
'id'=>$value['id'],
'pic_url'=>$value['pic_url'],
'val'=>$value['kcal_val'],
'nutrients_four' => $value['nutrients_four'],
'nutrients_list' => $value['nutrients_list']
]);
}else if($value['meals_type'] == '午餐'){
$return_data['list'][1]['val'] = bcadd($return_data['list'][1]['val'],$value['kcal_val'],2);
$return_data['list'][1]['nutrients_four'][0]['value'] = bcadd($return_data['list'][1]['nutrients_four'][0]['value'],$value['kcal_val'],2);
$return_data['list'][1]['nutrients_four'][1]['value'] = bcadd($return_data['list'][1]['nutrients_four'][1]['value'],$value['carbohydrate_val'],2);
$return_data['list'][1]['nutrients_four'][2]['value'] = bcadd($return_data['list'][1]['nutrients_four'][2]['value'],$value['protein_val'],2);
$return_data['list'][1]['nutrients_four'][3]['value'] = bcadd($return_data['list'][1]['nutrients_four'][3]['value'],$value['fat_val'],2);
array_push($return_data['list'][1]['list'],[
'name'=>$value['food_name'],
'weight'=>$value['weight'].' '.$value['unit'],
'id'=>$value['id'],
'pic_url'=>$value['pic_url'],
'val'=>$value['kcal_val'],
'nutrients_four' => $value['nutrients_four'],
'nutrients_list' => $value['nutrients_list']
]);
}else if($value['meals_type'] == '晚餐'){
$return_data['list'][2]['val'] = bcadd($return_data['list'][2]['val'],$value['kcal_val'],2);
$return_data['list'][2]['nutrients_four'][0]['value'] = bcadd($return_data['list'][2]['nutrients_four'][0]['value'],$value['kcal_val'],2);
$return_data['list'][2]['nutrients_four'][1]['value'] = bcadd($return_data['list'][2]['nutrients_four'][1]['value'],$value['carbohydrate_val'],2);
$return_data['list'][2]['nutrients_four'][2]['value'] = bcadd($return_data['list'][2]['nutrients_four'][2]['value'],$value['protein_val'],2);
$return_data['list'][2]['nutrients_four'][3]['value'] = bcadd($return_data['list'][2]['nutrients_four'][3]['value'],$value['fat_val'],2);
array_push($return_data['list'][2]['list'],[
'name'=>$value['food_name'],
'weight'=>$value['weight'].' '.$value['unit'],
'id'=>$value['id'],
'pic_url'=>$value['pic_url'],
'val'=>$value['kcal_val'],
'nutrients_four' => $value['nutrients_four'],
'nutrients_list' => $value['nutrients_list']
]);
}else{
$return_data['list'][3]['val'] = bcadd($return_data['list'][3]['val'],$value['kcal_val'],2);
$return_data['list'][3]['nutrients_four'][0]['value'] = bcadd($return_data['list'][3]['nutrients_four'][0]['value'],$value['kcal_val'],2);
$return_data['list'][3]['nutrients_four'][1]['value'] = bcadd($return_data['list'][3]['nutrients_four'][1]['value'],$value['carbohydrate_val'],2);
$return_data['list'][3]['nutrients_four'][2]['value'] = bcadd($return_data['list'][3]['nutrients_four'][2]['value'],$value['protein_val'],2);
$return_data['list'][3]['nutrients_four'][3]['value'] = bcadd($return_data['list'][3]['nutrients_four'][3]['value'],$value['fat_val'],2);
array_push($return_data['list'][3]['list'],[
'name'=>$value['food_name'],
'weight'=>$value['weight'].' '.$value['unit'],
'id'=>$value['id'],
'pic_url'=>$value['pic_url'],
'val'=>$value['kcal_val'],
'nutrients_four' => $value['nutrients_four'],
'nutrients_list' => $value['nutrients_list']
]);
}
}
// dump($return_data['list']);
// die;
$return_data['list'] = array_values($return_data['list']);
// 处理剩下可吃
$return_data['remaining_kcal'] = bcsub($return_data['suggestion']['kcal'],$return_data['today_intake']['kcal'],2)>=0?bcsub($return_data['suggestion']['kcal'],$return_data['today_intake']['kcal'],2):0;
// 处理各餐卡路里占比
$return_data = $this->calculate_kcal_proportion($return_data);
// 计算营养物质能量占比
$return_data = $this->calculate_energy_proportion($return_data);
// 排序营养元素食物排行榜
$return_data = $this->energy_food_rank($return_data);
// 微量元素处理全天
$return_data = $this->calculate_trace_elements($return_data);
// 处理单餐营养占比
// return $this->msg($return_data);
foreach ($return_data['list'] as $key => $value) {
$all_yy_data_0 = bcadd($value['nutrients_four'][3]['value'],bcadd($value['nutrients_four'][1]['value'],$value['nutrients_four'][2]['value'],20),2);
foreach ($value['nutrients_four'] as $k => $v) {
if($k != 0){
if($all_yy_data_0 == 0){
$return_data['list'][$key]['nutrients_four'][$k]['proportion'] = 0;
}else{
$return_data['list'][$key]['nutrients_four'][$k]['proportion'] = bcdiv($value['nutrients_four'][$k]['value'],$all_yy_data_0,2) >= 1?'100':bcmul(bcdiv($value['nutrients_four'][$k]['value'],$all_yy_data_0,2),100,2);
}
// if($value['name'] == '晚餐'){
// // dump($return_data['list'][$key]['nutrients_four'][$k]['proportion']);
// }
// dump($return_data['list'][$key]['nutrients_four'][$k]['proportion']);
}
}
}
// return $this->msg($return_data);
}
$nameMap = [
'kcal' => ['卡路里','kcal','https://tc.pcxbc.com/kitchenscale_all/icon_kcal.png','#5180D8'],
'carbohydrate' => ['碳水','g','https://tc.pcxbc.com/kitchenscale_all/icon_carbohydrate.png','#ED7886'],
'protein' => ['蛋白质','g','https://tc.pcxbc.com/kitchenscale_all/icon_protein.png','#FFB169'],
'fat' => ['脂肪','g','https://tc.pcxbc.com/kitchenscale_all/icon_fat.png','#3CB383'],
];
$all_yy_data = bcadd($return_data['suggestion']['fat'],bcadd($return_data['suggestion']['carbohydrate'],$return_data['suggestion']['protein'],20),20);
foreach ($return_data['suggestion'] as $key => $value) {
$return_data['nutrients_four'][] = [
'name'=>$nameMap[$key][0],
'unit'=>$nameMap[$key][1],
'suggestion'=>$value,
'today_intake'=>$return_data['today_intake'][$key],
'icon'=>$nameMap[$key][2],
'color'=>$nameMap[$key][3],
'proportion'=>bcdiv($return_data['today_intake'][$key],$value,2) >= 1?'100':bcmul(bcdiv($return_data['today_intake'][$key],$value,2),100,2),
// 'proportion_fp'=>$key == 'kcal'?0:(bcdiv($return_data['suggestion'][$key],$all_yy_data,2))*100,
'proportion_fp'=>$key == 'kcal'?0:$nutrition_data[$key.'_p'],
];
}
// dump($user_data);
unset($return_data['suggestion']);
unset($return_data['today_intake']);
// return $return_data;
return $this->msg($return_data);
}
public function get_log_list_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["id"=>$data['aud_id']])
->field('weight,height,gender,age,is_use_set_kcal,set_kcal,activity_level')
->find();
if(!$user_data){
return $this->msg(10003);
}
// 计算年龄
$user_data['age_num'] = $user_data['age'];
// 计算推荐营养
$nutrition_data = $this->count_user_nutrition_all($user_data);
if($user_data['is_use_set_kcal'] == 1){
$nutrition_data['kcal'] = $user_data['set_kcal'];
}
$content_num = $cfc->query("SELECT COUNT(DISTINCT CONVERT(varchar, create_time, 23)) as total
FROM ".$this->kitchenscale_db_msg['eat_log']."
WHERE aud_id = ".$data['aud_id']." and is_del = 0");
$page_total = ceil($content_num[0]['total']/$this->page_num);
$food_content = $cfc->table($this->kitchenscale_db_msg['eat_log'])
->where(['aud_id'=>$data['aud_id'],'is_del'=>0])
->group('CONVERT(varchar, create_time, 23)')
->page($data['page'],$this->page_num)
->order('create_time DESC')
->field("CONVERT(varchar, create_time, 23) as create_time, SUM(kcal_val) as kcal_val")
->select();
$return_data = [];
foreach ($food_content as $key => $value) {
if(bcdiv($value['kcal_val'],$nutrition_data['kcal'],2) < 0.9){
$bz['text'] = '不达标';
$bz['color'] = '#F0AD4E';
}else if(bcdiv($value['kcal_val'],$nutrition_data['kcal'],2) >= 0.9 && bcdiv($value['kcal_val'],$nutrition_data['kcal'],2) < 1.1){
$bz['text'] = '达标';
$bz['color'] = '#4CD964';
}else{
$bz['text'] = '超标';
$bz['color'] = '#FF0000';
}
array_push($return_data,['time'=>$value['create_time'],'title'=>'摄入卡路里','val'=>$value['kcal_val'],'unit'=>'kcal','describe'=>$bz['text'],'color'=>$bz['color']]);
}
return $this->msg([
'page_now'=>$data['page'],
'page_total'=>$page_total,
'content_list'=>$return_data
]);
}
public function set_up_content_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["id"=>$data['aud_id']])
->field('weight,height,gender,age,is_use_set_kcal,set_kcal,birthday,set_carbohydrate_v,set_carbohydrate_p,set_protein_v,set_protein_p,set_fat_v,set_fat_p,activity_level')
->find();
if(!$user_data){
return $this->msg(10003);
}
// 计算年龄
if($user_data['birthday']){
$user_data['age_num'] = $this->calculate_age($user_data['birthday']);
}else{
$user_data['age_num'] = $user_data['age'];
}
// 计算推荐营养
$nutrition_data = $this->count_user_nutrition_all($user_data);
if($user_data['is_use_set_kcal'] == 1){
$nutrition_data['kcal'] = $user_data['set_kcal'] != 0?$user_data['set_kcal']:$nutrition_data['kcal'];
$nutrition_data['carbohydrate'] = $user_data['set_carbohydrate_v'] != null?$user_data['set_carbohydrate_v']:$nutrition_data['carbohydrate'];
$nutrition_data['protein'] = $user_data['set_protein_v'] != null?$user_data['set_protein_v']:$nutrition_data['protein'];
$nutrition_data['fat'] = $user_data['set_fat_v'] != null?$user_data['set_fat_v']:$nutrition_data['fat'];
// $nutrition_data['carbohydrate_p'] = $user_data['set_carbohydrate_p'] != null?bcdiv($user_data['set_carbohydrate_p'],100,2):$nutrition_data['carbohydrate_p'];
// $nutrition_data['protein_p'] = $user_data['set_protein_p'] != null?bcdiv($user_data['set_protein_p'],100,2):$nutrition_data['protein_p'];
// $nutrition_data['fat_p'] = $user_data['set_fat_p'] != null?bcdiv($user_data['set_fat_p'],100,2):$nutrition_data['fat_p'];
$nutrition_data['carbohydrate_p'] = $user_data['set_carbohydrate_p'] != null?$user_data['set_carbohydrate_p']:bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = $user_data['set_protein_p'] != null?$user_data['set_protein_p']:bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = $user_data['set_fat_p'] != null?$user_data['set_fat_p']:bcmul($nutrition_data['fat_p'],100,2);
}else{
$nutrition_data['carbohydrate_p'] = bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = bcmul($nutrition_data['fat_p'],100,2);
}
$nutrition_describe = [
[
// '对于一个孩子2-18岁没有特殊健康问题身体处于快速生长发育阶段需要充足的营养支持尤其是蛋白质和健康脂肪。通常建议的三大营养素比例为',
// '1、碳水化合物45%-65% 的总热量',
// '提供能量,支持孩子的日常活动和生长发育。',
// '优先选择复合碳水化合物(如全谷物、蔬菜、水果),避免精制糖和高糖零食。',
// '2、蛋白质10%-30% 的总热量',
// '支持肌肉、骨骼和器官的发育。',
// '建议摄入优质蛋白质来源,如瘦肉、鱼类、鸡蛋、豆类和乳制品。',
// '蛋白质需求较高,尤其是青春期孩子。',
// '3、脂肪25%-35% 的总热量',
// '提供能量并支持大脑发育尤其是Omega-3脂肪酸。',
// '优先选择健康脂肪,如鱼类、坚果、种子、橄榄油和牛油果。',
// '避免反式脂肪和过多的饱和脂肪。',
// '注意事项',
// '如果你有特定的健康目标(如增高,减重),可以进一步调整比例,并咨询营养师或医生以获得个性化建议。',
'孩子2-18岁处于快速生长发育期需充足营养尤其蛋白质和健康脂肪。建议比例',
'1、碳水化合物45%-65%总热量',
'提供能量,优选全谷物、蔬果等复合碳水,避免高糖零食。',
'2、蛋白质10%-30%总热量',
'支持肌肉、骨骼发育,推荐鱼、蛋、瘦肉、豆类等优质蛋白。',
'3、脂肪25%-35%总热量',
'供能并促进大脑发育,选择坚果、鱼类、橄榄油等健康脂肪。',
'注意事项:若有增高、减重等目标,可咨询专业人士调整。'
],
[
// '对于一个正常成年人(没有特殊健康问题或特定健身目标),通常建议的三大营养素比例为:',
// '1、碳水化合物45%-65% 的总热量',
// '主要功能是提供能量',
// '建议选择复合碳水化合物(如全谷物、蔬菜、豆类),而不是精制糖。',
// '对于普通人,碳水化合物占总热量的 50%-55% 是一个常见的推荐值。',
// '2、蛋白质10%-35% 的总热量',
// '用于维持肌肉、修复组织和支持免疫功能。',
// '普通人每日蛋白质摄入量建议为 0.8-1.2克/公斤体重。',
// '对于活动量较大或健身人群,蛋白质比例可以提高到 20%-30%。',
// '3、脂肪20%-35% 的总热量',
// '提供能量、支持细胞功能并帮助吸收脂溶性维生素。',
// '建议以 不饱和脂肪(如橄榄油、坚果、鱼类)为主,减少饱和脂肪和反式脂肪的摄入。',
// '脂肪占总热量的 20%-30% 是常见的推荐值。',
// '以上是根据世界卫生组织WHO和其他健康机构的建议制定的。具体比例可以根据个人的活动水平、健康状况和目标进行微调。',
// '注意事项',
// '活动水平:活动量大的人可能需要更多的碳水化合物来提供能量,而健身人群可能需要更多的蛋白质。',
// '健康状况:例如,糖尿病患者可能需要控制碳水化合物比例,而心血管疾病患者可能需要减少脂肪摄入。',
// '个体差异:每个人的代谢和需求不同,建议根据个人情况调整。',
// '如果你有特定的健康目标(如减脂、增肌或控制慢性病),可以进一步调整比例,并咨询营养师或医生以获得个性化建议。',
'正常成年人(无特殊健康问题)建议营养比例:',
'1、碳水化合物45%-65%总热量',
'主要供能,推荐全谷物、豆类等复合碳水。',
'2、蛋白质10%-35%总热量',
'维持肌肉与免疫功能日常建议0.8-1.2克/公斤体重。',
'3、脂肪20%-35%总热量',
'支持细胞功能,以不饱和脂肪为主,减少饱和脂肪。',
'注意事项:根据活动量、健康状况微调,特殊目标需个性化建议。'
],
[
// '对于一个老人65岁以上没有特殊健康问题身体的代谢率下降肌肉量减少可能面临营养不良或慢性病风险因此需要调整营养比例。通常建议的三大营养素比例为',
// '1、碳水化合物45%-65% 的总热量',
// '提供能量但应选择低血糖指数GI的食物如全谷物、蔬菜和豆类以控制血糖水平。',
// '避免精制糖和高糖食物,尤其是糖尿病患者。',
// '帮助维持肌肉质量,预防肌肉流失(少肌症)。',
// '建议摄入优质蛋白质,如鱼类、瘦肉、鸡蛋、豆类和乳制品。',
// '蛋白质需求较高,尤其是活动量较大的老人。',
// '3、脂肪20%-35% 的总热量',
// '提供能量,并支持细胞功能和脂溶性维生素的吸收。',
// '优先选择不饱和脂肪,如橄榄油、坚果、种子和鱼类。',
// '减少饱和脂肪和反式脂肪的摄入,以降低心血管疾病风险。',
// '注意事项',
// '如果你有特定的健康目标(控制慢性病),可以进一步调整比例,并咨询营养师或医生以获得个性化建议。',
'老人65岁以上代谢减缓需关注肌肉维持与慢性病预防。建议比例',
'1、碳水化合物45%-65%总热量',
'选择低GI食物如全谷物、蔬菜控制血糖。',
'2、蛋白质10%-30%总热量',
'预防肌肉流失,优选鱼、蛋、豆类等易消化蛋白。',
'3、脂肪20%-35%总热量',
'支持营养吸收,以橄榄油、鱼类等健康脂肪为主。',
'注意事项:慢性病患者需结合医生建议调整饮食。'
]
];
$return_data = [
'kcal'=>[
'title'=>"建议摄入卡路里",
'suggestion_kcal_val'=>$nutrition_data['kcal'],
'suggestion_kcal_unit'=>"千卡",
'suggestion_kcal_range_val'=>"建议您在:".bcmul($nutrition_data['bmr'],1.2,2)."~".bcmul($nutrition_data['bmr'],1.9,2)."千卡范围内调整,修改时请以医生建议为准!",
'describe'=>[
'基础代谢率(BMR):是指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率。',
'每日总能量消耗TDEE',
'TDEE是BMR乘以活动系数活动系数根据日常活动水平确定',
'久坐很少或没有运动BMR × 1.2',
'轻度活动每周1-3天轻度运动BMR × 1.375',
'中度活动每周3-5天中度运动BMR × 1.55',
'高度活动每周6-7天高强度运动BMR × 1.725',
'极高活动体力劳动或每天高强度训练BMR × 1.9',
'您的BMR为'.$nutrition_data['bmr'].',建议根据您的日常生活水平调整合适的TDEE',
],
],
'nutrition'=>[
'title'=>"建议三大营养比例",
'list'=>[
[
'name'=>'碳水化合物',
'key_v'=>'carbohydrate',
'icon'=>'icon-tanshuihuahewu',
'proportion'=>$nutrition_data['carbohydrate_p'],
'val'=>$nutrition_data['carbohydrate'],
'unit'=>'克'
],
[
'name'=>'蛋白质',
'key_v'=>'protein',
'icon'=>'icon-Sm-danbaizhi',
'proportion'=>$nutrition_data['protein_p'],
'val'=>$nutrition_data['protein'],
'unit'=>'克'
],
[
'name'=>'脂肪',
'key_v'=>'fat',
'icon'=>'icon-w_fat_normal',
'proportion'=>$nutrition_data['fat_p'],
'val'=>$nutrition_data['fat'],
'unit'=>'克'
]
],
'describe'=>[]
]
];
if($user_data['age_num'] >= 2 && $user_data['age_num'] <= 18){
$return_data['nutrition']['describe'] = $nutrition_describe[0];
}else if($user_data['age_num'] > 18 && $user_data['age_num'] < 65){
$return_data['nutrition']['describe'] = $nutrition_describe[1];
}else if($user_data['age_num'] >= 65){
$return_data['nutrition']['describe'] = $nutrition_describe[2];
}else{
}
return $this->msg($return_data);
}
public function del_user_eat_log_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['eat_log'])
->where(["id"=>$data['eat_log_id']])
->update(['is_del'=>1]);
if($user_data){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function del_user_eat_list_log_action($data){
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->field('id,token')->find();
// dump($user_data);
if(!$user_data){
return $this->msg(10003);
}
$result = $cfc->table($this->kitchenscale_db_msg['eat_log'])
->where("aud_id = ".$user_data['id']." AND LEFT(create_time,10) = '" .$data['time']. "'")
->update(['is_del'=>1]);
if($result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function current_food_statistics_action($data){
$id_arr = implode("','",$data['log_id']);
$cfc = Db::connect('cfc_db');
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])
->where(["token"=>$data['token']])
->field('weight,height,gender,age,is_use_set_kcal,set_kcal,birthday,set_carbohydrate_v,set_carbohydrate_p,set_protein_v,set_protein_p,set_fat_v,set_fat_p,activity_level')
->find();
if(!$user_data){
return $this->msg(10003);
}
if($user_data['birthday']){
$user_data['age_num'] = $this->calculate_age($user_data['birthday']);
}else{
$user_data['age_num'] = $user_data['age'];
}
$nutrition_data = $this->count_user_nutrition_all($user_data);
if($user_data['is_use_set_kcal'] == 1){
$nutrition_data['kcal'] = $user_data['set_kcal'] != 0?$user_data['set_kcal']:$nutrition_data['kcal'];
$nutrition_data['carbohydrate'] = $user_data['set_carbohydrate_v'] != null?$user_data['set_carbohydrate_v']:$nutrition_data['carbohydrate'];
$nutrition_data['protein'] = $user_data['set_protein_v'] != null?$user_data['set_protein_v']:$nutrition_data['protein'];
$nutrition_data['fat'] = $user_data['set_fat_v'] != null?$user_data['set_fat_v']:$nutrition_data['fat'];
$nutrition_data['carbohydrate_p'] = $user_data['set_carbohydrate_p'] != null?$user_data['set_carbohydrate_p']:bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = $user_data['set_protein_p'] != null?$user_data['set_protein_p']:bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = $user_data['set_fat_p'] != null?$user_data['set_fat_p']:bcmul($nutrition_data['fat_p'],100,2);
}else{
$nutrition_data['carbohydrate_p'] = bcmul($nutrition_data['carbohydrate_p'],100,2);
$nutrition_data['protein_p'] = bcmul($nutrition_data['protein_p'],100,2);
$nutrition_data['fat_p'] = bcmul($nutrition_data['fat_p'],100,2);
}
$return_data = [ //时间
'suggestion'=>[ //建议
'kcal'=>$nutrition_data['kcal'], //建议摄入卡路里量
'carbohydrate'=>$nutrition_data['carbohydrate'], //建议摄入碳水量
'protein'=>$nutrition_data['protein'], //建议摄入蛋白质量
'fat'=>$nutrition_data['fat'], //建议摄入脂肪量
],
'today_intake'=>[ //今日已摄入
'kcal'=>0, //今日已摄入卡路里量
'carbohydrate'=>0, //今日已摄入碳水量
'protein'=>0, //今日已摄入蛋白质量
'fat'=>0, //今日已摄入脂肪量
],
'remaining_kcal'=>$nutrition_data['kcal'], //剩下可摄入卡路里量
];
$eat_food_data = $cfc->table($this->kitchenscale_db_msg['eat_log'])->where("id in ('".$id_arr."')")->select();
// dump($eat_food_data);
// die;
if(count($eat_food_data) > 0){ //计算营养物质
// return $this->msg($food_content);
foreach ($eat_food_data as $key => $value) {
// dump($value['nutrients_four']);
$return_data['today_intake']['kcal'] = bcadd($return_data['today_intake']['kcal'],$value['kcal_val'],2);
$return_data['today_intake']['carbohydrate'] = bcadd($return_data['today_intake']['carbohydrate'],$value['carbohydrate_val'],2);
$return_data['today_intake']['protein'] = bcadd($return_data['today_intake']['protein'],$value['protein_val'],2);
$return_data['today_intake']['fat'] = bcadd($return_data['today_intake']['fat'],$value['fat_val'],2);
// 处理各餐
}
// 处理剩下可吃
$return_data['remaining_kcal'] = bcsub($return_data['suggestion']['kcal'],$return_data['today_intake']['kcal'],2)>=0?bcsub($return_data['suggestion']['kcal'],$return_data['today_intake']['kcal'],2):0;
}
$nameMap = [
'kcal' => ['卡路里','kcal','https://tc.pcxbc.com/kitchenscale_all/icon_kcal.png','#5180D8'],
'carbohydrate' => ['碳水','g','https://tc.pcxbc.com/kitchenscale_all/icon_carbohydrate.png','#ED7886'],
'protein' => ['蛋白质','g','https://tc.pcxbc.com/kitchenscale_all/icon_protein.png','#FFB169'],
'fat' => ['脂肪','g','https://tc.pcxbc.com/kitchenscale_all/icon_fat.png','#3CB383'],
];
$all_yy_data = bcadd($return_data['suggestion']['fat'],bcadd($return_data['suggestion']['carbohydrate'],$return_data['suggestion']['protein'],20),20);
foreach ($return_data['suggestion'] as $key => $value) {
$return_data['nutrients_four'][] = [
'name'=>$nameMap[$key][0],
'unit'=>$nameMap[$key][1],
'suggestion'=>$value,
'today_intake'=>$return_data['today_intake'][$key],
'icon'=>$nameMap[$key][2],
'color'=>$nameMap[$key][3],
'proportion'=>bcdiv($return_data['today_intake'][$key],$value,2) >= 1?'100':bcmul(bcdiv($return_data['today_intake'][$key],$value,2),100,2),
// 'proportion_fp'=>$key == 'kcal'?0:(bcdiv($return_data['suggestion'][$key],$all_yy_data,2))*100,
'proportion_fp'=>$key == 'kcal'?0:$nutrition_data[$key.'_p'],
];
}
// dump($user_data);
unset($return_data['suggestion']);
unset($return_data['today_intake']);
return $this->msg($return_data);
}
#######################################################################工具#######################################################################
#######################################################################工具#######################################################################
#######################################################################工具#######################################################################
// 计算每日每餐kcal占比
public function calculate_kcal_proportion($data){
$all_kcal = $data['today_intake']['kcal'];
$arr_kcal = [];
foreach ($data['list'] as $key => $value) {
$arr_kcal[] = $value['val'];
}
// 计算占比
$percentages = [];
if (bccomp($all_kcal, "0", 20) > 0) {
$sum = "0";
// 计算前n-1个元素的占比
for ($i = 0; $i < count($arr_kcal) - 1; $i++) {
$percentage = bcmul(bcdiv($arr_kcal[$i], $all_kcal, 20), "100", 20);
$percentage = bcdiv($percentage, "1", 2); // 保留两位小数
$percentages[] = $percentage;
$sum = bcadd($sum, $percentage, 2);
}
// 最后一个元素用100%减去前面总和确保100%
if($arr_kcal[count($arr_kcal)-1] != 0){
$lastPercentage = bcsub("100.00", $sum, 2);
}else{
$lastPercentage = '0.00';
}
$percentages[] = $lastPercentage;
} else {
// 如果总热量为0所有占比都为0
$percentages = array_fill(0, count($arr_kcal), "0.00");
}
// 将占比结果添加回原数据
foreach ($data['list'] as $key => &$value) {
$value['kcal_proportion'] = $percentages[$key];
}
return $data;
}
// 计算营养物质能量占比
public function calculate_energy_proportion($data){
// 获取今日摄入数据
$today_intake = $data['today_intake'];
// dump($today_intake);
// 总热量摄入
$total_kcal = $today_intake['kcal'];
// 各营养素摄入量(克)
$carb_intake = $today_intake['carbohydrate']; // 碳水
$protein_intake = $today_intake['protein']; // 蛋白质
$fat_intake = $today_intake['fat']; // 脂肪
// 供能系数
$carb_energy_coef = "4"; // 碳水4 kcal/g
$protein_energy_coef = "4"; // 蛋白质4 kcal/g
$fat_energy_coef = "9"; // 脂肪9 kcal/g
// 计算各营养素的能量贡献kcal
$carb_energy = bcmul($carb_intake, $carb_energy_coef, 20);
$protein_energy = bcmul($protein_intake, $protein_energy_coef, 20);
$fat_energy = bcmul($fat_intake, $fat_energy_coef, 20);
// 计算各营养素的能量占比(%
if (bccomp($total_kcal, "0", 20) > 0) {
// 碳水能量占比
$carb_proportion = bcmul(bcdiv($carb_energy, $total_kcal, 20), "100", 20);
$carb_proportion = bcdiv($carb_proportion, "1", 2); // 保留两位小数
// 蛋白质能量占比
$protein_proportion = bcmul(bcdiv($protein_energy, $total_kcal, 20), "100", 20);
$protein_proportion = bcdiv($protein_proportion, "1", 2);
// 脂肪能量占比
$fat_proportion = bcmul(bcdiv($fat_energy, $total_kcal, 20), "100", 20);
$fat_proportion = bcdiv($fat_proportion, "1", 2);
} else {
$carb_proportion = $protein_proportion = $fat_proportion = "0.00";
}
// 填充details数据
$data['details']['carbohydrate']['val'] = $carb_intake;
$data['details']['carbohydrate']['proportion'] = $carb_proportion;
$data['details']['protein']['val'] = $protein_intake;
$data['details']['protein']['proportion'] = $protein_proportion;
$data['details']['fat']['val'] = $fat_intake;
$data['details']['fat']['proportion'] = $fat_proportion;
return $data;
}
// 排序营养元素食物排行榜
public function energy_food_rank($data){
// 获取所有食物数据
$allFoods = [];
// 遍历每餐数据,收集所有食物信息
foreach ($data['list'] as $meal) {
if (!empty($meal['list'])) {
foreach ($meal['list'] as $food) {
// 获取食物的营养素数据
$nutrients_four = $food['nutrients_four'];
$nutrientValues = [];
// 将营养素数据转换为键值对,便于查询
foreach ($nutrients_four as $nutrient) {
$nutrientValues[$nutrient['name']] = $nutrient['value'];
}
$allFoods[] = [
'name' => $food['name'],
'pic_url' => $food['pic_url'],
'weight' => $food['weight'],
'carbohydrate' => isset($nutrientValues['碳水化合物']) ? $nutrientValues['碳水化合物'] : '0',
'protein' => isset($nutrientValues['蛋白质']) ? $nutrientValues['蛋白质'] : '0',
'fat' => isset($nutrientValues['脂肪']) ? $nutrientValues['脂肪'] : '0'
];
}
}
}
// 如果没有食物数据,直接返回
if (empty($allFoods)) {
return $data;
}
// 对每种营养素进行排序并取前三
$nutrientTypes = [
'carbohydrate' => '碳水化合物',
'protein' => '蛋白质',
'fat' => '脂肪'
];
foreach ($nutrientTypes as $nutrientKey => $nutrientName) {
// 使用BC函数进行精确比较排序
usort($allFoods, function($a, $b) use ($nutrientKey) {
$valueA = $a[$nutrientKey];
$valueB = $b[$nutrientKey];
// 使用bccomp进行比较
$comparison = bccomp($valueA, $valueB, 20);
if ($comparison == 0) {
return 0;
}
// 返回-1表示a应该在b前面降序排序
return ($comparison > 0) ? -1 : 1;
});
// 取前三名
$topThree = array_slice($allFoods, 0, 3);
// 填充rank_list
$rankList = [];
foreach ($topThree as $index => $food) {
$rankList[] = [
'icon' => 'https://tc.pcxbc.com/kitchenscale_all/rank'.($index+1).'.png',
'name' => $food['name'],
'pic_url' => $food['pic_url'],
'weight' => bcdiv($food[$nutrientKey], '1', 2) // 使用BC函数保留两位小数
];
}
// 如果不足三个,用空数据补全
$currentCount = count($rankList);
for ($i = $currentCount; $i < 3; $i++) {
$rankList[] = [
'icon' => 'https://tc.pcxbc.com/kitchenscale_all/rank' . ($i + 1) . '.png',
'name' => '',
'pic_url' => '',
'weight' => ''
];
}
// 更新到details中对应的营养素
$data['details'][$nutrientKey]['rank_list'] = $rankList;
}
return $data;
}
// 微量元素处理全天
public function calculate_trace_elements($data){
$traceElements = [];
// 遍历所有餐次数据
foreach ($data['list'] as $meal) {
if (!empty($meal['list'])) {
foreach ($meal['list'] as $food) {
if (!empty($food['nutrients_list'])) {
foreach ($food['nutrients_list'] as $nutrient) {
// 只处理维生素(type=2)和矿物质(type=3)
if (in_array($nutrient['type'], [2, 3])) {
$name = $nutrient['name'];
$value = $nutrient['value'];
// 初始化微量元素数据
if (!isset($traceElements[$name])) {
$traceElements[$name] = [
'name' => $nutrient['name'],
'name_ch' => isset($nutrient['name_ch']) ? $nutrient['name_ch'] : $nutrient['name'],
'unit' => $nutrient['unit'],
'value' => '0'
];
}
// 使用BC数学函数精确累加
$traceElements[$name]['value'] = bcadd(
$traceElements[$name]['value'],
$value,
20
);
}
}
}
}
}
}
// 处理结果,保留两位小数
$formattedElements = [];
foreach ($traceElements as $element) {
// 使用BC函数格式化值为两位小数
$formattedValue = bcdiv($element['value'], '1', 2);
// 如果值为0跳过可选根据需求决定是否显示0值
if (bccomp($formattedValue, '0', 2) > 0) {
$formattedElements[] = [
'name' => $element['name'],
'name_ch' => $element['name_ch'],
'unit' => $element['unit'],
'value' => $formattedValue
];
}
}
// 按中文名称排序
usort($formattedElements, function($a, $b) {
return strcmp($a['name_ch'], $b['name_ch']);
});
$data['trace_elements_all_day'] = $formattedElements;
return $data;
}
}