From 5840866aa6aac25f8bdfea72b4572d98af821e70 Mon Sep 17 00:00:00 2001 From: tsf Date: Mon, 3 Nov 2025 18:18:07 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KitchenScale/controller/app/Base.php | 173 ++-- .../KitchenScale/controller/app/Countfood.php | 98 +-- .../KitchenScale/controller/app/Index.php | 291 +++++-- .../controller/app/Usercenter.php | 12 +- application/NewReedaw/controller/app/Base.php | 4 +- application/NewReedaw/controller/app/Body.php | 649 ++++++++++++++- .../controller/app/Calculatebody.php | 641 +++++++++++++++ application/NewReedaw/controller/app/Card.php | 144 ++++ .../NewReedaw/controller/app/Countfood.php | 89 +++ .../NewReedaw/controller/app/Gufen.php | 93 +++ .../NewReedaw/controller/app/Index.php | 739 +++++++++++++++++- .../NewReedaw/controller/app/Language.php | 211 +++++ application/NewReedaw/controller/app/Role.php | 10 +- application/NewReedaw/controller/app/Skip.php | 582 ++++++++++++++ .../controller/app/Vitalcapacity.php | 639 +++++++++++++++ .../controller/admin/Printaction.php | 5 +- .../ZengJieCode/controller/app/Savemsg.php | 76 +- .../printaction/print_device_data_index.html | 8 + .../view/app/savemsg/logout_outbox_code.html | 242 ++++++ application/app/controller/Base.php | 6 +- application/app/controller/Card.php | 11 +- application/app/controller/Index.php | 2 +- application/app/controller/Language.php | 18 +- application/app/controller/Pagingcontrast.php | 23 +- application/route.php | 70 +- public/new_reedaw/icon/bmi.png | Bin 0 -> 1926 bytes public/new_reedaw/icon/card_config.png | Bin 0 -> 13250 bytes public/new_reedaw/icon/card_fh.png | Bin 0 -> 14097 bytes public/new_reedaw/icon/card_hs.png | Bin 0 -> 15856 bytes public/new_reedaw/icon/card_mb.png | Bin 0 -> 4539 bytes public/new_reedaw/icon/card_sm.png | Bin 0 -> 14425 bytes public/new_reedaw/icon/card_ts.png | Bin 0 -> 17786 bytes public/new_reedaw/icon/contrast.png | Bin 0 -> 2330 bytes public/new_reedaw/icon/inheritHeighet.png | Bin 0 -> 1788 bytes public/new_reedaw/icon/report.png | Bin 0 -> 2690 bytes 35 files changed, 4541 insertions(+), 295 deletions(-) create mode 100644 application/NewReedaw/controller/app/Calculatebody.php create mode 100644 application/NewReedaw/controller/app/Card.php create mode 100644 application/NewReedaw/controller/app/Countfood.php create mode 100644 application/NewReedaw/controller/app/Gufen.php create mode 100644 application/NewReedaw/controller/app/Language.php create mode 100644 application/NewReedaw/controller/app/Skip.php create mode 100644 application/NewReedaw/controller/app/Vitalcapacity.php create mode 100644 application/ZengJieCode/view/app/savemsg/logout_outbox_code.html create mode 100644 public/new_reedaw/icon/bmi.png create mode 100644 public/new_reedaw/icon/card_config.png create mode 100644 public/new_reedaw/icon/card_fh.png create mode 100644 public/new_reedaw/icon/card_hs.png create mode 100644 public/new_reedaw/icon/card_mb.png create mode 100644 public/new_reedaw/icon/card_sm.png create mode 100644 public/new_reedaw/icon/card_ts.png create mode 100644 public/new_reedaw/icon/contrast.png create mode 100644 public/new_reedaw/icon/inheritHeighet.png create mode 100644 public/new_reedaw/icon/report.png diff --git a/application/KitchenScale/controller/app/Base.php b/application/KitchenScale/controller/app/Base.php index b423b8c..3d2ee06 100644 --- a/application/KitchenScale/controller/app/Base.php +++ b/application/KitchenScale/controller/app/Base.php @@ -38,9 +38,9 @@ class Base extends Controller{ // 减 bcsub(,,20) // 乘 bcmul(,,20) // 除 bcdiv(,,20) - ################################################################接口################################################################ - ################################################################接口################################################################ - ################################################################接口################################################################ + ################################################################接口监控################################################################ + ################################################################接口监控################################################################ + ################################################################接口监控################################################################ // 接口记录 public function record_api_log($params, $error = null, $response = null){ // dump($params); @@ -62,6 +62,62 @@ class Base extends Controller{ } + + /* 接口说明(发邮件) + * $address(收件人的邮箱地址) 数组 格式: ['460834639@qq.com','460834639@qq.com'.......] + * $content(邮件的主题数据信息) 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123'] + * $annex(附件路径信息) 字符串 + */ + public function send_email_api_error($address,$content,$annex=''){ + // $ad = '460834639@qq.com'; + $ad1 = '295155911@qq.com'; + $mail = new PHPMailer(); //实例化 + $mail->IsSMTP(); // 启用SMTP + $mail->Host = "smtp.126.com"; //SMTP服务器 163邮箱例子 + $mail->Port = 465; //邮件发送端口 + $mail->SMTPAuth = true; //启用SMTP认证 + $mail->SMTPSecure = 'ssl'; + $mail->CharSet = "UTF-8"; //字符集 + $mail->Encoding = "base64"; //编码方式 + $mail->Username = "tsf3920322@126.com"; //你的邮箱 + $mail->Password = "HLWXNRPUCTHJFIIX"; //你的密码(邮箱后台的授权密码) + $mail->From = "tsf3920322@126.com"; //发件人地址(也就是你的邮箱) + + // $mail->Subject = "微盟测试邮件"; //邮件标题 + $mail->Subject = $content['title']; //邮件标题 + + // $mail->FromName = "微盟体测中心"; //发件人姓名 + $mail->FromName = $content['from_user_name']; //发件人姓名 + + + for ($i=0; $i < count($address); $i++) { + $mail->AddAddress($address[$i], ""); //添加收件人(地址,昵称) + } + + if($annex != ''){ + // $url = ROOT_PATH. 'public' . DS . 'tsf' . DS .'demoooo.jpg'; + $mail->AddAttachment($annex,''); // 添加附件,并指定名称 + } + + $mail->IsHTML(true); //支持html格式内容 + + $neirong = $content['content']; + + $mail->Body = $neirong; //邮件主体内容 + //发送 + if (!$mail->Send()) { + + return ['code' => 10003,'msg'=>$mail->ErrorInfo]; + // return $mail->ErrorInfo; + } else { + return ['code' => 0]; + // return 'success'; + } + } + + ################################################################通用工具################################################################ + ################################################################通用工具################################################################ + ################################################################通用工具################################################################ // 判断token是否过期 public function token_time_validate($token){ // 591b70e0d80b5fa6d77e6e1384453ab9 @@ -116,60 +172,7 @@ class Base extends Controller{ } } - /* 接口说明(发邮件) - * $address(收件人的邮箱地址) 数组 格式: ['460834639@qq.com','460834639@qq.com'.......] - * $content(邮件的主题数据信息) 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123'] - * $annex(附件路径信息) 字符串 - */ - public function send_email_api_error($address,$content,$annex=''){ - // $ad = '460834639@qq.com'; - $ad1 = '295155911@qq.com'; - $mail = new PHPMailer(); //实例化 - $mail->IsSMTP(); // 启用SMTP - $mail->Host = "smtp.126.com"; //SMTP服务器 163邮箱例子 - $mail->Port = 465; //邮件发送端口 - $mail->SMTPAuth = true; //启用SMTP认证 - $mail->SMTPSecure = 'ssl'; - $mail->CharSet = "UTF-8"; //字符集 - $mail->Encoding = "base64"; //编码方式 - $mail->Username = "tsf3920322@126.com"; //你的邮箱 - $mail->Password = "HLWXNRPUCTHJFIIX"; //你的密码(邮箱后台的授权密码) - $mail->From = "tsf3920322@126.com"; //发件人地址(也就是你的邮箱) - - // $mail->Subject = "微盟测试邮件"; //邮件标题 - $mail->Subject = $content['title']; //邮件标题 - - // $mail->FromName = "微盟体测中心"; //发件人姓名 - $mail->FromName = $content['from_user_name']; //发件人姓名 - - - for ($i=0; $i < count($address); $i++) { - $mail->AddAddress($address[$i], ""); //添加收件人(地址,昵称) - } - - if($annex != ''){ - // $url = ROOT_PATH. 'public' . DS . 'tsf' . DS .'demoooo.jpg'; - $mail->AddAttachment($annex,''); // 添加附件,并指定名称 - } - - $mail->IsHTML(true); //支持html格式内容 - - $neirong = $content['content']; - - $mail->Body = $neirong; //邮件主体内容 - //发送 - if (!$mail->Send()) { - - return ['code' => 10003,'msg'=>$mail->ErrorInfo]; - // return $mail->ErrorInfo; - } else { - return ['code' => 0]; - // return 'success'; - } - } - - - // 验证 + // 验证数据类型 public function verify_data_is_ok($data = 2,$type){ if($type == 'str'){ if (is_string($data)) { @@ -225,6 +228,54 @@ class Base extends Controller{ return false; } } + // 计算常规卡路里 + public function count_user_nutrition_all($data){ + // 计算基础代谢率(BMR) + if($data['gender'] == 1){ + // 男性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) + 5 + $bmr = bcmul(10,$data['weight'],20); + $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); + $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); + $bmr = bcadd($bmr,5,2); + }else if($data['gender'] == 2){ + // 女性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) - 161 + $bmr = bcmul(10,$data['weight'],20); + $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); + $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); + $bmr = bcsub($bmr,161,2); + }else{ + return $this->msg(10003,'性别未知'); + } + + // 每日总能量消耗(TDEE) + // 久坐(很少或没有运动):BMR × 1.2 + // 轻度活动(每周1-3天轻度运动):BMR × 1.375 + // 中度活动(每周3-5天中度运动):BMR × 1.55 + // 高度活动(每周6-7天高强度运动):BMR × 1.725 + // 极高活动(体力劳动或每天高强度训练):BMR × 1.9 + $tdee = bcmul($bmr,1.55,2); + + // 碳水化合物:通常占总热量的45-65% + // 蛋白质:通常占总热量的10-35% + // 脂肪:通常占总热量的20-35% + // 孩子&成年人:碳水化合物50%,蛋白质20%,脂肪30%。 + // 老人:碳水化合物50%,蛋白质25%,脂肪25%。 + // 建议每日摄入量计算: + // 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4 + // 2.蛋白质(克):(TDEE × 蛋白质比例) / 4 + // 3.脂肪(克): (TDEE × 脂肪比例) / 9 + $carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2); + if($data['age_num'] < 65){ + $protein = bcdiv(bcmul($tdee,0.2,20),4,2); + $fat = bcdiv(bcmul($tdee,0.3,20),9,2); + }else{ + $protein = bcdiv(bcmul($tdee,0.25,20),4,2); + $fat =bcdiv(bcmul($tdee,0.25,20),9,2); + } + return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr]; + } + ####################################################图片选择上传start############################################################## + ####################################################图片选择上传start############################################################## ####################################################图片选择上传start############################################################## public function pic_chose_list($page = 1) { $data = input(); @@ -344,7 +395,13 @@ class Base extends Controller{ } } ####################################################图片选择上传end############################################################## + ####################################################图片选择上传end############################################################## + ####################################################图片选择上传end############################################################## + + ########################################################其他工具######################################################## + ########################################################其他工具######################################################## + ########################################################其他工具######################################################## public function msg($data,$str='',$result = []){ if(is_array($data)){ if($str != ''){ @@ -374,6 +431,8 @@ class Base extends Controller{ public function ceshi(){ echo 'hello'; } + + } \ No newline at end of file diff --git a/application/KitchenScale/controller/app/Countfood.php b/application/KitchenScale/controller/app/Countfood.php index 17dc8e7..81adfa3 100644 --- a/application/KitchenScale/controller/app/Countfood.php +++ b/application/KitchenScale/controller/app/Countfood.php @@ -75,7 +75,7 @@ class Countfood extends Base{ } } // 获取记食器板块内容 - public function get_countfoot_content($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','aud_id'=>1,'time'=>'2025-09-17']){ + public function get_countfoot_content(){ // 尝试捕获异常 // try { if(count(input('post.')) > 0){ @@ -393,14 +393,16 @@ class Countfood extends Base{ $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') + ->field('weight,height,gender,age,birthday,is_use_set_kcal,set_kcal') ->find(); if(!$user_data){ return $this->msg(10003); } - - $user_data['age_num'] = $user_data['age']; - + 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){ // 加 bcadd(,,20) @@ -809,51 +811,51 @@ class Countfood extends Base{ #######################################################################工具####################################################################### #######################################################################工具####################################################################### - public function count_user_nutrition_all($data){ - // 计算基础代谢率(BMR) - if($data['gender'] == 1){ - // 男性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) + 5 - $bmr = bcmul(10,$data['weight'],20); - $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); - $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); - $bmr = bcadd($bmr,5,2); - }else if($data['gender'] == 2){ - // 女性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) - 161 - $bmr = bcmul(10,$data['weight'],20); - $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); - $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); - $bmr = bcsub($bmr,161,2); - }else{ - return $this->msg(10003,'性别未知'); - } + // public function count_user_nutrition_all($data){ + // // 计算基础代谢率(BMR) + // if($data['gender'] == 1){ + // // 男性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) + 5 + // $bmr = bcmul(10,$data['weight'],20); + // $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); + // $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); + // $bmr = bcadd($bmr,5,2); + // }else if($data['gender'] == 2){ + // // 女性:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄(岁) - 161 + // $bmr = bcmul(10,$data['weight'],20); + // $bmr = bcadd($bmr,bcmul(6.25,$data['height'],20),20); + // $bmr = bcsub($bmr,bcmul(5,$data['age_num'],20),20); + // $bmr = bcsub($bmr,161,2); + // }else{ + // return $this->msg(10003,'性别未知'); + // } - // 每日总能量消耗(TDEE) - // 久坐(很少或没有运动):BMR × 1.2 - // 轻度活动(每周1-3天轻度运动):BMR × 1.375 - // 中度活动(每周3-5天中度运动):BMR × 1.55 - // 高度活动(每周6-7天高强度运动):BMR × 1.725 - // 极高活动(体力劳动或每天高强度训练):BMR × 1.9 - $tdee = bcmul($bmr,1.55,2); + // // 每日总能量消耗(TDEE) + // // 久坐(很少或没有运动):BMR × 1.2 + // // 轻度活动(每周1-3天轻度运动):BMR × 1.375 + // // 中度活动(每周3-5天中度运动):BMR × 1.55 + // // 高度活动(每周6-7天高强度运动):BMR × 1.725 + // // 极高活动(体力劳动或每天高强度训练):BMR × 1.9 + // $tdee = bcmul($bmr,1.55,2); - // 碳水化合物:通常占总热量的45-65% - // 蛋白质:通常占总热量的10-35% - // 脂肪:通常占总热量的20-35% - // 孩子&成年人:碳水化合物50%,蛋白质20%,脂肪30%。 - // 老人:碳水化合物50%,蛋白质25%,脂肪25%。 - // 建议每日摄入量计算: - // 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4 - // 2.蛋白质(克):(TDEE × 蛋白质比例) / 4 - // 3.脂肪(克): (TDEE × 脂肪比例) / 9 - $carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2); - if($data['age_num'] < 65){ - $protein = bcdiv(bcmul($tdee,0.2,20),4,2); - $fat = bcdiv(bcmul($tdee,0.3,20),9,2); - }else{ - $protein = bcdiv(bcmul($tdee,0.25,20),4,2); - $fat =bcdiv(bcmul($tdee,0.25,20),9,2); - } - return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr]; - } + // // 碳水化合物:通常占总热量的45-65% + // // 蛋白质:通常占总热量的10-35% + // // 脂肪:通常占总热量的20-35% + // // 孩子&成年人:碳水化合物50%,蛋白质20%,脂肪30%。 + // // 老人:碳水化合物50%,蛋白质25%,脂肪25%。 + // // 建议每日摄入量计算: + // // 1.碳水化合物(克): (TDEE × 碳水化合物比例) / 4 + // // 2.蛋白质(克):(TDEE × 蛋白质比例) / 4 + // // 3.脂肪(克): (TDEE × 脂肪比例) / 9 + // $carbohydrate = bcdiv(bcmul($tdee,0.5,20),4,2); + // if($data['age_num'] < 65){ + // $protein = bcdiv(bcmul($tdee,0.2,20),4,2); + // $fat = bcdiv(bcmul($tdee,0.3,20),9,2); + // }else{ + // $protein = bcdiv(bcmul($tdee,0.25,20),4,2); + // $fat =bcdiv(bcmul($tdee,0.25,20),9,2); + // } + // return ['kcal'=>$tdee,'carbohydrate'=>$carbohydrate,'protein'=>$protein,'fat'=>$fat,'bmr'=>$bmr]; + // } public function calculateDateRange($n) { // 获取当前日期和时间 $today = new \DateTime(); diff --git a/application/KitchenScale/controller/app/Index.php b/application/KitchenScale/controller/app/Index.php index 1d9b717..d4eb216 100644 --- a/application/KitchenScale/controller/app/Index.php +++ b/application/KitchenScale/controller/app/Index.php @@ -25,7 +25,10 @@ class Index extends Base{ 'collect_list'=>'app_user_collect_list',//点赞表 'banner'=>'app_banner_data',//banner 'version'=>'app_version_log',//版本表 - 'user'=>'app_user_data',//banner + 'user'=>'app_user_data',//用户表 + 'kcal_log'=>'app_user_kcal_log',//饮食记录表 + 'search_log'=>'app_user_search_log',//搜索历史表 + ]; @@ -157,33 +160,31 @@ class Index extends Base{ } // 获取默认配置信息(包含:食材的分类列表,用户角色信息)(OK) - public function get_default_config($data = ['token'=>'']){ - try { - if(count(input('post.')) > 0){ - $data = input('post.'); + public function get_default_config(){ + // try { + $data = input('post.'); + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005); } - // if(!array_key_exists('token', $data)){ - // return $this->msg(10001); - // } - // if(!$this->verify_data_is_ok($data['token'],'str')){ - // return $this->msg(10005); - // } $return_data = $this->get_default_config_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'] .= "接口: (get_default_config)\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 $this->msg(99999); - } + // } catch (\Exception $e) { + // // 捕获异常 + // $logContent["flie"] = $e->getFile(); + // $logContent["line"] = $e->getLine(); + // $logContent['all_content'] = "异常信息:\n"; + // $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n"; + // $logContent['all_content'] .= "接口: (get_default_config)\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 $this->msg(99999); + // } } // 首页搜索接口(OK) @@ -227,55 +228,123 @@ class Index extends Base{ #######################################################################action####################################################################### #######################################################################action####################################################################### + // 老版 + // public function get_default_config_action($data){ + // $return_data = [ + // 'cook_label'=>[], + // // 'account'=>[], + // 'food_list'=>[], + // 'banner'=>[], + // 'jingang_region'=>[ + // ['name'=>'菜谱分类','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra1.png'], + // ['name'=>'我的收藏','jump_url'=>'/pageTwo/me/mymenu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra2.png'], + // ['name'=>'热量计算','jump_url'=>'/pages/count/count','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra3.png'], + // ['name'=>'健康食谱','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra4.png'], + // ], + // ]; + + // $cfc = Db::connect('cfc_db'); + // // // 获取食材分类列表start + // // $foodlist1 = $cfc->table($this->kitchenscale_db_msg['foodlist1'])->where("is_del = 0")->order('sort_num desc')->field('id,name')->select(); + + // $foodlist1 = $cfc->query("SELECT id,name FROM ".$this->kitchenscale_db_msg['foodlist1']." WHERE is_del = 0 ORDER BY sort_num"); + // // dump($foodlist1); + // // die; + // $foodlist2 = $cfc->table($this->kitchenscale_db_msg['foodlist2'])->where("is_del = 0")->field('id,name,one_id')->select(); + // // dump($foodlist3); + // foreach ($foodlist1 as $key => $value) { + // unset($foodlist1[$key]['ROW_NUMBER']); + // $foodlist1[$key]['list'] = []; + // foreach ($foodlist2 as $k => $v) { + // if($v['one_id'] == $value['id']){ + // unset($foodlist2[$k]['ROW_NUMBER']); + // array_push($foodlist1[$key]['list'],$foodlist2[$k]); + // // unset($foodlist2[$k]); + // } + // } + // } + // $return_data['food_list'] = $foodlist1; + // // // 获取食材分类列表end + // // 获取菜谱分类标签start + // $cook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label']) + // ->where("is_del = 0") + // ->field('id,name') + // ->select(); + // foreach ($cook_label as $key => $value) { + // unset($cook_label[$key]['ROW_NUMBER']); + // } + // $return_data['cook_label'] = $cook_label; + // // 获取菜谱分类标签end + + // // 获取首页信息start + // // 获取banner + // $banner_list = $cfc->query("select b.id,b.title,b.cover,b.create_user_head_pic,b.create_user_nickname,c.pic_url + // from ".$this->kitchenscale_db_msg['banner']." as a + // LEFT JOIN ".$this->kitchenscale_db_msg['cookbook']." as b on a.cookbook_id = b.id + // LEFT JOIN ".$this->kitchenscale_db_msg['uploadimg']." as c on b.cover = c.id + // where a.is_del=0 AND b.is_del=0 + // ORDER BY a.sort_num desc,a.id desc + // "); + // // dump($banner_list); + // // die; + // if($data['token'] != ''){ + // // 获取账号下信息以及用户信息 + // $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic,tel,email')->find(); + // if(!$user_data){ + // return $this->msg(20001,'账号信息错误'); + // } + // if(!$this->verify_data_is_ok($data['token'],'str')){ + // return $this->msg(10005); + // } + // // 获取账号下信息以及用户信息 + // $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find(); + // if(!$user_data){ + // return $this->msg(20001,'账号信息错误'); + // } + // $collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'is_del'=>0])->column('cookbook_id'); + // foreach ($banner_list as $key => $value) { + // if(array_key_exists($value['id'],$collect_list)){ + // $banner_list[$key]['is_me_like_it'] = 'yes'; + // }else{ + // $banner_list[$key]['is_me_like_it'] = 'no'; + // } + // unset($banner_list[$key]['ROW_NUMBER']); + // } + // }else{ + // foreach ($banner_list as $key => $value) { + // $banner_list[$key]['is_me_like_it'] = 'no'; + // unset($banner_list[$key]['ROW_NUMBER']); + // } + // } + // $return_data['banner'] = $banner_list; + // // return $this->msg($return_data); + // // 获取首页信息end + // return $this->msg($return_data); + // } + // 新版 public function get_default_config_action($data){ - $return_data = [ - 'cook_label'=>[], - // 'account'=>[], - 'food_list'=>[], - 'banner'=>[], - 'jingang_region'=>[ - ['name'=>'菜谱分类','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra1.png'], - ['name'=>'我的收藏','jump_url'=>'/pageTwo/me/mymenu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra2.png'], - ['name'=>'热量计算','jump_url'=>'/pages/count/count','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra3.png'], - ['name'=>'健康食谱','jump_url'=>'/pages/menu/menu','icon'=>'https://tc.pcxbc.com/kitchenscale_all/vajra4.png'], + 'user_data'=>[], + 'kcal_data'=>[ + 'title'=>'今日已摄入热量(千卡)', + 'kcal'=>['value'=>0,'unit'=>'kcal','standard'=>'不达标','color'=>'#F0AD4E'], + 'other_elements'=>[ + 'carbohydrate'=>['value'=>0,'unit'=>'g'], + 'protein'=>['value'=>0,'unit'=>'g'], + 'fat'=>['value'=>0,'unit'=>'g'], + ], + 'list'=>[ + ['title'=>'早餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'], + ['title'=>'午餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'], + ['title'=>'晚餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'], + ['title'=>'加餐(千卡)','icon'=>'','value'=>0,'unit'=>'kcal'], + ], ], + 'banner_data'=>[], + 'search_history'=>[], + 'search_guess'=>[], ]; - $cfc = Db::connect('cfc_db'); - // // 获取食材分类列表start - // $foodlist1 = $cfc->table($this->kitchenscale_db_msg['foodlist1'])->where("is_del = 0")->order('sort_num desc')->field('id,name')->select(); - - $foodlist1 = $cfc->query("SELECT id,name FROM ".$this->kitchenscale_db_msg['foodlist1']." WHERE is_del = 0 ORDER BY sort_num"); - // dump($foodlist1); - // die; - $foodlist2 = $cfc->table($this->kitchenscale_db_msg['foodlist2'])->where("is_del = 0")->field('id,name,one_id')->select(); - // dump($foodlist3); - foreach ($foodlist1 as $key => $value) { - unset($foodlist1[$key]['ROW_NUMBER']); - $foodlist1[$key]['list'] = []; - foreach ($foodlist2 as $k => $v) { - if($v['one_id'] == $value['id']){ - unset($foodlist2[$k]['ROW_NUMBER']); - array_push($foodlist1[$key]['list'],$foodlist2[$k]); - // unset($foodlist2[$k]); - } - } - } - $return_data['food_list'] = $foodlist1; - // // 获取食材分类列表end - // 获取菜谱分类标签start - $cook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label']) - ->where("is_del = 0") - ->field('id,name') - ->select(); - foreach ($cook_label as $key => $value) { - unset($cook_label[$key]['ROW_NUMBER']); - } - $return_data['cook_label'] = $cook_label; - // 获取菜谱分类标签end - - // 获取首页信息start // 获取banner $banner_list = $cfc->query("select b.id,b.title,b.cover,b.create_user_head_pic,b.create_user_nickname,c.pic_url from ".$this->kitchenscale_db_msg['banner']." as a @@ -284,22 +353,71 @@ class Index extends Base{ where a.is_del=0 AND b.is_del=0 ORDER BY a.sort_num desc,a.id desc "); - // dump($banner_list); - // die; + // 如果有账号信息 if($data['token'] != ''){ - // 获取账号下信息以及用户信息 - $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic,tel,email')->find(); - if(!$user_data){ - return $this->msg(20001,'账号信息错误'); - } if(!$this->verify_data_is_ok($data['token'],'str')){ return $this->msg(10005); } - // 获取账号下信息以及用户信息 - $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find(); - if(!$user_data){ + // 获取账号下信息以及用户信息 start + $user = $cfc->table($this->kitchenscale_db_msg['user'])->where(["token"=>$data['token']])->find(); + if(!$user){ return $this->msg(20001,'账号信息错误'); } + $return_data['user_data'] = $user; + if($return_data['user_data']['birthday']){ + $return_data['user_data']['age'] = $this->calculate_age($return_data['user_data']['birthday']); + } + unset($return_data['user_data']['id']); + unset($return_data['user_data']['token']); + unset($return_data['user_data']['update_time']); + unset($return_data['user_data']['ROW_NUMBER']); + // 获取账号下信息以及用户信息 end + // 处理计食器信息 start + $kcal = $cfc->table($this->kitchenscale_db_msg['kcal_log'])->where(["aud_id"=>$user['id'],'is_del'=>0])->whereTime('create_time', 'today')->order('id desc')->select(); + if(count($kcal)>0){ + $return_data['kcal_data']['title'] = '今日已摄入热量(千卡)'.$kcal[0]['create_time']; + foreach ($kcal as $key => $value) { + + $return_data['kcal_data']['kcal']['value'] = bcadd($return_data['kcal_data']['kcal']['value'],$value['kcal_val'],2); + $return_data['kcal_data']['other_elements']['carbohydrate']['value'] = bcadd($return_data['kcal_data']['other_elements']['carbohydrate']['value'],$value['carbohydrate_val'],2); + $return_data['kcal_data']['other_elements']['protein']['value'] = bcadd($return_data['kcal_data']['other_elements']['protein']['value'],$value['protein_val'],2); + $return_data['kcal_data']['other_elements']['fat']['value'] = bcadd($return_data['kcal_data']['other_elements']['fat']['value'],$value['fat_val'],2); + if($value['meals_type'] == '早餐'){ + $return_data['kcal_data']['list'][0]['value'] = bcadd($return_data['kcal_data']['list'][0]['value'],$value['kcal_val'],2); + }else if($value['meals_type'] == '午餐'){ + $return_data['kcal_data']['list'][1]['value'] = bcadd($return_data['kcal_data']['list'][1]['value'],$value['kcal_val'],2); + }else if($value['meals_type'] == '晚餐'){ + $return_data['kcal_data']['list'][2]['value'] = bcadd($return_data['kcal_data']['list'][2]['value'],$value['kcal_val'],2); + }else{ + $return_data['kcal_data']['list'][3]['value'] = bcadd($return_data['kcal_data']['list'][3]['value'],$value['kcal_val'],2); + } + } + foreach ($return_data['kcal_data']['list'] as $key => $value) { + if($value['value'] <= 0){ + $return_data['kcal_data']['list'][$key]['value'] = '-'; + } + } + } + + if($user['is_use_set_kcal'] == 1){ + $nutrition_data['kcal'] = $user['set_kcal']; + }else{ + $user['age_num'] = $return_data['user_data']['age']; + $nutrition_data = $this->count_user_nutrition_all($user); + } + + if(bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) < 0.9){ + $return_data['kcal_data']['kcal']['standard'] = '不达标'; + $return_data['kcal_data']['kcal']['color'] = '#F0AD4E'; + }else if(bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) >= 0.9 && bcdiv($return_data['kcal_data']['kcal']['value'],$nutrition_data['kcal'],2) < 1.1){ + $return_data['kcal_data']['kcal']['standard'] = '达标'; + $return_data['kcal_data']['kcal']['color'] = '#4CD964'; + }else{ + $return_data['kcal_data']['kcal']['standard'] = '超标'; + $return_data['kcal_data']['kcal']['color'] = '#FF0000'; + } + // 处理计食器信息 end + // 处理banner信息 start $collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'is_del'=>0])->column('cookbook_id'); foreach ($banner_list as $key => $value) { if(array_key_exists($value['id'],$collect_list)){ @@ -309,18 +427,25 @@ class Index extends Base{ } unset($banner_list[$key]['ROW_NUMBER']); } + + // 处理banner信息 end + // 处理搜索历史 start + $search_log = $cfc->table($this->kitchenscale_db_msg['search_log'])->where(["aud_id"=>$user['id'],'is_del'=>0])->order('id desc')->limit(30)->select(); + + $return_data['search_history'] = $search_log; + // 处理搜索历史 end }else{ foreach ($banner_list as $key => $value) { $banner_list[$key]['is_me_like_it'] = 'no'; unset($banner_list[$key]['ROW_NUMBER']); } } - $return_data['banner'] = $banner_list; - // return $this->msg($return_data); - // 获取首页信息end + + $return_data['banner_data'] = $banner_list; + + return $this->msg($return_data); } - public function search_column_action($data){ diff --git a/application/KitchenScale/controller/app/Usercenter.php b/application/KitchenScale/controller/app/Usercenter.php index 7437243..7806ae4 100644 --- a/application/KitchenScale/controller/app/Usercenter.php +++ b/application/KitchenScale/controller/app/Usercenter.php @@ -65,7 +65,7 @@ class Usercenter extends Base{ } } // 修改用户 - public function update_user_msg($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a','nickname'=>'测试人员001','gender'=>'1','age'=>'18','height'=>'165.34','weight'=>'55.55']){ + public function update_user_msg(){ try { if(count(input('post.')) > 0){ $data = input('post.'); @@ -79,8 +79,8 @@ class Usercenter extends Base{ if(!array_key_exists('gender', $data)){ return $this->msg(10001,'gender is miss'); } - if(!array_key_exists('age', $data)){ - return $this->msg(10001,'age is miss'); + if(!array_key_exists('birthday', $data)){ + return $this->msg(10001,'birthday is miss'); } if(!array_key_exists('height', $data)){ return $this->msg(10001,'height is miss'); @@ -97,8 +97,8 @@ class Usercenter extends Base{ if(!$this->verify_data_is_ok($data['gender'],'intnum')){ return $this->msg(10005,'gender type is error'); } - if(!$this->verify_data_is_ok($data['age'],'intnum')){ - return $this->msg(10005,'age type is error'); + if(!$this->verify_data_is_ok($data['birthday'],'datetime')){ + return $this->msg(10005,'birthday type is error'); } if(!$this->verify_data_is_ok($data['height'],'num')){ return $this->msg(10005,'height type is error'); @@ -305,7 +305,7 @@ class Usercenter extends Base{ $user_msg['nickname'] = $data['nickname']; $user_msg['head_pic'] = $data['gender'] == 1?'https://tc.pcxbc.com/tsf/1.png':'https://tc.pcxbc.com/tsf/2.png'; $user_msg['gender'] = $data['gender']; - $user_msg['age'] = $data['age']; + $user_msg['birthday'] = $data['birthday']; $user_msg['height'] = $data['height']; $user_msg['weight'] = $data['weight']; diff --git a/application/NewReedaw/controller/app/Base.php b/application/NewReedaw/controller/app/Base.php index 4d491a6..b192f9f 100644 --- a/application/NewReedaw/controller/app/Base.php +++ b/application/NewReedaw/controller/app/Base.php @@ -593,7 +593,9 @@ class Base extends Controller{ case 'intnum': // 整数验证 - 必须是整型或纯整数字符串 // 使用 filter_var 同时验证整型和整数字符串 - return filter_var($data, FILTER_VALIDATE_INT) !== false; + // 必须是 >0 的整数或字符串整数 + $filtered = filter_var($data, FILTER_VALIDATE_INT); + return $filtered !== false && $filtered > 0; case 'datetime': // 日期时间验证 - 保持原有逻辑不变 diff --git a/application/NewReedaw/controller/app/Body.php b/application/NewReedaw/controller/app/Body.php index eb4f3e1..6510857 100644 --- a/application/NewReedaw/controller/app/Body.php +++ b/application/NewReedaw/controller/app/Body.php @@ -2,12 +2,9 @@ namespace app\NewReedaw\controller\app; -use think\Controller; use think\Db; -use think\Cache; -use think\Log; -use PHPMailer\PHPMailer\PHPMailer; use app\NewReedaw\controller\app\Cardparts; +use app\NewReedaw\controller\app\Calculatebody; class Body extends Base{ @@ -30,6 +27,7 @@ class Body extends Base{ 'list'=>[] ]; protected $age_limit = 16; + protected $pagesize = 15; protected $unit_name = ['score'=>'身体得分','height'=>'身高','weight'=>'体重','bmi'=>'BMI','fat_r'=>'脂肪率','fat_w'=>'脂肪量','muscle'=>'肌肉率','muscleval'=>'肌肉量','water'=>'水分','bone'=>'骨重','protein'=>'蛋白率','proteinval'=>'蛋白量','kcal'=>'基础代谢','visceral'=>'内脏指数','sfr'=>'皮下脂肪','body_level'=>'肥胖等级','body_type'=>'身体类型']; protected $unit_symbol = ['score'=>'分','height'=>'CM','weight'=>'公斤','bmi'=>'','fat_r'=>'%','fat_w'=>'kg','muscle'=>'%','muscleval'=>'kg','water'=>'kg','bone'=>'kg','protein'=>'%','proteinval'=>'kg','kcal'=>'kcal','visceral'=>'','sfr'=>'%',]; protected $standard_color = [ @@ -85,7 +83,7 @@ class Body extends Base{ public function body_report(){ // phpinfo(); // die; - // try { + try { $data = input('post.'); if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ return $this->msg(10001); @@ -97,20 +95,243 @@ class Body extends Base{ return $this->msg(10005,'aud_id type error'); } return $this->body_report_action_detailed($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 $this->msg(99999); - // } + } 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 $this->msg(99999); + } } + // 手动记录 + public function manual_record(){ + try { + + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + unset($data['token']); + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['time'],'datetime')){ + return $this->msg(10005,'time type error'); + } + $temporary_data = $this->convertHeightAndWeight($data['height'],$data['weight']); + if($temporary_data['height_in_cm'] == false){ + return $this->msg(10005,'身高单位错误'); + } + if($temporary_data['weight_in_kg'] == false){ + return $this->msg(10005,'体重单位错误'); + } + $data['height'] = $temporary_data['height_in_cm']; + $data['weight'] = $temporary_data['weight_in_kg']; + if(strlen($data['time']) <= 12){ + // 时间日期转换,把'Y-m-d'转换成'Y-m-d H:i:s'格式 + $data['time'] = $this->addCurrentTimeToDateString($data['time']); + } + // $data['acd_id'] = '2'; + return $this->set_user_body_data($data,'by_hand_means'); + } 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 $this->msg(99999); + } + + } + // 设备记录 + public function device_record(){ + try { + // 你的业务逻辑 + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('adc', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['adc'],'num')){ + return $this->msg(10005,'adc type error'); + } + $temporary_data = $this->convertHeightAndWeight($data['height'],$data['weight']); + if($temporary_data['height_in_cm'] == false){ + return $this->msg(10005,'身高单位错误'); + } + if($temporary_data['weight_in_kg'] == false){ + return $this->msg(10005,'体重单位错误'); + } + // 检测设备传过来的info信息 + if(array_key_exists('info', $data)){ + if (!is_array($data['info'])) { + return $this->msg(10005,'info参数格式错误'); + }else{ + $info_data_arr =['bodyage','fat_r','muscle','kcal','visceral','sfr','water','bone','fatlevlval','protein','bmi']; + foreach ($data['info'] as $key => $value) { + if (!in_array($key, $info_data_arr)) { + return $this->msg(10005,'info参数格式错误-2'); + } + } + } + } + $data['height'] = $temporary_data['height_in_cm']; + $data['weight'] = $temporary_data['weight_in_kg']; + $data['time'] = date('Y-m-d H:i:s'); + return $this->set_user_body_data($data,'by_device'); + } 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 $this->msg(99999); + } + + } + // 获取历史列表(分页) + public function record_list_page(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('page', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['page'],'intnum')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'page'); + } 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 $this->msg(99999); + } + } + // 获取历史列表(分组) + public function record_list_group(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['s_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + if(!$this->verify_data_is_ok($data['e_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'group'); + } 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 $this->msg(99999); + } + } + // 历史记录(详细) + public function detailed_record(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('id', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005,'id type error'); + } + return $this->get_all_detaile_data_action($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 $this->msg(99999); + } + } + // 删除历史数据 + public function del_record(){ + try { + $data = input('post.'); + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + $user_data = Db::table($this->body_db_name['body_data'])->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($user_data){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } 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 $this->msg(99999); + } + } + ################################################################action################################################################ ################################################################action################################################################ @@ -344,7 +565,318 @@ class Body extends Base{ // dump($result_end); } + // 用户身体数据卡片记录 + public function set_user_body_data($data,$type){ + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + + // 判断头围数据是否存在是否合理 + if(array_key_exists('head_data', $data)){ + if(!$this->verify_data_is_ok($data['head_data'],'num')){ + return $this->msg(10005); + } + $data['head_circumference'] = $data['head_data']; + }else{ + $data['head_circumference'] = 0; + } + + // 查询用户信息 + $user_data = Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->field('birthday,gender,target_weight,initial_weight,initial_date')->find(); + + if(!$user_data){ + return $this->msg(10003); + } + // 如果最初体重设置为null + if($user_data['initial_date'] == null){ + Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->update(['initial_weight'=>$data['weight'],'initial_date'=>$data['time']]); + $target_current = $this->base_target_initial_cumulative_weight([ + 'weight'=>$data['weight'], + 'target_weight'=>$user_data['target_weight'], + 'initial_weight'=>$data['weight'], + 'initial_date'=>$data['time'], + ]); + }else{ + $target_current = $this->base_target_initial_cumulative_weight([ + 'weight'=>$data['weight'], + 'target_weight'=>$user_data['target_weight'], + 'initial_weight'=>$user_data['initial_weight'], + 'initial_date'=>$user_data['initial_date'], + ]); + } + // 设置身高、体重、年龄、性别、阶段称谓、头围、生日、阻抗 + $result_data['height'] = $data['height']; + $result_data['weight'] = $data['weight']; + $result_data['age'] = $this->calculate_age($user_data['birthday']); + $result_data['gender'] = $user_data['gender']; + $result_data['head_circumference'] = $data['head_circumference']; + $result_data['birthday'] = $user_data['birthday']; + if(array_key_exists('adc', $data)){ + if($data['adc'] > 0){ + $result_data['adc'] = $data['adc']; + $type = "by_device_adc"; + }else{ + $result_data['adc'] = 550; + $type = "by_device"; + } + } + $calculate_body_formula = new Calculatebody(); + + // 计算身体数据 + $get_body_value = $calculate_body_formula->calculate_body_data_result($result_data); + + if($get_body_value === false){ + return $this->msg(10005); + } + + // 如果年纪小于三岁,处理头围数据star + $standardlist = []; + if($result_data['age'] < 3){ + if(array_key_exists('standardlist',$get_body_value)){ + $standardlist = $get_body_value['standardlist']; + foreach ($standardlist as $key => $value) { + if($value['name'] == 'head' && count($value['list'] ) > 0){ + $standardlist = $value; + } + } + $standardlist['list2'] = []; + foreach ($standardlist['list'] as $key => $value) { + array_push($standardlist['list2'],[ + 'min_val'=>$value['minvalue'], + 'max_val'=>$value['maxvalue'], + 'text'=>$value['text'], + 'color'=>$value['color'] + ]); + } + unset($standardlist['list']); + unset($get_body_value['standardlist']); + } + }else{ + if(array_key_exists('standardlist',$get_body_value)){ + unset($get_body_value['standardlist']); + } + } + // 如果年纪小于三岁,处理头围数据end + $get_body_value['gender'] = $user_data['gender']; + $get_body_value['birthday'] = $user_data['birthday']; + // 添加身高、体重、bmi、头围(如果有)的标尺标准 + $get_body_value = $this->hwb_standard($get_body_value); + + $enumeration_data = [ + 'fat_r'=>'脂肪率', + 'muscle'=>'肌肉率', + 'kcal'=>'基础代谢', + 'visceral'=>'内脏指数', + 'sfr'=>'皮下脂肪', + 'water'=>'水分', + 'bone'=>'骨重', + 'protein'=>'蛋白率', + 'bodyage'=>'身体年龄' + ]; + + // return $this->msg($get_body_value); + // 根据秤传过来的数据,去处理要存的结果 + if(array_key_exists('info', $data)){ + + + foreach ($data['info'] as $key => $value) { + if($key == 'bmi'){ + if($value > 0){ + $get_body_value['BMI'] = $value; + $get_body_value['BMI2'] = explode(',',$get_body_value['BMI2']); + $get_body_value['BMI2'][0] = $value; + $get_body_value['BMI2'] = implode(',',$get_body_value['BMI2']); + } + }else if($key == 'bodyage'){ + $get_body_value[$enumeration_data[$key]] = $value; + }else if($key == 'fatlevlval'){ + continue; + }else{ + if($value > 0){ + $get_body_value[$enumeration_data[$key]][0] = $value; + } + } + } + } + + $set_data = [ + 'acd_id'=>2, + 'aud_id'=>$data['aud_id'], + 'record_time'=>array_key_exists('time', $data)?$data['time']:date('Y-m-d H:i:s'), + 'create_time'=>date('Y-m-d H:i:s'), + 'last_update_time'=>date('Y-m-d H:i:s'), + 'age'=>$get_body_value['age'], + 'height'=>$get_body_value['身高2'], + 'height_val'=>$get_body_value['身高'], + 'weight'=>$get_body_value['体重2'], + 'weight_val'=>$get_body_value['体重'], + 'bmi'=>$get_body_value['BMI2'], + 'bmi_val'=>$get_body_value['BMI'], + 'score'=>$get_body_value['身体得分'], + 'fat_r'=> implode(',',$get_body_value['脂肪率']), + 'fat_w'=>implode(',',$get_body_value['脂肪量']), + 'muscle'=>implode(',',$get_body_value['肌肉率']), + 'muscleval'=>implode(',',$get_body_value['肌肉量']), + 'water'=>implode(',',$get_body_value['水分']), + 'proteinval'=>implode(',',$get_body_value['蛋白量']), + 'bone'=>implode(',',$get_body_value['骨重']), + 'protein'=>implode(',',$get_body_value['蛋白率']), + 'kcal'=>implode(',',$get_body_value['基础代谢']), + 'visceral'=>implode(',',$get_body_value['内脏指数']), + 'sfr'=>implode(',',$get_body_value['皮下脂肪']), + 'body_level'=>$get_body_value['肥胖等级'], + 'body_type'=>$get_body_value['身体类型'], + 'body_age'=>$get_body_value['身体年龄'], + 'record_type' => $type, + 'head_circumference' => $result_data['age'] < 3?json_encode($standardlist):"", + ]; + if(strlen($set_data['record_time']) <= 12){ + // 时间日期转换,把'Y-m-d'转换成'Y-m-d H:i:s'格式 + $set_data['record_time'] = $this->addCurrentTimeToDateString($set_data['record_time']); + } + + // 启动事务 + Db::startTrans(); + try{ + $set_user_data = Db::table($this->body_db_name['body_data'])->insert($set_data); + $update_arr = [ + 'height'=>$get_body_value['身高'], + 'weight'=>$get_body_value['体重'] + ]; + if($data['head_circumference']>0){ + $update_arr['head_data'] = $data['head_circumference']; + } + $update_user_data = Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->update($update_arr); + // 提交事务 + Db::commit(); + return $this->msg([ + 'acd_id'=>2, + 'height'=>$get_body_value['身高'].',CM', + 'weight'=>$get_body_value['体重'].',公斤', + 'bmi'=>$get_body_value['BMI'], + 'target_current'=>$target_current, + ]); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return $this->msg(10002); + } + } + public function record_list_page_or_group_action($data,$type){ + $return_result = []; + + if($type == 'group'){ + $data['s_time'] = $data['s_time'].' 00:00:00'; + $data['e_time'] = $data['e_time'].' 23:59:59'; + $result = Db::query(" + select + id, + CONVERT(varchar(10), record_time, 120) AS r_t, + CONVERT(varchar(19), record_time, 120) AS record_time, + height_val as v1, + weight_val as v2, + bmi_val as v3 + from ".$this->body_db_name['body_data']." + where aud_id='".$data['aud_id']."' + and record_time between '".$data['s_time']."' and '".$data['e_time']."' + and is_del = 0 + order by record_time desc"); + foreach ($result as $key => $value) { + array_push($return_result, [ + 'id'=>$value['id'], + 'v1'=>floatval(sprintf("%.2f", $value['v1'])), + 'v2'=>floatval(sprintf("%.2f", $value['v2'])), + 'v3'=>floatval(sprintf("%.2f", $value['v3'])), + 'v1_name'=>'身高', + 'v2_name'=>'体重', + 'v3_name'=>'BMI', + // 'r_t'=>str_replace('-', '/', $value['r_t']) + 'r_t'=>$value['r_t'] + ]); + } + }else{ + $result = Db::table($this->body_db_name['body_data'])->where(['aud_id'=>$data['aud_id'],'is_del'=>0])->field("id,record_time,REPLACE(record_time, '-', '-') AS b_time,height_val,weight_val,bmi_val")->order('record_time desc')->page($data['page'],$this->pagesize)->select(); + $return_result['totalrows'] = Db::table($this->body_db_name['body_data'])->where(['aud_id'=>$data['aud_id']])->count(); + $return_result['rows'] = []; + $return_result['pageno'] = $data['page']; + $return_result['pagesize'] = $this->pagesize; + $return_result['totalpage'] = ceil($return_result['totalrows']/$this->pagesize); + foreach ($result as $key => $value) { + array_push($return_result['rows'],[ + 'id'=>$value['id'], + 'v1'=>floatval(sprintf("%.2f", $value['height_val'])), + 'v2'=>floatval(sprintf("%.2f", $value['weight_val'])), + 'v3'=>floatval(sprintf("%.2f", $value['bmi_val'])), + 'v1_name'=>'身高', + 'v2_name'=>'体重', + 'v3_name'=>'BMI', + 'record_time'=>$value['b_time'], + ]); + } + } + return $this->msg($return_result); + } + // 获取详细历史数据信息 + public function get_all_detaile_data_action($data){ + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 设置排除在外的数据类型start + $exclude_data_arr = ['height','weight','age','bmi']; + // 设置排除在外的数据类型end + $result = Db::table($this->body_db_name['body_data'])->where(['id'=>$data['id']])->find(); + $for_data_arr = ['height'=>['身高','cm'],'weight'=>['体重','kg'],'age'=>['年龄','岁'],'bmi'=>['BMI',''],'head'=>['头围',''],'fat_w'=>['脂肪量','kg'],'fat_r'=>['脂肪率','%'],'muscleval'=>['肌肉量','kg'],'muscle'=>['肌肉率','%'],'proteinval'=>['蛋白量','kg'],'protein'=>['蛋白率','%'],'water'=>['水分',''],'bone'=>['骨重','kg'],'visceral'=>['内脏指数',''],'sfr'=>['皮下脂肪','%'],'kcal'=>['基础代谢','kcal'],'un_fat_w_weight'=>['去脂体重','kg'],'body_age'=>['体龄',''],'body_level'=>['肥胖等级',''],'body_type'=>['体型','']]; + if($result){ + $result_data = []; + foreach ($for_data_arr as $key => $value) { + $temporary_arr['key_name'] = $key; + $temporary_arr['name'] = $value[0]; + // 身体数据处理,如果没有阻抗,则只显示四项$exclude_data_arr + if($result['record_type'] != 'by_device_adc'){ + if(!in_array($key, $exclude_data_arr)){ + continue; + }else{ + $temporary_arr['value'] = explode(',',$result[$key])[0]; + } + }else{ + + if($key == 'un_fat_w_weight'){ + $temporary_arr['value'] = bcsub(explode(',',$result['weight'])[0],explode(',',$result['fat_w'])[0],2); + }else{ + if(array_key_exists($key,$result)){ + $temporary_arr['value'] = explode(',',$result[$key])[0]; + } + + } + } + $temporary_arr['unit'] = $value[1]; + array_push($result_data,$temporary_arr); + } + // + // 添加头围详细start + if($result['head_circumference'] != null){ + array_unshift($result_data,[ + 'key_name'=>'head_circumference', + 'name'=>'头围', + 'value'=>json_decode($result['head_circumference'],true)['value'] == 0?"0":json_decode($result['head_circumference'],true)['value'], + 'unit'=>'cm', + ]); + } + // 添加头围详细end + return $this->msg($result_data); + }else{ + return $this->msg(10004); + } + + } + + + + ################################################################内部调用################################################################ + ################################################################内部调用################################################################ public function processing_return_data_new($data){ $result_end_data = []; $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']); @@ -655,9 +1187,86 @@ class Body extends Base{ } return $return_data; } - // public function body_report_action_detailed($data){ - // } + // 添加身高体重bmi的标准 + public function hwb_standard($data){ + $linshi_data = []; + $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']); + $gender_val = $data['gender']; + if($data['age'] < $this->age_limit){ + foreach ($data as $key => $value) { + if($key =='身高'){ + $linshi_data['身高'] = $this->bhw_list['height']; + $bhw_date = Db::table($this->body_db_name['heigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + + if($bhw_date){ + $linshi_data['身高'][0]['max_val'] = $bhw_date[0]['f2sd']; + $linshi_data['身高'][1]['min_val'] = $bhw_date[0]['f2sd']; + $linshi_data['身高'][1]['max_val'] = $bhw_date[0]['f1sd']; + $linshi_data['身高'][2]['min_val'] = $bhw_date[0]['f1sd']; + $linshi_data['身高'][2]['max_val'] = $bhw_date[0]['z1sd']; + $linshi_data['身高'][3]['min_val'] = $bhw_date[0]['z1sd']; + $linshi_data['身高'][3]['max_val'] = $bhw_date[0]['z2sd']; + $linshi_data['身高'][4]['min_val'] = $bhw_date[0]['z2sd']; + $linshi_data['身高'][4]['max_val'] = $bhw_date[0]['z3sd']; + } + + }else if($key =='体重'){ + $linshi_data['体重'] = $this->bhw_list['weight']; + $bhw_date = Db::table($this->body_db_name['weigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + if($bhw_date){ + $linshi_data['体重'][0]['max_val'] = $bhw_date[0]['f2sd']; + $linshi_data['体重'][1]['min_val'] = $bhw_date[0]['f2sd']; + $linshi_data['体重'][1]['max_val'] = $bhw_date[0]['f1sd']; + $linshi_data['体重'][2]['min_val'] = $bhw_date[0]['f1sd']; + $linshi_data['体重'][2]['max_val'] = $bhw_date[0]['z1sd']; + $linshi_data['体重'][3]['min_val'] = $bhw_date[0]['z1sd']; + $linshi_data['体重'][3]['max_val'] = $bhw_date[0]['z2sd']; + $linshi_data['体重'][4]['min_val'] = $bhw_date[0]['z2sd']; + $linshi_data['体重'][4]['max_val'] = $bhw_date[0]['z3sd']; + } + }else if($key =='BMI'){ + $linshi_data['BMI'] = $this->bhw_list['bmi']; + $bhw_date = Db::table($this->body_db_name['bmi'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + if($bhw_date){ + $linshi_data['BMI'][0]['max_val'] = $bhw_date[0]['f1sd']; + $linshi_data['BMI'][1]['min_val'] = $bhw_date[0]['f1sd']; + $linshi_data['BMI'][1]['max_val'] = $bhw_date[0]['z1sd']; + $linshi_data['BMI'][2]['min_val'] = $bhw_date[0]['z1sd']; + $linshi_data['BMI'][2]['max_val'] = $bhw_date[0]['z2sd']; + $linshi_data['BMI'][3]['min_val'] = $bhw_date[0]['z2sd']; + } + } + } + foreach ($linshi_data as $key => $value) { + foreach ($value as $k => $v) { + if($data[$key] >= $v['min_val'] && $data[$key] < $v['max_val']){ + // 如果落在区间内 + $data[$key.'2'] = $data[$key].','.$v['text'].','.$v['color']; + break; + } + } + // 如果$key.'2'没有被设置 + if(!array_key_exists($key.'2', $data)){ + if($data[$key] < $value[0]['min_val']){ + // 如果小于最小值 + $data[$key.'2'] = $data[$key].','.$value[0]['text'].','.$value[0]['color']; + }else if($data[$key] >= $value[count($value)-1]['max_val']){ + // 如果大于最大值 + $data[$key.'2'] = $data[$key].','.$value[count($value)-1]['text'].','.$value[count($value)-1]['color']; + } + } + } + // die; + }else{ + $data['身高2'] = $data['身高'].',无,无'; + $data['体重2'] = $data['体重'].',无,无'; + $data['BMI2'] = $data['BMI'].',无,无'; + } + return $data; + } + + diff --git a/application/NewReedaw/controller/app/Calculatebody.php b/application/NewReedaw/controller/app/Calculatebody.php new file mode 100644 index 0000000..4288274 --- /dev/null +++ b/application/NewReedaw/controller/app/Calculatebody.php @@ -0,0 +1,641 @@ +52.5,'height'=>165,'age'=>30,'gender'=>1]){ + $data['gender'] = $data['gender'] == 0 ? 1 : $data['gender']; + + $data['adc'] = array_key_exists('adc', $data)?$data['adc']:$this->default_adc; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + + // 青测自己写的计算start + // $result = $this->calculate_body_data($data['height'],$data['weight'],$data['age'],$data['gender'],$data['adc']); + // // $result['fat_w'] = $result['fat_r'] / 100 * $data['weight']; + // $result['fat_w'] = bcmul(bcdiv($result['fat_r'],'100',20),$data['weight'],2); + // // $result['proteinval'] = $result['protein'] / 100 * $data['weight']; + // $result['proteinval'] = bcmul(bcdiv($result['protein'],'100',20),$data['weight'],2); + // //肌肉量=体重-脂肪量-骨量 + // // $result['muscleval'] = $result['weight'] - $result['fat_w'] - $result['bone']; + // $result['muscleval'] = bcsub(bcsub($result['weight'],$result['fat_w'],20),$result['bone'],2); + // // $result['muscle'] = $result['muscleval'] / $data['weight'] * 100.0; + // $result['muscle'] = bcmul(bcdiv($result['muscleval'],$data['weight'],20),'100.0',2); + // // 水份=肌肉量-蛋白量 + // // $result['water'] = $result['muscleval'] - $result['proteinval']; + // $result['water'] = bcsub($result['muscleval'],$result['proteinval'],2); + // // $result['lbm'] = (1 - $result['fat_r'] / 100) * $data['weight']; + // $result['lbm'] = bcmul(bcsub('1',bcdiv($result['fat_r'],'100',20),20),$data['weight'],2); + // 青测自己写的计算end + + // 使用接口调用之前的进行计算start + $url = 'https://klcz.pcxbc.com/open-api/calc/healthcalc/bodyfat3'; + if($data['age'] < '3'){ + $temporary_parameter = [ + 'weight'=>$data['weight'], + 'height'=>$data['height'], + 'age'=>round($data['age']),//四舍五入取整 + 'adc'=>round($data['adc']),//四舍五入取整 + 'gender'=>$data['gender'], + 'head'=>$data['head_circumference'], + 'hasStandardList'=>true, + 'birthDay'=>$data['birthday'], + ]; + }else{ + $temporary_parameter = [ + 'weight'=>$data['weight'], + 'height'=>$data['height'], + 'age'=>round($data['age']),//四舍五入取整 + 'adc'=>round($data['adc']),//四舍五入取整 + 'gender'=>$data['gender'], + ]; + } + $request_result = $this->postRequest($url,$temporary_parameter); + if($request_result['code'] != 0){ + return false; + } + + $result['weight'] = $request_result['data']['weight']; + $result['height'] = $request_result['data']['height']; + $result['bmi'] = $request_result['data']['bmi']; + $result['age'] = $request_result['data']['age']; + $result['cmi'] = $request_result['data']['cmi']; + $result['fat_w'] = $request_result['data']['bfrval']; + $result['fat_r'] = $request_result['data']['bfr']; + $result['muscleval'] = $request_result['data']['romval']; + $result['muscle'] = $request_result['data']['rom']; + $result['water'] = $request_result['data']['vwc']; + $result['proteinval'] = $request_result['data']['ppval']; + $result['protein'] = $request_result['data']['pp']; + $result['bone'] = $request_result['data']['bm']; + $result['kcal'] = $request_result['data']['bmr']; + $result['visceral'] = $request_result['data']['uvi']; + $result['sfr'] = $request_result['data']['sfr']; + $result['standard_level'] = $request_result['data']['fatlevelname']; + $result['bodyage'] = $request_result['data']['bodyage']; + $result['lbm'] = $request_result['data']['lbm']; + $result['body'] = $request_result['data']['body']; + // 使用接口调用之前的进行计算end + + $return_data['standardlist'] = $request_result['data']['standardlist']; + $return_data['体重'] = $data['weight']; + $return_data['身高'] = $data['height']; + $return_data['BMI'] = $result['bmi']; + $return_data['age'] = $result['age']; + + // 身体得分修改start + // if($result['bmi']<21.6){ + // $return_data['身体得分'] = bcmul(bcdiv($result['bmi'],'21.6',20),'100',0); + // }else{ + // $return_data['身体得分'] = bcmul(bcdiv('21.6',$result['bmi'],20),'100',0); + // } + $return_data['身体得分'] = $result['cmi']; + // 身体得分修改end + + $return_data['脂肪量'][0] = $result['fat_w']; + $return_data['脂肪率'][0] = $result['fat_r']; + if( + ($data['gender']==1 && $data['age']<30 && $result['fat_r']<10) || + ($data['gender']==1 && $data['age']>=30 && $result['fat_r']<11) || + ($data['gender']==2 && $data['age']<30 && $result['fat_r']<20) || + ($data['gender']==2 && $data['age']>=30 && $result['fat_r']<21)){ + $return_data['脂肪率'][1] = '偏低'; + $return_data['脂肪量'][1] = '偏低'; + }else if( + ($data['gender']==1 && $data['age']<30 && $result['fat_r']>=10 && $result['fat_r']<21) || + ($data['gender']==1 && $data['age']>=30 && $result['fat_r']>=11 && $result['fat_r']<22) || + ($data['gender']==2 && $data['age']<30 && $result['fat_r']>=20 && $result['fat_r']<31) || + ($data['gender']==2 && $data['age']>=30 && $result['fat_r']>=21 && $result['fat_r']<32)){ + $return_data['脂肪率'][1] = '标准'; + $return_data['脂肪量'][1] = '标准'; + }else if( + ($data['gender']==1 && $data['age']<30 && $result['fat_r']>=21 && $result['fat_r']<26) || + ($data['gender']==1 && $data['age']>=30 && $result['fat_r']>=22 && $result['fat_r']<27) || + ($data['gender']==2 && $data['age']<30 && $result['fat_r']>=31 && $result['fat_r']<38) || + ($data['gender']==2 && $data['age']>=30 && $result['fat_r']>=32 && $result['fat_r']<39)){ + $return_data['脂肪率'][1] = '偏高'; + $return_data['脂肪量'][1] = '偏高'; + }else if( + ($data['gender']==1 && $data['age']<30 && $result['fat_r']>=26) || + ($data['gender']==1 && $data['age']>=30 && $result['fat_r']>=27) || + ($data['gender']==2 && $data['age']<30 && $result['fat_r']<38) || + ($data['gender']==2 && $data['age']>=30 && $result['fat_r']<39)){ + $return_data['脂肪率'][1] = '高'; + $return_data['脂肪量'][1] = '高'; + }else{ + $return_data['脂肪率'][1] = '异常'; + $return_data['脂肪量'][1] = '异常'; + } + + $return_data['肌肉量'][0] = $result['muscleval']; + $return_data['肌肉率'][0] = $result['muscle']; + if( + ($data['gender']==1 && $result['muscle']<40) || + ($data['gender']==2 && $result['muscle']<30)){ + $return_data['肌肉量'][1] = '不足'; + $return_data['肌肉率'][1] = '不足'; + }else if( + ($data['gender']==1 && $result['muscle']>=40 && $result['muscle']<60) || + ($data['gender']==2 && $result['muscle']>=30 && $result['muscle']<50)){ + $return_data['肌肉量'][1] = '标准'; + $return_data['肌肉率'][1] = '标准'; + }else if( + ($data['gender']==1 && $result['muscle']>=60) || + ($data['gender']==2 && $result['muscle']>=50)){ + $return_data['肌肉量'][1] = '优'; + $return_data['肌肉率'][1] = '优'; + }else{ + $return_data['肌肉量'][1] = '异常'; + $return_data['肌肉率'][1] = '异常'; + } + + $return_data['水分'][0] = $result['water']; + if( + ($data['gender']==1 && $result['water']<55) || + ($data['gender']==2 && $result['water']<45)){ + $return_data['水分'][1] = '不足'; + }else if( + ($data['gender']==1 && $result['water']>=55 && $result['water']<65) || + ($data['gender']==2 && $result['water']>=45 && $result['water']<60)){ + $return_data['水分'][1] = '标准'; + }else if( + ($data['gender']==1 && $result['water']>65) || + ($data['gender']==2 && $result['water']>60)){ + $return_data['水分'][1] = '优'; + }else{ + $return_data['水分'][1] = '异常'; + } + + $return_data['蛋白量'][0] = $result['proteinval']; + $return_data['蛋白率'][0] = $result['protein']; + if( + ($data['gender']==1 && $result['protein']<16) || + ($data['gender']==2 && $result['protein']<14)){ + $return_data['蛋白量'][1] = '不足'; + $return_data['蛋白率'][1] = '不足'; + }else if( + ($data['gender']==1 && $result['protein']>=16 && $result['protein']<18) || + ($data['gender']==2 && $result['protein']>=14 && $result['protein']<16)){ + $return_data['蛋白量'][1] = '标准'; + $return_data['蛋白率'][1] = '标准'; + }else if( + ($data['gender']==1 && $result['protein']>18) || + ($data['gender']==2 && $result['protein']>16)){ + $return_data['蛋白量'][1] = '优'; + $return_data['蛋白率'][1] = '优'; + }else{ + $return_data['蛋白量'][1] = '异常'; + $return_data['蛋白率'][1] = '异常'; + } + + $return_data['骨重'][0] = $result['bone']; + if( + ($data['gender']==1 && $data['weight']<60 && $result['bone']<2.4) || + ($data['gender']==1 && $data['weight']>=60 && $data['weight']<75 && $result['bone']<2.8) || + ($data['gender']==1 && $data['weight']>=75 && $result['bone']<3.1) || + ($data['gender']==2 && $data['weight']<45 && $result['bone']<1.7) || + ($data['gender']==2 && $data['weight']>=45 && $data['weight']<60 && $result['bone']<2.1) || + ($data['gender']==2 && $data['weight']>=60 && $result['bone']<2.4)){ + $return_data['骨重'][1] = '不足'; + }else if( + ($data['gender']==1 && $data['weight']<60 && $result['bone']>=2.4 && $result['bone']<=2.6) || + ($data['gender']==1 && $data['weight']>=60 && $data['weight']<75 && $result['bone']>=2.8 && $result['bone']<=3) || + ($data['gender']==1 && $data['weight']>=75 && $result['bone']>=3.1 && $result['bone']<=3.3) || + ($data['gender']==2 && $data['weight']<45 && $result['bone']>=1.7 && $result['bone']<=1.9) || + ($data['gender']==2 && $data['weight']>=45 && $data['weight']<60 && $result['bone']>=2.1 && $result['bone']<=2.3) || + ($data['gender']==2 && $data['weight']>=60 && $result['bone']>=2.4 && $result['bone']<=2.6)){ + $return_data['骨重'][1] = '标准'; + }else if( + ($data['gender']==1 && $data['weight']<60 && $result['bone']>2.6) || + ($data['gender']==1 && $data['weight']>=60 && $data['weight']<75 && $result['bone']>3) || + ($data['gender']==1 && $data['weight']>=75 && $result['bone']<3.3) || + ($data['gender']==2 && $data['weight']<45 && $result['bone']>1.9) || + ($data['gender']==2 && $data['weight']>=45 && $data['weight']<60 && $result['bone']>2.3) || + ($data['gender']==2 && $data['weight']>=60 && $result['bone']>2.6)){ + $return_data['骨重'][1] = '优'; + }else{ + $return_data['骨重'][1] = '异常'; + } + + $return_data['基础代谢'][0] = $result['kcal']; + if( + ($data['gender']==1 && $data['age']>0 && $data['age']<3 && (60.9*$data['weight']-54)>$result['kcal']) || + ($data['gender']==1 && $data['age']>=3 && $data['age']<10 && (22.7*$data['weight']+495)>$result['kcal']) || + ($data['gender']==1 && $data['age']>=10 && $data['age']<18 && (17.5*$data['weight']+651)>$result['kcal']) || + ($data['gender']==1 && $data['age']>=18 && $data['age']<30 && (15.3*$data['weight']+679)>$result['kcal']) || + ($data['gender']==1 && $data['age']>=30 && (11.6*$data['weight']+879)>$result['kcal']) || + ($data['gender']==2 && $data['age']>0 && $data['age']<3 && (61*$data['weight']-51)>$result['kcal']) || + ($data['gender']==2 && $data['age']>=3 && $data['age']<10 && (22.5*$data['weight']+499)>$result['kcal']) || + ($data['gender']==2 && $data['age']>=10 && $data['age']<18 && (12.2*$data['weight']+746)>$result['kcal']) || + ($data['gender']==2 && $data['age']>=18 && $data['age']<30 && (14.7*$data['weight']+496)>$result['kcal']) || + ($data['gender']==2 && $data['age']>=30 && (8.7*$data['weight']+820)>$result['kcal'])){ + $return_data['基础代谢'][1] = '偏低'; + }else if( + ($data['gender']==1 && $data['age']>0 && $data['age']<3 && (60.9*$data['weight']-54)<=$result['kcal']) || + ($data['gender']==1 && $data['age']>=3 && $data['age']<10 && (22.7*$data['weight']+495)<=$result['kcal']) || + ($data['gender']==1 && $data['age']>=10 && $data['age']<18 && (17.5*$data['weight']+651)<=$result['kcal']) || + ($data['gender']==1 && $data['age']>=18 && $data['age']<30 && (15.3*$data['weight']+679)<=$result['kcal']) || + ($data['gender']==1 && $data['age']>=30 && (11.6*$data['weight']+879)<=$result['kcal']) || + ($data['gender']==2 && $data['age']>0 && $data['age']<3 && (61*$data['weight']-51)<=$result['kcal']) || + ($data['gender']==2 && $data['age']>=3 && $data['age']<10 && (22.5*$data['weight']+499)<=$result['kcal']) || + ($data['gender']==2 && $data['age']>=10 && $data['age']<18 && (12.2*$data['weight']+746)<=$result['kcal']) || + ($data['gender']==2 && $data['age']>=18 && $data['age']<30 && (14.7*$data['weight']+496)<=$result['kcal']) || + ($data['gender']==2 && $data['age']>=30 && (8.7*$data['weight']+820)<=$result['kcal'])){ + $return_data['基础代谢'][1] = '优'; + }else{ + $return_data['基础代谢'][1] = '异常'; + } + + $return_data['内脏指数'][0] = $result['visceral']; + if($result['visceral']<9){ + $return_data['内脏指数'][1] = '标准'; + }else if($result['visceral']>=9 && $result['visceral']<14){ + $return_data['内脏指数'][1] = '警惕'; + }else if($result['visceral']>=14){ + $return_data['内脏指数'][1] = '危险'; + }else{ + $return_data['内脏指数'][1] = '异常'; + } + + $return_data['皮下脂肪'][0] = $result['sfr']; + if( + ($data['gender']==1 && $result['sfr']<7) || + ($data['gender']==2 && $result['sfr']<11)){ + $return_data['皮下脂肪'][1] = '不足'; + }else if( + ($data['gender']==1 && $result['sfr']>=7 && $result['sfr']<15) || + ($data['gender']==2 && $result['sfr']>=11 && $result['sfr']<17)){ + $return_data['皮下脂肪'][1] = '标准'; + }else if( + ($data['gender']==1 && $result['sfr']>=15) || + ($data['gender']==2 && $result['sfr']>=17)){ + $return_data['皮下脂肪'][1] = '偏高'; + }else{ + $return_data['皮下脂肪'][1] = '异常'; + } + // 脂肪率:偏低 标准 偏高 高 + // 肌肉率:不足 标准 优 + + // 肥胖等级修改start + // // if($data['age']>=16){ + // if($result['standard_level']<-0.2){ + // $return_data['肥胖等级'] = '体重不足'; + // }else if($result['standard_level']>=-0.2 && $result['standard_level']<-0.1){ + // $return_data['肥胖等级'] = '偏瘦'; + // }else if($result['standard_level']>=-0.1 && $result['standard_level']<=0.1){ + // $return_data['肥胖等级'] = '标准'; + // }else if($result['standard_level']>0.1 && $result['standard_level']<=0.2){ + // $return_data['肥胖等级'] = '偏重'; + // }else if($result['standard_level']>0.2){ + // $return_data['肥胖等级'] = '超重'; + // }else{ + // $return_data['肥胖等级'] = '暂无数据'; + // } + // // }else{ + // // $return_data['肥胖等级'] = '儿童'; + // // } + $return_data['肥胖等级'] = $result['standard_level']; + // 肥胖等级修改end + + + // 身体类型修改start + // // if($data['age']>=16){ + // if(($return_data['脂肪率'][1] == '高' || $return_data['脂肪率'][1] == '偏高') && $return_data['肌肉率'][1] == '不足'){ + // $return_data['身体类型'] = '隐形肥胖'; + // }else if(($return_data['脂肪率'][1] == '高' || $return_data['脂肪率'][1] == '偏高') && $return_data['肌肉率'][1] == '标准'){ + // $return_data['身体类型'] = '偏胖'; + // }else if(($return_data['脂肪率'][1] == '高' || $return_data['脂肪率'][1] == '偏高') && $return_data['肌肉率'][1] == '优'){ + // $return_data['身体类型'] = '结实型偏胖'; + // }else if($return_data['脂肪率'][1] == '标准' && $return_data['肌肉率'][1] == '不足'){ + // $return_data['身体类型'] = '缺乏肌肉型'; + // }else if($return_data['脂肪率'][1] == '标准' && $return_data['肌肉率'][1] == '标准'){ + // $return_data['身体类型'] = '标准型'; + // }else if($return_data['脂肪率'][1] == '标准' && $return_data['肌肉率'][1] == '优'){ + // $return_data['身体类型'] = '标准肌肉型'; + // }else if($return_data['脂肪率'][1] == '偏低' && $return_data['肌肉率'][1] == '不足'){ + // $return_data['身体类型'] = '偏瘦'; + // }else if($return_data['脂肪率'][1] == '偏低' && $return_data['肌肉率'][1] == '标准'){ + // $return_data['身体类型'] = '偏瘦肌肉型'; + // }else if($return_data['脂肪率'][1] == '偏低' && $return_data['肌肉率'][1] == '优'){ + // $return_data['身体类型'] = '健美肌肉型'; + // }else{ + // $return_data['身体类型'] = '暂无数据'; + // } + // // }else{ + // // $return_data['身体类型'] = '儿童'; + // // } + $return_data['身体类型'] = $result['body']; + // 身体类型修改end + + $return_data['身体年龄'] = $result['bodyage']; + + // $result_end['fat_r'] = $result['fat_r']; + // $result_end['muscle'] = $result['muscle']; + // $result_end['water'] = $result['water']; + // $result_end['bone'] = $result['bone']; + // $result_end['kcal'] = $result['kcal']; + // $result_end['fat_w'] = $result['fat_w']; + // $result_end['visceral'] = $result['visceral']; + // $result_end['protein'] = $result['protein']; + // $result_end['bodyage'] = $result['bodyage']; + // $result_end['bmi'] = $result['bmi']; + // // $result_end['cmi'] = $result['cmi']; + // $result_end['sfr'] = $result['sfr']; + // // $result_end['sfrval'] = $result['sfrval']; + // $result_end['skeletalmuscle'] = $result['skeletalmuscle']; + // $result_end['muscleval'] = $result['muscleval']; + // $result_end['proteinval'] = $result['proteinval']; + // $result_end['lbm'] = $result['lbm']; + // $result_end['weight'] = $result['weight']; + // $result_end['height'] = $result['height']; + return $return_data; + } + + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + + // 计算身体数据,BMI、脂肪率、脂肪量、肌肉率、肌肉量.... + public function calculate_body_data($height,$weight,$age,$gender,$impedance){ + + $result_data = []; + $mheight = bcdiv($height, '100', 20); // 假设我们保留20位小数 + $gender = $gender == 0 ? 1 : $gender; + + if (($weight <= 0) || ($weight > 220) || ($height <= 0) || ($height > 270) || ($age <= 0) || ($age > 120) || ($impedance <= 0) || ($impedance > 1000) || !in_array($gender, [1, 2])) { + if ($weight != 0 && $height != 0) { + // 计算BMI + $bmi = bcdiv($weight, bcmul($mheight, $mheight,20), 2); + $result_data['bmi'] = $bmi; + $result_data['bone'] = 0; + $result_data['muscle'] = 0; + $result_data['water'] = 0; + $result_data['fat_r'] = 0; + $result_data['sfr'] = 0; + $result_data['skeletalmuscle'] = 0; + $result_data['protein'] = 0; + $result_data['visceral'] = 0; + $result_data['kcal'] = 0; + $result_data['bodyage'] = 0; + $result_data['weight'] = $weight; + $result_data['height'] = $height; + $result_data['age'] = $age; + $result_data['adc'] = $impedance; + $result_data['gender'] = $gender; + $result_data['standard_level'] = 0.0; + return $result_data; + } + } + $num = intval(bcmul(bcdiv($weight,bcmul($mheight,$mheight,20),20),'10',20))/10; + $num2 = 0.0; + $num3 = 0.0; + $num4 = 0.0; + $num5 = 0.0; + $num6 = 0.0; + $num7 = 0.0; + $num8 = 0.0; + $num9 = 0.0; + $num10 = 0.0; + $num11 = 0.0; + // 根据男女计算脂肪率、脂肪量、肌肉率、肌肉量等等.... + $standard_weight = 0.0; + $standard_level = 0.0; + if ($gender == 1){ + // $num2 = 0.015 * $weight + (2.0 - 0.00055 * $impedance) * $height / 100 - 1.15; + $num2 = bcsub(bcadd(bcmul('0.015',$weight,20),bcdiv(bcmul(bcsub('2.0',bcmul('0.00055',$impedance,20),20),$height,20),'100.0',20),20),'1.15',2); + // $num3 = (0.0 - (0.00115 * $impedance + 0.01)) * $weight + (49.64 - 0.031 * $impedance) * $height / 100.0 + $impedance * 0.08 + $age * 0.04 + 15.4; + $num3 = bcsub(bcsub(bcsub(bcsub(bcmul(bcsub('0.0',bcadd(bcmul('0.00115',$impedance,20),'0.01',20),20),$weight,20),bcdiv(bcmul(bcsub('49.64',bcmul('0.031',$impedance,20)),$height,20),'100.0',20),20),bcmul($impedance,'0.08'),20),bcmul($age,'0.04'),20),'15.4',2); + // $num4 = 1000000.0/($num*(2.688*$impedance-78.28))-(10058/$impedance)-0.22*$age+52.6; + $num4 = bcadd(bcsub(bcsub(bcdiv('1000000.0',bcmul($num,bcsub(bcmul('2.688',$impedance,20),'78.28',20),20),20),bcdiv('10058',$impedance,20),20),bcmul('0.22',$age,20),20),'52.6',20); + // $num5 = -930000.0 / $num / (1.966 * $impedance - 58.46) + (13176 / $impedance) - 0.06 * $age + 40.0; + $num5 = bcadd(bcsub(bcadd(bcdiv(bcdiv('-930000.0',$num,20),bcsub(bcmul('1.966',$impedance,20),'58.46',20),20),bcdiv('13176',$impedance,0),20),bcmul('0.06',$age,20),20),'40.0',20); + // $num6 = 0.898 * $num5; + $num6 = bcmul('0.898',$num5,1); + // $num7 = 0.895 * $num4; + $num7 = bcmul('0.895',$num4,20); + // $num8 = 0.8 * (100.0 - $num5 - $num4 - $num2 / $weight); + $num8 = bcmul('0.8',bcsub(bcsub(bcsub('100.0',$num5,20),$num4,20),bcdiv($num2,$weight,20),20),2); + // $num9 = 0.304 * $weight - 25.58 * $height / 100.0 + 0.131 * $age + 0.005 * $impedance + 22.0; + $num9 = bcadd(bcadd(bcadd(bcsub(bcmul('0.304',$weight,20),bcdiv(bcmul('25.58',$height,20),'100.0',20),20),bcmul('0.131',$age,20),20),bcmul('0.005',$impedance,20),20),'22.0',0); + // $num10 = (9.0 + 0.0015 * $impedance) * $weight + (1350.0 - 0.88 * $impedance) * $height / 100.0 + (188 / $age) + 0.748 * $impedance - 1053.0; + $num10 = bcsub(bcadd(bcadd(bcadd(bcmul(bcadd('9.0',bcmul('0.0015',$impedance,20),20),$weight,20),bcdiv(bcmul(bcsub('1350.0',bcmul('0.88',$impedance,20),20),$height,20),'100.0',20),20),bcdiv('188',$age,20),20),bcmul('0.748',$impedance,20),20),'1053.0',0); + // $num11 = $age * (1.0 + 0.012 * ($num - 1.0)) - 21.0 + (30 - $age) * 0.35 + ($impedance - 450) * 0.02 + 11.0; + $num11 = bcadd(bcadd(bcadd(bcsub(bcmul($age,bcadd('1.0',bcmul('0.012',bcsub($num,'1.0',20),20),20),20),'21.0',20),bcmul(bcsub('30',$age,20),'0.35',20),20),bcmul(bcsub($impedance,'450',20),'0.02',20),20),'11.0',0); + + // $standard_weight = ($height-80)*0.7; + $standard_weight = bcmul(bcsub($height,'80',20),'0.7',20); + + }else{ + // $num2 = 2.2E-05 * $impedance * $weight + (4.99 - 0.00284 * $impedance) * $height / 100.0 + 0.0012 * $impedance - 4.45; + $num2 = bcsub(bcadd(bcadd(bcmul(bcmul('0.000022',$impedance,20),$weight,20),bcdiv(bcmul(bcsub('4.99',bcmul('0.00284',$impedance,20),20),$height,20),'100.0',20),20),bcmul('0.0012',$impedance,20),20),'4.45',2); + // $num3 = (0.0 - (0.00115 * $impedance + 0.01)) * $weight + (49.64 - 0.031 * $impedance) * $height / 100.0 + $impedance * 0.08 + $age * 0.04 + 6.0; + $num3 = bcadd(bcadd(bcadd(bcadd(bcmul(bcsub('0.0',bcadd(bcmul('0.00115',$impedance,20),'0.01',20),20),$weight,20),bcdiv(bcmul(bcsub('49.64',bcmul('0.031',$impedance,20),20),$height,20),'100.0',20),20),bcmul($impedance,'0.08',20),20),bcmul($age,'0.04',20),20),'6.0',2); + // $num4 = 1000000.0 / ($num * (2.467 * $impedance - 75.37)) - (14215 / $impedance) - 0.034 * $age + 43.2; + $num4 = bcadd(bcsub(bcsub(bcdiv('1000000.0',bcmul($num,bcsub(bcmul('2.467',$impedance,20),'75.37',20),20),20),bcdiv('14215',$impedance,20),20),bcmul('0.034',$age,20),20),'43.2',20); + // $num5 = -3030000.0 / ($num + 20.0) / (1.966 * $impedance - 58.46) + (28176 / $impedance) - 0.06 * $age + 51.0; + $num5 = bcadd(bcsub(bcadd(bcdiv(bcdiv('-3030000.0',bcadd($num,'20.0',20),20),bcsub(bcmul('1.966',$impedance,20),'58.46',20),20),bcdiv('28176',$impedance,20),20),bcmul('0.06',$age,20),20),'51.0',20); + // $num6 = 0.876 * $num5 + 1.66; + $num6 = bcadd(bcmul('0.876',$num5,20),'1.66',1); + // $num7 = 0.857 * $num4 - 0.36; + $num7 = bcsub(bcmul('0.857',$num4,20),'0.36',20); + // $num8 = 0.75 * (100.0 - $num5 - $num4 - $num2 / $weight); + $num8 = bcmul('0.75',bcsub('100.0',bcsub($num5,bcsub($num4,bcdiv($num2,$weight,20),20),20),20),2); + // $num9 = 0.304 * $weight - 25.58 * $height / 100.0 + 0.131 * $age + 0.005 * $impedance + 22.0; + $num9 = bcadd(bcadd(bcadd(bcsub(bcmul(0.304,$weight,20),bcdiv(bcmul(25.58,$height,20),'100.0',20),20),bcmul('0.131',$age,20),20),bcmul('0.005',$impedance,20),20),'22.0',0); + // $num10 = (0.00307 * $impedance + 1.5) * $weight + (1459.0 - 0.989 * $impedance) * $height / 100.0 + $age * 0.9 + 0.923 * $impedance - 950.0; + $num10 = bcsub(bcadd(bcadd(bcadd(bcmul(bcadd(bcmul('0.00307',$impedance,20),'1.5',20),$weight,20),bcdiv(bcmul(bcsub('1459.0',bcmul('0.989',$impedance,20),20),$height,20),'100.0',20),20),bcmul($age,'0.9',20),20),bcmul('0.923',$impedance,20),20),'950.0',0); + // $num11 = $age * (0.95 + 0.02 * ($num - 21.2)) + ($impedance - 500) * 0.02; + $num11 = bcadd(bcmul($age,bcadd(0.95,bcmul('0.02',bcsub($num,'21.2',20),20),20),20),bcmul(bcsub($impedance,'500',20),'0.02',20),0); + + // $standard_weight = ($height-80)*0.7; + $standard_weight = bcmul(bcsub($height,'80',20),'0.6',20); + } + + $result_data['bmi'] = $num; + // $num2 = (($num2 > $weight * 0.15) ? ($weight * 0.15) : $num2); + if(bccomp($num2, bcmul($weight,'0.15',20), 20) === 1){ + $num2 = bcmul($weight,'0.15',2); + } + // $result_data['bone'] = ($num2 < $weight * 0.02) ? ($weight * 0.02) : $num2; + if(bccomp($num2, bcmul($weight,'0.02',20), 20) === -1){ + $result_data['bone'] = bcmul($weight,'0.02',2); + }else{ + $result_data['bone'] = $num2; + } + // $num3 = (($num3 > 75.0) ? 75.0 : $num3); + if(bccomp($num3, '75.0', 20) === 1){ + $num3 = '75.0'; + } + // $result_data['muscle'] = ($num3 < 15.0) ? 15.0 : $num3; + if(bccomp($num3, '15.0', 20) === -1){ + $result_data['muscle'] = '15.00'; + }else{ + $result_data['muscle'] = $num3; + } + // $num4 = (($num4 > 70.0) ? 70.0 : $num4); + if(bccomp($num4, '70.0', 20) === 1){ + $num4 = '70.0'; + } + // $result_data['water'] = ($num4 < 20.0) ? 20.0 : $num4; + if(bccomp($num4, '20.0', 20) === -1){ + $result_data['water'] = '20.00'; + }else{ + $result_data['water'] = $num4; + } + // $num5 = (($num5 > 50.0) ? 50.0 : $num5); + if(bccomp($num5, '50.0', 20) === 1){ + $num5 = '50.0'; + } + // $result_data['fat_r'] = ($num5 < 5.0) ? 5.0 : $num5; + + if(bccomp($num5, '5.0', 20) === -1){ + $result_data['fat_r'] = '5.00'; + }else{ + // $result_data['fat_r'] = $num5; + $result_data['fat_r'] = substr($num5, 0, strpos($num5, ".") + 3); + } + // $result_data['sfr'] = $num6 <= 0 ? "0" : $num6; + if(bccomp($num6, '0.0', 20) === -1){ + $result_data['sfr'] = '0.00'; + }else{ + $result_data['sfr'] = $num6; + } + // $result_data['skeletalmuscle'] = $num7; + $result_data['skeletalmuscle'] = substr($num7, 0, strpos($num7, ".") + 3); + // $num8 = (($num8 > 50.0) ? 50.0 : $num8); + if(bccomp($num8, '50.0', 20) === 1){ + $num8 = '50.00'; + } + // $result_data['protein'] = ($num8 < 10.0) ? 10.0 : $num8; + if(bccomp($num8, '10.0', 20) === -1){ + $result_data['protein'] = '10.00'; + }else{ + $result_data['protein'] = $num8; + } + // $num9 = (($num9 > 20.0) ? 20.0 : $num9); + if(bccomp($num9, '20.0', 20) === 1){ + $num9 = '20.0'; + } + // $result_data['visceral'] = ($num9 < 1.0) ? 1.0 : $num9; + if(bccomp($num9, '1.0', 20) === -1){ + $result_data['visceral'] = '1.0'; + }else{ + $result_data['visceral'] = $num9; + } + // $result_data['kcal'] = $num10 <= 0 ? "0" : $num10; + if(bccomp($num10, '0', 20) !== 1){ + $result_data['kcal'] = '0'; + }else{ + $result_data['kcal'] = $num10; + } + + // $standard_level = ($weight-$standard_weight)/$standard_weight; + $standard_level = bcdiv(bcsub($weight,$standard_weight,20),$standard_weight,2); + // 加 bcadd(,,20) + // 减 bcsub(,,20) + if ($age < 18){ + $num11 = $age; + }else{ + // $num11 = (($num11 > ($age + 10)) ? (($age + 10)) : $num11); + if(bccomp($num11, $age + 10, 20) === 1){ + $num11 = $age + 10; + } + // $num11 = (($num11 < ($age - 10)) ? (($age - 10)) : $num11); + if(bccomp($num11, $age - 10, 20) === -1){ + $num11 = $age - 10; + } + } + + $result_data['bodyage'] = $num11; + $result_data['weight'] = $weight; + $result_data['height'] = $height; + $result_data['age'] = $age; + $result_data['adc'] = $impedance; + $result_data['gender'] = $gender; + $result_data['standard_level'] = $standard_level; + return $result_data; + } + // 计算脂肪率 + function calculate_fat_r(){ + } + // 计算脂肪量 + function calculate_zhifangliang(){ + + } + // 计算肌肉率 + function calculate_jiroulv(){ + + } + // 计算肌肉量 + function calculate_jirouliang(){ + + } + // 计算水分 + function calculate_shuifen(){ + + } + // 计算蛋白量 + function calculate_danbailiang(){ + + } + // 计算骨重 + function calculate_guzhong(){ + + } + // 计算蛋白率 + function calculate_danbailv(){ + + } + // 计算基础代谢 + function calculate_jichudaixie(){ + + } + // 计算内脏指数 + function calculate_neizangzhishu(){ + + } + // 计算皮下脂肪 + function calculate_pixiazhifang(){ + + } + // 计算肥胖等级 + function calculate_feipangdengji(){ + + } + + + + public function msg($code,$msg='',$data=[]){ + return json(['code'=>$code,'msg'=>$msg,'data'=>$data]); + } + +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Card.php b/application/NewReedaw/controller/app/Card.php new file mode 100644 index 0000000..a954c3d --- /dev/null +++ b/application/NewReedaw/controller/app/Card.php @@ -0,0 +1,144 @@ +'app_account_number', + 'juese'=>'app_user_data', + 'card'=>'app_card_data' + ]; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 测试token=>'caadd1be045a65f30b92aa805f1de54a' + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 卡片列表信息 + public function card_list_msg(){ + try { + // 你的业务逻辑 + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + return $this->card_list_msg_action($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 $this->msg(99999); + } + } + // 卡片列表信息 + public function card_user_order(){ + try { + // 你的业务逻辑 + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('card_data', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + return $this->card_user_order_action($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 $this->msg(99999); + } + } + + + ################################################################action################################################################ + ################################################################action################################################################ + public function card_list_msg_action($data){ + // 检查角色 + $user_data = Db::table($this->card_db_name['juese'])->where(['id'=>$data['aud_id'],'is_del'=>0])->field('id,card_order')->find(); + if(!$user_data){ + return $this->msg(10003,'未核实到角色信息'); + } + // 获取卡片信息 + $card_data = Db::table($this->card_db_name['card'])->where(['is_del'=>0])->field('id,name,content,page_url_report,is_sub_item,background_color,background_pic,key_word')->cache(86400)->select(); + // 根据用户处理卡片信息 + $return_data = [ + 'chosen_yes'=>[], + 'chosen_no'=>[], + ]; + if($user_data['card_order'] != ''){ + $user_data['card_order'] = explode(',',$user_data['card_order']); + }else{ + $user_data['card_order'] = []; + } + for ($i=0; $i < count($card_data); $i++) { + if(!in_array($card_data[$i]['id'],$user_data['card_order'])){ + $return_data['chosen_no'][] = $card_data[$i]; + }else{ + $key = array_search($card_data[$i]['id'], $user_data['card_order']); + $return_data['chosen_yes'][$key] = $card_data[$i]; + } + } + ksort($return_data['chosen_yes']); + return $this->msg($return_data); + } + public function card_user_order_action($data){ + + if($data['card_data'] != ''){ + $data['card_data2'] = explode(',',$data['card_data']); + }else{ + $data['card_data2'] = []; + } + + foreach ($data['card_data2'] as $key => $value) { + if(!$this->verify_data_is_ok($value,'intnum')){ + return $this->msg(10005,'卡片id错误'); + } + } + $user_data = Db::table($this->card_db_name['juese'])->where(['id'=>$data['aud_id'],'is_del'=>0])->count(); + if($user_data <= 0){ + return $this->msg(10003,'未核实到角色信息'); + } + $result = Db::table($this->card_db_name['juese'])->where(['id'=>$data['aud_id']])->update(['card_order' => $data['card_data']]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + + } + + + +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Countfood.php b/application/NewReedaw/controller/app/Countfood.php new file mode 100644 index 0000000..c5ad963 --- /dev/null +++ b/application/NewReedaw/controller/app/Countfood.php @@ -0,0 +1,89 @@ +'app_account_number', + ]; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 测试token=>'caadd1be045a65f30b92aa805f1de54a' + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 卡片列表信息 + public function card_list_msg(){ + try { + // 你的业务逻辑 + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + return $this->card_list_msg_action($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 $this->msg(99999); + } + } + + + + ################################################################action################################################################ + ################################################################action################################################################ + public function card_list_msg_action($data){ + // 检查角色 + $user_data = Db::table($this->card_db_name['juese'])->where(['id'=>$data['aud_id'],'is_del'=>0])->field('id,card_order')->find(); + if(!$user_data){ + return $this->msg(10003,'未核实到角色信息'); + } + // 获取卡片信息 + $card_data = Db::table($this->card_db_name['card'])->where(['is_del'=>0])->field('id,name,content,page_url_report,is_sub_item,background_color,background_pic,key_word')->cache(86400)->select(); + // 根据用户处理卡片信息 + $return_data = [ + 'chosen_yes'=>[], + 'chosen_no'=>[], + ]; + if($user_data['card_order'] != ''){ + $user_data['card_order'] = explode(',',$user_data['card_order']); + }else{ + $user_data['card_order'] = []; + } + for ($i=0; $i < count($card_data); $i++) { + if(!in_array($card_data[$i]['id'],$user_data['card_order'])){ + $return_data['chosen_no'][] = $card_data[$i]; + }else{ + $key = array_search($card_data[$i]['id'], $user_data['card_order']); + $return_data['chosen_yes'][$key] = $card_data[$i]; + } + } + ksort($return_data['chosen_yes']); + return $this->msg($return_data); + } + + + +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Gufen.php b/application/NewReedaw/controller/app/Gufen.php new file mode 100644 index 0000000..727d8e9 --- /dev/null +++ b/application/NewReedaw/controller/app/Gufen.php @@ -0,0 +1,93 @@ +'app_account_number', + 'guize'=>'admin_estimate', + + ]; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 测试token=>'caadd1be045a65f30b92aa805f1de54a' + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 获取单个类型列表 + public function get_single_data($data = ['address'=>'上海','gender'=>'1','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + try { + // 你的业务逻辑 + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('address', $data) || !array_key_exists('gender', $data) || !array_key_exists('token', $data)){ + $return_data = $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['address'],'str')){ + return $this->msg(10005); + } + if(!$this->verify_data_is_ok($data['gender'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + $return_data = $this->sportstesting_get_type_list_action($data); + + // 成功 + $this->record_api_log($data, null, $return_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 $this->msg(99999); + } + + } + + + + ################################################################action################################################################ + ################################################################action################################################################ + public function sportstesting_get_type_list_action($data){ + + $parameter_data = explode(',',$data['address']); + $gender = $data['gender']; + // 精准查询地市规则start + // if(count($parameter_data) == 1){ + // $db_condition = "province = '".$parameter_data[0]."'"; + // }else if(count($parameter_data) == 2){ + // $db_condition = "province = '".$parameter_data[0]."' and city = '".$parameter_data[1]."'"; + // }else if(count($parameter_data) == 3){ + // $db_condition = "province = ".$parameter_data[0]."' and city = '".$parameter_data[1]."' and area = '".$parameter_data[2]."'"; + // }else{ + // return $this->msg(10005); + // } + // 精准查询地市规则end + // 全省地市一个规则start + $db_condition = "province = '".$parameter_data[0]."'"; + // 全省地市一个规则end + $data = Db::table($this->card_db_name['guize'])->where($db_condition)->find(); + $data = json_decode($data['content'],true); + $result = $this->handle_default_rule_list_content($data,$gender); + return $this->msg($result); + } + + + +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Index.php b/application/NewReedaw/controller/app/Index.php index f700513..bb386f2 100644 --- a/application/NewReedaw/controller/app/Index.php +++ b/application/NewReedaw/controller/app/Index.php @@ -2,12 +2,13 @@ namespace app\NewReedaw\controller\app; -use think\Controller; + use think\Db; use think\Cache; use think\Log; use PHPMailer\PHPMailer\PHPMailer; use app\NewReedaw\controller\app\Role; +use app\app\controller\Language; class Index extends Base{ @@ -15,7 +16,67 @@ class Index extends Base{ 'zhanghao'=>'app_account_number', 'juese'=>'app_user_data', 'body_data'=>'app_card_body_data', - + 'banben'=>'app_version_log', + 'shangwuhezuo'=>'admin_business_cooperation', + 'diqu'=>'admin_estimate', + 'banner'=>'admin_notice_banner', + 'skip'=>'app_card_skip_data', + 'vitalcapacity'=>'app_card_vitalcapacity_data', + ]; + protected $request_result = [ + '2'=>['height'=>['身高','cm'],'weight'=>['体重','kg'],'age'=>['年龄','岁'],'bmi'=>['BMI',''],'head'=>['头围',''],'fat_w'=>['脂肪量','kg'],'fat_r'=>['脂肪率','%'],'muscleval'=>['肌肉量','kg'],'muscle'=>['肌肉率','%'],'proteinval'=>['蛋白量','kg'],'protein'=>['蛋白率','%'],'water'=>['水分',''],'bone'=>['骨重','kg'],'visceral'=>['内脏指数',''],'sfr'=>['皮下脂肪','%'],'kcal'=>['基础代谢','kcal'],'un_fat_w_weight'=>['去脂体重','kg'],'body_age'=>['体龄',''],'body_level'=>['肥胖等级',''],'body_type'=>['体型','']], + '6'=>['jump_num'=>['个数',''],'jump_time'=>['时长',''],'jump_kcal'=>['卡路里','kcal']], + '8'=>['one_val'=>['第一次','ml'],'two_val'=>['第二次','ml'],'three_val'=>['第三次','ml'],'average_val'=>['三次平均','ml'],'score'=>['最后成绩','分']] + ]; + protected $identity_list = ['P0'=>'陌生人','P1'=>'爸爸','P2'=>'妈妈','P3'=>'大宝','P4'=>'二宝','P5'=>'三宝','P6'=>'四宝','P7'=>'爷爷','P8'=>'奶奶']; + protected $grade_list = [ + ['id'=>'nothing','name'=>'无'], + ['id'=>'grade_s_1','name'=>'小学一年级'], + ['id'=>'grade_s_2','name'=>'小学二年级'], + ['id'=>'grade_s_3','name'=>'小学三年级'], + ['id'=>'grade_s_4','name'=>'小学四年级'], + ['id'=>'grade_s_5','name'=>'小学五年级'], + ['id'=>'grade_s_6','name'=>'小学六年级'], + ['id'=>'grade_m_1','name'=>'初中一年级'], + ['id'=>'grade_m_2','name'=>'初中二年级'], + ['id'=>'grade_m_3','name'=>'初中三年级'], + ['id'=>'grade_h_1','name'=>'高中一年级'], + ['id'=>'grade_h_2','name'=>'高中二年级'], + ['id'=>'grade_h_3','name'=>'高中三年级'], + ['id'=>'grade_u_12','name'=>'大学一、二年级'], + ['id'=>'grade_u_34','name'=>'大学三、四年级'] + ]; + protected $language_country = [ + 'en' => 'English', // 英语(通用)★ + 'zh-Hans' => '中文', // 中文(简体)★ + // 'es' => 'Español', // 西班牙语(西班牙)★ + // 'fr' => 'Français', // 法语(法国)★ + // 'pt' => 'Português', // 葡萄牙语(巴西)★ + // 'ar' => 'العربية', // 阿拉伯语(标准)★ + // 'ru' => 'Русский', // 俄语(俄罗斯)★ + // 'de' => 'Deutsch', // 德语(德国)★ + // 'ja' => '日本語', // 日语 + // 'ko' => '한국어', // 韩语 + // 'it' => 'Italiano', // 意大利语 + // 'nl' => 'Nederlands', // 荷兰语 + // 'hi' => 'हिन्दी', // 印地语 + // 'tr' => 'Türkçe', // 土耳其语 + // 'vi' => 'Tiếng Việt', // 越南语 + // 'th' => 'ไทย', // 泰语 + // 'pl' => 'Polski', // 波兰语 + // 'sv' => 'Svenska', // 瑞典语 + // 'fi' => 'Suomi', // 芬兰语 + // 'da' => 'Dansk', // 丹麦语 + // 'no' => 'Norsk', // 挪威语 + // 'he' => 'עברית', // 希伯来语 + // 'id' => 'Bahasa Indonesia', // 印尼语 + // 'ms' => 'Bahasa Melayu', // 马来语 + // 'cs' => 'Čeština', // 捷克语 + // 'hu' => 'Magyar', // 匈牙利语 + // 'el' => 'Ελληνικά', // 希腊语 + // 'ro' => 'Română', // 罗马尼亚语 + // 'sk' => 'Slovenčina', // 斯洛伐克语 + // 'uk' => 'Українська', // 乌克兰语 ]; // 加 bcadd(,,20) // 减 bcsub(,,20) @@ -30,16 +91,7 @@ class Index extends Base{ // 配置信息 public function config($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a']){ try { - // 你的业务逻辑 - if(count(input('post.')) > 0){ - $data = input('post.'); - } - if(!array_key_exists('token', $data)){ - return $this->msg(10001); - } - if(!$this->verify_data_is_ok($data['token'],'str')){ - return $this->msg(10005); - } + $data = input('post.'); return $this->config_action($data); } catch (\Exception $e) { // 捕获异常 @@ -55,20 +107,41 @@ class Index extends Base{ return $this->msg(99999); } } - // 获取首页角色信息 - public function get_user_data_information(){ + + // 身高预测 + public function genetic_height(){ try { $data = input('post.'); - if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ + if(!is_array($data)){ + return $this->msg(10005); + } + if(!array_key_exists('dadHeight', $data) || !array_key_exists('momHeight', $data) || !array_key_exists('birthday', $data) || !array_key_exists('sex', $data)){ return $this->msg(10001); } - if(!$this->verify_data_is_ok($data['token'],'str')){ - return $this->msg(10005,'token type error'); + unset($data['token']); + if(!$this->verify_data_is_ok($data['birthday'],'datetime')){ + return $this->msg(10005,'birthday type error'); } - if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ - return $this->msg(10005,'aud_id type error'); + if(!$this->verify_data_is_ok($data['dadHeight'],'num')){ + return $this->msg(10005,'dadHeight type error'); } - return $this->get_user_data_information_action($data); + if(!$this->verify_data_is_ok($data['momHeight'],'num')){ + return $this->msg(10005,'momHeight type error'); + } + if(!$this->verify_data_is_ok($data['sex'],'intnum')){ + return $this->msg(10005,'sex type error'); + } + + // 直接开始业务,请求外部接口start + $url = 'https://ybapi.pcxbc.com/api/child/predictheight'; + $temporary_parameter = [ + 'dadHeight'=>$data['dadHeight'], + 'momHeight'=>$data['momHeight'], + 'birthday'=>$data['birthday'], + 'sex'=>$data['sex'], + ]; + $request_result = $this->postRequest($url,$temporary_parameter,array('Content-Type:application/json','Origin:http://ybdevice.pcxbc.com')); + return json($request_result); } catch (\Exception $e) { // 捕获异常 $logContent["flie"] = $e->getFile(); @@ -84,6 +157,128 @@ class Index extends Base{ } } + // BMI测评 + public function bmi_evaluation(){ + try { + $cbe_data = input('post.'); + if(!is_array($cbe_data)){ + return $this->msg(10005); + } + if(!array_key_exists('height', $cbe_data) || !array_key_exists('weight', $cbe_data) || !array_key_exists('birthday', $cbe_data) || !array_key_exists('sex', $cbe_data)){ + return $this->msg(10001); + } + unset($cbe_data['token']); + if(!$this->verify_data_is_ok($cbe_data['birthday'],'datetime')){ + return $this->msg(10005,'birthday type error'); + } + if(!$this->verify_data_is_ok($cbe_data['height'],'num')){ + return $this->msg(10005,'height type error'); + } + if(!$this->verify_data_is_ok($cbe_data['weight'],'num')){ + return $this->msg(10005,'weight type error'); + } + if(!$this->verify_data_is_ok($cbe_data['sex'],'intnum')){ + return $this->msg(10005,'sex type error'); + } + + // 直接开始业务,请求外部接口start + $url = 'http://ybdevice.pcxbc.com/api/result/calcbmi'; + $temporary_parameter = [ + 'height'=>$cbe_data['height'], + 'weight'=>$cbe_data['weight'], + 'birthday'=>$cbe_data['birthday'], + 'sex'=>$cbe_data['sex'], + ]; + $request_result = $this->postRequest($url,$temporary_parameter,array('Content-Type:application/json','Origin:http://ybdevice.pcxbc.com')); + // 直接开始业务,请求外部接口end + + // 处理进度点 + $request_result =$this->bmi_evaluation_action($request_result); + return $request_result; + } 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($cbe_data, $logContent, null); + return $this->msg(99999); + } + } + + // 数据对比(包含身体、跳绳、肺活量) + public function all_data_contrast($data = ['before_id'=>'171','after_id'=>'174','type'=>'2','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + try { + $data = input('post.'); + if(!array_key_exists('before_id', $data) || !array_key_exists('after_id', $data) || !array_key_exists('type', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['before_id'],'intnum')){ + return $this->msg(10005); + } + if(!$this->verify_data_is_ok($data['after_id'],'intnum')){ + return $this->msg(10005); + } + if(!$this->verify_data_is_ok($data['type'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + if($data['type'] == '2'){ + return $this->get_body_data_contrast($data); + }else if($data['type'] == '6'){ + return $this->get_skip_data_contrast($data); + }else if($data['type'] == '8'){ + return $this->get_vitalcapacity_data_contrast($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 $this->msg(99999); + } + + } + + // // 获取首页角色信息 + // public function get_user_data_information(){ + // try { + // $data = input('post.'); + // if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ + // return $this->msg(10001); + // } + // if(!$this->verify_data_is_ok($data['token'],'str')){ + // return $this->msg(10005,'token type error'); + // } + // if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + // return $this->msg(10005,'aud_id type error'); + // } + // return $this->get_user_data_information_action($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 $this->msg(99999); + // } + // } + ################################################################action################################################################ ################################################################action################################################################ @@ -112,30 +307,498 @@ class Index extends Base{ ] ], 'king_kong_region'=>[ - ['title'=>'增量对比','icon'=>'','jump'=>''], - ['title'=>'中招估分','icon'=>'','jump'=>''], - ['title'=>'遗传身高','icon'=>'','jump'=>''], - ['title'=>'BMI测评','icon'=>'','jump'=>''], + ['title'=>'减值对比','icon'=>'https://tc.pcxbc.com/new_reedaw/icon/contrast.png','jump'=>'/pageTwo/compk/contrast'], + ['title'=>'中招估分','icon'=>'https://tc.pcxbc.com/new_reedaw/icon/report.png','jump'=>'/pageTwo/score/report'], + ['title'=>'遗传身高','icon'=>'https://tc.pcxbc.com/new_reedaw/icon/inheritHeighet.png','jump'=>'/pageTwo/home/inheritHeighet'], + ['title'=>'BMI测评','icon'=>'https://tc.pcxbc.com/new_reedaw/icon/bmi.png','jump'=>'/pageTwo/home/bmi'], ], - 'role_list'=>[ - ] + 'version_msg'=>[], + 'login_status'=>[], + 'business_cooperation_url'=>[], + 'area_list'=>[], + 'identity_list'=>[], + 'grade_list'=>[], + 'banner'=>[], + ]; - $role = new Role; - $return_data['role_list'] = $role->role_list_action(['token'=>$data['token'],'type'=>2])->getData()['data']; + + $temporary = $this->login_invalid_version($data); + $return_data['version_msg'] = $temporary[1]; + $return_data['login_status'] = $temporary[0]; + + $return_data['business_cooperation_url'] = Db::table($this->index_db_name['shangwuhezuo'])->where(['is_del'=>0])->field('title,data_url as url')->select(); + + $address_data = Db::table($this->index_db_name['diqu'])->where(['type' => '2'])->cache(86400)->field('id,content,city,area')->find(); + $return_data['area_list'] = json_decode($address_data['content'],true); + $return_data['identity_list'] = []; + foreach ($this->identity_list as $key => $value) { + array_push($return_data['identity_list'],['id'=>$key,'name'=>$value]); + } + $return_data['grade_list'] = $this->grade_list; + + $return_data['banner'] = Db::table($this->index_db_name['banner'])->where(['scene_data' => '3','is_del'=>0])->cache(3600)->order('sort_num desc')->field('id,type,pic,jump_url,parameter_data,sort_num')->select(); + + for ($i=0; $i < count($return_data['banner']); $i++) { + if($return_data['banner'][$i]['type'] != 1){ + $return_data['banner'][$i]['parameter_data'] = ''; + } + unset($return_data['banner'][$i]['sort_num']); + unset($return_data['banner'][$i]['ROW_NUMBER']); + } return $this->msg($return_data); } - public function get_user_data_information_action($data){ - $return_result = [ - 'body_data'=>[], - 'kcal_data'=>[], - 'card_data'=>[] - ]; - $aud_data = Db::table($this->index_db_name['juese'])->where(['id'=>$data['aud_id']])->find(); - - $body_data = Db::table($this->index_db_name['body_data'])->where(['id'=>$data['aud_id']])->find(); - + public function bmi_evaluation_action($data){ + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + if(!array_key_exists('code',$data) || !array_key_exists('data',$data)){ + return $this->msg(99999,'网络异常,请稍后重试1'); + } + if($data['code'] != 0){ + return $this->msg(99999,'网络异常,请稍后重试2'); + } + if(!is_array($data['data'])){ + return $this->msg(99999,'网络异常,请稍后重试3'); + } + if(!array_key_exists('bmi',$data['data']) || !array_key_exists('bmilevel',$data['data']) || !array_key_exists('bmilevelcolor',$data['data']) || !array_key_exists('bmilevellist',$data['data'])){ + return $this->msg(99999,'网络异常,请稍后重试4'); + } + if(!is_array($data['data']['bmilevellist'])){ + return $this->msg(99999,'网络异常,请稍后重试5'); + } + $num = 0; + $subsection_val = 0; + $temporary_subsection_val = null; + foreach ($data['data']['bmilevellist'] as $key => $value) { + if(!array_key_exists('maxvalue',$value) || !array_key_exists('minvalue',$value)){ + return $this->msg(99999,'网络异常,请稍后重试6'); + } + // 判断是否可以进行比较,规则是否正确 + if(is_numeric($value['maxvalue']) && is_numeric($value['minvalue'])){ + if($data['data']['bmi'] >= $value['minvalue'] && $data['data']['bmi'] < $value['maxvalue']){ + // 在落点内 + $subsection_val = bcsub($value['maxvalue'],$value['minvalue'],1);//获取最大最小值差 + $temporary_subsection_val = bcsub($data['data']['bmi'],$value['minvalue'],1);//获取当前值与最小值差 + $temporary_subsection_val = bcdiv($temporary_subsection_val,$subsection_val,1);//获取当前值与最小值差与最大最小值差之比 + $subsection_val = bcdiv(100,count($data['data']['bmilevellist']),1);//每段应该的百分比 + $temporary_subsection_val = bcmul($subsection_val,$temporary_subsection_val,1);//获取当前值与最小值差与最大最小值差之比与总段数之比 + $temporary_subsection_val = bcadd($temporary_subsection_val,bcmul($subsection_val,$num,1),1); + }else{ + $num = $num + 1; + } + } + } + if($temporary_subsection_val === null){ + if($data['data']['bmi'] >= $data['data']['bmilevellist'][count($data['data']['bmilevellist'])-1]['maxvalue']){ + $temporary_subsection_val = 100; + }else{ + return $this->msg(99999,'网络异常,请稍后重试7'); + } + } + $data['data']['offset'] = $temporary_subsection_val; + $data = $data['data']; + // 处理key名称一致start + foreach ($data['bmilevellist'] as $key => $value) { + $data['bmilevellist'][$key]['max_val'] = $value['maxvalue']; + $data['bmilevellist'][$key]['min_val'] = $value['minvalue']; + unset($data['bmilevellist'][$key]['minvalue']); + unset($data['bmilevellist'][$key]['maxvalue']); + } + // 处理key名称一致end + return $this->msg($data); } + // 数据对比(身体) + public function get_body_data_contrast($data){ + $data2 = [$data['before_id'],$data['after_id']]; + $data3 = implode(',',$data2); + $calculate_arr = []; + $result = Db::query(" + select + acbd.id, + acbd.height, + acbd.weight, + acbd.bmi, + acbd.fat_r, + acbd.fat_w, + acbd.muscle, + acbd.muscleval, + acbd.water, + acbd.proteinval, + acbd.bone, + acbd.protein, + acbd.kcal, + acbd.visceral, + acbd.sfr, + acbd.record_time, + acbd.record_type, + acbd.head_circumference, + REPLACE(CONVERT(varchar(10), acbd.record_time, 23), '-', '-') AS b_time, + aud.nickname, + aud.gender, + aud.birthday, + aud.head_pic + from ".$this->index_db_name['body_data']." as acbd + left join ".$this->index_db_name['juese']." as aud on acbd.aud_id=aud.id + where acbd.id in ($data3) + and acbd.is_del = 0 + "); + + if(!$result || count($result)<2){ + return $this->msg(10004); + } + // 调整顺序 + foreach ($result as $key => $value) { + if($value['id'] == $data2[0]){ + $calculate_arr['before'] = $value; + }else{ + $calculate_arr['after'] = $value; + } + } + + $return_data['time'] = $calculate_arr['before']['b_time'].'与'.$calculate_arr['after']['b_time']; + $return_data['headimg'] = $calculate_arr['before']['head_pic']; + $return_data['name'] = $calculate_arr['before']['nickname']; + $return_data['gender'] = $calculate_arr['before']['gender']; + $return_data['age'] = $this->calculate_age($calculate_arr['before']['birthday']); + $return_data['day'] = abs($this->daysSince($calculate_arr['before']['record_time'],$calculate_arr['after']['record_time'])); + $return_data['list'] = []; + // 处理如果没有阻抗的数据为0,显示异常start;同步处理,如果两个对比数据,都没有阻抗数据,则只显示基础信息 + if($calculate_arr['before']['record_type'] != 'by_device_adc' && $calculate_arr['after']['record_type'] != 'by_device_adc'){ + foreach ($calculate_arr['before'] as $key => $value) { + if(!in_array($key, ['height','weight','bmi','head_circumference'])){ + unset($calculate_arr['before'][$key]); + unset($calculate_arr['after'][$key]); + } + } + if($return_data['age']>=3){ + unset($calculate_arr['before']['head_circumference']); + unset($calculate_arr['after']['head_circumference']); + }else{ + $calculate_arr['before']['head_circumference'] = json_decode($calculate_arr['before']['head_circumference'],true); + $calculate_arr['after']['head_circumference'] = json_decode($calculate_arr['after']['head_circumference'],true); + foreach ($calculate_arr as $key => $value) { + if(array_key_exists('value',$value['head_circumference'])){ + $calculate_arr[$key]['head'][0] = $value['head_circumference']['value']; + }else{ + $calculate_arr[$key]['head'][0] = 0; + } + if(array_key_exists('level',$value['head_circumference'])){ + $calculate_arr[$key]['head'][1] = $value['head_circumference']['level']; + }else{ + $calculate_arr[$key]['head'][1] = '异常'; + } + if(array_key_exists('color',$value['head_circumference'])){ + $calculate_arr[$key]['head'][2] = $value['head_circumference']['color']; + }else{ + $calculate_arr[$key]['head'][2] = ''; + } + $calculate_arr[$key]['head'] = implode(',',$calculate_arr[$key]['head']); + unset($calculate_arr['before']['head_circumference']); + unset($calculate_arr['after']['head_circumference']); + } + } + }else{ + foreach ($calculate_arr as $key => $value) { + if($value['record_type'] != 'by_device_adc'){ + $calculate_arr[$key]['fat_r'] = "0,异常"; + $calculate_arr[$key]['fat_w'] = "0,异常"; + $calculate_arr[$key]['muscle'] = "0,异常"; + $calculate_arr[$key]['muscleval'] = "0,异常"; + $calculate_arr[$key]['water'] = "0,异常"; + $calculate_arr[$key]['proteinval'] = "0,异常"; + $calculate_arr[$key]['bone'] = "0,异常"; + $calculate_arr[$key]['protein'] = "0,异常"; + $calculate_arr[$key]['kcal'] = "0,异常"; + $calculate_arr[$key]['visceral'] = "0,异常"; + $calculate_arr[$key]['sfr'] = "0,异常"; + } + } + } + // 处理如果没有阻抗的数据为0,显示异常end;同步处理,如果两个对比数据,都没有阻抗数据,则只显示基础信息 + foreach ($calculate_arr['before'] as $key => $value) { + if(in_array($key, ['height','weight','bmi','head','fat_r','fat_w','muscle','muscleval','water','proteinval','bone','protein','kcal','visceral','sfr'])){ + $before_arr = explode(',', $value); + $after_arr = explode(',', $calculate_arr['after'][$key]); + array_push($return_data['list'], [ + 'firstresult'=>[ + 'color'=>'', + 'level'=>$before_arr[1], + 'value'=>$before_arr[0], + 'title'=>$this->request_result['2'][$key][0], + 'unit'=>$this->request_result['2'][$key][1], + 'name'=>$key, + ], + 'secondresult'=>[ + 'color'=>'', + 'level'=>$after_arr[1], + 'value'=>$after_arr[0], + 'title'=>$this->request_result['2'][$key][0], + 'unit'=>$this->request_result['2'][$key][1], + 'name'=>$key, + ], + 'diffval'=>bcsub($after_arr[0],$before_arr[0],2), + ]); + } + } + // 添加头围数据(如果需要的话)end + return $this->msg($return_data); + } + // 数据对比(跳绳) + public function get_skip_data_contrast($data){ + $data2 = [$data['before_id'],$data['after_id']]; + $data3 = implode(',',$data2); + $calculate_arr = []; + $result = Db::query(" + select + acsd.id, + acsd.jump_num, + acsd.jump_time, + acsd.jump_kcal, + acsd.record_time, + REPLACE(CONVERT(varchar(10), acsd.record_time, 23), '-', '-') AS b_time, + aud.nickname, + aud.gender, + aud.birthday, + aud.head_pic + from ".$this->index_db_name['skip']." as acsd + left join ".$this->index_db_name['juese']." as aud on acsd.aud_id=aud.id + where acsd.id in ($data3) + and acsd.is_del = 0 + "); + + if(!$result || count($result)<2){ + return $this->msg(10004); + } + // 调整顺序 + foreach ($result as $key => $value) { + if($value['id'] == $data2[0]){ + $calculate_arr['before'] = $value; + }else{ + $calculate_arr['after'] = $value; + } + } + $return_data['time'] = $calculate_arr['before']['b_time'].'-'.$calculate_arr['after']['b_time']; + $return_data['headimg'] = $calculate_arr['before']['head_pic']; + $return_data['name'] = $calculate_arr['before']['nickname']; + $return_data['gender'] = $calculate_arr['before']['gender']; + $return_data['age'] = $this->calculate_age($calculate_arr['before']['birthday']); + $return_data['day'] = abs($this->daysSince($calculate_arr['before']['record_time'],$calculate_arr['after']['record_time'])); + + $return_data['list'] = []; + foreach ($calculate_arr['before'] as $key => $value) { + if(in_array($key, ['jump_num','jump_time','jump_kcal'])){ + $before_arr = $value; + $after_arr = $calculate_arr['after'][$key]; + $temporary_arr = [ + 'firstresult'=>[ + 'color'=>'', + 'level'=>'', + 'value'=>$key=='jump_time'?implode(':',$this->handle_hour_branch_second($before_arr)):$before_arr, + 'title'=>$this->request_result['6'][$key][0], + 'unit'=>$this->request_result['6'][$key][1], + 'name'=>$key, + ], + 'secondresult'=>[ + 'color'=>'', + 'level'=>'', + 'value'=>$key=='jump_time'?implode(':',$this->handle_hour_branch_second($after_arr)):$after_arr, + 'title'=>$this->request_result['6'][$key][0], + 'unit'=>$this->request_result['6'][$key][1], + 'name'=>$key, + ], + 'diffval'=>bcsub($after_arr,$before_arr,2) + ]; + if($key=='jump_time'){ + $temporary_arr['diffval'] = $temporary_arr['diffval'] >= 0?implode(':',$this->handle_hour_branch_second($temporary_arr['diffval'])):'-'.implode(':',$this->handle_hour_branch_second($temporary_arr['diffval'])); + } + array_push($return_data['list'], $temporary_arr); + + } + + } + return $this->msg($return_data); + } + // 数据对比(肺活) + public function get_vitalcapacity_data_contrast($data){ + $data2 = [$data['before_id'],$data['after_id']]; + $data3 = implode(',',$data2); + $calculate_arr = []; + $result = Db::query(" + select + acsd.id, + acsd.one_val, + acsd.two_val, + acsd.three_val, + acsd.average_val, + acsd.score_val as score, + acsd.record_time, + REPLACE(CONVERT(varchar(10), acsd.record_time, 23), '-', '-') AS b_time, + aud.nickname, + aud.gender, + aud.birthday, + aud.head_pic + from ".$this->index_db_name['vitalcapacity']." as acsd + left join ".$this->index_db_name['juese']." as aud on acsd.aud_id=aud.id + where acsd.id in ($data3) + and acsd.is_del = 0 + "); + + if(!$result || count($result)<2){ + return $this->msg(10004); + } + // 调整顺序 + foreach ($result as $key => $value) { + if($value['id'] == $data2[0]){ + $calculate_arr['before'] = $value; + }else{ + $calculate_arr['after'] = $value; + } + } + $return_data['time'] = $calculate_arr['before']['b_time'].'-'.$calculate_arr['after']['b_time']; + $return_data['headimg'] = $calculate_arr['before']['head_pic']; + $return_data['name'] = $calculate_arr['before']['nickname']; + $return_data['gender'] = $calculate_arr['before']['gender']; + $return_data['age'] = $this->calculate_age($calculate_arr['before']['birthday']); + $return_data['day'] = abs($this->daysSince($calculate_arr['before']['record_time'],$calculate_arr['after']['record_time'])); + + $return_data['list'] = []; + foreach ($calculate_arr['before'] as $key => $value) { + if(in_array($key, ['one_val','two_val','three_val','average_val','score_val'])){ + $before_arr = $value; + $after_arr = $calculate_arr['after'][$key]; + $temporary_arr = [ + 'firstresult'=>[ + 'color'=>'', + 'level'=>'', + 'value'=>$before_arr, + 'title'=>$this->request_result['8'][$key][0], + 'unit'=>$this->request_result['8'][$key][1], + 'name'=>$key, + ], + 'secondresult'=>[ + 'color'=>'', + 'level'=>'', + 'value'=>$after_arr, + 'title'=>$this->request_result['8'][$key][0], + 'unit'=>$this->request_result['8'][$key][1], + 'name'=>$key, + ], + 'diffval'=>bcsub($after_arr,$before_arr,2) + ]; + array_push($return_data['list'], $temporary_arr); + + } + + } + return $this->msg($return_data); + } + + + ################################################################内部调用################################################################ + ################################################################内部调用################################################################ + // 检测版本及判断是否登录失效 + public function login_invalid_version($data){ + // 获取客户端IP + $ip = request()->ip(); + // 调用IP识别方法 + $region = $this->getIpInfo($ip); + // 解析地区信息 + $regionParts = explode('|', $region); + $country = $regionParts[0] ?? ''; + // 判断国家是否在支持的语言列表中 + $language = ''; + if ($country && $country !== '0') { + $languageMap = [ + '中国' => 'zh-Hans', + '美国' => 'en', + '英国' => 'en', + '西班牙' => 'es', + '法国' => 'fr', + '葡萄牙' => 'pt', + '阿拉伯联合酋长国' => 'ar', + '俄罗斯' => 'ru', + '德国' => 'de' + ]; + $language = $languageMap[$country] ?? ''; + } + // 检查语言是否在支持列表中 + $language_all = new Language(); + $isSupportedLanguage = array_key_exists($language, $language_all->getSupportedLanguages()); + + $result = Db::table($this->index_db_name['banben'])->order('is_del,id desc')->find(); + if($result){ + $version = $result['version_num_original']; + $url = $result['download_url']; + }else{ + $version = ''; + $url = ''; + } + if(!array_key_exists('token', $data)){ + return [['code'=>-1,'description'=>'已过期'],['version'=>$version,'url'=>$url,'language'=>'zh-Hans','language_arr'=>$this->process_Language()]]; + }else{ + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005); + } + $user_token_state = $this->token_time_validate($data['token']); + $language_data = $this->pd_language($user_token_state['language'],$isSupportedLanguage,$language); + if($user_token_state['state'] === false){ + return [['code'=>-1,'description'=>'已过期'],['version'=>$version,'url'=>$url,'language'=>$language_data,'language_arr'=>$this->process_Language()]]; + }else{ + return [['code'=>0,'description'=>'未过期'],['version'=>$version,'url'=>$url,'language'=>$language_data,'language_arr'=>$this->process_Language()]]; + } + } + } + // 添加IP信息获取方法 + protected function getIpInfo($ip) { + // 默认IP + $ip = $ip ?: request()->ip(); + try { + $ip2region = new \Ip2Region(); + $info = $ip2region->memorySearch($ip); + // 返回国家信息 + return $info['region'] ?: '未知'; + } catch (\Exception $e) { + return '未知'; + } + } + public function pd_language($user_language,$isSupportedLanguage,$language){ + if(!$user_language){ + if($isSupportedLanguage){ + $result = $language; + }else{ + $result = 'zh-Hans'; // 默认语言为中文 + } + }else{ + $result = $user_language; + } + return $result; + } + // 处理返回的语言数组 + protected function process_Language(){ + $temporary_arr = []; + foreach ($this->language_country as $key => $value) { + array_push($temporary_arr,['key'=>$key,'value'=>$value]); + } + return $temporary_arr; + } + + + + // public function get_user_data_information_action($data){ + // $return_result = [ + // 'body_data'=>[], + // 'kcal_data'=>[], + // 'card_data'=>[] + // ]; + // $aud_data = Db::table($this->index_db_name['juese'])->where(['id'=>$data['aud_id']])->find(); + + // $body_data = Db::table($this->index_db_name['body_data'])->where(['id'=>$data['aud_id']])->find(); + + + // } + } \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Language.php b/application/NewReedaw/controller/app/Language.php new file mode 100644 index 0000000..141bcac --- /dev/null +++ b/application/NewReedaw/controller/app/Language.php @@ -0,0 +1,211 @@ + 'English', + 'zh-Hans' => 'Chinese', + 'es' => 'Spanish', + 'fr' => 'French', + 'pt' => 'Portuguese', + 'ar' => 'Arabic', + 'ru' => 'Russian', + 'de' => 'German' + ]; + + // 语言映射表 + protected $languageMap = [ + 'en' => [ + '操作成功' => 'Success', + '体重' => 'Weight', + '身高' => 'Height', + '消瘦' => 'Slim', + '正常' => 'Normal', + '偏重' => 'Overweight', + '肥胖' => 'Obesity', + '反映和衡量一个人健康状况的重要标志之一' => "One of the important indicators reflecting and measuring a person's health status", + '人体纵向部分的长度,源于人体的纵向生长,受遗传因素的影响较大' => "The length of the longitudinal part of the human body is derived from its longitudinal growth and is greatly influenced by genetic factors", + 'BMI是身体质量指数,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。' => "BMI is the body mass index, which is currently a commonly used international standard for measuring the degree of body fat, thinness, and health.", + '公斤' => "kg", + 'CM' => "cm", + '年' => "-", + '月' => "-", + '日' => "", + '身体得分' => "Physical score", + '分' => "score", + '身体类型' => "body type", + '健美肌肉型' => "Bodybuilding muscle type", + '低' => "Low", + '偏低' => "Slightly low", + '标准' => "Standard", + '偏高' => "Slightly high", + '高' => "High", + '矮' => "Short", + '偏矮' => "Slightly short", + '脂肪率' => "Body Fat Percentage", + '体脂率是指身体成分中,脂肪组织所占的比率。测量体脂率比单纯的只测量体重更能反映我们身体的脂肪水平(肥胖程度)。' => "Body fat percentage refers to the proportion of fat tissue in body composition. Measuring it provides a more accurate reflection of body fat levels (degree of obesity) than weight measurement alone.", + '脂肪量' => "Fat Mass", + '人体脂肪的重量' => "Body Fat Weight", + '肌肉率' => "Muscle Percentage", + '优' => "Excellent", + '根据人体肌肉总量和人体体重、身高等相结合得到的人体的一个比例值,这个值的范围决定一个人的身体健康状况以及力量的多少。' => "Muscle percentage is a ratio derived from total muscle mass, body weight, height, etc. Its range determines a person's health status and strength level.", + '肌肉量' => "Muscle Mass", + '不足' => "Insufficient", + '肌肉量=实际体重*肌肉率' => "Muscle Mass = Actual Weight × Muscle Percentage", + '水分' => "Body Water", + '指人体内水分比例。' => "Refers to the proportion of water in the human body.", + '蛋白量' => "Protein Mass", + '蛋白量=实际体重*蛋白率' => "Protein Mass = Actual Weight × Protein Percentage", + '骨重' => "Bone Mass", + '单位体积内,骨组织、骨矿物质(钙、磷等)和骨基质(骨胶原、蛋白率、无机盐等等)含量,骨量代表它们骨骼健康的情况。' => "Bone mass refers to the content of bone tissue, minerals (calcium, phosphorus, etc.), and bone matrix (collagen, proteins, inorganic salts, etc.) per unit volume, reflecting skeletal health.", + '蛋白率' => "Protein Percentage", + '人体内蛋白率含量。' => "The proportion of protein in the human body.", + '基础代谢' => "Basal Metabolic Rate (BMR)", + '指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率' => "The energy expenditure rate when the body is awake, completely at rest, and unaffected by muscle activity, ambient temperature, food intake, or mental stress.", + '内脏指数' => "Visceral Fat Index", + '警惕' => "Caution", + '危险' => "Danger", + '内脏脂肪指数' => "Visceral Fat Level", + '皮下脂肪' => "Subcutaneous Fat", + '皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织' => "Subcutaneous fat refers to adipose tissue stored under the skin. About two-thirds of body fat is stored subcutaneously.", + '肥胖等级' => "Obesity Level", + '体重不足' => "Underweight", + '肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。' => "Obesity level indicates the disparity between actual and ideal weight, serving as a diagnostic criterion for obesity.", + '孩子可能存在营养不良:对于处在生长发育期的孩子而言,蛋白质、碳水化合物、维生素和矿物质这四类营养素非常重要。建议补充足够的蛋白质、锌、钙、铁、维生素D、赖氨酸等营养。建议补充含鸡内金山楂膏健脾开胃类药食同源食物。' => "The child may be malnourished: For growing children, protein, carbohydrates, vitamins, and minerals are critical. Ensure adequate intake of protein, zinc, calcium, iron, vitamin D, lysine, etc. Consider herbal foods like chicken gizzard-hawthorn paste to improve digestion and appetite.", + '孩子可能存在营养不良:对于处在生长发育期的孩子而言,最有利于长高的营养素是蛋白质、碳水化合物、维生素和矿物质四类。建议补充足够的蛋白质、锌、铁、钙、维生素D、赖氨酸等营养。' => "The child may be malnourished: For children in their growth and development stage, the most beneficial nutrients for height growth are proteins, carbohydrates, vitamins, and minerals. It is recommended to ensure adequate intake of nutrients such as protein, zinc, iron, calcium, vitamin D, and lysine.", + '坚持适当、科学的跳跃运动能够科学地增加学生体重,能够改善学 生体重过低的情况;同时运动会消耗能量并加速胃肠蠕动,这会使孩子的食欲大开,再配合均衡的营养有利于孩子增重。' => "Moderate, scientifically designed jumping exercises can help underweight students gain weight by boosting energy expenditure and gastrointestinal motility, thereby increasing appetite. Combined with balanced nutrition, this supports healthy weight gain.", + '3-7岁的孩子:骑两轮车、拍踢球、打篮球、游泳、爬山,每天高强度运动不超过30分钟。' => "Ages 3–7: Bicycling, ball games, basketball, swimming, hiking. Limit high-intensity exercise to 30 minutes daily.", + '该年龄段睡眠时间建议:9-11小时' => "Recommended sleep duration for this age group: 9–11 hours.", + '孩子开始对于赞赏、鼓励、认同和肯定有需求,而且此阶段父亲在孩子的性格塑造、情绪控制以及责任感培养方面扮演着重要的角色,必须告诉孩子什么事应该做、什么事不应该做,并经常性地给孩子一些积极地暗示。例如,可以时常向孩子表达“我会一直在你身边,不要害怕””我对你的进步都看在眼里等类似的话语。' => "Children begin to crave praise, encouragement, and validation. Fathers play a key role in shaping character, emotional regulation, and responsibility during this phase. Clearly define boundaries while offering positive affirmations (e.g., 'I’m always here for you,' 'I see your progress').", + '《中华人民共和国卫生行业标准WS 423-2013》' => "《Chinese Health Industry Standard WS 423-2013》", + '《中华人民共和国卫生行业标准WS/T 612-2018》' => "《Chinese Health Industry Standard WS/T 612-2018》", + '《中华人民共和国卫生行业标准WS/T1586-2018》' => "《Chinese Health Industry Standard WS/T 1586-2018》", + '《WHO 5~19岁身高/体重判定标准》' => "《WHO Growth Reference for Children and Adolescents (5–19 Years)》", + '头围' => "Head Circumference", + '头围是指绕头部一周的最大长度,头围的大小与脑的发育密切相关' => "Head circumference refers to the maximum length around the head. Its measurement is closely related to brain development.", + + ], + // 可以添加更多语言映射 + ]; + + /** + * 处理多国语言翻译 + * + * @param string $language 目标语言代码 + * @param mixed $data 要翻译的数据(字符串或数组) + * @return mixed 翻译后的数据 + */ + public function handling_languages_from_multiple_countries($language, $data) + { + + // dump($data); + // 验证语言是否支持 + if (!$this->isLanguageSupported($language)) { + return $this->msg($data['data']); + } + + // 如果是数组,递归处理每个元素 + if (is_array($data)) { + // dump(2); + $data = $this->translateArray($language, $data); + return $this->msg($data['data']); + } + + // 如果是字符串,直接翻译 + if (is_string($data)) { + // dump(3); + return $this->translateString($language, $data); + } + + // dump($data); + // 其他类型直接返回 + return $this->msg($data['data']); + } + + /** + * 检查语言是否支持 + * + * @param string $language 语言代码 + * @return bool + */ + protected function isLanguageSupported($language) + { + return isset($this->supportedLanguages[$language]); + } + + /** + * 翻译数组 + * + * @param string $language 目标语言 + * @param array $array 要翻译的数组 + * @return array 翻译后的数组 + */ + protected function translateArray($language, array $array) + { + $result = []; + foreach ($array as $key => $value) { + // 保持键不变,只翻译值 + $result[$key] = is_array($value) + ? $this->translateArray($language, $value) + : $this->translateString($language, $value); + } + return $result; + } + + /** + * 翻译字符串 + * + * @param string $language 目标语言 + * @param string $string 要翻译的字符串 + * @return string 翻译后的字符串 + */ + protected function translateString($language, $string) + { + // dump($string); + // 检查是否有该语言的映射表 + if (!isset($this->languageMap[$language])) { + return $string; + } + + // 检查是否有对应的翻译 + return $this->languageMap[$language][$string] ?? $string; + } + + /** + * 获取支持的语言列表 + * + * @return array + */ + public function getSupportedLanguages() + { + return $this->supportedLanguages; + } + + /** + * 添加新的语言翻译 + * + * @param string $language 语言代码 + * @param array $translations 翻译映射数组 + * @return bool + */ + public function addTranslations($language, array $translations) + { + if (!$this->isLanguageSupported($language)) { + return false; + } + + if (!isset($this->languageMap[$language])) { + $this->languageMap[$language] = []; + } + + $this->languageMap[$language] = array_merge( + $this->languageMap[$language], + $translations + ); + + return true; + } +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Role.php b/application/NewReedaw/controller/app/Role.php index 57919df..3c2fd5d 100644 --- a/application/NewReedaw/controller/app/Role.php +++ b/application/NewReedaw/controller/app/Role.php @@ -112,7 +112,7 @@ class Role extends Base{ try { // 你的业务逻辑 $data = input('post.'); - if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('nickname', $data) || !array_key_exists('birthday', $data) || !array_key_exists('gender', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('measure_model', $data)){ + if(!array_key_exists('token', $data) || !array_key_exists('id', $data) || !array_key_exists('nickname', $data) || !array_key_exists('birthday', $data) || !array_key_exists('gender', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('measure_model', $data)){ return $this->msg(10001); } if($data['measure_model'] != '1' && $data['measure_model'] != '2'){ @@ -121,8 +121,8 @@ class Role extends Base{ if(!$this->verify_data_is_ok($data['token'],'str')){ return $this->msg(10005,'token type error'); } - if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ - return $this->msg(10005,'aud_id type error'); + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005,'id type error'); } if(!$this->verify_data_is_ok($data['birthday'],'datetime')){ return $this->msg(10005,'birthday type error'); @@ -151,7 +151,7 @@ class Role extends Base{ return $this->msg(99999); } } - // 添加角色 + // 获取角色列表 public function role_list(){ try { // 你的业务逻辑 @@ -273,7 +273,7 @@ class Role extends Base{ $parameter['card_order'] = $address_data['recommend_cards']; } - $return_result = Db::table($this->role_db_name['juese'])->where(['id'=>$data['aud_id']])->update($parameter); + $return_result = Db::table($this->role_db_name['juese'])->where(['id'=>$data['id']])->update($parameter); if($return_result){ return $this->msg([]); }else{ diff --git a/application/NewReedaw/controller/app/Skip.php b/application/NewReedaw/controller/app/Skip.php new file mode 100644 index 0000000..90d39c2 --- /dev/null +++ b/application/NewReedaw/controller/app/Skip.php @@ -0,0 +1,582 @@ +'app_account_number', + 'juese'=>'app_user_data', + 'body'=>'app_card_body_data', + 'skip'=>'app_card_skip_data', + + ]; + protected $curve_data_format = ['jump_num'=>['跳绳个数','个','#009DFF'],'jump_time'=>['跳绳时长','分钟','#009DFF'],'jump_kcal'=>['消耗卡路里','kcal','#009DFF']]; + // protected $skip_use_db_name = [ + // '1'=>'app_card_skip_data', + // '2'=>'app_user_data', + // '3'=>'app_card_body_data', + // ]; + protected $pagesize = 15; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 测试token=>'caadd1be045a65f30b92aa805f1de54a' + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 手动记录 + public function manual_record(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('r_time', $data) || !array_key_exists('num', $data) || !array_key_exists('time_m', $data) || !array_key_exists('time_s', $data) || !array_key_exists('type', $data) || !array_key_exists('token', $data)){ + $return_data = $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['r_time'],'datetime')){ + return $this->msg(10005,'r_time type error'); + } + if(!$this->verify_data_is_ok($data['type'],'str')){ + return $this->msg(10005,'type type error'); + } + if(!$this->verify_data_is_ok($data['num'],'intnum') || !$this->verify_data_is_ok($data['time_m'],'intnum') || !$this->verify_data_is_ok($data['time_s'],'intnum')){ + return $this->msg(10005,'跳绳数量或者分钟、秒钟值必须为整数'); + } + if($data['num'] <= 0){ + return $this->msg(10005,'跳绳数不能小于等于0'); + } + if(abs($data['time_s']) >= 60){ + return $this->msg(10005,'秒钟值不能大于60'); + } + unset($data['token']); + if($this->validate_user_identity($data['aud_id']) === false){ + return $this->msg(10003); + } + return $this->manual_record_action($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 $this->msg(99999); + } + + } + // 设备记录 + public function device_record(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('kcal', $data) || !array_key_exists('num', $data) || !array_key_exists('time_m', $data) || !array_key_exists('time_s', $data) || !array_key_exists('type', $data) || !array_key_exists('token', $data)){ + $return_data = $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005); + } + if(!$this->verify_data_is_ok($data['kcal'],'num')){ + return $this->msg(10005); + } + if(!$this->verify_data_is_ok($data['type'],'str')){ + return $this->msg(10005); + } + if(!$this->isValidInteger($data['num']+0) || !$this->isValidInteger($data['time_m']+0) || !$this->isValidInteger($data['time_s']+0)){ + $return_data = $this->msg(10005,'跳绳数量或者分钟、秒钟值必须为整数'); + } + if($data['num'] <= 0){ + $return_data = $this->msg(10005,'跳绳数不能小于等于0'); + } + if(abs($data['time_s']) >= 60){ + $return_data = $this->msg(10005,'秒钟值不能大于60'); + } + unset($data['token']); + if($this->validate_user_identity($data['aud_id']) === false){ + $return_data = $this->msg(10003); + } + $return_data = $this->manual_record_action($data); + + // 成功 + $this->record_api_log($data, null, $return_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 $this->msg(99999); + } + } + // 数据报告 + public function data_report(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + return $this->data_report_action($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 $this->msg(99999); + } + } + // 曲线 + public function curve_chart(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + return $this->curve_chart_action($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 $this->msg(99999); + } + } + // 获取历史列表(分页) + public function record_list_page(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('page', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['page'],'intnum')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'page'); + } 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 $this->msg(99999); + } + } + // 获取历史列表(分组) + public function record_list_group(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['s_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + if(!$this->verify_data_is_ok($data['e_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'group'); + } 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 $this->msg(99999); + } + } + // 历史记录(详细) + public function detailed_record(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('id', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005,'id type error'); + } + return $this->get_all_detaile_data_action($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 $this->msg(99999); + } + } + // 删除历史数据 + public function del_record(){ + try { + $data = input('post.'); + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + $user_data = Db::table($this->skip_db_name['skip'])->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($user_data){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } 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 $this->msg(99999); + } + } + + ################################################################action################################################################ + ################################################################action################################################################ + public function manual_record_action($data){ + // 分秒转换为秒 + $data['time'] = abs($data['time_m'])*60+abs($data['time_s']); + $user_msg_content = Db::table($this->skip_db_name['juese'])->where(['id'=>$data['aud_id']])->count(); + if($user_msg_content<=0){ + return $this->msg(10004); + } + if(!array_key_exists('kcal', $data)){ + $last_data_body = Db::table($this->skip_db_name['body'])->where(['aud_id'=>$data['aud_id'],'is_del'=>0])->order('record_time desc,id desc')->field('id,weight_val,record_time')->find(); + if(!$last_data_body){ + $last_data_body = Db::table($this->skip_db_name['juese'])->where(['id'=>$data['aud_id']])->field('id,weight as weight_val')->find(); + if(!$last_data_body){ + return $this->msg(10004); + } + } + $kcal_data = $this->skip_kcal_calculate($data['num'],$data['time'],$last_data_body['weight_val']); + }else{ + // 将时间从秒转换为分钟 + $minutes = bcdiv($data['time'],60,20); + // 计算每分钟的跳绳次数 + $jumpsPerMinute = bcdiv($data['num'],$minutes,2); + $kcal_data['totalCalories'] = $data['kcal']; + $kcal_data['averageAchievement'] = $jumpsPerMinute; + $kcal_data['caloriesPerMinute'] = bcdiv($kcal_data['totalCalories'],$minutes,2); + } + + + $data_set = [ + 'create_time'=>date('Y-m-d H:i:s'), + 'last_update_time'=>date('Y-m-d H:i:s'), + 'jump_num'=>$data['num'], + + 'jump_time'=>$data['time'], + 'jump_kcal'=>$kcal_data['totalCalories'], + 'average_num'=>$kcal_data['averageAchievement'], + 'average_kcal'=>$kcal_data['caloriesPerMinute'], + 'aud_id'=>$data['aud_id'], + 'record_time'=>array_key_exists('r_time', $data)?$data['r_time']:date('Y-m-d H:i:s'), + 'jump_type'=>$data['type'] + ]; + if(strlen($data_set['record_time']) <= 12){ + $data_set['record_time'] = $this->addCurrentTimeToDateString($data_set['record_time']); + } + $last_data_body = Db::table($this->skip_db_name['skip'])->insert($data_set); + $result = [ + 'today_jump_num'=>0, + 'today_jump_time'=>0, + 'today_jump_kcal'=>0, + ]; + $all_data = Db::table($this->skip_db_name['skip'])->where(['aud_id'=>$data['aud_id']])->whereTime('record_time','today')->field('jump_num,jump_time,jump_kcal')->select(); + foreach ($all_data as $key => $value) { + $result['today_jump_num'] = $result['today_jump_num']+$value['jump_num']; + $result['today_jump_time'] = $result['today_jump_time']+$value['jump_time']; + $result['today_jump_kcal'] = bcadd($result['today_jump_kcal'],$value['jump_kcal'],2); + } + $result['last_jump_num'] = $data['num']; + $result['last_jump_time'] = $data['time']; + $result['last_jump_kcal'] = $data_set['jump_kcal']; + // $result['last_record_time'] = str_replace('-', '/', $data_set['record_time']); + $result['last_record_time'] = $data_set['record_time']; + $time_conversion = $this->handle_hour_branch_second($result['today_jump_time']); + $result['today_jump_time'] = $time_conversion['h'].':'.$time_conversion['m'].':'.$time_conversion['s']; + $time_conversion = $this->handle_hour_branch_second($result['last_jump_time']); + $result['last_jump_time'] = $time_conversion['h'].':'.$time_conversion['m'].':'.$time_conversion['s']; + return $this->msg($result); + } + public function data_report_action($data){ + $all_data = Db::table($this->skip_db_name['skip'])->where(['aud_id'=>$data['aud_id']])->whereTime('record_time','today')->field('jump_num,jump_time,jump_kcal')->select(); + $last_data = Db::table($this->skip_db_name['skip'])->where(['aud_id'=>$data['aud_id']])->order('record_time desc,id desc')->field('id,jump_num,jump_time,jump_kcal,record_time')->find(); + $result = [ + 'today_jump_num'=>0, + 'today_jump_time'=>0, + 'today_jump_kcal'=>0, + ]; + foreach ($all_data as $key => $value) { + $result['today_jump_num'] = $result['today_jump_num']+$value['jump_num']; + $result['today_jump_time'] = $result['today_jump_time']+$value['jump_time']; + $result['today_jump_kcal'] = bcadd($result['today_jump_kcal'],$value['jump_kcal'],2); + } + if($last_data){ + $result['last_jump_num'] = $last_data['jump_num']; + $result['last_jump_time'] = $last_data['jump_time']; + $result['last_jump_kcal'] = $last_data['jump_kcal']; + $result['last_record_time'] = $last_data['record_time']; + }else{ + $result['last_jump_num'] = 0; + $result['last_jump_time'] = 0; + $result['last_jump_kcal'] = 0; + $result['last_record_time'] = ''; + } + $time_conversion = $this->handle_hour_branch_second($result['today_jump_time']); + $result['today_jump_time'] = $time_conversion['h'].':'.$time_conversion['m'].':'.$time_conversion['s']; + $time_conversion = $this->handle_hour_branch_second($result['last_jump_time']); + $result['last_jump_time'] = $time_conversion['h'].':'.$time_conversion['m'].':'.$time_conversion['s']; + return $this->msg($result); + } + public function curve_chart_action($data){ + $audid = $data['aud_id']; + $timeData = explode('-', $data['time']); + // 根据$timeData的长度构建不同的查询条件 + $map = ['aud_id' => $audid,'is_del'=>0]; + switch (count($timeData)) { + case 3: // 年月日 + $map['record_time'] = ['between', [date('Y-m-d 00:00:00', strtotime($timeData[0] . '-' . $timeData[1] . '-' . $timeData[2])), date('Y-m-d 23:59:59', strtotime($timeData[0] . '-' . $timeData[1] . '-' . $timeData[2]))]]; + break; + case 2: // 年月 + $map['record_time'] = ['between', [date('Y-m-01 00:00:00', strtotime($timeData[0] . '-' . $timeData[1])), date('Y-m-t 23:59:59', strtotime($timeData[0] . '-' . $timeData[1]))]]; + break; + case 1: // 年 + $map['record_time'] = ['between', [date('Y-01-01 00:00:00', strtotime($timeData[0])), date('Y-12-31 23:59:59', strtotime($timeData[0]))]]; + break; + default: + return $this->msg(10005); // 无效的时间数据格式 + } + + // 使用查询构造器进行查询 + $result = Db::name($this->skip_db_name['skip'])->where($map)->field('jump_num,jump_time,jump_kcal,aud_id,record_time,jump_type,DATEPART(hour, record_time) AS hour,DATEPART(minute, record_time) AS minute,DATEPART(day, record_time) AS day,DATEPART(month, record_time) AS month')->order('record_time')->select(); + $return_data = []; + if(count($timeData) == 3){ + $key_condition = 'hour'; + }else if(count($timeData) == 2){ + $key_condition = 'day'; + }else if(count($timeData) == 1){ + $key_condition = 'month'; + } + foreach ($this->curve_data_format as $key => $value) { + $temporary_arr['title'] = $value[0].'('.$value[1].')'; + $temporary_arr['key'] = $key; + $temporary_arr['line']['categories'] = []; + $temporary_arr['line']['series'][0]['color'] = $value[2]; + $temporary_arr['line']['series'][0]['name'] = $value[0].'('.$value[1].')'; + $temporary_arr['line']['series'][0]['data'] = []; + foreach ($result as $k => $v) { + if($key_condition == 'hour'){ + // 每一次的记录都添加进去 + array_push($temporary_arr['line']['categories'],$result[$k]['hour'].':'.$result[$k]['minute']); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + }else if($key_condition == 'day'){ + // 根据天分组 + if(in_array($result[$k]['month'].'/'.$result[$k][$key_condition],$temporary_arr['line']['categories'])){ + $num = array_search($result[$k]['month'].'/'.$result[$k][$key_condition], $temporary_arr['line']['categories']); + $temporary_arr['line']['series'][0]['data'][$num] = bcadd($temporary_arr['line']['series'][0]['data'][$num],$result[$k][$key],2); + }else{ + array_push($temporary_arr['line']['categories'],$result[$k]['month'].'/'.$result[$k][$key_condition]); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + } + + }else{ + // 根据年分组 + if(in_array($result[$k]['month'].'月',$temporary_arr['line']['categories'])){ + $num = array_search($result[$k]['month'].'月', $temporary_arr['line']['categories']); + $temporary_arr['line']['series'][0]['data'][$num] = bcadd($temporary_arr['line']['series'][0]['data'][$num],$result[$k][$key],2); + }else{ + array_push($temporary_arr['line']['categories'],$result[$k]['month'].'月'); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + } + } + } + array_push($return_data,$temporary_arr); + } + foreach ($return_data[1]['line']['series'][0]['data'] as $key => $value) { + $return_data[1]['line']['series'][0]['data'][$key] = bcdiv($return_data[1]['line']['series'][0]['data'][$key],60,2); + } + return $this->msg($return_data); + } + public function record_list_page_or_group_action($data,$type){ + $return_result = []; + + if($type == 'group'){ + $data['s_time'] = $data['s_time'].' 00:00:00'; + $data['e_time'] = $data['e_time'].' 23:59:59'; + $result = Db::query(" + select + id, + CONVERT(varchar(10), record_time, 120) AS r_t, + CONVERT(varchar(19), record_time, 120) AS record_time, + jump_num as v1, + jump_time as v2, + jump_kcal as v3 + from ".$this->skip_db_name['skip']." + where aud_id='".$data['aud_id']."' + and record_time between '".$data['s_time']."' and '".$data['e_time']."' + and is_del = 0 + order by record_time desc"); + foreach ($result as $key => $value) { + $time_t = $this->handle_hour_branch_second($value['v2']); + array_push($return_result, [ + 'id'=>$value['id'], + 'v1'=>$value['v1'], + 'v2'=>$time_t['h'].':'.$time_t['m'].':'.$time_t['s'], + 'v3'=>$value['v3'], + 'v1_name'=>'个数', + 'v2_name'=>'时长', + 'v3_name'=>'卡路里', + // 'r_t'=>str_replace('-', '/', $value['r_t']) + 'r_t'=>$value['r_t'] + ]); + } + }else{ + $result = Db::table($this->skip_db_name['skip'])->where(['aud_id'=>$data['aud_id'],'is_del'=>0])->field("id,record_time,REPLACE(record_time, '-', '-') AS b_time,jump_num,jump_time,jump_kcal")->order('record_time desc')->page($data['page'],$this->pagesize)->select(); + $return_result['totalrows'] = Db::table($this->skip_db_name['skip'])->where(['aud_id'=>$data['aud_id']])->count(); + $return_result['rows'] = []; + $return_result['pageno'] = $data['page']; + $return_result['pagesize'] = $this->pagesize; + $return_result['totalpage'] = ceil($return_result['totalrows']/$this->pagesize); + foreach ($result as $key => $value) { + $time_t = $this->handle_hour_branch_second($value['jump_time']); + array_push($return_result['rows'],[ + 'id'=>$value['id'], + 'v1'=>$value['jump_num'], + 'v2'=>$time_t['h'].':'.$time_t['m'].':'.$time_t['s'], + 'v3'=>$value['jump_kcal'], + 'v1_name'=>'个数', + 'v2_name'=>'时长', + 'v3_name'=>'卡路里', + 'record_time'=>$value['b_time'], + ]); + } + } + return $this->msg($return_result); + } + public function get_all_detaile_data_action($data){ + + $result = $result = Db::table($this->skip_db_name['skip'])->where(['id'=>$data['id'],'is_del'=>0])->find(); + $for_data_arr = ['jump_num'=>['个数',''],'jump_time'=>['时长',''],'jump_kcal'=>['卡路里','kcal']]; + if($result){ + $result_data = []; + foreach ($for_data_arr as $key => $value) { + $temporary_arr['key_name'] = $key; + $temporary_arr['name'] = $value[0]; + $temporary_arr['value'] = explode(',',$result[$key])[0]; + $temporary_arr['unit'] = $value[1]; + array_push($result_data,$temporary_arr); + } + return $this->msg($result_data); + }else{ + return $this->msg(10002); + } + + } + + ################################################################内部调用################################################################ + ################################################################内部调用################################################################ + // 跳绳卡路里计算 + public function skip_kcal_calculate($num=143, $time=222, $weight=70) { + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 将时间从秒转换为分钟 + $minutes = bcdiv($time,60,20); + // 计算每分钟的跳绳次数 + $jumpsPerMinute = bcdiv($num,$minutes,2); + // 根据跳绳次数确定MET值 + // $met = 11.8; + if ($jumpsPerMinute < 100) { + $met = 8.8; + } else if ($jumpsPerMinute >= 100 && $jumpsPerMinute < 120) { + $met = 11.8; + } else { + $met = 12.3; + } + // 计算每分钟燃烧的卡路里 + $caloriesPerMinute = bcdiv(bcmul(bcmul($met,$weight,20),3.5,20),200,2); + // 计算总卡路里消耗 + $totalCalories = bcmul($caloriesPerMinute,$minutes,2); + // 返回结果 + return [ + 'averageAchievement' => $jumpsPerMinute, + 'caloriesPerMinute' => $caloriesPerMinute, + 'totalCalories' => $totalCalories + ]; + } + + +} \ No newline at end of file diff --git a/application/NewReedaw/controller/app/Vitalcapacity.php b/application/NewReedaw/controller/app/Vitalcapacity.php new file mode 100644 index 0000000..ff600f6 --- /dev/null +++ b/application/NewReedaw/controller/app/Vitalcapacity.php @@ -0,0 +1,639 @@ +'app_account_number', + 'juese'=>'app_user_data', + 'vitalcapacity'=>'app_card_vitalcapacity_data', + 'biaozhun'=>'pc_vitalcapacity_standard', + + ]; + protected $color = ['无效'=>'#FF5656','不及格'=>'#FF5656','及格'=>'#FFAB00','良好'=>'#5AD06D','优秀'=>'#6492F6','牛逼'=>'#3967D6']; + protected $curve_data_format = ['one_val'=>['第一次','容积/ml','#009DFF'],'two_val'=>['第二次','容积/ml','#009DFF'],'three_val'=>['第三次','容积/ml','#009DFF'],'average_val'=>['平均','容积/ml','#009DFF']]; + protected $pagesize = 15; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 测试token=>'caadd1be045a65f30b92aa805f1de54a' + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 手动记录 + public function manual_record(){ + try { + + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('one', $data) || !array_key_exists('two', $data) || !array_key_exists('three', $data) || !array_key_exists('time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + unset($data['token']); + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['one'],'intnum')){ + return $this->msg(10005,'one type error'); + } + if(!$this->verify_data_is_ok($data['two'],'intnum')){ + return $this->msg(10005,'two type error'); + } + if(!$this->verify_data_is_ok($data['three'],'intnum')){ + return $this->msg(10005,'three type error'); + } + if(!$this->verify_data_is_ok($data['time'],'datetime')){ + return $this->msg(10005,'time type error'); + } + if(strlen($data['time']) <= 12){ + // 时间日期转换,把'Y-m-d'转换成'Y-m-d H:i:s'格式 + $data['time'] = $this->addCurrentTimeToDateString($data['time']); + } + return $this->manual_record_action($data,'by_hand_means'); + } 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 $this->msg(99999); + } + } + // 设备记录 + public function device_record(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('one', $data) || !array_key_exists('two', $data) || !array_key_exists('three', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + unset($data['token']); + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['one'],'intnum')){ + return $this->msg(10005,'one type error'); + } + if(!$this->verify_data_is_ok($data['two'],'intnum')){ + return $this->msg(10005,'two type error'); + } + if(!$this->verify_data_is_ok($data['three'],'intnum')){ + return $this->msg(10005,'three type error'); + } + $data['time'] = date('Y-m-d H:i:s'); + return $this->manual_record_action($data,'by_device'); + } 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 $this->msg(99999); + } + } + // 数据报告 + public function data_report(){ + try { + $data = input('post.'); + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + $return_data = $this->msg(10001); + } + unset($data['token']); + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + return $this->data_report_action($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 $this->msg(99999); + } + } + // 曲线 + public function curve_chart(){ + try { + // 你的业务逻辑 + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('token', $data)){ + $return_data = $this->msg(10001); + } + unset($data['token']); + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['time'],'datetime')){ + return $this->msg(10005,'time type error'); + } + return $this->curve_chart_action($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 $this->msg(99999); + } + } + // 获取历史列表(分页) + public function record_list_page(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('page', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['page'],'intnum')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'page'); + } 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 $this->msg(99999); + } + } + // 获取历史列表(分组) + public function record_list_group(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ + return $this->msg(10005,'aud_id type error'); + } + if(!$this->verify_data_is_ok($data['s_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + if(!$this->verify_data_is_ok($data['e_time'],'datetime')){ + return $this->msg(10005,'page type error'); + } + return $this->record_list_page_or_group_action($data,'group'); + } 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 $this->msg(99999); + } + } + // 历史记录(详细) + public function detailed_record(){ + try { + $data = input('post.'); + if(!array_key_exists('token', $data) || !array_key_exists('id', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['token'],'str')){ + return $this->msg(10005,'token type error'); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005,'id type error'); + } + return $this->get_all_detaile_data_action($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 $this->msg(99999); + } + } + // 删除历史数据 + public function del_record(){ + try { + $data = input('post.'); + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(!$this->verify_data_is_ok($data['id'],'intnum')){ + return $this->msg(10005); + } + unset($data['token']); + $user_data = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($user_data){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } 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 $this->msg(99999); + } + } + + ################################################################action################################################################ + ################################################################action################################################################ + public function manual_record_action($data,$type){ + $temporary_arr['aud_id'] = $data['aud_id']; + $temporary_arr['record_time'] = $data['time']; + $temporary_arr['one'] = $data['one']; + $temporary_arr['two'] = $data['two']; + $temporary_arr['three'] = $data['three']; + $temporary_arr['average'] = bcdiv(bcadd(bcadd($data['one'],$data['two'],2),$data['three'],2),3,2); + $temporary_arr['create_time'] = date('Y-m-d H:i:s'); + $temporary_arr['one_val'] = $data['one']; + $temporary_arr['two_val'] = $data['two']; + $temporary_arr['three_val'] = $data['three']; + $temporary_arr['average_val'] = $temporary_arr['average']; + $temporary_arr['flow_val'] = array_key_exists('flow', $data)?$data['flow']:'0.00';//流速 + $temporary_arr['record_type'] = $type;//流速 + // die; + // 处理记录时间 + + $user_msg = Db::name($this->vitalcapacity_db_name['juese'])->where(['id'=>$data['aud_id']])->field('id,grade,gender,birthday')->find(); + // die; + if($user_msg){ + // 根据性别&年级&年龄查规则 + if($user_msg['grade'] == 'nothing'){ + // 计算年龄判断是属于哪个年级 + $user_age = $this->calculate_age($user_msg['birthday']); + if($user_age <= 7){ + $user_msg['grade'] = 'grade_s_1'; + }else if($user_age == 8){ + $user_msg['grade'] = 'grade_s_2'; + }else if($user_age == 9){ + $user_msg['grade'] = 'grade_s_3'; + }else if($user_age == 10){ + $user_msg['grade'] = 'grade_s_4'; + }else if($user_age == 11){ + $user_msg['grade'] = 'grade_s_5'; + }else if($user_age == 12){ + $user_msg['grade'] = 'grade_s_6'; + }else if($user_age == 13){ + $user_msg['grade'] = 'grade_m_1'; + }else if($user_age == 14){ + $user_msg['grade'] = 'grade_m_2'; + }else if($user_age == 15){ + $user_msg['grade'] = 'grade_m_3'; + }else if($user_age == 16){ + $user_msg['grade'] = 'grade_h_1'; + }else if($user_age == 17){ + $user_msg['grade'] = 'grade_h_2'; + }else if($user_age == 18){ + $user_msg['grade'] = 'grade_h_3'; + }else if($user_age == 19 || $user_age == 20){ + $user_msg['grade'] = 'grade_u_12'; + }else if($user_age >= 21){ + $user_msg['grade'] = 'grade_u_34'; + } + } + $sql_str = "sex = ".$user_msg['gender']." and ".$user_msg['grade']." <= ".$temporary_arr['average_val']; + $user_achievement = Db::name($this->vitalcapacity_db_name['biaozhun'])->where($sql_str)->order($user_msg['grade'] .' desc')->field('level,score,'.$user_msg['grade'])->limit(1)->cache(86400)->select(); + if(count($user_achievement)<=0){ + $user_achievement[0] = ['level'=>'无效','score'=>'0']; + } + $temporary_arr['score'] = $user_achievement[0]['score'].','.$user_achievement[0]['level'].','.$this->color[$user_achievement[0]['level']]; + $temporary_arr['score_val'] = $user_achievement[0]['score']; + + }else{ + return $this->msg(10004,'未找到有效数据'); + } + $standard_data = $this->get_vitalcapacity_data($data['aud_id']); + $temporary_arr['standard_data'] = json_encode($standard_data); + $result = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->insert($temporary_arr); + + if($result){ + $time = $result[0]['record_time']; + $time = strtotime($time); + $time = date('Y年m月d日 H:i:s', $time); + return $this->msg([ + 'average'=>$temporary_arr['average'].'ml', + 'level'=>$user_achievement[0]['level'], + 'time'=>$time, + 'flow_val'=>$temporary_arr['flow_val'], + 'list'=>$standard_data, + 'offset'=>$this->vitalcapacity_standard_interval($temporary_arr['average'],$standard_data) + ]); + }else{ + return $this->msg(10002); + } + } + public function data_report_action($data){ + $result = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->where(['aud_id'=>$data['aud_id']])->order('record_time desc')->field('record_time,score,average,flow_val,standard_data')->limit(1)->select(); + + if(count($result) <= 0){ + // return $this->msg(10004); + return $this->msg([ + 'average'=>'', + 'level'=>'', + 'time'=>'', + 'flow_val'=>'', + 'list'=>'', + 'offset'=>'' + ]); + + }else{ + + $time = $result[0]['record_time']; + $time = strtotime($time); + $time = date('Y年m月d日 H:i:s', $time); + $o_l = explode(',',$result[0]['score']); + // $standard_data = $this->get_vitalcapacity_data($data['aud_id']); + $standard_data = json_decode($result[0]['standard_data'],true); + + return $this->msg([ + 'average'=>$result[0]['average'].'ml', + 'level'=>$o_l[1], + 'time'=>$time, + 'flow_val'=>$result[0]['flow_val'] == '.00'?'0.00':$result[0]['flow_val'], + 'list'=>$standard_data, + 'offset'=>$this->vitalcapacity_standard_interval($result[0]['average'],$standard_data) + ]); + } + } + public function curve_chart_action($data){ + $audid = $data['aud_id']; + $timeData = explode('-', $data['time']); + + // 根据$timeData的长度构建不同的查询条件 + $map = ['aud_id' => $audid]; + switch (count($timeData)) { + case 3: // 年月日 + $map['record_time'] = ['between', [date('Y-m-d 00:00:00', strtotime($timeData[0] . '-' . $timeData[1] . '-' . $timeData[2])), date('Y-m-d 23:59:59', strtotime($timeData[0] . '-' . $timeData[1] . '-' . $timeData[2]))]]; + break; + case 2: // 年月 + $map['record_time'] = ['between', [date('Y-m-01 00:00:00', strtotime($timeData[0] . '-' . $timeData[1])), date('Y-m-t 23:59:59', strtotime($timeData[0] . '-' . $timeData[1]))]]; + break; + case 1: // 年 + $map['record_time'] = ['between', [date('Y-01-01 00:00:00', strtotime($timeData[0])), date('Y-12-31 23:59:59', strtotime($timeData[0]))]]; + break; + default: + return $this->msg(10005); // 无效的时间数据格式 + } + // 使用查询构造器进行查询 + $result = Db::name($this->vitalcapacity_db_name['vitalcapacity'])->where($map)->field('id,one_val,two_val,three_val,average_val,score_val,aud_id,record_time,DATEPART(hour, record_time) AS hour,DATEPART(day, record_time) AS day,DATEPART(month, record_time) AS month')->order('record_time')->select(); + $return_data = []; + if(count($timeData) == 3){ + $key_condition = 'hour'; + }else if(count($timeData) == 2){ + $key_condition = 'day'; + }else if(count($timeData) == 1){ + $key_condition = 'month'; + } + foreach ($this->curve_data_format as $key => $value) { + $temporary_arr['title'] = $value[0].'('.$value[1].')'; + $temporary_arr['key'] = $key; + $temporary_arr['line']['categories'] = []; + $temporary_arr['line']['series'][0]['color'] = $value[2]; + $temporary_arr['line']['series'][0]['name'] = $value[0].'('.$value[1].')'; + $temporary_arr['line']['series'][0]['data'] = []; + foreach ($result as $k => $v) { + if($key_condition == 'hour'){ + if(in_array($result[$k][$key_condition].'时',$temporary_arr['line']['categories'])){ + + $num = array_search($result[$k][$key_condition].'时', $temporary_arr['line']['categories']); + // $temporary_arr['line']['series'][0]['data'][$num] = bcadd($temporary_arr['line']['series'][0]['data'][$num],$result[$k][$key],2); + $temporary_arr['line']['series'][0]['data'][$num] = $temporary_arr['line']['series'][0]['data'][$num] >= $result[$k][$key]?$temporary_arr['line']['series'][0]['data'][$num]:$result[$k][$key]; + + }else{ + array_push($temporary_arr['line']['categories'],$result[$k][$key_condition].'时'); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + } + }else if($key_condition == 'day'){ + if(in_array($result[$k]['month'].'-'.$result[$k][$key_condition],$temporary_arr['line']['categories'])){ + $num = array_search($result[$k]['month'].'-'.$result[$k][$key_condition], $temporary_arr['line']['categories']); + // $temporary_arr['line']['series'][0]['data'][$num] = bcadd($temporary_arr['line']['series'][0]['data'][$num],$result[$k][$key],2); + $temporary_arr['line']['series'][0]['data'][$num] = $temporary_arr['line']['series'][0]['data'][$num] >= $result[$k][$key]?$temporary_arr['line']['series'][0]['data'][$num]:$result[$k][$key]; + }else{ + array_push($temporary_arr['line']['categories'],$result[$k]['month'].'-'.$result[$k][$key_condition]); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + } + }else{ + if(in_array($result[$k]['month'].'月',$temporary_arr['line']['categories'])){ + $num = array_search($result[$k]['month'].'月', $temporary_arr['line']['categories']); + // $temporary_arr['line']['series'][0]['data'][$num] = bcadd($temporary_arr['line']['series'][0]['data'][$num],$result[$k][$key],2); + $temporary_arr['line']['series'][0]['data'][$num] = $temporary_arr['line']['series'][0]['data'][$num] >= $result[$k][$key]?$temporary_arr['line']['series'][0]['data'][$num]:$result[$k][$key]; + }else{ + array_push($temporary_arr['line']['categories'],$result[$k]['month'].'月'); + array_push($temporary_arr['line']['series'][0]['data'],$result[$k][$key]); + } + } + } + array_push($return_data,$temporary_arr); + } + return $this->msg($return_data); + } + public function record_list_page_or_group_action($data,$type){ + $return_result = []; + + if($type == 'group'){ + $data['s_time'] = $data['s_time'].' 00:00:00'; + $data['e_time'] = $data['e_time'].' 23:59:59'; + $result = Db::query(" + select + id, + CONVERT(varchar(10), record_time, 120) AS r_t, + CONVERT(varchar(19), record_time, 120) AS record_time, + one_val as v1, + two_val as v2, + three_val as v3, + average_val as v4, + score as v5 + from ".$this->vitalcapacity_db_name['vitalcapacity']." + where aud_id='".$data['aud_id']."' + and record_time between '".$data['s_time']."' and '".$data['e_time']."' + and is_del = 0 + order by record_time desc"); + foreach ($result as $key => $value) { + // $time_t = $this->handle_hour_branch_second($value['v2']); + array_push($return_result, [ + 'id'=>$value['id'], + 'v1'=>$value['v1'] == '.00'?'0':$value['v1'], + 'v2'=>$value['v2'] == '.00'?'0':$value['v2'], + 'v3'=>$value['v3'] == '.00'?'0':$value['v3'], + 'v4'=>$value['v4'] == '.00'?'0':$value['v4'], + 'v5'=>explode(',',$value['v5'])[0], + 'v1_name'=>'第一次', + 'v2_name'=>'第二次', + 'v3_name'=>'第三次', + 'v4_name'=>'平均', + 'v5_name'=>'成绩', + // 'r_t'=>str_replace('-', '/', $value['r_t']) + 'r_t'=>$value['r_t'] + ]); + } + }else{ + $result = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->where(['aud_id'=>$data['aud_id'],'is_del'=>0])->field("id,record_time,REPLACE(record_time, '-', '-') AS b_time,one_val,two_val,three_val,average_val,score")->order('record_time desc')->page($data['page'],$this->pagesize)->select(); + $return_result['totalrows'] = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->where(['aud_id'=>$data['aud_id']])->count(); + $return_result['rows'] = []; + $return_result['pageno'] = $data['page']; + $return_result['pagesize'] = $this->pagesize; + $return_result['totalpage'] = ceil($return_result['totalrows']/$this->pagesize); + foreach ($result as $key => $value) { + // $time_t = $this->handle_hour_branch_second($value['jump_time']); + array_push($return_result['rows'],[ + 'id'=>$value['id'], + 'v1'=>$value['one_val'] == '.00'?'0':$value['one_val'], + 'v2'=>$value['two_val'] == '.00'?'0':$value['two_val'], + 'v3'=>$value['three_val'] == '.00'?'0':$value['three_val'], + 'v4'=>$value['average_val'] == '.00'?'0':$value['average_val'], + 'v5'=>explode(',',$value['score'])[0], + 'v1_name'=>'第一次', + 'v2_name'=>'第二次', + 'v3_name'=>'第三次', + 'v4_name'=>'平均', + 'v5_name'=>'成绩', + 'record_time'=>$value['b_time'] + ]); + } + } + return $this->msg($return_result); + } + public function get_all_detaile_data_action($data){ + + $result = $result = Db::table($this->vitalcapacity_db_name['vitalcapacity'])->where(['id'=>$data['id'],'is_del'=>0])->find(); + $for_data_arr = ['one_val'=>['第一次','ml'],'two_val'=>['第二次','ml'],'three_val'=>['第三次','ml'],'average_val'=>['三次平均','ml'],'score'=>['最后成绩','分']]; + if($result){ + $result_data = []; + foreach ($for_data_arr as $key => $value) { + $temporary_arr['key_name'] = $key; + $temporary_arr['name'] = $value[0]; + $temporary_arr['value'] = explode(',',$result[$key])[0]; + $temporary_arr['unit'] = $value[1]; + array_push($result_data,$temporary_arr); + } + return $this->msg($result_data); + }else{ + return $this->msg(10002); + } + + } + + ################################################################内部调用################################################################ + ################################################################内部调用################################################################ + // 肺活量判断区间 + public function vitalcapacity_standard_interval($val,$data){ + // 缓存一周 + $result = ''; + if(!$data || count($data) <= 0){ + return $result; + } + $temporary_qj = $data; + $max = 0; + $min = 0; + $num = 0; + foreach ($temporary_qj as $key => $value) { + if($val >= $value['min_val'] && $val <= $value['max_val']){ + $max = $value['max_val']; + $min = $value['min_val']; + $num = $key; + break; + } + } + + $num = count($temporary_qj)-1-$num; + + if($max == 0){ + if($val >= $temporary_qj[0]['max_val']){ + $result = 100; + } + }else{ + $temporary_num = bcmul(bcdiv(bcsub($val,$min,20),bcsub($max,$min,20),2),bcdiv(100,count($temporary_qj),2),2); + $result = bcadd(bcmul(bcdiv(100,count($temporary_qj),2),$num,2),$temporary_num,2); + } + return $result; + } + // 肺活量判断区间(根据得分) + public function vitalcapacity_standard_interval2($val,$data){ + // 缓存一周 + $result = ''; + if(count($data) <= 0){ + return $result; + } + $temporary_qj = $data; + $max = 0; + $min = 0; + $num = 0; + foreach ($temporary_qj as $key => $value) { + if($val >= $value['min_val'] && $val <= $value['max_val']){ + $max = $value['max_val']; + $min = $value['min_val']; + $num = $key; + break; + } + } + // 计算每份占比 + $share_value = bcdiv($temporary_qj[0]['max_val'],count($temporary_qj),1); + // 计算在这一段中占多少 + $result = bcsub($val,$min,1); + $result = bcdiv($result,bcsub($max,$min,1),1); + $num = count($temporary_qj)-1-$num; + $num = bcmul($num,$share_value,1); + $result = bcadd($num,$result,1); + // $num = count($temporary_qj)-1-$num; + // $temporary_num = bcmul(bcdiv(bcsub($val,$min,20),bcsub($max,$min,20),2),bcdiv(100,count($temporary_qj),2),2); + // $result = bcadd(bcmul(bcdiv(100,count($temporary_qj),2),$num,2),$temporary_num,2); + + return $result; + } + + +} \ No newline at end of file diff --git a/application/ZengJieCode/controller/admin/Printaction.php b/application/ZengJieCode/controller/admin/Printaction.php index 124218e..8aba997 100644 --- a/application/ZengJieCode/controller/admin/Printaction.php +++ b/application/ZengJieCode/controller/admin/Printaction.php @@ -46,6 +46,7 @@ class Printaction extends Base a.mac_code, a.sn_code, b.box_code, + b.is_del, FORMAT(b.box_num, '000') AS box_num FROM sn_code_all AS a @@ -62,10 +63,10 @@ class Printaction extends Base return $result; }else{ $result2 = [ - ['Mac码','Sn码','箱号'] + ['Mac码','Sn码','箱号','是否注销'] ]; for ($i=0; $i < count($result); $i++) { - $result2[] = [$result[$i]['mac_code'],$result[$i]['sn_code'],$result[$i]['box_code'].'-'.$result[$i]['box_num']]; + $result2[] = [$result[$i]['mac_code'],$result[$i]['sn_code'],$result[$i]['box_code'].'-'.$result[$i]['box_num'],$result[$i]['is_del']==0?'否':'是']; } $excel = new \app\download\controller\Excel(); $excel->export($result2, $pc['box_code']); diff --git a/application/ZengJieCode/controller/app/Savemsg.php b/application/ZengJieCode/controller/app/Savemsg.php index b7cea54..893ce40 100644 --- a/application/ZengJieCode/controller/app/Savemsg.php +++ b/application/ZengJieCode/controller/app/Savemsg.php @@ -96,7 +96,7 @@ class Savemsg extends Base{ public function save_box_msg($data = ['sn_code_all'=>'564654564654654,564654564654654','box_serial_number'=>'996589585']){ - // try { + try { // 你的业务逻辑 if(count(input('post.')) > 0){ $data = input('post.'); @@ -115,22 +115,22 @@ class Savemsg extends Base{ } $result = $this->save_box_msg_action($data); return $result; - // } 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'] .= "函数名: " . __FUNCTION__ . "\n"; - // $logContent['all_content'] .= "行号: " . $e->getLine() . "\n"; - // $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n"; - // // dump($data); - // // die; - // $this->record_api_log($data, $logContent, null); - // return $this->msg(99999); - // } + } 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'] .= "函数名: " . __FUNCTION__ . "\n"; + $logContent['all_content'] .= "行号: " . $e->getLine() . "\n"; + $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n"; + // dump($data); + // die; + $this->record_api_log($data, $logContent, null); + return $this->msg(99999); + } } @@ -173,9 +173,14 @@ class Savemsg extends Base{ } } - + public function logout_outbox_code(){ + return $this->fetch(); + } + + + ########################################################################action######################################################################## ########################################################################action######################################################################## @@ -212,9 +217,20 @@ class Savemsg extends Base{ public function save_sn_msg_action($data){ $data = $this->chuli_str_kongbai($data); $zengjie = Db::connect('zengjie_db'); - $sn_code = $zengjie->table('sn_code_all')->where(['sn_code'=>$data['sn_code']])->count(); - if($sn_code > 0){ - return $this->msg(10002,'该码已录入'); + $sn_code = $zengjie->table('sn_code_all')->where(['sn_code'=>$data['sn_code']])->find(); + + if($sn_code){ + $box_state = $zengjie->table('box_code_all')->where(['id'=>$sn_code['batch_id']])->field('id,is_del')->find(); + if($box_state['is_del'] == 0){ + return $this->msg(10002,'该码已录入'); + }else{ + $sn_del_state = $zengjie->table('sn_code_all')->where(['id'=>$sn_code['id']])->delete(); + if ($sn_del_state) { + // return $this->msg(10000, '删除成功'); // 假设10000是成功代码 + } else { + return $this->msg(10002, '数据错误请重新尝试'); + } + } } $result = $zengjie->table('sn_code_all')->insert([ @@ -354,6 +370,24 @@ class Savemsg extends Base{ return $data; } + public function logout_outbox_code_action(){ + $data = input(); + // 处理前导零 + $boxNumber = ltrim($data['boxNumber'], '0'); + $boxNumber = $boxNumber === '' ? '0' : $boxNumber; + $zengjie = Db::connect('zengjie_db'); + $box_result = $zengjie->table('box_code_all')->where(['box_code'=>$data['boxCode'],'box_num'=>$boxNumber])->count(); + if($box_result <= 0){ + return $this->msg(10002,'未找到对应外箱编码'); + } + $result = $zengjie->table('box_code_all')->where(['box_code'=>$data['boxCode'],'box_num'=>$boxNumber])->update(['is_del'=>1]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002,'注销失败'); + } + } + ######################################################测试######################################################### ######################################################测试######################################################### ######################################################测试######################################################### diff --git a/application/ZengJieCode/view/admin/printaction/print_device_data_index.html b/application/ZengJieCode/view/admin/printaction/print_device_data_index.html index 1d10a3c..a30cfc1 100644 --- a/application/ZengJieCode/view/admin/printaction/print_device_data_index.html +++ b/application/ZengJieCode/view/admin/printaction/print_device_data_index.html @@ -32,12 +32,20 @@ MAC地址 SN码 箱号 + 是否注销 {volist name="data" id="item"} {$item.mac_code|default='未分配'} {$item.sn_code} {$item.box_code}-{$item.box_num} + + {if condition="$item.is_del == 0"} + 否 + {else /} + 是 + {/if} + {/volist} diff --git a/application/ZengJieCode/view/app/savemsg/logout_outbox_code.html b/application/ZengJieCode/view/app/savemsg/logout_outbox_code.html new file mode 100644 index 0000000..190d52b --- /dev/null +++ b/application/ZengJieCode/view/app/savemsg/logout_outbox_code.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 大箱注销重新录入工具 + + + + +

大箱注销重新录入工具

+ +
+
+ + +
+ +
+ + +
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/application/app/controller/Base.php b/application/app/controller/Base.php index b2c3a02..217ac51 100644 --- a/application/app/controller/Base.php +++ b/application/app/controller/Base.php @@ -148,7 +148,7 @@ class Base extends Controller{ return ['state'=>false,'language'=>null]; } - $user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->field('id,login_time,language')->find(); + $user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token,'is_del'=>0])->field('id,login_time,language')->find(); if(!$user_login){ Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,未找到用户token', 'token_log'); return ['state'=>false,'language'=>null]; @@ -177,8 +177,8 @@ class Base extends Controller{ return ['state'=>false,'language'=>$user_login['language']]; } else { // echo "未超过 {$specifiedDays} 天"; - $user_login = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->update(['login_time'=>date('Y-m-d H:i:s')]); - if($user_login){ + $result = Db::table($this->base_use_db_name['6'])->where(['token'=>$token])->update(['login_time'=>date('Y-m-d H:i:s')]); + if($result){ Log::record('用户尝试更新token时间,token:' . $token.',记录成功,最新的时间为'.date('Y-m-d H:i:s'), 'token_log'); return ['state'=>true,'language'=>$user_login['language']]; }else{ diff --git a/application/app/controller/Card.php b/application/app/controller/Card.php index ba73bda..e25d07a 100644 --- a/application/app/controller/Card.php +++ b/application/app/controller/Card.php @@ -100,10 +100,17 @@ class Card extends Base{ if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){ return $this->msg(10005); } + $user_languages = Db::table('app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->field('id,language')->find(); + if(!$user_languages){ + return $this->msg(10003); + } // $return_data; $return_data = $this->get_user_body_data($data); - // $language_data = new Language(); - // $return_data = $language_data->handling_languages_from_multiple_countries('en', $return_data->getData()); + // 处理多语言 + if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){ + $language_data = new Language(); + $return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData()); + } return $return_data; } catch (\Exception $e) { // 捕获异常 diff --git a/application/app/controller/Index.php b/application/app/controller/Index.php index e01c8dc..089f30d 100644 --- a/application/app/controller/Index.php +++ b/application/app/controller/Index.php @@ -147,8 +147,8 @@ class Index extends Base{ $url = ''; } $user_token_state = $this->token_time_validate($data['token']); - $language_data = $this->pd_language($user_token_state['language'],$isSupportedLanguage,$language); + if($user_token_state['state'] === false){ return $this->msg(-1,'未登录',['version'=>$version,'url'=>$url,'language'=>$language_data,'language_arr'=>$this->process_Language()]); }else{ diff --git a/application/app/controller/Language.php b/application/app/controller/Language.php index 141bcac..2e607c2 100644 --- a/application/app/controller/Language.php +++ b/application/app/controller/Language.php @@ -20,6 +20,19 @@ class Language extends Base protected $languageMap = [ 'en' => [ '操作成功' => 'Success', + '关键参数缺失' => 'Required parameter missing', + '操作失败' => 'Operation failed', + '信息核实错误' => 'Information verification error', + '未找到有效数据' => 'No valid data found', + '参数格式错误' => 'Parameter format error', + '参数不能为空' => 'Parameter cannot be empty', + '参数错误' => 'Parameter error', + '自定义信息' => 'Custom message', + '登录失效' => 'Login invalid', + '网络异常,请稍后重试' => 'Network error, please try again later', + '年龄' => 'Age', + '岁' => '', + '无' => 'none', '体重' => 'Weight', '身高' => 'Height', '消瘦' => 'Slim', @@ -80,9 +93,9 @@ class Language extends Base '3-7岁的孩子:骑两轮车、拍踢球、打篮球、游泳、爬山,每天高强度运动不超过30分钟。' => "Ages 3–7: Bicycling, ball games, basketball, swimming, hiking. Limit high-intensity exercise to 30 minutes daily.", '该年龄段睡眠时间建议:9-11小时' => "Recommended sleep duration for this age group: 9–11 hours.", '孩子开始对于赞赏、鼓励、认同和肯定有需求,而且此阶段父亲在孩子的性格塑造、情绪控制以及责任感培养方面扮演着重要的角色,必须告诉孩子什么事应该做、什么事不应该做,并经常性地给孩子一些积极地暗示。例如,可以时常向孩子表达“我会一直在你身边,不要害怕””我对你的进步都看在眼里等类似的话语。' => "Children begin to crave praise, encouragement, and validation. Fathers play a key role in shaping character, emotional regulation, and responsibility during this phase. Clearly define boundaries while offering positive affirmations (e.g., 'I’m always here for you,' 'I see your progress').", - '《中华人民共和国卫生行业标准WS 423-2013》' => "《Chinese Health Industry Standard WS 423-2013》", + '《中华人民共和国卫生行业标准WS/T 423-2022》' => "《Chinese Health Industry Standard WS 423-2022》", '《中华人民共和国卫生行业标准WS/T 612-2018》' => "《Chinese Health Industry Standard WS/T 612-2018》", - '《中华人民共和国卫生行业标准WS/T1586-2018》' => "《Chinese Health Industry Standard WS/T 1586-2018》", + '《中华人民共和国卫生行业标准WS/T 586-2018》' => "《Chinese Health Industry Standard WS/T 586-2018》", '《WHO 5~19岁身高/体重判定标准》' => "《WHO Growth Reference for Children and Adolescents (5–19 Years)》", '头围' => "Head Circumference", '头围是指绕头部一周的最大长度,头围的大小与脑的发育密切相关' => "Head circumference refers to the maximum length around the head. Its measurement is closely related to brain development.", @@ -90,7 +103,6 @@ class Language extends Base ], // 可以添加更多语言映射 ]; - /** * 处理多国语言翻译 * diff --git a/application/app/controller/Pagingcontrast.php b/application/app/controller/Pagingcontrast.php index d59e749..22b2110 100644 --- a/application/app/controller/Pagingcontrast.php +++ b/application/app/controller/Pagingcontrast.php @@ -87,14 +87,24 @@ class Pagingcontrast extends Base{ if(!$this->verify_data_is_ok($data['type'],'intnum')){ return $this->msg(10005); } + $token = $data['token']; + $user_languages = Db::table('app_account_number')->where(['token'=>$token,'is_del'=>0])->field('id,language')->find(); + if(!$user_languages){ + return $this->msg(10003); + } unset($data['token']); if(array_key_exists($data['type'],$this->db_name)){ $return_data = $this->jump_transfer_interface_record($data,'page'); }else{ $return_data = $this->msg(10005); } + // 处理多语言 + if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){ + $language_data = new Language(); + $return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData()); + } // 成功 - $this->record_api_log($data, null, $return_data); + // $this->record_api_log($data, null, $return_data); return $return_data; } catch (\Exception $e) { // 捕获异常 @@ -127,10 +137,19 @@ class Pagingcontrast extends Base{ if(!$this->verify_data_is_ok($data['type'],'intnum')){ return $this->msg(10005); } + $token = $data['token']; + $user_languages = Db::table('app_account_number')->where(['token'=>$token,'is_del'=>0])->field('id,language')->find(); + if(!$user_languages){ + return $this->msg(10003); + } unset($data['token']); $return_data = $this->jump_transfer_interface_detailed($data); // 成功 - $this->record_api_log($data, null, $return_data); + // 处理多语言 + if($user_languages['language'] != 'zh-Hans' || $user_languages['language'] != ''){ + $language_data = new Language(); + $return_data = $language_data->handling_languages_from_multiple_countries($user_languages['language'], $return_data->getData()); + } return $return_data; } catch (\Exception $e) { // 捕获异常 diff --git a/application/route.php b/application/route.php index 9faa55c..0a0ca25 100644 --- a/application/route.php +++ b/application/route.php @@ -621,6 +621,10 @@ Route::any('/z/print_scan_barcode', 'app/ZengJieCode/admin.printaction/print_sca // 获取大箱没打印的条码 Route::any('/z/print_combined_code', 'app/ZengJieCode/admin.printaction/print_combined_code'); +// 大箱注销重新录入 +Route::any('/z/logout_outbox_code', 'app/ZengJieCode/app.savemsg/logout_outbox_code'); +Route::any('/z/logout_outbox_code_action', 'app/ZengJieCode/app.savemsg/logout_outbox_code_action'); + ################################################################下面是设备入库录入################################################################ @@ -658,6 +662,14 @@ Route::any('/de/admin/device/device_all', 'app/DeviceEnter/admin.device/device_a ################################################################接口(API) // 默认配置 Route::any('/reedaw/config', 'app/NewReedaw/app.index/config'); +// 通用数据对比 +Route::any('/reedaw/all_data_contrast', 'app/NewReedaw/app.index/all_data_contrast'); + +################################################################金刚区部分 +// 遗传身高 +Route::any('/reedaw/genetic_height', 'app/NewReedaw/app.index/genetic_height'); +// BMI评测 +Route::any('/reedaw/bmi_evaluation', 'app/NewReedaw/app.index/bmi_evaluation'); ################################################################登录注册部分 // 注册账号 @@ -671,11 +683,63 @@ Route::any('/reedaw/add_member', 'app/NewReedaw/app.role/add_member'); Route::any('/reedaw/update_member', 'app/NewReedaw/app.role/update_member'); // 获取角色列表 Route::any('/reedaw/role_list', 'app/NewReedaw/app.role/role_list'); +################################################################卡片部分 +// 卡片列表 +Route::any('/reedaw/card/card_list_msg', 'app/NewReedaw/app.card/card_list_msg'); +// 用户卡片排序 +Route::any('/reedaw/card/card_user_order', 'app/NewReedaw/app.card/card_user_order'); ################################################################身体报告部分 // 获取角色报告 -Route::any('/reedaw/body_report', 'app/NewReedaw/app.body/body_report'); - - +Route::any('/reedaw/body/body_report', 'app/NewReedaw/app.body/body_report'); +// 手动记录 +Route::any('/reedaw/body/manual_record', 'app/NewReedaw/app.body/manual_record'); +// 设备记录 +Route::any('/reedaw/body/device_record', 'app/NewReedaw/app.body/device_record'); +// 历史记录(分页) +Route::any('/reedaw/body/record_list_page', 'app/NewReedaw/app.body/record_list_page'); +// 历史记录(分组) +Route::any('/reedaw/body/record_list_group', 'app/NewReedaw/app.body/record_list_group'); +// 历史记录(详细) +Route::any('/reedaw/body/detailed_record', 'app/NewReedaw/app.body/detailed_record'); +// 历史记录(详细) +Route::any('/reedaw/body/del_record', 'app/NewReedaw/app.body/del_record'); +################################################################肺活部分 +// 手动记录 +Route::any('/reedaw/vitalcapacity/manual_record', 'app/NewReedaw/app.vitalcapacity/manual_record'); +// 设备记录 +Route::any('/reedaw/vitalcapacity/device_record', 'app/NewReedaw/app.vitalcapacity/device_record'); +// 上一次数据 +Route::any('/reedaw/vitalcapacity/data_report', 'app/NewReedaw/app.vitalcapacity/data_report'); +// 曲线 +Route::any('/reedaw/vitalcapacity/curve_chart', 'app/NewReedaw/app.vitalcapacity/curve_chart'); +// 历史记录(分页) +Route::any('/reedaw/vitalcapacity/record_list_page', 'app/NewReedaw/app.vitalcapacity/record_list_page'); +// 历史记录(分组) +Route::any('/reedaw/vitalcapacity/record_list_group', 'app/NewReedaw/app.vitalcapacity/record_list_group'); +// 历史记录(详细) +Route::any('/reedaw/vitalcapacity/detailed_record', 'app/NewReedaw/app.vitalcapacity/detailed_record'); +// 历史记录(详细) +Route::any('/reedaw/vitalcapacity/del_record', 'app/NewReedaw/app.vitalcapacity/del_record'); +################################################################跳绳部分 +// 手动记录 +Route::any('/reedaw/skip/manual_record', 'app/NewReedaw/app.skip/manual_record'); +// 设备记录 +Route::any('/reedaw/skip/device_record', 'app/NewReedaw/app.skip/device_record'); +// 上一次数据 +Route::any('/reedaw/skip/data_report', 'app/NewReedaw/app.skip/data_report'); +// 曲线 +Route::any('/reedaw/skip/curve_chart', 'app/NewReedaw/app.skip/curve_chart'); +// 历史记录(分页) +Route::any('/reedaw/skip/record_list_page', 'app/NewReedaw/app.skip/record_list_page'); +// 历史记录(分组) +Route::any('/reedaw/skip/record_list_group', 'app/NewReedaw/app.skip/record_list_group'); +// 历史记录(详细) +Route::any('/reedaw/skip/detailed_record', 'app/NewReedaw/app.skip/detailed_record'); +// 历史记录(详细) +Route::any('/reedaw/skip/del_record', 'app/NewReedaw/app.skip/del_record'); +################################################################跳绳部分 +// 获取单个地区数据 +Route::any('/reedaw/gf/get_single_data', 'app/NewReedaw/app.gufen/get_single_data'); diff --git a/public/new_reedaw/icon/bmi.png b/public/new_reedaw/icon/bmi.png new file mode 100644 index 0000000000000000000000000000000000000000..a774566ebc4c682ace4506377341a8abbd2a56a9 GIT binary patch literal 1926 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 A4FCWD literal 0 HcmV?d00001 diff --git a/public/new_reedaw/icon/card_fh.png b/public/new_reedaw/icon/card_fh.png new file mode 100644 index 0000000000000000000000000000000000000000..7efa4edc79e567c504fac1907879d18e28dbaff7 GIT binary patch literal 14097 zcmV+sH}1%ZP)FE3C==taA_UY#P>gxFD==tg8`{w8O=;iq8 z=lAL4_~z*L>gf3B>iOy8`RC;K=i~Y3goCA-Xj5^j})~+}rhkeDz;l`RD8V>g4ruZ}nnb`snKT(b4$L&Gcqt{O9HU z<>vJ3==$pB`{3XE-re(IUHIze^n!o(WMcW}=J?;<_QAmUzrOW)cJ*y&^=W4K<>C6) z*7>rr_^he+YHIUpX!d4i^|*!R4=_=<@2Z*BFToA{58 z^mujq<>mKbVEE$Q_}$(2o164$WBBIk`s3sJ;o|qu%=dwS`s3jE#l-boTK4Md{ORWS zqoVnqob+>X`N_xjwzv7Fr1qen_UPdFudnu;nD&{L@?~H7+1d51r}n3!_-WLD`MJ6Fv$OW6rudhX_*My#$oI#_^~S>b!NB#ElK5U-`p?ex z$;bA+xcR84^^%VCi-z@garbp`_i1MN=iv9(()Y>4^}4n8qn`Mbko1g;^@D`^+uird z%Js3Y_OYz_nVI_0&-jdr`FeN!>E!(6;`qYE_O-D0kBan$f%9-`@n>WH=j{9E?EKi< z_}19=)X)0O%KF^c`NhHbZf*SG*o8>()psF_;7LZ zZ*KbN?*8WK_-JGM-QoM#*!SJn`qS0>$Hn=%w)BvU`RnBR#mM(@ZTMzo`n|mRv$guH ztM*@7{N(KV>*)K<&iS68_-tzTT2}b$>;32G{psiZ=jQw5g@dL>G`j$ z`IMFMUtjrQUHinu`E+#p;^+P66{R zD>X;j)U<5D%k(1{|fuBqEajt!hA&#<_igbVQeg-l8^FOT$)9*1Ognx z$Vav$j^jdn45CtbkN616Wl@+wAixM)yGJAkOgIKnSu8#U0f1pRhXcfXJ6i(5g=5mI zEL2;K;`40@K-D%dQ;Sz8NEVmP9)qZewzf9*$X0{kaqM#q%xHCWKA(lK$6{I`5^Zfn zLxWI=?CnuAOPV4GLMA}RVgLZD7?*-Es5C`=K@keMjt&PIgQ#q=(3v59{dId3qrUiJ zJRt{E!5BnkAvjN_kjZ2md;3!&9$Sy*D{%xLlidnpQ=yP4)d3Y)g@8&Bd3n@WMCEH} z0IE8MYKu9qpThNMil3MFFmFtv+SzJIr8rKTnIR%)u9+ESOG?doV-b})_sATwNv_LxIuVR*;mvjNd<`5A6J zr3_J87loU|xl}idMO1!vtn01rdz%WCGPzvjduVO6&)$M!D`f1UlH{Q%)BE>7dwk^+ zC4*WSWtx){_-Y1%j5SmQL9=%y+&2x_w1|(3M9zvsu|cLeKCfDjK~#=?=QUSTSBtwJ zy`~9^O8nEc_kweR{t;A!`OW-6r0KdRB^etVJLzUA$zQ)M&|y$*;_^?wqbU|@@~=ET z>zZS;z#99F75gOJ9bO3LTd7mapnZmbnm#b-D+fgfnaY7-Re`C|xn}FIbm+{yvJsRO6h<;Lob%#f#=d!1Z zP7mvgQ3*5HQW3D`(hN6_yo6V|T*Ta5LqlWRHggfgpHL_kbLk6K9m_YC`G5G~Rgd;d zQXZkASZtC=+wS;&RPcm7Ce=;3nk-5WP@jEon$oqp&R66>sq_#bit0BMMs6%$lb`?L z2TvPy?d@|Vw4F-zww{@Rgw4hUf|o!=z!f|mp`k&N4m<&l%Y5r6TP<2vRUNaSw>S22 z@|vN_gN;f0>X;DcDIJX$HwOn>47N0hQ4FKi7u|h6G9jg_)7=+gV=xf<8e4Tt^^aL_ z?aipDW+}6VH)s2;-8vGK zkl-3TZ{CxM6Mde2de`$veVvFSHcYzgw|j!moV9-a9GyBHEu9SiEpu&BdUvcpeA`k! zEphnt2glo@YmI7aYbThRnohI{2y6BCu+m3S4$jI`DwS#y3H=fQfN{CG5-!Xh+BA(N zHLV^fUt970&7i)Kxm(-X;zk2~M$Ud(JhkVNTqM@tZ{6ZD!+YWMtMd`ukU`ye+$6&n`vDcD(7JC2&n*t4tL^CIXL zGDOxiHQ6O_MsvxcNlKwKu`|Zy?9I>a&0V;5O?gpKa_nG%jp_M&bJmts9#GZ`{O!gX?x<+TN%@19+Y}xGUu0e~hZcW_N)wyaF>1aJQ z*=xpI3x=-jvwQT&)?CpadGyUaGhB{(T4gy)vz9kM$?5)VZq)Rl%0pMK%x+0;9-VOO z{%2cvm9^J#gm;)S6Hj7)9hJawgsmyI*QQlYr?dULOh#we#5FG{-x+!3jm=ip9#fA- zt@QR8UC;rg*Lc~{Efy2J)>OXXWCyj)oS58E)%D&4uLT=>+}Y&z$aQ-IquYAR2D0C1 zynNYu$JFXq!{0i8{=Fr=Wt|7=ov%wZNCJBaR5zId5$3`M%CbBC{)*VR6q|Vky=BXL zn)Vwzx!2c+ls+vAUt&>^ykQnaPWs^Z^Y6Ro_*?JSRVp;h%^jRhFPpOR*39OZ$`FJ) zysULJ&ZTRp=Sawf!|A&2Aq^WUhkD;i@$vCmw`O_2j)*WPU#eTdx(r^mx96nod%7Za zPRhi>%KN!Dn@szdA&DB<)Q~c8_J{|e&t4~8q-SrKBLd{zLQPI|J zZ?E2|lWEo0H;S9DO>gO}x2JFGnL$Wt)lY6OyXLjWHNY#pyz^2bLB3pLCE+<@s900C z@z95{TW9)24{j>)XbP#*!bn0U*Wr$Hd}DEFNy(1&pYzie6^8}6e!t~?U426>8K^8g zW%{I&iW5QJ3%{JCQXRe=IkaVH(5nzrV49+`Y`mE@(%Fgbv@uf?{iM}E+2*tuXLN;6Gn;25MqquF<#>Q){ z|Bef0sV~*7PCk5y8S1Aye)MIHiTACg6~|`p`#4^yRL2lPs!;gKn6B&aVBEM_s#5E! zHz!WC7(DvXy9U}Ekp>~tLN!0}JRTMVYr)ftPVs#99f#}JuRC)D909^+vl;OXq4!Tc z<`O+4I`i=dRu}Z~m+>l$JuEf-(#^BKoAaJeic5avM^1L}1Y;zR$MkGAq2S>tMmiQ& z9b00QvO9U|<#!G2U*{2on<0**6|RV#`_=jIYR}DSd@90R%E$yL^iO!>k8L%ek|tS4 z7P|xnSX4}T|BX^5`(@@;m5QaQYvoy#c|Le=!K*urb@k)pp#s_xBn$^)P3SU&K(3|K z7`}R}V(G1!HK7~UziYsGodZ85=Ehsq=(!^N{DimGm1ifC5pVNXty(orjv5%~sZ{6A zffhsX}5u43@P=@-!ik?$Lre0CJf`p6C`8M#!!jGlI5mQ z;BxojMMZ-a-nAx0*^@53BY|TD7y2A7pLQuDvS#T7Z?CSMBU_j*jwcbhJCia)x7o7^MNVJ|v^ut2V{krMhEM`sd?u9f1yq*3;wL zk}y&rJVw}{OM7U@@- zr2%c|tJt>vjj6>hDHHd!C3`wP1XK=~k~!{MI%g3ZI>Y~qH2 zTP1A7P2p&4HG9fn!Hg7_832J8 z;|U>F5fUuP%HwEefQ`|f1(8;hr%AVMBh}PU+<_qBf>s1qE8_l z4%`aiRSFqTsL5twOyANy==Yt8&5VNP{Oq*9go-dZrC#b6KGGLluwduvOHvV!WU<*C zEiIJKau$knwGl#NdzO_)*}8!H6H;9K=lf365&eXUk)(z#%pZJ}ozvt)o6aVf8hOP; zT0`E5M8JwL<0%iq2y;WVwZ-a_4~DKCowqk|-Bjav;?JN`6!bR6Xo=-4nkSd@5Z%&_ zGh6%mMiy3g_9sfEunt?YQD{RH>yDj~z zsR%WY@T4+=wtVnloJ7K68~5y-ZsP5l6BPB~)5a`?Opd+%_B&<=~F{p+aFv#1udd05jsY4w|9&~RBizGBi ziUkR-p1%HK;m+y1_ZS5SwB_H}=NM1m0_>f)-!(I%Pn!RN3Xdv%QsL09rM0(=;uZ{f z^y})YsUbY)pHTJG@axw_JQUUR?JT<%XWEy!Dbz|0hbch@zX<-vA4BmKfjaOaYQ#B} z5@Mc*tI_m36tQZRsLms~!ot*hi~pepEwKnzBQST3rfk5@v2$ zv-tFd!*Hi$)auk!HOzs>li?UjgF~oz_xXp)dgt`z_$=AAW@<-+u0Wv>ow7%%a}=!9 zjMKQehE3W2&91H%nZ+GSH~3ee6(Jaez<4%~_W~-^p9mG-P%ePpZm5n?d^oIrM0ZGC!=vVQ7)HDK_EiZu)K#XxXwOoTwxLrY+B)e@Zw=JF6VWzy_lng zN(|UI{z9yR%W*ecz~S&5%t=xpm%FL<-SF#Odh5N+6Sk0_w?= zfT~Qpkw3Vy_I%WrR~piBTrMNQM^OCJlJ@sZtv(jMb>!yFXs_l4AOz_Xlqx;((&YL5 z{Rc8K+7~Ulab-1Qg$EC29B69TUwYy2?RURUYKqLiw%couO-|6mw?T343tkoC9Jw6FL5|bGL84S_&vNo? z9Ssa#TC?n;qdJq42#td0DMxFMmg5!A0{Z#_o^3hf=eeOFNiHMOl8zi`KUBGVz^~-P zqWt0*u;Tm`{zE$lB0W0Zn6&jn@mvn_Q}#J* z`^Itd@@w8UL1&M7gy^bqxtb8~A|b;5L$^YNxWLd5`za9INYZw@(`i4KCr@m=@*Brf z<5?IA)2X(O4t~-&yXE-v6DJbp1%ySdc-m;JTL(+_@T82M%7L=-HN~4A$3_jBEb&^h zq+(%IY|ZrI@|LQ|j?JaIy1H3eS;K{)F`s^)kYIZ2er?6w*&k)y0gWNmER{y!QSvxF zF>yWF=bQW%>5kLPO@%s)qRtKuTyfLJ-X%U0 zO^O#=>zgq$C+s&O9;NpJDvqM8hzKaHlsc1K!ueMrA1B6j4Ru_2M=y^-HFzK-6dHL> zSNx`IG1*l<;IZg(X}YnsM^$;vn zYs=gt-4aTu;VXXppgPdDld7!^^ z-^I&|W>+7Jn)6;T$Wfo&401hjA}1&3$=<*~8=rsxp9%MKa!eCyU4u_Rz$`V{wdN`l zwoZe!OQ}ki9r=3?w7O6y(XrFZSmXpn%(y83dn9iwWME&RgnA) zEMe)PSX^y;9pAz!bNgI<)(!M0>8pX8Vg7+BlR5Y&HdtpbAE<0U(Bm2UVbPT1QJG;Q zLBYX&XXif8Y&#otBFD6#xvQ(DX2Dt*4vZ$azGvd%RS*D|myx*(Ta$~voL$(|V7(!- zWkpG3M}xklr5TNjz&OwdskHT0CA;_T4QwkqeR%u!RSKze)hZtBG=G=@3?3M;Z21(e zrlnJtcxdhS-3igJUQt4xG5g2sI*RQYfGYRZ)pfsg>By0cfi=4-&VC=@69hgB3JA;G zQgf!JVkF2kA>7|{M|Sq1$~8+SPPBP%;j1ydyW@Ova=H_O0!O_T)@XDu5LS*lry%VE1Epl?qVoWo$bp^V zUv&qV6m1?SWKh943JnHzl@2FYr~cA`)dOq7SN3(^PY4Q#J{#6H*gL&^Xt96n+<*kv z*v0dW9UX`JckX^N!+UGj&_G#CuS?k3djUc7W~6w}S+LRLqxJe~nwodm)W_!_kAYMw zh0j&lef+lS#u}GB6K%H4-aJ1GNTnLz*wT_0QB^9~%rFA8oMlNn6^2fqlhC&?dG@4} zFk%bDAbr!g5cU&DN+BB3zPxPu7L)h-&Yxe}*4%mw65MZ~va>y7d5nuiLPG5OrA~(r zJ6;SOd}6aQe2qs&XXRBt|NP|E!M5mt+CH!5uKbeh$sEvvz&|)F;uz#K9T7qCDLs|d zK+JBRc@=j*IG6}gAz}n#`h~ix`dGz+QHEey&eA)#@BNr?iwP^IUp;7Su2{8-uzc;c zxAhEiVVBC=woRzru)KI(m}|nV2`SMgtw*aoHdyr!ht${C)wP$ciwjPOUFLN7_H8?- z*@I7lp2u!HP*)FEwS8~wn0hq!`N&uIyIn`-?DEgh(j5N<8$s=vx(dpmk}^Ix z&=q~+EL<4ePr)80S1@zc3ts(LMX6yh#YkpFs3w)X`Ib+xN%f+Ojsz4ag3^Q8-XJ#@ z)(AjF8>YrYJqx-w(`)y&n3l+%1D6uz&Ny7OP950T+U7c8*ZaolYW&0dz^efjHK9ku zB7|g9x(yp5S8Rf6;S=mLv*JwqPpCpjSClrRQEe^@iZ{mMJI-HyChkN)SnSowP<1$l zO4%Q}6~-q)g+M{vkzmTka<7zHo589{>7QV%ygV{qokd9?l)13?eZxxKA6b3u)8|p& zl@BfNw7y&#QeP)nH7pi&tn- zjmzjBi>=9phFk=uW*&0^q?s2Bg>Y^nZL=I3{atKqY)ncn@?pfs)ZPBzRc7ttpK0W3Bgur#4U(;%8tk1t7(qJ+-0OMk?qEdSMc6^Zk_;}Is_WpVuGJ=%X=?KTe zIERS(LpNo9pAhb6eWb3wp>T!EywTm$uU>@pRO)<3Xb2-#`hIJO=eV%Bn>v)h1}Yp0 z#^T%B@|beSW3G-)p>K}P%PFWnefaCw^k`=JebK7~#4lHP>XarHa$w+Etx>ee-5X!) zQ5frs@hqhhLudm73FB2;$`aD)`QLHj99Dhh_}H;B|Do zd+B8>t4YRLN}S7v86QWO`3K{P`WGLKTAHwMMRt?EuGO;qw%~$wQf1X+4Vy7VSeEvO+B3y27)XcSNZYYYf#4E7c)Q8cl{nix%t zu_w_~H8C;Gl<%&ICv4oDv-y{kjOTb(*?oM>n|trfH{U!|wAolYp0n4-Ve6-?4%UXG zmF@}mlo;v}(VV}wL&R4arq^stiD`Up#o4@oRY4`ePF<@P?s4Gt{U}Fg^ix?9Q!FxN z_|?+n`s}Hv zrao$8Ql0=MlDxlO6<}s35|fiinLDqe&dI6XcdLVs+`=gFDJ4%t4eg?FEUtF9&Tfh; z?^364k8AQaLcHYfPcc5Se&IFg+Hb%0ov|4W5~*CD2XH+^`Wbe2!vsLY~sbo){iPsge5gwsvc5Kt-pDVR3! zR4Xf4|5u%F>NY@YM0&P)Ir&%v6bX}4Cq%jLNab=41mDt}83PvRa? zUK=wjA#(W(wrHby8G#h5HTy`l4(fxVfW$qw7Qw;YK}JCp2zWfMn8`Z4yv8>sdfLp0 z9UN-tK|QEuc4m|%ho7;m#5d)|>l>!O96K9Sjk!@!McARru$DI5DvC`E>_~HoaU37y zW&~6|pD1=1i?H`zer2Oaj7!1zrBdEspbE^8rf}%I73d8uCA?utA_PjM`U4*?_u6^CzzY>JDR|n)fHG2ASm;hiuhKiQ?@~rm)J3esHE*`(aD5y9@LG#~L zu^u_Jr|xfcs>SCoj@AnRviMA1fB(UT6l~#pms*dOcn&;m^09G80G1W;>Y{}N>cS6F zoLbHq2bB@?+Fl!&n@c~kUcYU_num2WBi`R^qX(6sZ419#+!(6yojTpk-b{fRq%ThM zjoPfRua?29D<7=Sie0{Nk&9F9IirpMYyn{ZDWyGQWt~6$T^xrE zs>q$`elZCVM-rvrjFrPYC0yfTb<5>)KrP=ou`qV|)|DNqXJh4y zyNaui7zq^%EN=_Re4PV%_#hTZS7E@1RT=9TCY&DbocS+VNKp!*AV5`M3{+X-vaLw1Ye&Vo=LIZ%rL68@9Yh4##w;tj)PB&Q!9rA< zT-BZr>YX5b$!E)`zEGc)Dvt#vYt*y4y7Pr>05xZbO4IOgEk)rHPXtF4f?bvvIOT&@ z&9su{Re1sVNhP~p{C?4&Yb#2`{Qe0p*FYfwe%~J5JnpbzT;;Ozw>_NJu3ToVqWiYk zL@Muh;}T+KRVG9phVqv-w~#U-kzw@>CG!z76qdcfwatbvpwQN`I-WGOvsF`2v%<|f z01cJJXcImc1gQ8{&?vZyQ0jXTAvBH`zJa9)tcXPl6Oc;x6OcIOe2^6Gt?ZiwR^6Sv z>VdB&blNv@$IpO(fV7_x37+m%P+>eE70Sf~Vbxcl7RbSDHJ5N>nuN%SbFHm=n>waB zr6d$Lzs{p+a5HvQRczrB^ywM&*uNNOU~568ZXw5I;R~f(=}E_^p3a-M58dVUg=#ym zXsV;8HQ~;U<3bUi53f>`!MO@T$iqkIath&AU9!rya&;@+(Bh%#j9B$&v6rD zg=mg*4J#ip0f0W8$YvxXl*^s3pyf$n$siDJ-}z~TQ^o2ahr%BR6lPD_udQgERx@`j z=p&F6GBS@TRw_^$3GfL6!$nGeF2~s!RJF~>%@gBRx>U4mzu7drFI2PGK%zh0g;P6V z5OEn7gquOA(m^7`6G%=my7F)mgFmdVo8ENsaPnBWJnQ*&{Vf8LIxAwLRW^C(oTsZ(?iB}l_v;I_cgD`(P)+0Bmt$=K6>Pf1 zAXJ%<0p|sRe4tWkk0!Ynfod6+HGL!chw&x(OJL91FZ=oXXs76v%jSeZWI&+ON(ne+ zz7jJ|=9EFGBL@O1mWit>;N>a7V?uYGtlr!Qs>p2a!p3W}H2Yskw6;h4hs|&R)!?b( z4`H+}mXV@!PkVWRtjSH>v2}k%&xGX2!&l_+s>;14IljJr<0Q94m4K$n+=oIT0FMq5 z6R~P&VuC*sZ9pYqrj%jFx3!G%cq=(#a=*T{)eAMXp<3;N_Bpn+fQ?-eOrL=i5SNi; z?9RxLP*!HpNO)awc6R0otaq%K3I+S7?bY*sbcXgb%nd1Jl(qo8;IW~g#JHzrgNc}B z9A-?g&pq7-$nU;pDV3aYe8FhNpgDUT$HZKi_CO!1+queF+KSFVTN*wlP+10{f)dZj zz^cZTSu|!bF%ciLqBr8AS-DoiddAQMWuE1;!qouo&Ck8gRus@ zUiFd>G6)q$(*!CX{+j)YuhuDZSI4`0Q1eS#HQJtyfwl@zFNgq&s7wucl|?|(_#4_T z%XI_3{Ic!*Fib}tK2YkNM}qp-0taTSq0fM;T20IHemBa-+PyqST@kft&uBp90jY=wGep=~J?du%^_sZ< z0C+Ww!@0Y;H)-XF%GQllXJOe7XBeMC_emuM_wRq7@Z7{)dZ?Yq+yeSJ`r>!z8oOe0e9PjF6pEp`5(7DRWF>mHZdn4@WREN_1=OgVJuXfw7P2@Aii ztpghYr) z#MrBp{w#R)n>A}c4e9O+)r7yQ+(R9@tGH<-az;i$)BcPhs9dO)k;d_?WKgqW3%1CQ zD^9o;J>rvu2kx=6&zyOdJQoIqq}Qv3uP>dlU_!`+YefHQE2yf%5p2%Ub$AVV)yGH1 zAisv>hjzWY;+yZ+jzO$G1?mU_l`EA3s*)5ePfr6mM8nSI@z5pZ)AqCHG&C3ATQe&r zW!k7fYqs!NoKy^pXJ+@=$Ij0EW0O)Lftpq6Sl0eRcHTe^pqh(`q}UKtB&!TUYX}r- zX0}1!)aju1>njRH0KluGnj~UCMcWexu?SENU^Qnb*D4c86OS*QzO8Ii{L!_Q$>%P+ zsjw`h_`DazGvjf=m0RbxpV(Om(GBFQNloG2VRA9*9K$0(TrV9|G_A!n4^ZLN6n&^P zff|)Q>Lo^wg0<~yKJ>Z$4AjNr#)*dvVSn}2S8aK{TjI(Z<3nRcTx*=VG%;%cOQBG5 z20$Rg87P6VIMxm?)ohv&RgvT32v#RN%=Fh^QRW!{ihGINmLa-wnHS5-HtFPB(SL=C zW!0nhm{7jnLM~;{10E;Ax%u<~7>r7=h77S+9`o*X58PW;Fe2J7x-OwODC-K+cUl3N z9|tYG&w-WC5`Za78nqxjs;A!Lr=K4L;0_*_ zJ-arrb%R=;71MTHz(BEh;M3I5|F3oDi+N93wDHY49*nGTsVc~xLs zO?jtdD^ae@jJ&ZUOiZ#Z1z&}ksiWD$NF5V$fk1tKCS?SxA6XTTmR>G*8w>KA>KdF#d)RSBXB;+ygBQr`iPB?Wc z#>2&N-?^Jt-(^)H*P^-d{=~$j(~hbd0ctu}`20FcY%Ulba;2H9z56vz>Ue#q{2e6| zD%7)*o3m6OTL5p$56rm zp&8$M%cK(<(^LF1qw(hLkx5(JE=}HSor^kJenoDsLUY>RoROLe2ajc2tm_Zexfgy$ zh3dU+j%uxkTht!c^iykr;8MiST_d75Z9N=oI~p+~cIF>EfBv&y zg{V$V*)U4xMaCivV{zwiy}4;ZNQGLhu5kJ3WaNtcL~9k_fLG0*N8**CvX6CJR{G7o z@2|h8(Ny$AwQP9q^3sMmg9e*|av358)OSX*L=fl0!N9`Vy?fwCKWujE2v&#G&TMwj z^XlXqcaq+1S}aADMy9A;eD*>QJ(-xe_9-T3r8jXLox8my1m)&^IGc+_LrrXcX3zYxHP1`i$z%@I}_$u00S91Nw)#2DEv2-P@tH|JaTDXt|@<*tw1 zR3DYzIps*xome#Ot^2r#n)>MYgzdLh+&*;dhk*kb zAxc#F)1eARvk{K+=jG-DICrgk4=>-Ey02^2!-o%F9HUKX*_pZ($*lEkdj$q4Fi?U7 zPyyYQ8Jn@lTHjsZ;^)!1bxW_RFI35HhZiPod^_qu*M_|l=XvK6-ar9rfs?U&xI_3^ z_oBc_3rpsAF0NdgdA&8=F(GYKN8ER3H|N3O3P$K7$EIVTNhlHltAz!TpeU_lAq|ck zwJ%{>-L+_s5l8D1Hl#+zB|%lzpnDL5oMDs-J3IF5*u(3$?W+t4b(tR&?w!%M!}5-2 zUUpzv`hi&&YUgiz<9H$G>#y3XaCY(~d6Vbi0R-JE7dWP;ghc!K`MtI28?4~>SA{za z&sBMVv9>&a-g#bciRHd>->be5z(1`YmY)un1(=Dp8xXeg_b@( zjM(b4Ux&;&+&=Y#u30$;9LL{2c2}aOUh`DiyD!{`IBNA>Ic0hNyhD#Ie4cv|o|G_i zL3&SxRvQ!giA(x|QKdmU9EK0z(iBPs5gW(E*P!tw1_q1-gaW4tS&X`ZX9AwXcFy6z zt$0>I-6z+tXJ($lkOhg_>F*yo{BlD>Lte)lPcdHm22LdZA zQz0ZwRXe zgmrWiA*oA9h;P~6Wf%4PRuECrqir{zoq=%e@rX)^U+lYoL1*K%U3D%84uq_|aR0tq z8&!vuRDIR0ce8h%C)q1iN+qiwu;N4$8DJqWpTfpqrt^UQV#0Ki(Z@DWL1ESbiM?)D zZl!soz2D^a=(6GkK`-tmC6hnwSbj~N5q|M z15n2jsK~PAfC|n6hcsM_4+(zQe5nZ{!F%!7K3N-GU$51C_~C~S{jT4~=J4s5%(d~G zR&LD?!`!Q0I~WU|!MSETch8IyiwfdL_{G4;lN_`aIS0BN6ZXw4ey+57Mbjk*GOHwH zbUd^`z{ijvcHz%Q3PAEuPsfTfoq{n^k~sNuK+DLlh#4A*ZLasb?r$_lM4l^Oo$Omz z`N;)<&CJZiTux4FaKg+fD9BVed=&anEzO046!x~(lZ#4=ljB1$5;R5)S$91N-TB?y zn%_VB?&gbmxp#N}IKYDNt9IufRaLQQ6$W!WKga0WV12h4%9k(>AP=zBwAF98(IVP^r@h!xk;&)7!;icl)IRACOG*lycx1=RuMhvx6XlkaEh8p;cJN>UPCz@{chWcp zb!n)@g<*q%Aj@=E!Ez(FKwKl%1mt88l0c;MvK!{zZu%}LY0{*du(-J9>C3lZkb|KR zmq4lqb?{)`7pJ{^d`w1S5IQ$3Z1!vjPHlCj%E(aV4*2qmaUe#8XP*7_S1TF&*+GNs zm5R}j3J)HQTLezXnQH(lrsDvXCDLKVj%8)VCT1o37-twGfJwN+zV!6W#qfx2-mznN zD1)u7J?-kMP^bV^B+`?F;X=G|TrWz@Dk$1h}zxw$Sp@EW7M;1tG=wQGB4q?y@R zY#aStvDt&bW&^9Nw zQ1O^V3OP7m$w)1cc|Zvw!5lcOKQaj2fupb=BtmKv`C(iRp zwf@Kd;w6bp-A$L^-+u>{!T~_^@!ThG(|qKK4J< ze}(-I74|>We}(-I74|>We}(-I74|>We}z5M@89#w_#XXRe#POVXCD0q7z#Ynx%2?Y P00000NkvXXu0mjfSYmoU literal 0 HcmV?d00001 diff --git a/public/new_reedaw/icon/card_hs.png b/public/new_reedaw/icon/card_hs.png new file mode 100644 index 0000000000000000000000000000000000000000..e4579c8735ae4ba0b73cc657d758e8e923b80d70 GIT binary patch literal 15856 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 literal 0 HcmV?d00001 diff --git a/public/new_reedaw/icon/card_ts.png b/public/new_reedaw/icon/card_ts.png new file mode 100644 index 0000000000000000000000000000000000000000..c9036de8db200eeb35d371652a85dc728648ca45 GIT binary patch literal 17786 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 Rp_Bjs002ovPDHLkV1i?dgx~-G literal 0 HcmV?d00001 diff --git a/public/new_reedaw/icon/contrast.png b/public/new_reedaw/icon/contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..07ad7e27ee2bad58222b430a52eb40d1ecb07885 GIT binary patch literal 2330 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 CBG{P# literal 0 HcmV?d00001 diff --git a/public/new_reedaw/icon/inheritHeighet.png b/public/new_reedaw/icon/inheritHeighet.png new file mode 100644 index 0000000000000000000000000000000000000000..3938d2153991c0178ffd8833f94b5bcb92669b0e GIT binary patch literal 1788 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