From 0ae9ae37fd2eb1cda6732a5094be052d500818b6 Mon Sep 17 00:00:00 2001 From: tsf <460834639@qq.com> Date: Tue, 24 Sep 2024 18:40:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=8E=AF=E5=A2=83=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/controller/Appversion.php | 88 ++- application/admin/view/appversion/index.html | 95 +-- application/app/controller/Base.php | 80 +- application/app/controller/Card.php | 4 +- application/app/controller/Cardparts.php | 130 +-- application/app/controller/Index.php | 2 +- application/app/controller/Login.php | 8 +- application/app/controller/Vitalcapacity.php | 67 +- application/route.php | 76 +- application/testapp/controller/Base.php | 470 +++++++++++ .../testapp/controller/Calculatebody.php | 643 +++++++++++++++ application/testapp/controller/Card.php | 728 +++++++++++++++++ application/testapp/controller/Cardparts.php | 462 +++++++++++ application/testapp/controller/Cardpublic.php | 643 +++++++++++++++ application/testapp/controller/Device.php | 271 +++++++ application/testapp/controller/Download.php | 50 ++ application/testapp/controller/Index.php | 640 +++++++++++++++ application/testapp/controller/Login.php | 483 ++++++++++++ .../testapp/controller/Myinformation.php | 154 ++++ .../testapp/controller/Pagingcontrast.php | 602 ++++++++++++++ application/testapp/controller/Skip.php | 364 +++++++++ .../testapp/controller/Sportstesting.php | 737 ++++++++++++++++++ .../testapp/controller/Vitalcapacity.php | 403 ++++++++++ application/testapp/view/download/demo.html | 171 ++++ application/testapp/view/download/demo2.html | 171 ++++ public/appupdatefile/新建 XLS 工作表.xls | Bin 18432 -> 0 bytes public/estimate/20240708082036_ceshi.xlsx | Bin 59253 -> 0 bytes 27 files changed, 7375 insertions(+), 167 deletions(-) create mode 100644 application/testapp/controller/Base.php create mode 100644 application/testapp/controller/Calculatebody.php create mode 100644 application/testapp/controller/Card.php create mode 100644 application/testapp/controller/Cardparts.php create mode 100644 application/testapp/controller/Cardpublic.php create mode 100644 application/testapp/controller/Device.php create mode 100644 application/testapp/controller/Download.php create mode 100644 application/testapp/controller/Index.php create mode 100644 application/testapp/controller/Login.php create mode 100644 application/testapp/controller/Myinformation.php create mode 100644 application/testapp/controller/Pagingcontrast.php create mode 100644 application/testapp/controller/Skip.php create mode 100644 application/testapp/controller/Sportstesting.php create mode 100644 application/testapp/controller/Vitalcapacity.php create mode 100644 application/testapp/view/download/demo.html create mode 100644 application/testapp/view/download/demo2.html delete mode 100644 public/appupdatefile/新建 XLS 工作表.xls delete mode 100644 public/estimate/20240708082036_ceshi.xlsx diff --git a/application/admin/controller/Appversion.php b/application/admin/controller/Appversion.php index 65bd6f6..adbf5c6 100644 --- a/application/admin/controller/Appversion.php +++ b/application/admin/controller/Appversion.php @@ -42,9 +42,9 @@ class Appversion extends Base{ $num = Db::table('app_version_log')->where($parameter)->count(); $result = Db::table('app_version_log')->where($parameter)->order('is_del,id desc')->page($page,$this->page_num)->select(); if(!$pd){ - $result['num'] = $num; - $result['data'] = $result; - return $this->msg(0,'success',$result); + $return_data['num'] = $num; + $return_data['data'] = $result; + return $this->msg($return_data); } $this->assign([ 'result' => $result, @@ -58,6 +58,17 @@ class Appversion extends Base{ return $this->fetch(); } + public function app_edit(){ + $data = input(); + $result = Db::table('app_version_log')->where(['id'=>$data['id']])->find(); + $this->assign([ + 'result' => $result, + ]); + return $this->fetch(); + } + + + public function app_add_action(){ $file = request()->file('apk'); $name = request()->param(); @@ -68,6 +79,22 @@ class Appversion extends Base{ } if($file){ // 移动到框架应用根目录/public/uploads/ 目录下 + + // 设置文件路径 + $filePath = ROOT_PATH . 'public' . DS . 'appupdatefile' . DS . $name['file_name'].'_'.$name['version_num'].'.apk'; + // 检查文件是否存在 + if (file_exists($filePath)) { + // 尝试删除文件 + if (unlink($filePath)) { + // 删除成功 + // echo "文件删除成功。"; + } else { + // 删除失败 + // echo "文件删除失败,请检查权限设置。"; + return $this->msg(10001,'更新文件失败'); + } + } + $file_name_new = $name['file_name'].'_'.$name['version_num'].'.apk'; $info = $file->validate(['size'=>$this->file_max,'ext'=>'apk'])->move(ROOT_PATH . 'public' . DS . 'appupdatefile',$file_name_new); if($info){ @@ -102,6 +129,61 @@ class Appversion extends Base{ } + + public function app_edit_action(){ + $file = request()->file('apk'); + $name = request()->param(); + + if($file){ + // 移动到框架应用根目录/public/uploads/ 目录下 + $app_yz = Db::table('app_version_log')->where(['id'=>$name['id']])->find(); + if($app_yz){ + $file_name_new = $name['file_name'].'_'.$name['version_num'].'.apk'; + if($app_yz['name'] == $name['file_name'] && $app_yz['version_num'] == $name['version_num'] && $app_yz['version_num_original'] == $name['version_num_original'] && $app_yz['content'] == $name['content']){ + $update_data = [ + 'update_time'=>date('Y-m-d H:i:s'), + ]; + }else{ + $update_data = [ + 'name'=>$name['file_name'], + 'version_num'=>$name['version_num'], + 'version_num_original'=>$name['version_num_original'], + 'content'=>$name['content'], + 'download_url'=>'http://tc.pcxbc.com/appupdatefile/'.$file_name_new, + 'update_time'=>date('Y-m-d H:i:s'), + ]; + } + // 如果修改信息不变,直接更新文件即可 + // 设置文件路径 + $filePath = ROOT_PATH . 'public' . DS . 'appupdatefile' . DS . $name['file_name'].'_'.$name['version_num'].'.apk'; + // 检查文件是否存在 + if (file_exists($filePath)) { + // 尝试删除文件 + if (unlink($filePath)) { + // 删除成功 + } else { + return $this->msg(10001,'删除原始文件失败'); + } + } + $info = $file->validate(['size'=>$this->file_max,'ext'=>'apk'])->move(ROOT_PATH . 'public' . DS . 'appupdatefile',$file_name_new); + if($info){ + $result = Db::table('app_version_log')->where(['id'=>$name['id']])->update($update_data); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + }else{ + return $this->msg(10001, $file->getError()); + } + }else{ + return $this->msg(10001,'未找到需要更新的数据'); + } + }else{ + return $this->msg(10001, '文件缺失'); + } + } + public function app_del(){ $data = input(); if(is_array($data['id'])){ diff --git a/application/admin/view/appversion/index.html b/application/admin/view/appversion/index.html index 6b30950..d86290e 100644 --- a/application/admin/view/appversion/index.html +++ b/application/admin/view/appversion/index.html @@ -31,35 +31,8 @@
-
-
@@ -74,7 +47,7 @@ 创建时间 下载 状态 - + 操作 @@ -86,14 +59,16 @@ {$vo.version_num} {$vo.content} {$vo.create_time} - 点击下载 + 点击复制链接 {if condition="$vo.is_del == 1"} 已停用 {else /} 已启用 {/if} - + + + {/volist} @@ -104,24 +79,13 @@
-
\ No newline at end of file diff --git a/application/app/controller/Base.php b/application/app/controller/Base.php index 5984919..a4fa4ca 100644 --- a/application/app/controller/Base.php +++ b/application/app/controller/Base.php @@ -11,7 +11,7 @@ class Base extends Controller{ protected $ceshiyong_token = ['caadd1be045a65f30b92aa805f1de54a','e0966788d02cc93290d9d674921d9715']; protected $base_call_method = ['内部']; - protected $token_time = 86400*30; + protected $token_time = 2592000;//30天的秒数 protected $return_data_all = [ // '0' => ['success',[]], '10001'=>'关键参数缺失', @@ -26,7 +26,10 @@ class Base extends Controller{ '10010'=>'自定义信息', '20001'=>'登录失效', ]; - + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) ################################################################接口################################################################ ################################################################接口################################################################ ################################################################接口################################################################ @@ -118,21 +121,33 @@ class Base extends Controller{ // 判断token是否过期 public function token_time_validate($token){ - if(in_array($token,$this->ceshiyong_token)){ - return true; - } - $time = cache($token); - // dump($time); - if($time === false){ + // if(in_array($token,$this->ceshiyong_token)){ + // return true; + // } + // $time = cache($token); + // if($time === false){ + // Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因没有找到该token', 'log'); + // return false; + // } + // $diff_time = bcsub(time(),$time,0); + // if($diff_time > $this->token_time){ + // Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因当前时间戳减去记录时间戳后为'.$diff_time.'秒,大于规定秒数'.$this->token_time, 'log'); + // return false; + // } + // cache($token, time()); + // Log::record('用户尝试更新token时间,token:' . $token.',记录成功,最新的秒数为'.time(), 'log'); + // return true; + + + if(cache($token) === false){ + Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因没有找到该token,或该token已经超过30天', 'log'); return false; } - $diff_time = time() - $time; - // dump($diff_time); - if($diff_time > $this->token_time){ - return false; - } - cache($token, time()); + $time_now = date('Y-m-d H:i:s'); + cache($token,$time_now,$this->token_time); + Log::record('用户尝试更新token时间,token:' . $token.',记录成功,最新的时间为'.$time_now, 'log'); return true; + } // 计算天数 @@ -387,7 +402,11 @@ class Base extends Controller{ public function msg($data,$str='',$result = []){ if(is_array($data)){ - return json(['code'=>0,'msg'=>'操作成功','data'=>$data]); + if($str != ''){ + return json(['code'=>0,'msg'=>$str,'data'=>$data]); + }else{ + return json(['code'=>0,'msg'=>'操作成功','data'=>$data]); + } }else{ if($str != ''){ return json(['code'=>$data,'msg'=>$str,'data'=>$result]); @@ -399,19 +418,30 @@ class Base extends Controller{ - public function ceshiyong(){ - - phpinfo(); - $token = '2d4ea9b3f44b169ddf64b2f3d2725ceb'; + public function ceshiyong($aa = 4,$gd = 0.2){ + $token = 'caadd1be045a65f30b92aa805f1de54a'; + $jieguo = $this->token_time_validate($token); + // // // Log::record('用户尝试更新token时间,token:' . $token, 'log'); + // // // phpinfo(); + // // dump($jieguo); + // // // return $jieguo; + // // die; + // // cache($token, time()); $time = cache($token); + dump($jieguo); dump($time); - die; - $aa = 15; - $a = 1; + // // die; + + + + + // $aa = 3; + // dump($aa/20); + $a = $aa; for ($i=0; $i < 100; $i++) { - dump($aa.'======='.$aa/15*100); - $aa = $aa - $a; - if($aa < 5){ + dump($a.'======='.$a/$aa*100); + $a = $a - $gd; + if($a < 0){ break; } } diff --git a/application/app/controller/Card.php b/application/app/controller/Card.php index d94a254..c838a9d 100644 --- a/application/app/controller/Card.php +++ b/application/app/controller/Card.php @@ -81,7 +81,7 @@ class Card extends Base{ // 详细卡片信息 // $data = ['id'=>'2'] - public function card_data_detailed($data=['aud_id'=>'61','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + public function card_data_detailed($data=['aud_id'=>'87','token'=>'caadd1be045a65f30b92aa805f1de54a']){ if(count(input('post.')) > 0){ $data = input('post.'); } @@ -271,6 +271,8 @@ class Card extends Base{ }else{ // $curve_bottom = $this->card_curve_target_action($result); $result_end = $this->processing_return_data_new($result[0]); + // dump($result_end); + // die; $cardparts = new Cardparts; // dump($result_end); $result_end['gender'] = $result[0]['gender']; diff --git a/application/app/controller/Cardparts.php b/application/app/controller/Cardparts.php index cc9ec50..048c153 100644 --- a/application/app/controller/Cardparts.php +++ b/application/app/controller/Cardparts.php @@ -38,138 +38,138 @@ class Cardparts extends Base{ protected $fat_r_w = [ 'man'=>[ '29'=>[ - ['min_val'=>'0','max_val'=>'10','text'=>'偏低','color'=>'#ff5656'], - ['min_val'=>'10','max_val'=>'21','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'21','max_val'=>'26','text'=>'偏高','color'=>'#5ad06d'], - ['min_val'=>'26','max_val'=>'50','text'=>'高','color'=>'#6492f6'], + ['min_val'=>'0','max_val'=>'10','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'10','max_val'=>'21','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'21','max_val'=>'26','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'26','max_val'=>'50','text'=>'高','color'=>'#FA5951'], ], '30'=>[ - ['min_val'=>'0','max_val'=>'11','text'=>'偏低','color'=>'#ff5656'], - ['min_val'=>'11','max_val'=>'22','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'22','max_val'=>'27','text'=>'偏高','color'=>'#5ad06d'], - ['min_val'=>'27','max_val'=>'50','text'=>'高','color'=>'#6492f6'], + ['min_val'=>'0','max_val'=>'11','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'11','max_val'=>'22','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'22','max_val'=>'27','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'27','max_val'=>'50','text'=>'高','color'=>'#FA5951'], ], ], 'woman'=>[ '29'=>[ - ['min_val'=>'0','max_val'=>'20','text'=>'偏低','color'=>'#ff5656'], - ['min_val'=>'20','max_val'=>'31','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'31','max_val'=>'38','text'=>'偏高','color'=>'#5ad06d'], - ['min_val'=>'38','max_val'=>'80','text'=>'高','color'=>'#6492f6'], + ['min_val'=>'0','max_val'=>'20','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'20','max_val'=>'31','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'31','max_val'=>'38','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'38','max_val'=>'80','text'=>'高','color'=>'#FA5951'], ], '30'=>[ - ['min_val'=>'0','max_val'=>'21','text'=>'偏低','color'=>'#ff5656'], - ['min_val'=>'21','max_val'=>'32','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'32','max_val'=>'39','text'=>'偏高','color'=>'#5ad06d'], - ['min_val'=>'39','max_val'=>'80','text'=>'高','color'=>'#6492f6'], + ['min_val'=>'0','max_val'=>'21','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'21','max_val'=>'32','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'32','max_val'=>'39','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'39','max_val'=>'80','text'=>'高','color'=>'#FA5951'], ] ] ]; // 肌肉率&肌肉量 protected $muscle_muscleval = [ 'man'=>[ - ['min_val'=>'0','max_val'=>'40','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'40','max_val'=>'60','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'40','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'40','max_val'=>'60','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], ], 'woman'=>[ - ['min_val'=>'0','max_val'=>'30','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'30','max_val'=>'50','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'50','max_val'=>'100','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'30','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'30','max_val'=>'50','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'50','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], ] ]; // 水分 protected $water = [ 'man'=>[ - ['min_val'=>'0','max_val'=>'55','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'55','max_val'=>'65','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'65','max_val'=>'100','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'55','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'55','max_val'=>'65','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'65','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], ], 'woman'=>[ - ['min_val'=>'0','max_val'=>'45','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'45','max_val'=>'60','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'45','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'45','max_val'=>'60','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], ] ]; // 蛋白量&蛋白率 protected $proteinval_protein = [ 'man'=>[ - ['min_val'=>'0','max_val'=>'16','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'16','max_val'=>'18','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'18','max_val'=>'50','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'16','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'16','max_val'=>'18','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'18','max_val'=>'50','text'=>'优','color'=>'#3C66D2'], //蓝 ], 'woman'=>[ - ['min_val'=>'0','max_val'=>'14','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'14','max_val'=>'16','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'16','max_val'=>'50','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'14','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'14','max_val'=>'16','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'16','max_val'=>'50','text'=>'优','color'=>'#3C66D2'], ] ]; // 骨重 protected $bone = [ 'man'=>[ '60'=>[ - ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'2.6','max_val'=>'6','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.6','max_val'=>'6','text'=>'优','color'=>'#3C66D2'], ], '60_75'=>[ - ['min_val'=>'0','max_val'=>'2.8','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'2.8','max_val'=>'3','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'3','max_val'=>'6','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'2.8','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.8','max_val'=>'3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'3','max_val'=>'6','text'=>'优','color'=>'#3C66D2'], ], '75'=>[ - ['min_val'=>'0','max_val'=>'3.1','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'3.1','max_val'=>'3.3','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'3.3','max_val'=>'7','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'3.1','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'3.1','max_val'=>'3.3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'3.3','max_val'=>'7','text'=>'优','color'=>'#3C66D2'], ], ], 'woman'=>[ '45'=>[ - ['min_val'=>'0','max_val'=>'1.7','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'1.7','max_val'=>'1.9','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'1.9','max_val'=>'5','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'1.7','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'1.7','max_val'=>'1.9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'1.9','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], ], '45_60'=>[ - ['min_val'=>'0','max_val'=>'2.1','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'2.1','max_val'=>'2.3','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'2.3','max_val'=>'5','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'2.1','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.1','max_val'=>'2.3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.3','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], ], '60'=>[ - ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'2.6','max_val'=>'5','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.6','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], ], ] ]; // 基础代谢 protected $kcal = [ ['min_val'=>'0','max_val'=>'','text'=>'偏低','color'=>'#ff5656'], - ['min_val'=>'','max_val'=>'9999','text'=>'优','color'=>'#5ad06d'], + ['min_val'=>'','max_val'=>'9999','text'=>'优','color'=>'#3C66D2'], ]; // 内脏指数 protected $visceral = [ 'man'=>[ - ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#5AD06D'], - ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#6492F6'], - ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#3967D6'], + ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#FAB000'], + ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#FA5951'], //红 ], 'woman'=>[ - ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#5AD06D'], - ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#6492F6'], - ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#3967D6'], + ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#FAB000'], + ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#FA5951'], //红 ] ]; // 皮下脂肪 protected $sfr = [ 'man'=>[ - ['min_val'=>'0','max_val'=>'7','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'7','max_val'=>'15','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'15','max_val'=>'50','text'=>'偏高','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'7','text'=>'不足','color'=>'#FCDB67'], //淡黄 + ['min_val'=>'7','max_val'=>'15','text'=>'标准','color'=>'#59D16D'], //绿 + ['min_val'=>'15','max_val'=>'50','text'=>'偏高','color'=>'#FAB000'], //橙 ], 'woman'=>[ - ['min_val'=>'0','max_val'=>'11','text'=>'不足','color'=>'#ff5656'], - ['min_val'=>'11','max_val'=>'17','text'=>'标准','color'=>'#ffab00'], - ['min_val'=>'17','max_val'=>'50','text'=>'偏高','color'=>'#5ad06d'], + ['min_val'=>'0','max_val'=>'11','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'11','max_val'=>'17','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'17','max_val'=>'50','text'=>'偏高','color'=>'#FAB000'], ] ]; diff --git a/application/app/controller/Index.php b/application/app/controller/Index.php index 7860c2f..4795133 100644 --- a/application/app/controller/Index.php +++ b/application/app/controller/Index.php @@ -263,7 +263,7 @@ class Index extends Base{ } // 获取所有卡片列表信息 - public function get_card_all_list($data = ['aud_id'=>11,'token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + public function get_card_all_list($data = ['aud_id'=>83,'token'=>'caadd1be045a65f30b92aa805f1de54a']){ if(count(input('post.')) > 0){ $data = input('post.'); } diff --git a/application/app/controller/Login.php b/application/app/controller/Login.php index e8ccc8d..41d7fe8 100644 --- a/application/app/controller/Login.php +++ b/application/app/controller/Login.php @@ -10,7 +10,7 @@ use \think\Validate; use PHPMailer\PHPMailer\PHPMailer; class Login extends Base{ - protected $code_time = 60; + protected $code_time = 50; protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png'; @@ -140,7 +140,7 @@ class Login extends Base{ $result = Db::table('app_account_number')->insertGetId($set_data); if($result){ cache($set_data['token'], time()); - return $this->msg(['token'=>$set_data['token'],'aan_id'=>$result]); + return $this->msg(['token'=>$set_data['token'],'aan_id'=>$result],'登录成功'); }else{ return $this->msg(10002); } @@ -159,7 +159,7 @@ class Login extends Base{ return $this->msg(10003,'账号密码错误'); }else{ cache($result['token'], time()); - return $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']]); + return $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']],'登录成功'); } }else{ return $this->msg(10003,'账号未注册,请先注册'); @@ -275,7 +275,7 @@ class Login extends Base{ $postData = array( 'phone' => $tel, // 'content' => '您好,欢迎使用Reedaw,您的手机验证码是:'.$code.',验证码三分钟内有效,若非本人操作,请忽略!' - 'content' => '测试验证码为:'.$code + 'content' => '【Reedaw】您好,欢迎使用Reedaw,您的验证码是:'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信' ); $postData = json_encode($postData); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); diff --git a/application/app/controller/Vitalcapacity.php b/application/app/controller/Vitalcapacity.php index f8d19de..524780b 100644 --- a/application/app/controller/Vitalcapacity.php +++ b/application/app/controller/Vitalcapacity.php @@ -8,7 +8,7 @@ use think\Db; class Vitalcapacity extends Base{ 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'],'score_val'=>['分数','分/分','#009DFF'],]; + protected $curve_data_format = ['one_val'=>['第一次','容积/ml','#009DFF'],'two_val'=>['第二次','容积/ml','#009DFF'],'three_val'=>['第三次','容积/ml','#009DFF'],'average_val'=>['平均','容积/ml','#009DFF']]; protected $standard0 = ['优秀','良好','及格','不及格','无效']; protected $standard = [ ['min_val'=>'90','max_val'=>'100','text'=>'优秀','color'=>'#6492F6'], @@ -36,7 +36,7 @@ class Vitalcapacity extends Base{ ################################################################接口################################################################ // 手动数据记录 - public function vitalcapacity_save_record_data($data = ['aud_id'=>'89','one'=>'1560','two'=>'1560','three'=>'1560','time'=>'2024-07-23','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + public function vitalcapacity_save_record_data($data = ['aud_id'=>'83','one'=>'1523','two'=>'1825','three'=>'1896','time'=>'2024-07-23','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input('post.')) > 0){ $data = input('post.'); } @@ -53,7 +53,7 @@ class Vitalcapacity extends Base{ return $this->vitalcapacity_save_record_data_action($data); } // 设备数据记录 - public function vitalcapacity_save_record_data_device($data = ['aud_id'=>'89','one'=>'1500','two'=>'1500','three'=>'1200','flow'=>'88.88','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + public function vitalcapacity_save_record_data_device($data = ['aud_id'=>'99','one'=>'1523','two'=>'1825','three'=>'1896','flow'=>'88.88','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input('post.')) > 0){ $data = input('post.'); } @@ -70,7 +70,8 @@ class Vitalcapacity extends Base{ return $this->vitalcapacity_save_record_data_action($data); } // 数据报告 - public function vitalcapacity_data_report($data = ['aud_id'=>'89','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + public function vitalcapacity_data_report($data = ['aud_id'=>'83','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ $data = input('post.'); } @@ -84,7 +85,7 @@ class Vitalcapacity extends Base{ return $this->vitalcapacity_data_report_action($data); } // 曲线 - public function vitalcapacity_curve_chart($data = ['aud_id'=>'89','time'=>'2024-07-23','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + public function vitalcapacity_curve_chart($data = ['aud_id'=>'83','time'=>'2024','token'=>'caadd1be045a65f30b92aa805f1de54a']){ if(count(input('post.')) > 0){ $data = input('post.'); } @@ -141,7 +142,13 @@ class Vitalcapacity extends Base{ return $this->msg(10004); } + $standard_data = $this->get_vitalcapacity_data($data['aud_id']); + // dump($standard_data); + // die; + $temporary_arr['standard_data'] = json_encode($standard_data); + // dump($temporary_arr); + // die; $result = Db::table('app_card_vitalcapacity_data')->insert($temporary_arr); if($result){ @@ -163,7 +170,7 @@ class Vitalcapacity extends Base{ ################################################################vitalcapacity_data_report public function vitalcapacity_data_report_action($data){ - $result = Db::table('app_card_vitalcapacity_data')->where(['aud_id'=>$data['aud_id']])->order('record_time desc')->field('record_time,score,average,flow_val')->limit(1)->select(); + $result = Db::table('app_card_vitalcapacity_data')->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); @@ -182,7 +189,10 @@ class Vitalcapacity extends Base{ $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 = $this->get_vitalcapacity_data($data['aud_id']); + $standard_data = json_decode($result[0]['standard_data'],true); + // dump($result); + // die; return $this->msg([ 'average'=>$result[0]['average'].'ml', 'level'=>$o_l[1], @@ -243,7 +253,7 @@ class Vitalcapacity extends Base{ $temporary_arr['line']['series'][0]['data'] = []; // dump($temporary_arr['title']); foreach ($result as $k => $v) { - // dump($key_condition); + // dump($k); // if($result[$k][$key] == 26.43){ // dump(123); // } @@ -342,6 +352,47 @@ class Vitalcapacity extends Base{ 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; + } + } + // dump($data); + // dump($val); + // dump($max); + // dump($min); + // dump($num); + + // 计算每份占比 + $share_value = bcdiv($temporary_qj[0]['max_val'],count($temporary_qj),1); + // 计算在这一段中占多少 + $result = bcsub($val,$min,1); + // dump($result); + $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); + // dump($share_value); + // $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; + } ################################################################other################################################################ diff --git a/application/route.php b/application/route.php index 0b6031f..bd97155 100644 --- a/application/route.php +++ b/application/route.php @@ -67,8 +67,10 @@ Route::any('/device/device_del', 'admin/device/device_del'); // APP版本管理 Route::any('/appversion/index', 'admin/appversion/index'); Route::any('/appversion/app_add', 'admin/appversion/app_add'); +Route::any('/appversion/app_edit', 'admin/appversion/app_edit'); Route::any('/appversion/app_del', 'admin/appversion/app_del'); Route::any('/appversion/app_add_action', 'admin/appversion/app_add_action'); +Route::any('/appversion/app_edit_action', 'admin/appversion/app_edit_action'); // 联系我们H5 Route::any('/technology/index', 'admin/technology/index'); @@ -89,124 +91,175 @@ Route::any('/technology/set_user_opinion', 'admin/technology/set_user_opinion'); // ################################公共接口################################ // 获取记录信息(分组)(包含身体、跳绳、肺活量)、 Route::any('/get_all_record_data_group', 'app/pagingcontrast/get_all_record_data_group'); +Route::any('/testedition/get_all_record_data_group', 'testapp/pagingcontrast/get_all_record_data_group'); // 获取记录信息(分页)(包含身体、跳绳、肺活量) Route::any('/get_all_record_data_page', 'app/pagingcontrast/get_all_record_data_page'); +Route::any('/testedition/get_all_record_data_page', 'testapp/pagingcontrast/get_all_record_data_page'); // 获取详细历史数据信息 Route::any('/get_all_record_detailed_information', 'app/pagingcontrast/get_all_record_detailed_information'); +Route::any('/testedition/get_all_record_detailed_information', 'testapp/pagingcontrast/get_all_record_detailed_information'); // 数据对比 Route::any('/get_all_card_data_contrast', 'app/pagingcontrast/get_all_card_data_contrast'); +Route::any('/testedition/get_all_card_data_contrast', 'testapp/pagingcontrast/get_all_card_data_contrast'); // 删除某个历史数据 Route::any('/card_del_record_data', 'app/pagingcontrast/del_all_record_data'); +Route::any('/testedition/card_del_record_data', 'testapp/pagingcontrast/del_all_record_data'); // 检测版本及判断是否登录失效 Route::any('/login_invalid_version', 'app/index/login_invalid_version'); +Route::any('/testedition/login_invalid_version', 'testapp/index/login_invalid_version'); // ################################登录接口################################ // 注册接口12 Route::any('/register_action', 'app/login/register_action'); +Route::any('/testedition/register_action', 'testapp/login/register_action'); // 重置密码 Route::any('/reset_password', 'app/login/reset_password'); +Route::any('/testedition/reset_password', 'testapp/login/reset_password'); // 登录接口 Route::any('/login_action', 'app/login/login_action'); +Route::any('/testedition/login_action', 'testapp/login/login_action'); // 手机或者邮箱验证码接口接口 Route::any('/send_phone_email_code', 'app/login/send_phone_email_code'); +Route::any('/testedition/send_phone_email_code', 'testapp/login/send_phone_email_code'); // 退出登录操作 Route::any('/user_quit_account', 'app/login/user_quit_account'); +Route::any('/testedition/user_quit_account', 'testapp/login/user_quit_account'); // 删除账号 Route::any('/delete_account', 'app/login/delete_account'); +Route::any('/testedition/delete_account', 'testapp/login/delete_account'); // ################################APP首页接口################################ // 创建用户 Route::any('/create_user_data', 'app/index/create_user_data'); +Route::any('/testedition/create_user_data', 'testapp/index/create_user_data'); // 删除用户 Route::any('/del_user_data', 'app/index/del_user_data'); +Route::any('/testedition/del_user_data', 'testapp/index/del_user_data'); // 修改用户 Route::any('/update_user_data', 'app/index/update_user_data'); +Route::any('/testedition/update_user_data', 'testapp/index/update_user_data'); // 获取账号下用户列表 Route::any('/get_user_card_list', 'app/index/get_user_card_list'); +Route::any('/testedition/get_user_card_list', 'testapp/index/get_user_card_list'); // 获取指定用户详细信息 Route::any('/get_user_data_information', 'app/index/get_user_data_information'); +Route::any('/testedition/get_user_data_information', 'testapp/index/get_user_data_information'); // 获取所有卡片列表信息 Route::any('/get_card_all_list', 'app/index/get_card_all_list'); +Route::any('/testedition/get_card_all_list', 'testapp/index/get_card_all_list'); // 保存用户的卡片排序 Route::any('/save_user_card_order', 'app/index/save_user_card_order'); +Route::any('/testedition/save_user_card_order', 'testapp/index/save_user_card_order'); // 获取年级列表 // Route::any('/get_grade_identity_list', 'app/index/get_grade_identity_list'); Route::any('/get_grade_list', 'app/index/get_grade_list'); +Route::any('/testedition/get_grade_list', 'testapp/index/get_grade_list'); // ################################身体数据卡片接口################################ // 报告页详情 Route::any('/card_data_detailed', 'app/card/card_data_detailed'); +Route::any('/testedition/card_data_detailed', 'testapp/card/card_data_detailed'); // 手动记录接口 Route::any('/card_manual_recording', 'app/card/card_manual_recording'); +Route::any('/testedition/card_manual_recording', 'testapp/card/card_manual_recording'); // 设备记录 Route::any('/card_manual_recording_device', 'app/card/card_manual_recording_device'); +Route::any('/testedition/card_manual_recording_device', 'testapp/card/card_manual_recording_device'); // 修改初始体重/目标体重 Route::any('/card_modify_weight', 'app/card/card_modify_weight'); +Route::any('/testedition/card_modify_weight', 'testapp/card/card_modify_weight'); // 曲线页面图表 Route::any('/card_curve_chart', 'app/card/card_curve_chart'); +Route::any('/testedition/card_curve_chart', 'testapp/card/card_curve_chart'); // 曲线页面底部目标 Route::any('/card_curve_target', 'app/card/card_curve_target'); +Route::any('/testedition/card_curve_target', 'testapp/card/card_curve_target'); // ################################跳绳接口################################ // 手动记录 Route::any('/skip_manual_recording', 'app/skip/skip_manual_recording'); +Route::any('/testedition/skip_manual_recording', 'testapp/skip/skip_manual_recording'); // 设备记录 Route::any('/skip_manual_recording_device', 'app/skip/skip_manual_recording_device'); +Route::any('/testedition/skip_manual_recording_device', 'testapp/skip/skip_manual_recording_device'); // 今日数据 Route::any('/skip_today_data', 'app/skip/skip_today_data'); +Route::any('/testedition/skip_today_data', 'testapp/skip/skip_today_data'); // 运动曲线 Route::any('/skip_curve_chart', 'app/skip/skip_curve_chart'); +Route::any('/testedition/skip_curve_chart', 'testapp/skip/skip_curve_chart'); // 删除某个历史数据 Route::any('/skip_del_record_data', 'app/skip/skip_del_record_data'); +Route::any('/testedition/skip_del_record_data', 'testapp/skip/skip_del_record_data'); // ################################肺活量接口################################ // 记录数据 Route::any('/vitalcapacity_save_record_data', 'app/vitalcapacity/vitalcapacity_save_record_data'); Route::any('/vitalcapacity_save_record_data_device', 'app/vitalcapacity/vitalcapacity_save_record_data_device'); +Route::any('/testedition/vitalcapacity_save_record_data', 'testapp/vitalcapacity/vitalcapacity_save_record_data'); +Route::any('/testedition/vitalcapacity_save_record_data_device', 'testapp/vitalcapacity/vitalcapacity_save_record_data_device'); // 报告数据(上次数据) Route::any('/vitalcapacity_data_report', 'app/vitalcapacity/vitalcapacity_data_report'); +Route::any('/testedition/vitalcapacity_data_report', 'testapp/vitalcapacity/vitalcapacity_data_report'); // 曲线 Route::any('/vitalcapacity_curve_chart', 'app/vitalcapacity/vitalcapacity_curve_chart'); +Route::any('/testedition/vitalcapacity_curve_chart', 'testapp/vitalcapacity/vitalcapacity_curve_chart'); // ################################估分接口################################ // 获取类型列表 Route::any('/sportstesting_get_type_list', 'app/sportstesting/sportstesting_get_type_list'); +Route::any('/testedition/sportstesting_get_type_list', 'testapp/sportstesting/sportstesting_get_type_list'); // 获取类型列表 Route::any('/sportstesting_get_region_list', 'app/sportstesting/sportstesting_get_region_list'); +Route::any('/testedition/sportstesting_get_region_list', 'testapp/sportstesting/sportstesting_get_region_list'); // 获取估分最后一次数据 Route::any('/sportstesting_get_last_data', 'app/sportstesting/sportstesting_get_last_data'); +Route::any('/testedition/sportstesting_get_last_data', 'testapp/sportstesting/sportstesting_get_last_data'); // 获取估分历史列表 Route::any('/sportstesting_get_all_list', 'app/sportstesting/sportstesting_get_all_list'); +Route::any('/testedition/sportstesting_get_all_list', 'testapp/sportstesting/sportstesting_get_all_list'); // 获取估分历史详情 Route::any('/sportstesting_get_one_details', 'app/sportstesting/sportstesting_get_one_details'); +Route::any('/testedition/sportstesting_get_one_details', 'testapp/sportstesting/sportstesting_get_one_details'); // 计算并存储数据 Route::any('/sportstesting_set_once_data', 'app/sportstesting/sportstesting_set_once_data'); +Route::any('/testedition/sportstesting_set_once_data', 'testapp/sportstesting/sportstesting_set_once_data'); // 获取估分已有的地区列表 Route::any('/sportstesting_get_city_list', 'app/sportstesting/sportstesting_get_city_list'); +Route::any('/testedition/sportstesting_get_city_list', 'testapp/sportstesting/sportstesting_get_city_list'); // ################################设备管理################################ // 获取系统设备列表 Route::any('/device_data_list', 'app/device/device_data_list'); +Route::any('/testedition/device_data_list', 'testapp/device/device_data_list'); // 绑定系统设备 Route::any('/device_binding', 'app/device/device_binding'); +Route::any('/testedition/device_binding', 'testapp/device/device_binding'); // 获取用户设备列表 Route::any('/device_user_data_list', 'app/device/device_user_data_list'); +Route::any('/testedition/device_user_data_list', 'testapp/device/device_user_data_list'); // 解绑系统设备 Route::any('/device_unbinding', 'app/device/device_unbinding'); +Route::any('/testedition/device_unbinding', 'testapp/device/device_unbinding'); // 根据mac获取设备信息 Route::any('/device_mac_get_content', 'app/device/device_mac_get_content'); +Route::any('/testedition/device_mac_get_content', 'testapp/device/device_mac_get_content'); // // 计算并存储数据 // Route::any('/device_data_list', 'app/device/device_data_list'); // ################################我的接口################################ // 获取账号信息 Route::any('/get_my_account_msg', 'app/myinformation/get_my_account_msg'); +Route::any('/testedition/get_my_account_msg', 'testapp/myinformation/get_my_account_msg'); // 修改昵称 Route::any('/update_my_nickname', 'app/myinformation/update_my_nickname'); +Route::any('/testedition/update_my_nickname', 'testapp/myinformation/update_my_nickname'); // 邮箱/手机绑定 Route::any('/update_my_account_msg', 'app/myinformation/update_my_account_msg'); +Route::any('/testedition/update_my_account_msg', 'testapp/myinformation/update_my_account_msg'); // 修改密码 Route::any('/update_my_password', 'app/myinformation/update_my_password'); +Route::any('/testedition/update_my_password', 'testapp/myinformation/update_my_password'); // // 报告数据(上次数据) // Route::any('/vitalcapacity_data_report', 'app/sportstesting/vitalcapacity_data_report'); // // 曲线 @@ -214,11 +267,28 @@ Route::any('/update_my_password', 'app/myinformation/update_my_password'); // ################################通用卡片接口################################ // 报告页详情 -Route::any('/get_card_content', 'app/cardpublic/get_card_content'); +// Route::any('/get_card_content', 'app/cardpublic/get_card_content'); +Route::any('/testedition/get_card_content', 'testapp/cardpublic/get_card_content'); // 存储数据 -Route::any('/public_data_save', 'app/cardpublic/data_save'); +// Route::any('/public_data_save', 'app/cardpublic/data_save'); +Route::any('/testedition/public_data_save', 'testapp/cardpublic/data_save'); // 获取标签项目信息 -Route::any('/get_label_list', 'app/cardpublic/get_label_list'); +// Route::any('/get_label_list', 'app/cardpublic/get_label_list'); +Route::any('/testedition/get_label_list', 'testapp/cardpublic/get_label_list'); +// 卡片运动曲线 +// Route::any('/card_motion_curve', 'app/cardpublic/card_motion_curve'); +Route::any('/testedition/card_motion_curve', 'testapp/cardpublic/card_motion_curve'); +// 获取手动记录内容 +// Route::any('/obtain_manual_record_content', 'app/cardpublic/obtain_manual_record_content'); +Route::any('/testedition/obtain_manual_record_content', 'testapp/cardpublic/obtain_manual_record_content'); +// 数据对比-获取数据 +// Route::any('/data_contrast_obtain_data', 'app/cardpublic/data_contrast_obtain_data'); +Route::any('/testedition/data_contrast_obtain_data', 'testapp/cardpublic/data_contrast_obtain_data'); +// 数据对比-对比数据 +// Route::any('/data_contrast_contrast_data', 'app/cardpublic/data_contrast_contrast_data'); +Route::any('/testedition/data_contrast_contrast_data', 'testapp/cardpublic/data_contrast_contrast_data'); + + // // ################################################################其它测试################################################################ diff --git a/application/testapp/controller/Base.php b/application/testapp/controller/Base.php new file mode 100644 index 0000000..d126394 --- /dev/null +++ b/application/testapp/controller/Base.php @@ -0,0 +1,470 @@ +'test_app_data_log', + '2'=>'test_app_card_data', + '3'=>'test_app_user_data', + '4'=>'test_pc_vitalcapacity_standard']; + protected $ceshiyong_token = ['57bd45e3a963b372ea2d873e4bd8d1f8','e0966788d02cc93290d9d674921d9715']; + protected $base_call_method = ['内部']; + protected $token_time = 2592000;//30天的秒数 + protected $return_data_all = [ + // '0' => ['success',[]], + '10001'=>'关键参数缺失', + '10002'=>'操作失败', + '10003'=>'信息核实错误', + '10004'=>'未找到有效数据', + '10005'=>'参数格式错误', + '10006'=>'参数不能为空', + '10007'=>'参数错误', + '10008'=>'', + '10009'=>'', + '10010'=>'自定义信息', + '20001'=>'登录失效', + ]; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 操作记录留存 + // $data = ['aud_id'=>'xxxxxxxxxxxxxxx','order_list'=>[1,2,3,4,5]] + public function abnormal_data_log_action($dacall_methoda = 0,$content='未记录的内容',$use_database_name='未记录的数据库名'){ + $result = Db::table($this->base_use_db_name['1'])->insert([ + 'create_time'=>date('Y-m-d H:i:s'), + 'call_method'=>$this->base_call_method[$dacall_methoda], + 'content'=>$content, + 'use_database_name'=>$use_database_name, + ]); + } + + // 检查变量是否是一个只有数字的一维数组 + public function is_num_array($array = [1,2,3],$type=1) { + if (!is_array($array)) { + return false; // 变量不是数组 + } + foreach ($array as $value) { + if (!is_numeric($value)) { + return false; // 数组中包含非数字元素 + } + } + if($type!=1){ + return true; + } + $result = Db::table($this->base_use_db_name['2'])->where(['is_del'=>0])->cache(true,3600)->select();//查询结果缓存3600秒 + if(empty(array_diff($array, array_column($result, 'id')))){ + return true;// 数组是一维的且只包含数字,且已经跟数据库比对过,每个数值都是有效 + }else{ + return false;//跟数据库比对过,存在无效数值 + } + } + public function validate_user_identity($data) { + $validate_user = Db::table($this->base_use_db_name['3'])->where(['id'=>$data])->count(); + if($validate_user<=0){ + return false; + }else{ + return true; + } + } + // 判断字符串是手机还是邮箱 + public function is_tel_email($str) { + // 手机号码的正则表达式(中国大陆格式)(下面正则实际判断的是是否为11位数字) + $mobilePattern = '/^\d{11}$/'; + // 电子邮件地址的正则表达式 + $emailPattern = '/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/'; + // 判断是否为手机号码 + if (preg_match($mobilePattern, $str)) { + return 'tel'; + } + // 判断是否为电子邮件地址 + if (preg_match($emailPattern, $str)) { + return 'email'; + } + // 如果都不是,返回其他 + return false; + } + + // 计算年龄 + public function calculate_age($data = '1991-04-20'){ + $today = time(); // 获取当前时间的 Unix 时间戳 + $birthDate = strtotime($data); // 将出生日期字符串转换为 Unix 时间戳 + if ($birthDate !== false) { + $age = date('Y', $today) - date('Y', $birthDate); + // 如果当前年份的月份和日期小于出生年份的月份和日期,那么年龄减一 + if (date('m-d', $today) < date('m-d', $birthDate)) { + $age--; + } + return $age; + } else { + return false; + } + } + // 秒转化格式,00:00:00 + public function handle_hour_branch_second($data = '2000'){ + $data = abs($data); + $hours = intval($data / 3600); + $minutes = intval(($data % 3600) / 60); + $remainingSeconds = $data % 60; + return [ + 'h' => str_pad($hours, 2, '0', STR_PAD_LEFT), + 'm' => str_pad($minutes, 2, '0', STR_PAD_LEFT), + 's' => str_pad($remainingSeconds, 2, '0', STR_PAD_LEFT) + ]; + } + + // 判断token是否过期 + public function token_time_validate($token){ + // if(in_array($token,$this->ceshiyong_token)){ + // return true; + // } + // $time = cache($token); + // if($time === false){ + // Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因没有找到该token', 'log'); + // return false; + // } + // $diff_time = bcsub(time(),$time,0); + // if($diff_time > $this->token_time){ + // Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因当前时间戳减去记录时间戳后为'.$diff_time.'秒,大于规定秒数'.$this->token_time, 'log'); + // return false; + // } + // cache($token, time()); + // Log::record('用户尝试更新token时间,token:' . $token.',记录成功,最新的秒数为'.time(), 'log'); + // return true; + if(is_string($token)){ + $length = strlen($token); + if ($length < 10 ) { + return false; + } + }else{ + return false; + } + if(cache($token) === false){ + Log::record('用户尝试更新token时间,token:' . $token.',但是更新token失败,原因没有找到该token,或该token已经超过30天', 'log'); + return false; + } + $time_now = date('Y-m-d H:i:s'); + cache($token,$time_now,$this->token_time); + Log::record('用户尝试更新token时间,token:' . $token.',记录成功,最新的时间为'.$time_now, 'log'); + return true; + } + + // 计算天数 + public function daysSince($pastDate,$now = false) + { + // 创建一个表示过去日期的 DateTime 对象 + $past = new \DateTime($pastDate); + if($now === false){ + // 创建一个表示当前日期的 DateTime 对象 + $now = new \DateTime(); + }else{ + $now = new \DateTime($now); + } + // 使用 DateTime::diff() 方法计算两个日期之间的差值 + $interval = $past->diff($now); + // 返回相差的天数 + return $interval->format('%a'); + } + + // 计算月龄 + public function calculateAgeInMonthsWithPrecision($birthDateStr) { + // 获取当前日期 + $now = new \DateTime(); + // 将出生日期字符串转换为 DateTime 对象 + $birthDate = \DateTime::createFromFormat('Y-m-d', $birthDateStr); + // 计算两者之间的差距(以月为单位,包含部分月份的小数) + $interval = $now->diff($birthDate); + $ageInMonths = $interval->y * 12 + $interval->m; // 年份乘以12加上月份 + $remainingDays = $interval->d; // 当前月内的剩余天数 + // 将剩余天数转换为小数月份(假设一个月为30天,进行近似计算) + $partialMonth = $remainingDays / 30; + // 结果精确到小数点后两位 + // $ageInMonthsPrecise = round($ageInMonths + $partialMonth, 2); + // 整月+剩余月取整 + $ageInMonthsPrecise = intval($ageInMonths + $partialMonth); + return $ageInMonthsPrecise; + } + // 曲线页面-底部统计动作 + public function base_target_initial_cumulative_weight($data = []){ + // 第一种:用户详情(所有数据都有) + // 第二种:手动记录(只有最新体重) + // 第三种:修改原始体重(只有原始体重) + // dump($data); + if(count($data) > 0){ + $result_data['target_weight'] = $data['target_weight']; + $result_data['initial_weight'] = $data['initial_weight']; + $result_data['cumulative_weight'] = bcsub($data['weight'],$data['initial_weight'],2); + $result_data['cumulative_day'] = $data['initial_date'] == 0?0:$this->daysSince($data['initial_date']); + }else{ + $result_data['target_weight'] = 0; + $result_data['initial_weight'] = 0; + $result_data['cumulative_weight'] = 0; + $result_data['cumulative_day'] = 0; + } + // dump($result_data); + return $result_data; + } + + // 判断一个参数是否为数字且大于等于0 + public function isPositiveNumber($value) { + return is_numeric($value) && $value >= 0; + } + // 判断是否为整型,或者字符串类型的整型数字 + public function isValidInteger($var) { + // 直接检查是否为整型 + if (is_int($var)) { + return true; + } + + // 检查是否为字符串且是有效的整数表示 + if (is_string($var) && filter_var($var, FILTER_VALIDATE_INT) !== false) { + return true; + } + + // 其他情况 + return false; + } + + // 判断一个字符串是否为两位以内小数 + public function isTwoDecimalOrLess($str) { + return preg_match('/^\d*(\.\d{1,2})?$/', $str) === 1; + } + + // 获取用户肺活量的标准值 + public function get_vitalcapacity_data($id){ + $standard_data = [ + ['min_val'=>'90','max_val'=>'100','text'=>'优秀','color'=>'#6492F6'], + ['min_val'=>'80','max_val'=>'89','text'=>'良好','color'=>'#5AD06D'], + ['min_val'=>'60','max_val'=>'79','text'=>'及格','color'=>'#FFAB00'], + ['min_val'=>'10','max_val'=>'59','text'=>'不及格','color'=>'#FF5656'], + ['min_val'=>'0','max_val'=>'9','text'=>'无效','color'=>'#FF5656'], + ]; + $grade = Db::table($this->base_use_db_name['3'])->where(['id'=>$id])->field('id,grade,gender')->find(); + if(!$grade || $grade['grade'] == 'nothing'){ + return []; + } + $sql_min = "WITH RankedGrades AS ( + SELECT + id, + level, + ".$grade['grade'].", + ROW_NUMBER() OVER(PARTITION BY level ORDER BY ".$grade['grade']." ASC, id ASC) AS rn + FROM + ".$this->base_use_db_name['4']." + WHERE + sex = ".$grade['gender']." + ) + SELECT + id, + level, + ".$grade['grade']." + FROM + RankedGrades + WHERE + rn = 1"; + // dump($sql_min); + $result_min = Db::query($sql_min); + // dump($result_min); + // die; + foreach ($result_min as $key => $value) { + foreach ($standard_data as $sdk => $sdv) { + if($value['level'] == $sdv['text']){ + $standard_data[$sdk]['min_val'] = $value[$grade['grade']]; + } + } + } + for ($i=count($standard_data)-1; $i >= 1; $i--) { + $standard_data[$i]['max_val'] = $standard_data[$i-1]['min_val']; + } + $standard_data[0]['max_val'] = '5140'; + return $standard_data; + } + + + // 时间日期转换 + public function addCurrentTimeToDateString($dateStr) { + // 将日期字符串转换为DateTime对象 + $dateTime = new \DateTime($dateStr); + + // 获取当前的时分秒 + $currentTime = new \DateTime('now'); + $hours = $currentTime->format('H'); + $minutes = $currentTime->format('i'); + $seconds = $currentTime->format('s'); + + // 设置DateTime对象的时间部分为当前时间 + $dateTime->setTime($hours, $minutes, $seconds); + + // 返回格式化为"Y-m-d H:i:s"的字符串 + return $dateTime->format('Y-m-d H:i:s'); + } + + // 处理分秒变秒 + function convertMinutesSecondsToStringSeconds($timeString) { + // 分割字符串获取分钟和秒 + list($minutes, $seconds) = explode(':', $timeString); + // 将分钟和秒转换为秒 + $totalSeconds = ($minutes * 60) + intval($seconds); // 确保秒是整数 + return $totalSeconds; + } + + // 时间加一或者减一 + public function adjustDateTime($datetimeStr, $type) { + // 将时间字符串转换为时间戳 + $timestamp = strtotime($datetimeStr); + + // 检查时间戳是否有效 + if ($timestamp === false) { + return "无效的日期时间格式"; + } + + // 根据$type参数调整时间戳 + switch ($type) { + case 'add': + $newTimestamp = strtotime('+1 day', $timestamp); + break; + case 'subtract': + $newTimestamp = strtotime('-1 day', $timestamp); + break; + default: + return false; + } + + // 将新的时间戳转换回日期时间字符串 + $newDateTimeStr = date('Y-m-d', $newTimestamp); + + return $newDateTimeStr; + } + + // 对于任意浮点字符串的指定位四舍五入 + public function roundToString($numberStr, $numDecimals) { + // 将字符串转换为浮点数 + $number = floatval($numberStr); + + // 四舍五入到指定的小数位数 + $roundedNumber = round($number, $numDecimals); + + // 将结果转换回字符串 + return strval($roundedNumber); + } + + + public function postRequest($url, $data = [], $headers = []) { + $ch = curl_init(); // 初始化cURL会话 + + if (!$ch) { + return [ + 'error' => true, + 'message' => 'cURL init failed' + ]; + } + // 设置cURL选项 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用证书验证 + curl_setopt($ch, CURLOPT_URL, $url); // 要请求的URL + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出 + curl_setopt($ch, CURLOPT_POST, true); // 发送一个常规的POST请求 + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // POST数据 + // 设置请求头 + if (!empty($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + }else{ + // 如果需要发送JSON数据,可以使用以下设置: + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); + } + // 执行cURL会话 + $response = curl_exec($ch); + + if ($response === false) { + $error = curl_error($ch); + curl_close($ch); + return [ + 'error' => true, + 'message' => "cURL Error: $error" + ]; + } + $decodedResponse = json_decode($response, true); + $jsonError = json_last_error(); + curl_close($ch); + + if ($jsonError !== JSON_ERROR_NONE) { + return [ + 'error' => true, + 'message' => 'Invalid JSON Response', + 'raw_response' => $response + ]; + } + return $decodedResponse; + } + + + + public function msg($data,$str='',$result = []){ + if(is_array($data)){ + if($str != ''){ + return json(['code'=>0,'msg'=>$str,'data'=>$data]); + }else{ + return json(['code'=>0,'msg'=>'操作成功','data'=>$data]); + } + }else{ + if($str != ''){ + return json(['code'=>$data,'msg'=>$str,'data'=>$result]); + } + return json(['code'=>$data,'msg'=>$this->return_data_all[$data],'data'=>$result]); + } + } + + + + + public function ceshiyong($aa = 4,$gd = 0.2){ + $token = 'caadd1be045a65f30b92aa805f1de54a'; + $jieguo = $this->token_time_validate($token); + // // // Log::record('用户尝试更新token时间,token:' . $token, 'log'); + // // // phpinfo(); + // // dump($jieguo); + // // // return $jieguo; + // // die; + // // cache($token, time()); + $time = cache($token); + dump($jieguo); + dump($time); + // // die; + + + + + // $aa = 3; + // dump($aa/20); + $a = $aa; + for ($i=0; $i < 100; $i++) { + dump($a.'======='.$a/$aa*100); + $a = $a - $gd; + if($a < 0){ + break; + } + } + // $aa = 15; + // $a = 1; + // for ($i=0; $i < 100; $i++) { + // dump($aa.'======='.$aa/17.5*100); + // $aa = $aa - $a; + // if($aa < 1){ + // break; + // } + // } + } + + +} \ No newline at end of file diff --git a/application/testapp/controller/Calculatebody.php b/application/testapp/controller/Calculatebody.php new file mode 100644 index 0000000..90f3429 --- /dev/null +++ b/application/testapp/controller/Calculatebody.php @@ -0,0 +1,643 @@ +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'; + $temporary_parameter = [ + 'weight'=>$data['weight'], + 'height'=>$data['height'], + 'age'=>$data['age'], + 'adc'=>$data['adc'], + 'gender'=>$data['gender'], + ]; + // dump($temporary_parameter); + + $request_result = $this->postRequest($url,$temporary_parameter); + // dump($request_result); + $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']; + // dump($result); + // die; + // 使用接口调用之前的进行计算end + + $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']; + + // dump($return_data); + // die; + // $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']; + // dump($return_data); + // dump('========================================='); + return $return_data; + // dump($result_end); + // die; + } + + // 加 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; + // dump($num3); + if(bccomp($num3, '15.0', 20) === -1){ + $result_data['muscle'] = '15.00'; + }else{ + $result_data['muscle'] = $num3; + } + // dump($num4); + // $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; + // dump($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) + // dump($num11); + if ($age < 18){ + $num11 = $age; + }else{ + // dump($num11); + // $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; + } + } + // dump($age); + + $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; + // dump($result_data); + // die; + return $result_data; + } + // 计算脂肪率 + function calculate_fat_r(){ + dump(123); + } + // 计算脂肪量 + 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/testapp/controller/Card.php b/application/testapp/controller/Card.php new file mode 100644 index 0000000..cc867e2 --- /dev/null +++ b/application/testapp/controller/Card.php @@ -0,0 +1,728 @@ +'分','height'=>'CM','weight'=>'公斤','bmi'=>'','fat_r'=>'%','fat_w'=>'kg','muscle'=>'%','muscleval'=>'kg','water'=>'kg','bone'=>'kg','protein'=>'%','proteinval'=>'kg','kcal'=>'kcal','visceral'=>'','sfr'=>'%',]; + 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 $bhw_list = [ + 'bmi'=>[ + ['min_val'=>'0','max_val'=>'','text'=>'消瘦','color'=>'#FDDA6B'], + ['min_val'=>'','max_val'=>'','text'=>'正常','color'=>'#59D06A'], + ['min_val'=>'','max_val'=>'','text'=>'偏重','color'=>'#FDAA02'], + ['min_val'=>'','max_val'=>'50','text'=>'肥胖','color'=>'#FB5755'], + ], + 'height'=>[ + ['min_val'=>'0','max_val'=>'','text'=>'矮','color'=>'#FD5759'], + ['min_val'=>'','max_val'=>'','text'=>'偏矮','color'=>'#FAAD01'], + ['min_val'=>'','max_val'=>'','text'=>'标准','color'=>'#5BD068'], + ['min_val'=>'','max_val'=>'','text'=>'偏高','color'=>'#6793F4'], + ['min_val'=>'','max_val'=>'','text'=>'高','color'=>'#3D67D3'], + ], + 'weight'=>[ + ['min_val'=>'0','max_val'=>'','text'=>'低','color'=>'#F8595D'], + ['min_val'=>'','max_val'=>'','text'=>'偏低','color'=>'#FFAF04'], + ['min_val'=>'','max_val'=>'','text'=>'标准','color'=>'#59D168'], + ['min_val'=>'','max_val'=>'','text'=>'偏高','color'=>'#FFAF04'], + ['min_val'=>'','max_val'=>'','text'=>'高','color'=>'#F8595D'], + ] + ]; + protected $standard_color = [ + 'fat_r'=>['偏低'=>'#FCDB67','标准'=>'#58D268','偏高'=>'#FCAA00','高'=>'#FD5752'], + 'fat_w'=>['偏低'=>'#FCDB67','标准'=>'#58D268','偏高'=>'#FCAA00','高'=>'#FD5752'], + 'muscle'=>['不足'=>'#FFDA68','标准'=>'#59CD6F','优'=>'#3C64D4'], + 'muscleval'=>['不足'=>'#FFDA68','标准'=>'#59CD6F','优'=>'#3C64D4'], + 'water'=>['不足'=>'#FED966','标准'=>'#58CF6B','优'=>'#3A68D7'], + 'proteinval'=>['不足'=>'#FED966','标准'=>'#58CF6B','优'=>'#3A68D7'], + 'bone'=>['不足'=>'#FED966','标准'=>'#58CF6B','优'=>'#3A68D7'], + 'protein'=>['不足'=>'#FED966','标准'=>'#58CF6B','优'=>'#3A68D7'], + 'kcal'=>['偏低'=>'#FF5656','优'=>'#5ad06d'], + 'visceral'=>['标准'=>'#55CF6C','警惕'=>'#FEAC00','危险'=>'#FB5A52'], + 'sfr'=>['不足'=>'#FCDB68','标准'=>'#59D16F','偏高'=>'#FEAB03'], + ]; + protected $result_end_data_mould = [ + 'name'=>'', + 'value'=>'', + 'unit'=>'', + 'standard'=>'', + 'color'=>'', + 'list'=>[] + ]; + // 曲线参数 + protected $card_body_curve_arr = ['height','weight','bmi','fat_r']; + protected $card_body_curve_arr2 = ['身高','体重','BMI','脂肪率',]; + protected $card_body_curve_arr3 = ['#f7b03e','#fb7b92','#ff9f40','#3fcba7',]; + + protected $card_body_level = [ + 'height'=>['value'=>1,'list'=>['矮'=>2,'偏矮'=>3,'标准'=>4,'偏高'=>5,'高'=>5]], + 'weight'=>['value'=>3,'list'=>['低'=>1,'偏低'=>1,'标准'=>2,'偏高'=>3,'高'=>3]], + 'bmi'=>['value'=>2,'list'=>['消瘦'=>1,'正常'=>2,'偏重'=>3,'肥胖'=>4]], + ]; + + + protected $card_use_db_name = [ + '1'=>'test_app_card_body_data', + '2'=>'test_app_user_data', + '3'=>'test_pc_bmistand', + '4'=>'test_pc_heightstand', + '5'=>'test_pc_weightstand', + '6'=>'test_pc_childrenprescription', + '7'=>'test_pc_childprescriptionbyage', + '8'=>'test_pc_heightstand2', + '9'=>'test_pc_weightstand2', + '10'=>'test_pc_bmistand2', + ]; + + + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + + // 详细卡片信息 + // $data = ['id'=>'2'] + public function card_data_detailed($data=['aud_id'=>'87','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->get_user_body_data($data); + } + + // 曲线页面-曲线接口 + public function card_curve_chart($data = ['aud_id'=>'83','s_time'=>'2024-04-01','e_time'=>'2024-07-25','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // $data['s_time'] = $data['s_time'].' 00:00:00'; + // $data['e_time'] = $data['e_time'].' 23:59:59'; + return $this->curve_chart_action($data); + } + + // 手动记录 + // $data = ['id'=>'2','time'=>'1991-04-20 10:10:10','height'=>'15.1','weight'=>'75.1'] + public function card_manual_recording($data = ['aud_id'=>'83','time'=>'2024-07-24','height'=>'145.7','weight'=>'41.3','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + }else{ + $data['time'] = date('Y-m-d H:i:s'); + } + // dump($data); + // die; + 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); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $data['acd_id'] = '2'; + return $this->set_user_body_data($data); + } + // 设备记录 + // $data = ['id'=>'2','time'=>'1991-04-20 10:10:10','height'=>'15.1','weight'=>'75.1'] + public function card_manual_recording_device($data = ['aud_id'=>'58','height'=>'175','weight'=>'68','adc'=>'550','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + }else{ + $data['time'] = date('Y-m-d H:i:s'); + } + // dump($data); + // die; + 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($data['adc'] == 0){ + $data['adc'] = 550; + } + $data['time'] = date('Y-m-d H:i:s'); + // if($this->token_time_validate($data['token']) === false){ + // return $this->msg(20001); + // } + // unset($data['token']); + $data['acd_id'] = '2'; + return $this->set_user_body_data($data); + } + + // 修改初始体重/目标体重 + public function card_modify_weight($data = ['aud_id'=>'25','weight'=>'25','type'=>1,'time'=>'','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!is_array($data)){ + return $this->msg(10005); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('weight', $data) || !array_key_exists('type', $data) || !array_key_exists('time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + + return $this->modify_weight_action($data); + } + + ################################################################业务接口################################################################ + ################################################################业务接口################################################################ + + ################################################card_data_detailed + // 用户身体数据卡片获取 + public function get_user_body_data($data){ + $result = Db::query(" + select + Top 1 + acbd.id, + acbd.acd_id, + acbd.create_time, + acbd.last_update_time, + acbd.score, + 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.body_level, + acbd.aud_id, + acbd.record_time, + acbd.body_type, + acbd.age, + acbd.is_del, + acbd.height, + acbd.weight, + acbd.bmi, + acbd.body_age, + aud.birthday,aud.gender,aud.target_weight,aud.initial_weight,aud.initial_date + from ".$this->card_use_db_name['1']." as acbd + left join ".$this->card_use_db_name['2']." as aud on acbd.aud_id=aud.id + where acbd.aud_id='".$data['aud_id']."' + order by acbd.record_time desc + "); + // dump($result); + // die; + if(!$result){ + return $this->msg(10004); + }else{ + // $curve_bottom = $this->card_curve_target_action($result); + $result_end = $this->processing_return_data_new($result[0]); + // dump($result_end); + // die; + $cardparts = new Cardparts; + // dump($result_end); + $result_end['gender'] = $result[0]['gender']; + $result_end['record_time'] = $result[0]['record_time']; + $result_end['score'] = $result_end['score']; + $result_end['body_type'] = $result_end['body_type']; + $result_end = $cardparts->conversion_interval($result_end); + // dump($result); + // dump($result_end); + // die; + $result_end['cplist'] = $this->grow_up_recommendation([ + 'birthday'=>$result[0]['birthday'], + 'body'=>[ + 'height'=>$result[0]['height'], + 'weight'=>$result[0]['weight'], + 'bmi'=>$result[0]['bmi'] + ], + ]); + if(count($result_end['cplist']['nutritionlist']) <= 0){ + // $result_end['cplist'] = []; + $result_end['literature'] = []; + }else{ + $result_end['literature'] = [ + '《中华人民共和国卫生行业标准WS 423-2013》', + '《中华人民共和国卫生行业标准WS/T 612-2018》', + '《中华人民共和国卫生行业标准WS/T1586-2018》', + '《WHO 5~19岁身高/体重判定标准》', + ]; + } + return $this->msg($result_end); + } + } + // 返回数据处理 + public function processing_return_data_new($data){ + // dump($data); + $result_end_data = []; + $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']); + $gender_val = $data['gender']; + // dump($data); + // dump($this->result_end_data_mould); + // die; + foreach ($data as $key => $value) { + if($key != 'aud_id' && $key != 'id' && $key != 'create_time' && $key != 'last_update_time' && $key != 'acd_id' && $key != 'ROW_NUMBER' && $key != 'record_time' && $key != 'gender' && $key != 'birthday'){ + // dump($key); + // 设置单个数据格式 + $result_end_data[$key] = $this->result_end_data_mould; + if(array_key_exists($key, $this->unit_name)){ + $result_end_data[$key]['name'] = $this->unit_name[$key]; + } + if(array_key_exists($key, $this->unit_symbol)){ + $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; + } + $result_end_data[$key]['value'] = explode(',',$value)[0]; + if(strpos($value, ',')){ + $result_end_data[$key]['standard'] = explode(',',$value)[1]; + } + // dump($result_end_data[$key]); + if(array_key_exists($key, $this->standard_color)){ + // dump($key); + // dump($result_end_data[$key]); + // dump($this->standard_color[$key]); + if($result_end_data[$key]['standard'] != '异常'){ + $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; + } + } + // 如果小于16岁(儿童) + if($data['age'] < $this->age_limit){ + if(array_key_exists($key, $this->bhw_list)){ + $result_end_data[$key]['list'] = $this->bhw_list[$key]; + if($key == 'bmi'){ + // dump($month_num); + $bhw_date = Db::table($this->card_use_db_name['3'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + // dump($bhw_date); + if($bhw_date){ + $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z2sd']; + $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z2sd']; + } + }else if($key == 'height'){ + $bhw_date = Db::table($this->card_use_db_name['4'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + if($bhw_date){ + $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd']; + $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd']; + $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd']; + $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd']; + $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd']; + } + }else if($key == 'weight'){ + $bhw_date = Db::table($this->card_use_db_name['5'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + // dump($value); + // dump($bhw_date);/ + if($bhw_date){ + $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd']; + $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd']; + $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd']; + $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd']; + $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd']; + $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd']; + $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd']; + } + } + } + } + } + } + // $result_end_data['age'] = $data['age']; + // dump($data['age']); + // dump($result_end_data); + // die; + return $result_end_data; + } + + public function grow_up_recommendation($data){ + // card_body_level + // die; + // $result = [ + // ['name'=>'营养','key'=>'nutrition','content'=>''], + // ['name'=>'睡眠','key'=>'sleep','content'=>''], + // ['name'=>'运动','key'=>'motion','content'=>''], + // ['name'=>'情绪','key'=>'emotion','content'=>''] + // ]; + $result = [ + 'nutritionlist'=>[],//营养 + 'sportlist'=>[],//运动 + 'sleeplist'=>[],//睡眠 + 'moodlist'=>[],//情绪 + ]; + + $temporary_arr = []; + foreach ($data['body'] as $key => $value) { + if(explode(',',$value)[1] == '无'){ + $result = [ + 'nutritionlist'=>[],//营养 + 'sportlist'=>[],//运动 + 'sleeplist'=>[],//睡眠 + 'moodlist'=>[],//情绪 + ]; + return $result; + } + $temporary_arr[$key] = $this->card_body_level[$key]['list'][explode(',',$value)[1]]; + } + $min_value = min($temporary_arr); + $min_key = array_search($min_value,$temporary_arr); + $type_num = $this->card_body_level[$min_key]['value']; + $temporary_arr2 = Db::table($this->card_use_db_name['6'])->where(['Type'=>$type_num,'Level'=>$min_value,'IsDeleted'=>0])->field('Nutrition,Sport')->find(); + // dump($temporary_arr2); + array_push($result['nutritionlist'],$temporary_arr2['Nutrition']); + array_push($result['sportlist'],$temporary_arr2['Sport']); + // $result['nutritionlist'] = $temporary_arr2['Nutrition']; + // $result['sportlist'] = $temporary_arr2['Sport']; + + $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']); + $temporary_arr2 = Db::table($this->card_use_db_name['7'])->where(['IsDeleted'=>0])->field('MinAge,MaxAge,Type,Content')->select(); + $default_sleep = ''; + $default_emotion = ''; + foreach ($temporary_arr2 as $key => $value) { + if($value['MinAge'] == -1 && $value['Type'] == 2){ + $default_sleep = $value['Content']; + } + if($value['MinAge'] == -1 && $value['Type'] == 3){ + $default_emotion = $value['Content']; + } + if($month_num>=$value['MinAge'] && $month_num<=$value['MaxAge']){ + if($value['Type'] == 1){ + array_push($result['sportlist'],$value['Content']); + // $result['sportlist'] = $result['sportlist'].$value['Content']; + }else if($value['Type'] == 2){ + array_push($result['sleeplist'],$value['Content']); + // $result['sleeplist'] = $result['sleeplist'].$value['Content']; + }else if($value['Type'] == 3){ + array_push($result['moodlist'],$value['Content']); + // $result['moodlist'] = $result['moodlist'].$value['Content']; + } + } + } + + $result['sleeplist'] = count($result['sleeplist']) <= 0?array_push($result['sportlist'],$default_sleep):$result['sleeplist']; + $result['moodlist'] = count($result['moodlist']) <= 0?array_push($result['moodlist'],$default_sleep):$result['moodlist']; + + return $result; + } + + ########################################################card_curve_chart + + // 曲线图动作函数 + public function curve_chart_action($data){ + $card_body_curve_arr = implode(',',$this->card_body_curve_arr); + + $data['s_time'] = $data['s_time'].' 00:00:00'; + $data['e_time'] = $data['e_time'].' 23:59:59'; + + $user_data_list = Db::table($this->card_use_db_name['1']) + ->where('aud_id', $data['aud_id']) + ->whereTime('record_time', 'between', [$data['s_time'], $data['e_time']]) + ->field("record_time,REPLACE(CONVERT(varchar(10), record_time, 23), '-', '-') AS b_time,$card_body_curve_arr") + // ->field("record_time,REPLACE(CONVERT(varchar(10), record_time, 23), '-', '/') AS b_time,$card_body_curve_arr") + ->order('record_time desc') + ->select(); + // dump($user_data_list); + + // 下面业务逻辑是取每天的,最近后一次记录成绩 + $data_arr = []; + $record_arr1 = []; + $record_arr2 = []; + // 如果有数据 + if(count($user_data_list)>0){ + // 循环数据 + foreach ($user_data_list as $key => $value) { + // 如果数据中的时间不存在临时数组中 + if(!in_array($value['b_time'],$record_arr1)){ + array_push($record_arr1,$value['b_time']); + foreach ($this->card_body_curve_arr as $k => $v) { + $user_data_list[$key][$v] = explode(',',$user_data_list[$key][$v])[0]; + } + array_push($record_arr2,$user_data_list[$key]); + } + } + // dump($record_arr1); + // dump($record_arr2); + // die; + foreach ($this->card_body_curve_arr as $key => $value) { + $temporary_arr = []; + $temporary_arr['title'] = $this->card_body_curve_arr2[$key]; + $temporary_arr['key'] = $value; + $temporary_arr['line']['categories'] = []; + $temporary_arr['line']['series'][0]['color'] = $this->card_body_curve_arr3[$key]; + $temporary_arr['line']['series'][0]['data'] = []; + foreach ($record_arr2 as $k => $v) { + array_push($temporary_arr['line']['categories'],$record_arr2[$k]['b_time']); + array_push($temporary_arr['line']['series'][0]['data'],$record_arr2[$k][$value]); + } + array_push($data_arr,$temporary_arr); + } + } + // dump($data_arr); + return $this->msg($data_arr); + } + + ################################################card_manual_recording + // 用户身体数据卡片记录 + public function set_user_body_data($data){ + + $data['type'] = 1; + $user_data = Db::table($this->card_use_db_name['2'])->where(['id'=>$data['aud_id']])->field('birthday,gender,target_weight,initial_weight,initial_date')->find(); + if(!$user_data){ + return $this->msg(10003); + } + if($user_data['initial_date'] == null){ + Db::table($this->card_use_db_name['2'])->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']; + if(array_key_exists('adc', $data)){ + $result_data['adc'] = $data['adc']; + } + $calculate_body_formula = new Calculatebody(); + // 计算身体数据 + $get_body_value = $calculate_body_formula->calculate_body_data_result($result_data); + + $get_body_value['gender'] = $user_data['gender']; + $get_body_value['birthday'] = $user_data['birthday']; + // 添加身高体重bmi的标尺标准 + $get_body_value = $this->hwb_standard($get_body_value); + $set_data = [ + 'acd_id'=>$data['acd_id'], + '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['身体年龄'] + ]; + 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']); + } + + $set_user_data = Db::table($this->card_use_db_name['1'])->insert($set_data); + if($set_user_data){ + // 返回简要数据 + if($data['type'] == 1){ + return $this->msg([ + 'acd_id'=>2, + 'height'=>$get_body_value['身高'].',CM', + 'weight'=>$get_body_value['体重'].',公斤', + 'bmi'=>$get_body_value['BMI'], + 'target_current'=>$target_current, + ]); + } + + }else{ + return $this->msg(10002); + } + } + + // 添加身高体重bmi的标准 + public function hwb_standard($data){ + + $linshi_data = []; + $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']); + // dump($month_num); + $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->card_use_db_name['8'])->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->card_use_db_name['9'])->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->card_use_db_name['10'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select(); + // dump($bhw_date); + 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']; + } + } + } + // dump($linshi_data); + // die; + foreach ($linshi_data as $key => $value) { + // dump($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']; + } + } + 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'].',无,无'; + } + // dump($data); + // die; + return $data; + // dump($data); + } + + + ################################################card_modify_weight + public function modify_weight_action($data){ + // $data['aud_id'] = 26; + // $data['weight'] = 60; + // dump($data); + // die; + + $result = Db::query(" + select + TOP 1 + acbd.weight, + aud.target_weight, + aud.initial_weight, + aud.initial_date + from ".$this->card_use_db_name['1']." as acbd + left join ".$this->card_use_db_name['2']." as aud on acbd.aud_id = aud.id + where acbd.aud_id = ".$data['aud_id']." + order by acbd.record_time desc + "); + if($data['type'] == 1){ + // 修改目标体重 + $bhw_date = ['target_weight'=>$data['weight']]; + }else if($data['type'] == 2){ + // 修改原始体重 + $bhw_date = ['initial_weight'=>$data['weight'],'initial_date' => $data['time']]; + }else{ + return $this->msg(10005); + } + $result_update = Db::table($this->card_use_db_name['2'])->where(['id'=>$data['aud_id']])->update($bhw_date); + // dump($result_update); + // dump($result[0]['weight']); + // dump($result); + + if($result_update){ + $target_current = $this->base_target_initial_cumulative_weight([ + 'weight'=>$result[0]['weight'], + 'target_weight'=>$data['type'] == 1?$data['weight']:$result[0]['target_weight'], + 'initial_weight'=>$data['type'] == 1?$result[0]['initial_weight']:$data['weight'], + 'initial_date'=>$data['type'] == 1?$result[0]['initial_date']:$data['time'], + ]); + // die; + // dump($target_current); + return $this->msg($target_current); + }else{ + return $this->msg(10002); + } + + } + + ################################################card_record_detailed_information + + + ################################################################其他接口################################################################ + ################################################################其他接口################################################################ + + + + + + + + + + + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Cardparts.php b/application/testapp/controller/Cardparts.php new file mode 100644 index 0000000..b18196f --- /dev/null +++ b/application/testapp/controller/Cardparts.php @@ -0,0 +1,462 @@ +'反映和衡量一个人健康状况的重要标志之一', + 'height'=>'人体纵向部分的长度,源于人体的纵向生长,受遗传因素的影响较大', + 'bmi'=>'BMI是身体质量指数,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。' + ]; + protected $parameter_aggregate_bottom = [ + 'fat_r'=>'体脂率是指身体成分中,脂肪组织所占的比率。测量体脂率比单纯的只测量体重更能反映我们身体的脂肪水平(肥胖程度)。', + 'fat_w'=>'人体脂肪的重量', + 'muscle'=>'根据人体肌肉总量和人体体重、身高等相结合得到的人体的一个比例值,这个值的范围决定一个人的身体健康状况以及力量的多少。', + 'muscleval'=>'肌肉量=实际体重*肌肉率', + 'water'=>'指人体内水分比例。', + 'proteinval'=>'蛋白量=实际体重*蛋白率', + 'bone'=>'单位体积内,骨组织、骨矿物质(钙、磷等)和骨基质(骨胶原、蛋白率、无机盐等等)含量,骨量代表它们骨骼健康的情况。', + 'protein'=>'人体内蛋白率含量。', + 'kcal'=>'指人体在清醒而又极端安静的状态下,不受肌肉活动、环境温度、食物及精神紧张等影响时的能量代谢率', + 'visceral'=>'内脏脂肪指数', + 'sfr'=>'皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织', + 'body_level'=>'肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。' + ]; + protected $parameter_aggregate_bottom_out = ['body_level']; + protected $parameter_aggregate_bottom_condition = ['body_level']; + // 脂肪率&脂肪量 + protected $fat_r_w = [ + 'man'=>[ + '29'=>[ + ['min_val'=>'0','max_val'=>'10','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'10','max_val'=>'21','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'21','max_val'=>'26','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'26','max_val'=>'50','text'=>'高','color'=>'#FA5951'], + ], + '30'=>[ + ['min_val'=>'0','max_val'=>'11','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'11','max_val'=>'22','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'22','max_val'=>'27','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'27','max_val'=>'50','text'=>'高','color'=>'#FA5951'], + ], + ], + 'woman'=>[ + '29'=>[ + ['min_val'=>'0','max_val'=>'20','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'20','max_val'=>'31','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'31','max_val'=>'38','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'38','max_val'=>'80','text'=>'高','color'=>'#FA5951'], + ], + '30'=>[ + ['min_val'=>'0','max_val'=>'21','text'=>'偏低','color'=>'#FCDB67'], + ['min_val'=>'21','max_val'=>'32','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'32','max_val'=>'39','text'=>'偏高','color'=>'#FAB000'], + ['min_val'=>'39','max_val'=>'80','text'=>'高','color'=>'#FA5951'], + ] + ] + ]; + // 肌肉率&肌肉量 + protected $muscle_muscleval = [ + 'man'=>[ + ['min_val'=>'0','max_val'=>'40','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'40','max_val'=>'60','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], + ], + 'woman'=>[ + ['min_val'=>'0','max_val'=>'30','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'30','max_val'=>'50','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'50','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], + ] + ]; + // 水分 + protected $water = [ + 'man'=>[ + ['min_val'=>'0','max_val'=>'55','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'55','max_val'=>'65','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'65','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], + ], + 'woman'=>[ + ['min_val'=>'0','max_val'=>'45','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'45','max_val'=>'60','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'60','max_val'=>'100','text'=>'优','color'=>'#3C66D2'], + ] + ]; + // 蛋白量&蛋白率 + protected $proteinval_protein = [ + 'man'=>[ + ['min_val'=>'0','max_val'=>'16','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'16','max_val'=>'18','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'18','max_val'=>'50','text'=>'优','color'=>'#3C66D2'], //蓝 + ], + 'woman'=>[ + ['min_val'=>'0','max_val'=>'14','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'14','max_val'=>'16','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'16','max_val'=>'50','text'=>'优','color'=>'#3C66D2'], + ] + ]; + // 骨重 + protected $bone = [ + 'man'=>[ + '60'=>[ + ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.6','max_val'=>'6','text'=>'优','color'=>'#3C66D2'], + ], + '60_75'=>[ + ['min_val'=>'0','max_val'=>'2.8','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.8','max_val'=>'3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'3','max_val'=>'6','text'=>'优','color'=>'#3C66D2'], + ], + '75'=>[ + ['min_val'=>'0','max_val'=>'3.1','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'3.1','max_val'=>'3.3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'3.3','max_val'=>'7','text'=>'优','color'=>'#3C66D2'], + ], + ], + 'woman'=>[ + '45'=>[ + ['min_val'=>'0','max_val'=>'1.7','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'1.7','max_val'=>'1.9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'1.9','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], + ], + '45_60'=>[ + ['min_val'=>'0','max_val'=>'2.1','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.1','max_val'=>'2.3','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.3','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], + ], + '60'=>[ + ['min_val'=>'0','max_val'=>'2.4','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'2.4','max_val'=>'2.6','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'2.6','max_val'=>'5','text'=>'优','color'=>'#3C66D2'], + ], + ] + ]; + // 基础代谢 + protected $kcal = [ + ['min_val'=>'0','max_val'=>'','text'=>'偏低','color'=>'#ff5656'], + ['min_val'=>'','max_val'=>'9999','text'=>'优','color'=>'#3C66D2'], + ]; + // 内脏指数 + protected $visceral = [ + 'man'=>[ + ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#FAB000'], + ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#FA5951'], //红 + ], + 'woman'=>[ + ['min_val'=>'0','max_val'=>'9','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'9','max_val'=>'14','text'=>'警惕','color'=>'#FAB000'], + ['min_val'=>'14','max_val'=>'50','text'=>'危险','color'=>'#FA5951'], //红 + ] + ]; + // 皮下脂肪 + protected $sfr = [ + 'man'=>[ + ['min_val'=>'0','max_val'=>'7','text'=>'不足','color'=>'#FCDB67'], //淡黄 + ['min_val'=>'7','max_val'=>'15','text'=>'标准','color'=>'#59D16D'], //绿 + ['min_val'=>'15','max_val'=>'50','text'=>'偏高','color'=>'#FAB000'], //橙 + ], + 'woman'=>[ + ['min_val'=>'0','max_val'=>'11','text'=>'不足','color'=>'#FCDB67'], + ['min_val'=>'11','max_val'=>'17','text'=>'标准','color'=>'#59D16D'], + ['min_val'=>'17','max_val'=>'50','text'=>'偏高','color'=>'#FAB000'], + ] + ]; + + + + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // 计算部分内容的横线标准以及说明文字 + public function conversion_interval($data){ + // $data['gender'] = $data['gender']==2?'woman':'man'; + $gender = $data['gender']==2?'woman':'man'; + $age = $data['age']['value']; + $weight = 0; + $temporary_arr = [ + 'score_name' =>$data['score']['name'], + 'score_value' =>$data['score']['value'], + 'score_unit' =>$data['score']['unit'], + 'body_type_name' =>$data['body_type']['name'], + 'body_type_value' =>$data['body_type']['value'], + 'body_type_unit' =>$data['body_type']['unit'], + // 'record_time' =>str_replace('-', '/', $data['record_time']), + 'record_time' =>$data['record_time'], + 'top_list'=>[], + 'bottom_list'=>[], + ]; + $date_temporary = new \DateTime($temporary_arr['record_time']); + + // 使用 format 方法来指定新的日期和时间格式 + $temporary_arr['record_time'] = $date_temporary->format('Y年m月d日 H:i:s'); + // 处理格式(顶部) + foreach ($this->parameter_aggregate_top as $key => $value) { + $data[$key]['key_name'] = $key; + $data[$key]['desc'] = $value; + if($key == 'weight'){ + $weight = $data[$key]['value']; + } + array_push($temporary_arr['top_list'],$data[$key]); + } + + // 处理格式(底部) + foreach ($this->parameter_aggregate_bottom as $key => $value) { + $data[$key]['key_name'] = $key; + $data[$key]['desc'] = $value; + array_push($temporary_arr['bottom_list'],$data[$key]); + } + // 处理顶部list + foreach ($temporary_arr['top_list'] as $key => $value) { + if(count($temporary_arr['top_list'][$key]['list']) > 0){ + $temporary_arr['top_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['top_list'][$key]['list'],$temporary_arr['top_list'][$key]['value'],$temporary_arr['top_list'][$key]['standard']); + } + } + + // 处理底部list + foreach ($temporary_arr['bottom_list'] as $key => $value) { + // dump($value['key_name']); + // 脂肪率& + if($value['key_name'] == 'fat_r'){ + if($age < 30){ + $temporary_arr['bottom_list'][$key]['list'] = $this->fat_r_w[$gender]['29']; + }else{ + $temporary_arr['bottom_list'][$key]['list'] = $this->fat_r_w[$gender]['30']; + } + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 脂肪量 + else if($value['key_name'] == 'fat_w'){ + if($age < 30){ + $temporary_arr['bottom_list'][$key]['list'] = $this->fat_r_w[$gender]['29']; + }else{ + $temporary_arr['bottom_list'][$key]['list'] = $this->fat_r_w[$gender]['30']; + } + $temporary_arr['bottom_list'][$key]['list'] = $this->calculate_new_standard($temporary_arr['bottom_list'][$key]['list'],$weight,$value['key_name']); + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 肌肉率 + else if($value['key_name'] == 'muscle'){ + // dump('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'); + $temporary_arr['bottom_list'][$key]['list'] = $this->muscle_muscleval[$gender]; + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + // dump($temporary_arr['bottom_list'][$key]); + } + // 肌肉量 + else if($value['key_name'] == 'muscleval'){ + // dump('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'); + $temporary_arr['bottom_list'][$key]['list'] = $this->muscle_muscleval[$gender]; + $temporary_arr['bottom_list'][$key]['list'] = $this->calculate_new_standard($temporary_arr['bottom_list'][$key]['list'],$weight,$value['key_name']); + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + // dump($temporary_arr['bottom_list'][$key]); + } + // 水分 + else if($value['key_name'] == 'water'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->water[$gender]; + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 蛋白量 + else if($value['key_name'] == 'proteinval'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->proteinval_protein[$gender]; + $temporary_arr['bottom_list'][$key]['list'] = $this->calculate_new_standard($temporary_arr['bottom_list'][$key]['list'],$weight,$value['key_name']); + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 骨重 + else if($value['key_name'] == 'bone'){ + if($gender == 'man'){ + if($weight < 60){ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['60']; + }else if($weight >= 60 && $weight < 75){ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['60_75']; + }else{ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['75']; + } + }else{ + if($weight < 45){ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['45']; + }else if($weight >= 45 && $weight < 60){ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['45_60']; + }else{ + $temporary_arr['bottom_list'][$key]['list'] = $this->bone[$gender]['60']; + } + } + // dump($temporary_arr['bottom_list'][$key]); + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 蛋白率 + else if($value['key_name'] == 'protein'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->proteinval_protein[$gender]; + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 基础代谢 + else if($value['key_name'] == 'kcal'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->calculate_new_standard($this->kcal,$weight,$value['key_name'],$age,$gender); + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 内脏指数 + else if($value['key_name'] == 'visceral'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->visceral[$gender]; + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + // 皮下脂肪 + else if($value['key_name'] == 'sfr'){ + $temporary_arr['bottom_list'][$key]['list'] = $this->sfr[$gender]; + // 处理异常 + if($temporary_arr['bottom_list'][$key]['standard'] == '异常'){ + $temporary_arr['bottom_list'][$key] = $this->handling_exceptions($temporary_arr['bottom_list'][$key]); + } + $temporary_arr['bottom_list'][$key]['offset'] = $this->calculate_landing_point($temporary_arr['bottom_list'][$key]['list'],$temporary_arr['bottom_list'][$key]['value'],$temporary_arr['bottom_list'][$key]['standard']); + } + } + // dump($data['gender']); + // dump($data['age']['value']); + // // dump($temporary_arr['top_list']); + // dump($temporary_arr['bottom_list']); + // die; + return $temporary_arr; + } + + + // 计算落点百分比 + public function calculate_landing_point($data,$val,$t_val){ + $num = count($data); + $a_section = bcdiv(100,$num,2); + $temporary_data = []; + $num_0 = 0; + foreach ($data as $key => $value) { + if($t_val == $value['text']){ + $temporary_data = $value; + $num_0 = $key; + break; + } + } + $max_num = trim($temporary_data['max_val']); + $min_num = trim($temporary_data['min_val']); + if($val < $temporary_data['max_val']){ + $num_1 = bcsub($val,$min_num,2); + $num_2 = bcsub($max_num,$min_num,2); + $num_3 = bcdiv(bcdiv($num_1,$num_2,4),$num,4)*100; + $result = bcadd(bcmul($num_0,$a_section,2),$num_3,2); + }else{ + $num_3 = bcdiv(1,$num,4)*100; + $result = bcadd(bcmul($num_0,$a_section,2),$num_3,2); + } + return $result; + } + + // 计算新标准 + public function calculate_new_standard($data,$w,$k,$age=0,$gender='man'){ + $temporary_arr = []; + if($k != 'kcal'){ + foreach ($data as $key => $value) { + array_push($temporary_arr,[ + 'min_val'=>bcmul($w,bcdiv($value['min_val'],100,2),2), + 'max_val'=>bcmul($w,bcdiv($value['max_val'],100,2),2), + 'text'=>$value['text'], + 'color'=>$value['color'] + ]); + } + }else{ + // BMR标准值(男) BMR标准值(女) + // 60.9*体重(kg)-54 61.0*体重(kg)-51 + // 22.7*体重(kg)+495 22.5*体重(kg)+499 + // 17.5*体重(kg)+651 12.2*体重(kg)+746 + // 15.3*体重(kg)+679 14.7*体重(kg)+496 + // 11.6*体重(kg)+879 8.7*体重(kg)+820 + $vv_val = 0; + if($age < 3){ + if($gender == 'man'){ + $vv_val = bcsub(bcmul(60.9,$w,2),54,2); + }else{ + $vv_val = bcsub(bcmul(61.0,$w,2),51,2); + } + }else if($age >= 3 && $age < 10){ + if($gender == 'man'){ + $vv_val = bcadd(bcmul(22.7,$w,2),495,2); + }else{ + $vv_val = bcadd(bcmul(22.5,$w,2),499,2); + } + }else if($age >= 10 && $age < 18){ + if($gender == 'man'){ + $vv_val = bcadd(bcmul(17.5,$w,2),651,2); + }else{ + $vv_val = bcadd(bcmul(12.2,$w,2),746,2); + } + }else if($age >= 18 && $age < 30){ + if($gender == 'man'){ + $vv_val = bcadd(bcmul(15.3,$w,2),679,2); + }else{ + $vv_val = bcadd(bcmul(14.7,$w,2),496,2); + } + }else{ + if($gender == 'man'){ + $vv_val = bcadd(bcmul(11.6,$w,2),879,2); + }else{ + $vv_val = bcadd(bcmul(8.7,$w,2),820,2); + } + } + $data[0]['max_val'] = $vv_val; + $data[1]['min_val'] = $vv_val; + $temporary_arr = $data; + } + return $temporary_arr; + } + + + // 处理异常 + public function handling_exceptions($data){ + if($data['value'] <= $data['list'][0]['max_val']){ + $data['standard'] = $data['list'][0]['text']; + $data['color'] = $data['list'][0]['color']; + }else if($data['value'] >= $data['list'][count($data['list'])-1]['min_val']){ + $data['standard'] = $data['list'][count($data['list'])-1]['text']; + $data['color'] = $data['list'][count($data['list'])-1]['color']; + } + return $data; + } + +} \ No newline at end of file diff --git a/application/testapp/controller/Cardpublic.php b/application/testapp/controller/Cardpublic.php new file mode 100644 index 0000000..b440fd7 --- /dev/null +++ b/application/testapp/controller/Cardpublic.php @@ -0,0 +1,643 @@ +'test_app_user_data', + '2'=>'test_app_card_data_sub_item', + '3'=>'test_app_card_data_sub_item_data', + '4'=>'test_admin_estimate', + ]; + + protected $curve_color = ['#f7b03e','#fb7b92','#ff9f40','#3fcba7',]; + protected $level_data = [ + ['min_val'=>'0','max_val'=>'59','text'=>'不及格','color'=>'#FB5755'], + ['min_val'=>'60','max_val'=>'79','text'=>'及格','color'=>'#FCAE00'], + ['min_val'=>'80','max_val'=>'89','text'=>'良好','color'=>'#58CF67'], + ['min_val'=>'90','max_val'=>'150','text'=>'优秀','color'=>'#6691EF'], + ]; + + // 示意接口 + public function card_curve_chart($data = ['aud_id'=>'83','s_time'=>'2024-04-01','e_time'=>'2024-07-25','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + } + // 获取卡片数据 + public function get_card_content($data = ['aud_id'=>'83','acd_id'=>'10','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('acd_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // dump(111); + // die; + return $this->get_card_content_action($data); + } + + // 存储信息 + public function data_save($data = ['aud_id'=>'83','acd_id'=>'10','name'=>'50米','data'=>'10.3','record_time'=>'2024-09-06','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('acd_id', $data) || !array_key_exists('name', $data) || !array_key_exists('data', $data) || !array_key_exists('record_time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + + return $this->data_save_action($data); + } + + // 获取标签项目信息 + public function get_label_list($data = ['aud_id'=>'1','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + return $this->get_label_list_action($data); + } + + // 卡片运动曲线 + public function card_motion_curve($data = ['aud_id'=>'1','acd_id'=>'10','s_time'=>'2024-04-01','e_time'=>'2024-07-25','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + return $this->card_motion_curve_action($data); + } + + // 数据对比-获取数据 + public function data_contrast_obtain_data($data = ['aud_id'=>'1','acd_id'=>'10','name'=>'1000米','s_time'=>'2024-04-01','e_time'=>'2024-10-03']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('acd_id', $data) || !array_key_exists('name', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ + return $this->msg(10001); + } + return $this->data_contrast_obtain_data_action($data); + } + // 数据对比-对比数据 + public function data_contrast_contrast_data($data = ['before_id'=>'1','after_id'=>'3']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('before_id', $data) || !array_key_exists('after_id', $data)){ + return $this->msg(10001); + } + return $this->data_contrast_contrast_data_action($data); + } + // 获取手动记录内容 + public function obtain_manual_record_content($data = ['aud_id'=>1]){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data)){ + return $this->msg(10001); + } + $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_data){ + return $this->msg(10004); + } + $card_data = [ + ['id'=>'2','height'=>true,'weight'=>true,'number'=>false,'time'=>false,'list'=>[]], + ['id'=>'6','height'=>false,'weight'=>false,'number'=>true,'time'=>true,'list'=>[]], + [ + 'id'=>'10', + 'height'=>false, + 'weight'=>false, + 'number'=>false, + 'time'=>false, + 'list'=>[ + [ + 'id'=>'1', + 'name'=>'1000米', + 'number'=>false, + 'type'=>4, + 'time'=>true, + ], + [ + 'id'=>'2', + 'name'=>'800米', + 'number'=>false, + 'type'=>4, + 'time'=>true, + ], + [ + 'id'=>'3', + 'name'=>'50米', + 'number'=>true, + 'type'=>2, + 'time'=>false, + ], + ] + ], + ]; + if($user_data['gender'] == 1){ + unset($card_data[2]['list'][1]);//800米 + }else if($user_data['gender'] == 2){ + unset($card_data[2]['list'][0]);//1000米 + } + return $this->msg($card_data); + } + + + + + ################################################################action################################################################ + ################################################################action################################################################ + + ##################################################get_card_content################################################## + public function get_card_content_action($data){ + // 查找用户是存在 + $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_data){ + return $this->msg(10004); + } + // 卡片是否存在,以及是否含有子项 + $card_data_sub_item = Db::table($this->cardpublic_use_db_name['2'])->where("acd_id = ".$data['acd_id']." and suit_gender LIKE '%".$user_data['gender']."%'")->field('id,type,name,unit')->select(); + if(!$card_data_sub_item){ + return $this->msg(10004); + } + $return_data = [ + 'icon' => '', + 'label_list' => [], + 'line_list' => [], + 'label_data' => [], + + ]; + $data_this_time = []; + $today_time = date('Y-m-d'); + foreach ($card_data_sub_item as $key => $value) { + // 设置单项数据模板 + $temporary_arr_c = [ + 'project_name' => $value['name'], + 'score' => '', + 'max_score' => '', + 'standard' => '', + 'this_time_title' => '本次成绩', + 'this_time_value' => '', + 'today_time_title' => '今日总计', + 'today_times' => 0, + 'today_time_value' => 0, + 'all_time_title' => '总计平均', + 'all_times' => 0, + 'all_time_value' => 0, + 'describe' => '', + 'color' => '', + 'offset' => '', + 'unit_data' => '', + ]; + // 添加标签 + array_push($return_data['label_list'],$value['name']); + // 添加线性轴描述 + $return_data['line_list'] = $this->level_data; + // 查询最后一次成绩 + $data_this_time = Db::table($this->cardpublic_use_db_name['3'])->where(['aud_id'=>$data['aud_id'],'acdsi_id'=>$value['id']])->order('id desc')->field('id,detailed_msg,achievement')->find(); + // dump($data_this_time); + if($data_this_time){ + $data_this_time['detailed_msg'] = json_decode($data_this_time['detailed_msg'],true); + // 设置基础数据 + $temporary_arr_c['score'] = $data_this_time['detailed_msg']['score'].'分'; + $temporary_arr_c['max_score'] = $data_this_time['detailed_msg']['max_score']; + $temporary_arr_c['standard'] = $data_this_time['detailed_msg']['standard']; + $temporary_arr_c['describe'] = $data_this_time['detailed_msg']['describe']; + $temporary_arr_c['color'] = $data_this_time['detailed_msg']['color']; + $temporary_arr_c['offset'] = $data_this_time['detailed_msg']['offset']; + $temporary_arr_c['unit_data'] = $data_this_time['detailed_msg']['unit_data']; + // 获取到该项所有数据 + $all_time_title = Db::table($this->cardpublic_use_db_name['3'])->where(['aud_id'=>$data['aud_id'],'acdsi_id'=>$value['id']])->order('id desc')->field('id,achievement,LEFT(record_time,10) AS r_t')->select(); + // 处理今日,以及总计数据 + if($data_this_time['detailed_msg']['unit_data'] == '分/秒'){ + // 如果是分秒形式的数据 + // 设置今日数据跟总计数据的格式 + $temporary_arr_c['today_time_value'] = "0:00"; + $temporary_arr_c['all_time_value'] = "0:00"; + // 处理本次数据最终格式 + list($minutes, $seconds) = explode(':', $data_this_time['achievement']); + $temporary_arr_c['this_time_value'] = $minutes . '分' . sprintf('%02d', $seconds) . '秒'; + + // 计算今日总计&所有平均 + $temporary_arr_c['all_times'] = count($all_time_title); + foreach ($all_time_title as $k1 => $v1) { + $temporary_arr_c['all_time_value'] = $this->sumTimes($temporary_arr_c['all_time_value'],$v1['achievement']); + if($v1['r_t'] == $today_time){ + $temporary_arr_c['today_times'] = $temporary_arr_c['today_times']+1; + $temporary_arr_c['today_time_value'] = $this->sumTimes($temporary_arr_c['today_time_value'],$v1['achievement']); + } + } + $temporary_arr_c['all_time_value'] = $this->averageTime($temporary_arr_c['all_time_value'],$temporary_arr_c['all_times']); + list($minutes, $seconds) = explode(':', $temporary_arr_c['today_time_value']); + $temporary_arr_c['today_time_value'] = $minutes . '分' . sprintf('%02d', $seconds) . '秒'; + + }else{ + + $temporary_arr_c['this_time_value'] = $data_this_time['achievement'].$data_this_time['detailed_msg']['unit_data']; + + $temporary_arr_c['all_times'] = count($all_time_title); + foreach ($all_time_title as $k1 => $v1) { + $temporary_arr_c['all_time_value'] = $temporary_arr_c['all_time_value']+$v1['achievement']; + if($v1['r_t'] == $today_time){ + $temporary_arr_c['today_times'] = $temporary_arr_c['today_times']+1; + $temporary_arr_c['today_time_value'] = $temporary_arr_c['today_time_value']+$v1['achievement']; + } + } + $temporary_arr_c['today_time_value'] = $temporary_arr_c['today_time_value'].$data_this_time['detailed_msg']['unit_data']; + + $temporary_arr_c['all_time_value'] = bcdiv($temporary_arr_c['all_time_value'],$temporary_arr_c['all_times'],1).$data_this_time['detailed_msg']['unit_data']; + } + $temporary_arr_c['today_times'] = $temporary_arr_c['today_times'].'次'; + $temporary_arr_c['all_times'] = $temporary_arr_c['all_times'].'次'; + + } + array_push($return_data['label_data'],$temporary_arr_c); + } + return $this->msg($return_data); + } + ##################################################data_save################################################## + public function data_save_action($data){ + + // 查找用户是存在 + $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_data){ + return $this->msg(10004); + } + // 查找项目是否存在,以及获取项目信息 + $card_data_sub_item_data = Db::table($this->cardpublic_use_db_name['2'])->where("name = '".$data['name']."' and suit_gender LIKE '%".$user_data['gender']."%'")->field('id,type,name,unit,acd_id')->find(); + if(!$card_data_sub_item_data){ + return $this->msg(10004); + } + // 如果项目数据类型为分秒格式 + if($card_data_sub_item_data['type'] == 1){ + // 判断是否为整型,或者字符串类型的整型数字 + if(!$this->isValidInteger($data['data'])){ + return $this->msg(10005); + } + }else if($card_data_sub_item_data['type'] == 4){ + // 检查字符串格式是否为“数字”+“:”+“数字”的格式,且冒号后的数字小于等于59 + if(!$this->isValidFormatWithLimit($data['data'])){ + return $this->msg(10005); + } + }else if($card_data_sub_item_data['type'] == 2){ + // 判断一个字符串是否为两位以内小数 + // dump($this->isTwoDecimalOrLess($data['data'])); + if(!$this->isTwoDecimalOrLess($data['data'])){ + return $this->msg(10005); + } + } + $score_all_data = $this->calculation_score($user_data['gender'],$data,$card_data_sub_item_data['type']); + $save_data = [ + 'acd_id' => $card_data_sub_item_data['acd_id'], + 'acdsi_id' => $card_data_sub_item_data['id'], + 'aud_id' => $data['aud_id'], + 'achievement' => $data['data'], + 'record_time' => $data['record_time'].date(' H:i:s'), + 'create_time' => date('Y-m-d H:i:s'), + 'unit' => $card_data_sub_item_data['unit'], + 'score' => $score_all_data['score'], + 'detailed_msg' => json_encode($score_all_data), + ]; + + $result = Db::table($this->cardpublic_use_db_name['3'])->insert($save_data); + // $result = true; + if($result){ + if($save_data['unit'] == '分/秒'){ + list($minutes, $seconds) = explode(':', $data['data']); + $score_all_data['this_time_value'] = $minutes . '分' . sprintf('%02d', $seconds) . '秒'; + }else{ + $score_all_data['this_time_value'] = $data['data'].$save_data['unit']; + } + + return $this->msg($score_all_data); + }else{ + return $this->msg(10002); + } + } + ##################################################get_label_list################################################## + public function get_label_list_action($data){ + // 查找用户是存在 + $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_data){ + return $this->msg(10004); + } + $label_data = Db::table($this->cardpublic_use_db_name['2'])->where("suit_gender LIKE '%".$user_data['gender']."%'")->field('id,acd_id,name,unit,type')->select(); + if(count($label_data)<=0){ + return $this->msg(10004); + } + + $return_data = []; + $temporary_arr = []; + foreach ($label_data as $key => $value) { + if(!array_key_exists($value['acd_id'], $temporary_arr)){ + $temporary_arr[$value['acd_id']] = [$value['name']]; + }else{ + array_push($temporary_arr[$value['acd_id']],$value['name']); + } + } + foreach ($temporary_arr as $key => $value) { + array_push($return_data,[ + 'acd_id'=>$key, + 'list'=>$value, + ]); + } + return $this->msg($return_data); + } + + ##################################################card_motion_curve################################################## + public function card_motion_curve_action($data){ + $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_data){ + return $this->msg(10004); + } + $card_sub_item_data = Db::table($this->cardpublic_use_db_name['3'])->where(['acd_id'=>$data['acd_id'],'aud_id'=>$data['aud_id']])->order('record_time desc')->field('id,acdsi_id,score,LEFT(record_time,10) as record_time')->select(); + $card_sub_item_type = Db::table($this->cardpublic_use_db_name['2'])->where("acd_id = ".$data['acd_id']." and suit_gender LIKE '%".$user_data['gender']."%'")->field('id,name,unit')->select(); + $temporary_arr = []; + $return_data = []; + // 处理一个临时数据 + foreach ($card_sub_item_type as $key => $value) { + $temporary_arr[$value['id']] = ['name'=>$value['name'],'unit'=>$value['unit'],'time'=>[],'data'=>[]]; + } + // 往临时数组内填入数据 + foreach ($card_sub_item_data as $key => $value) { + // dump($value); + array_push($temporary_arr[$value['acdsi_id']]['time'],$value['record_time']); + array_push($temporary_arr[$value['acdsi_id']]['data'],$value['score']); + } + $num = 0; + foreach ($temporary_arr as $key => $value) { + if(($num+1) > count($this->curve_color)){ + $num = 0; + } + array_push($return_data,[ + 'title'=>$value['name'], + 'key'=>$value['name'], + 'line'=>[ + 'categories'=>$value['time'], + 'series'=>[ + [ + 'color'=>$this->curve_color[$num], + 'name'=>$value['name'], + 'data'=>$value['data'], + ] + ], + ], + ]); + $num = $num+1; + } + return $this->msg($return_data); + } + ##################################################data_contrast_obtain_data################################################## + public function data_contrast_obtain_data_action($data){ + // dump($data); + // $user_data = Db::table($this->cardpublic_use_db_name['1'])->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + $card_data = Db::table($this->cardpublic_use_db_name['2'])->where(['acd_id'=>$data['acd_id'],'name'=>$data['name']])->find(); + + $result_data = Db::table($this->cardpublic_use_db_name['3']) + ->where(['aud_id'=>$data['aud_id'],'acdsi_id'=>$card_data['id']]) + ->whereTime('record_time', 'between', [$data['s_time'], $data['e_time']]) + ->field('id,achievement,score,unit,record_time') + ->order('record_time desc') + ->select(); + + // dump($result_data); + $return_data = []; + foreach ($result_data as $key => $value) { + if($value['unit'] == '分/秒'){ + $temporary_arr_e1 = explode(':', $value['achievement']); + $temporary_arr_e2 = explode('/', $value['unit']); + } + $temporary_arr = [ + "id"=> $value['id'], + // "v1"=> $value['achievement'].$value['unit'], + "v1"=> $value['unit'] == '分/秒'?$temporary_arr_e1[0].$temporary_arr_e2[0].$temporary_arr_e1[1].$temporary_arr_e2[1]:$value['achievement'].$value['unit'], + "v2"=> $value['score'].'分', + "v1_name"=> "成绩", + "v2_name"=> "得分", + "r_t"=> substr($value['record_time'], 0, 10) + ]; + array_push($return_data,$temporary_arr); + } + // dump($user_data); + // dump($card_data); + // dump($result_data); + // dump($return_data); + return $this->msg($return_data); + } + ##################################################data_contrast_contrast_data################################################## + public function data_contrast_contrast_data_action($data){ + + $tj = "id IN (".$data['before_id'].",".$data['after_id'].")"; + + $card_data = Db::table($this->cardpublic_use_db_name['3'])->where($tj)->select(); + if(count($card_data)<2){ + return $this->msg(10004); + } + if($card_data[0]['acdsi_id'] != $card_data[1]['acdsi_id']){ + return $this->msg(10003); + } + + dump($card_data); + } + + + + ################################################################tool################################################################ + ################################################################tool################################################################ + + // 计算得分成绩以及线性进度 + public function calculation_score($gender,$data,$type){ + // $card_name['card_name'] = ; + $card_name['project_name'] = $data['name']; + $card_name['score'] = 0; + $card_name['offset'] = 0; + $describe_list = $this->level_data; + $card_name['rule'] = []; + + // 计算得分 + // 获取评分细则 + $estimate = Db::table($this->cardpublic_use_db_name['4'])->where(['type'=>3])->find(); + $estimate = json_decode($estimate['content'],true); + + // 根据男女循环出项目细则 + foreach ($estimate[$gender]['公共考核标准'] as $key => $value) { + if(count($card_name['rule']) > 0){ + break; + } + foreach ($value['list'] as $k => $v) { + if($k == $data['name']){ + $card_name['rule'] = $v; + break; + } + } + } + foreach ($card_name['rule']['content'] as $key => $value) { + if($type == '分/秒'){ + $rule_result = $this->convertMinutesSecondsToStringSeconds($value[0]); + $data_result = $this->convertMinutesSecondsToStringSeconds($data['data']); + }else{ + $rule_result = $value[0]; + $data_result = $data['data']; + } + switch ($value[1]) { + case "<=": + $result = $data_result <= $rule_result; + break; + case ">=": + $result = $data_result >= $rule_result; + break; + case "<": + $result = $data_result < $rule_result; + break; + case ">": + $result = $data_result > $rule_result; + break; + case "==": + $result = $data_result == $rule_result; + break; + case "!=": + $result = $data_result != $rule_result; + break; + default: + // 如果比较符号不是上述任何一个,可以抛出一个异常或错误 + throw new Exception("Unsupported comparison operator: " . $value[1]); + } + if($result == true){ + $card_name['score'] = $value[2]; + if($value[2] < 100){ + $card_name['offset'] = $value[2]; + }else{ + $card_name['offset'] = 100; + } + + // $card_name['offset'] = bcdiv($value[2],$card_name['diagram'][count($card_name['diagram'])-1]['max_val'],0); + break; + } + } + + foreach ($describe_list as $key => $value) { + if($card_name['score'] >= $value['min_val'] && $card_name['score'] <= $value['max_val']){ + $card_name['standard'] = $value['text']; + $card_name['color'] = $value['color']; + break; + } + } + $card_name['max_score'] = $card_name['rule']['content'][0][2]; + $card_name['describe'] = $card_name['rule']['describe']; + $card_name['unit_data'] = $card_name['rule']['unit_data']; + // $card_name['default_data_format'] = $card_name['rule']['value']; + // $card_name['default_data_type'] = $card_name['rule']['type']; + // $card_name['list'] = $describe_list; + unset($card_name['rule']); + return $card_name; + } + + + // 获取标签列表,以及标签列表下数据 + public function get_other_data(){ + + } + + + ################################################################其他################################################################ + ################################################################其他################################################################ + + + // 检查字符串格式是否为“数字”+“:”+“数字”的格式,且冒号后的数字小于等于59 + public function isValidFormatWithLimit($str){ + // 使用正则表达式匹配“数字:数字”的格式 + if (preg_match('/^(\d+):(\d+)$/', $str, $matches)) { + // 提取冒号前后的数字 + $firstNumber = $matches[1]; + $secondNumber = $matches[2]; + + // 检查冒号后的数字是否小于等于60 + if ($secondNumber <= 59) { + return true; + } + } + return false; + } + + // 两个时间相加4:20、5:15 + function sumTimes($time1, $time2) { + // 将时间字符串拆分为分钟和秒 + list($min1, $sec1) = explode(':', $time1); + list($min2, $sec2) = explode(':', $time2); + + // 将分钟和秒转换为整数 + $totalMin = (int)$min1 + (int)$min2; + $totalSec = (int)$sec1 + (int)$sec2; + + // 如果秒数超过或等于60,则进位到分钟 + if ($totalSec >= 60) { + $totalMin += floor($totalSec / 60); + $totalSec = $totalSec % 60; + } + // 格式化总时间为"分:秒" + // $totalTime = sprintf('%d分%02d秒', $totalMin, $totalSec); + $totalTime = $totalMin.":".$totalSec; + // 返回结果 + return $totalTime; + } + + + // 处理平均时间 + function averageTime($timeStr, $divisor) { + // 步骤1: 拆分时间字符串 + list($minutes, $seconds) = explode(':', $timeStr); + + // 步骤2: 转换为总秒数 + $totalSeconds = ($minutes * 60) + $seconds; + + // 步骤3: 除以参数 + $averageSeconds = $totalSeconds / $divisor; + + // 步骤4: 转换回分钟和秒 + $averageMinutes = floor($averageSeconds / 60); + $remainingSeconds = round($averageSeconds % 60); // 使用round来处理小数秒,如果需要更精确的四舍五入 + + // 步骤5: 格式化结果为“分:秒” + $formattedTime = sprintf('%d分%02d秒', $averageMinutes, $remainingSeconds); + + return $formattedTime; + } + + + + + + + + + + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Device.php b/application/testapp/controller/Device.php new file mode 100644 index 0000000..feca712 --- /dev/null +++ b/application/testapp/controller/Device.php @@ -0,0 +1,271 @@ +'test_app_device_data', + '2'=>'test_app_account_number', + '3'=>'test_app_device_code_data', + ]; + + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 获取系统设备列表 + public function device_data_list($data = ['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->device_data_list_action($data); + } + + // 绑定系统设备 + public function device_binding($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a','device_id'=>'3','device_mac'=>'54654654']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data) || !array_key_exists('device_id', $data) || !array_key_exists('device_mac', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + return $this->device_binding_action($data); + } + // 获取用户设备列表 + public function device_user_data_list($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + return $this->device_user_data_list_action($data); + } + // 解绑系统设备 + public function device_unbinding($data = ['token'=>'e0966788d02cc93290d9d674921d9715','id'=>'8']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data) || !array_key_exists('id', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + return $this->device_unbinding_action($data); + } + + // 获取设备详情 + public function device_mac_get_content($data = ['mac'=>'76:FE:B3:2F:E7:D8','acd_id'=>'2','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('mac', $data) || !array_key_exists('acd_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + return $this->device_mac_get_content_action($data); + } + + ################################################################业务接口################################################################ + ################################################################业务接口################################################################ + + ################################################device_data_list + public function device_data_list_action($data){ + $result = Db::table($this->device_use_db_name['1'])->where(['is_del'=>0])->field('id,name,pic,content,page_measure,bluetooth_type,device_model')->select(); + foreach ($result as $key => $value) { + unset($result[$key]['ROW_NUMBER']); + } + if(empty($result)){ + return $this->msg(10004); + }else{ + return $this->msg(['list'=>$result]); + } + } + + ################################################device_binding + public function device_binding_action($data){ + $result_user = Db::table($this->device_use_db_name['2'])->where(['token'=>$data['token']])->field('id,token')->find(); + if(!$result_user){ + return $this->msg(10003); + } + $device_code_data = Db::table($this->device_use_db_name['3'])->where(['machine_code'=>$data['device_mac']])->find(); + $device_code_data_user = explode(',',$device_code_data['bind_account_id']); + if($device_code_data){ + // 多用户可以绑定 + if(in_array($result_user['id'], $device_code_data_user)){ + return $this->msg(10003,'设备已绑定'); + }else{ + array_push($device_code_data_user,$result_user['id']); + $device_binding = Db::table($this->device_use_db_name['3'])->where(['machine_code'=>$data['device_mac']])->update([ + 'bind_account_id'=>implode(',',$device_code_data_user), + ]); + if($device_binding){ + return $this->msg([]); + }else{ + return $this->msg(10002,'更新失败'); + } + } + } + $device_binding = Db::table($this->device_use_db_name['3'])->insert([ + 'add_id'=>$data['device_id'], + 'machine_code'=>$data['device_mac'], + 'create_time'=>date('Y-m-d H:i:s'), + 'bind_account_id'=>$result_user['id'], + ]); + if($device_binding){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + ################################################device_user_data_list + public function device_user_data_list_action($data){ + $result_user = Db::table($this->device_use_db_name['2'])->where(['token'=>$data['token']])->field('id,token')->find(); + if(!$result_user){ + return $this->msg(10003); + } + $likePattern = '%' . $result_user['id'] . '%'; + $device_code_data = Db::table($this->device_use_db_name['3']) + ->alias('adcd') + ->join(''.$this->device_use_db_name['1'].' add','adcd.add_id = add.id','LEFT') + // ->where(['adcd.bind_account_id'=>$result_user['id']]) + // ->where('adcd.bind_account_id LIKE "%'.$result_user['id'].'%"') + ->where("adcd.bind_account_id LIKE ?", [$likePattern]) + ->field('adcd.id,adcd.add_id,adcd.machine_code,adcd.create_time,add.name,add.pic,add.content,add.page_measure,add.bluetooth_type,add.device_model') + ->select(); + if(count($device_code_data) <= 0){ + return $this->msg([]); + } + $device_code_data1 = []; + $result = []; + + // 新版格式 + // $result['list'] = []; + foreach ($device_code_data as $key => $value) { + array_push($result,[ + 'add_id'=>$value['add_id'], + 'name'=>$value['name'], + 'pic'=>$value['pic'], + 'content'=>$value['content'], + 'page_measure'=>$value['page_measure'], + 'bluetooth_type'=>$value['bluetooth_type'], + 'device_model'=>$value['device_model'], + 'bind_time'=>$value['create_time'], + 'id'=>$value['id'], + 'mac'=>$value['machine_code'] + ]); + } + + return $this->msg(['list'=>$result]); + } + + ################################################device_unbinding + public function device_unbinding_action($data){ + $result_user = Db::table($this->device_use_db_name['2'])->where(['token'=>$data['token']])->field('id,token')->find(); + if(!$result_user){ + return $this->msg(10003); + } + + $device_binding_user = Db::table($this->device_use_db_name['3']) + ->alias('adcd') + ->join(''.$this->device_use_db_name['1'].' add2','add2.id = adcd.add_id','LEFT') + ->where(['adcd.id'=>$data['id']]) + ->field('adcd.id,adcd.bind_account_id,add2.acd_id') + ->find(); + // dump(time()); + // die; + $device_binding_user = explode(',',$device_binding_user['bind_account_id']); + // dump($device_binding_user); + $key = array_search($result_user['id'], $device_binding_user); + if($key !== false){ + unset($device_binding_user[$key]); + }else{ + return $this->msg([]); + } + // dump($device_binding_user); + // dump(implode(',',$device_binding_user)); + // die; + $device_binding = Db::table($this->device_use_db_name['3'])->where(['id'=>$data['id']])->update([ + 'bind_account_id'=>implode(',',$device_binding_user), + ]); + if($device_binding){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + ################################################device_mac_get_content + public function device_mac_get_content_action($data){ + + $user_id = Db::table($this->device_use_db_name['2'])->where(['token'=>$data['token']])->field('id,token')->find(); + // dump($user_id); + // die; + $likePattern = '%' . $user_id['id'] . '%'; + $result_device = Db::table($this->device_use_db_name['3']) + ->alias('adcd') + ->join(''.$this->device_use_db_name['1'].' add','adcd.add_id = add.id','LEFT') + ->where([ + 'adcd.machine_code'=>$data['mac'], + 'add.acd_id'=>$data['acd_id'], + 'adcd.bind_account_id'=>['LIKE',$likePattern], + 'add.is_del'=>0, + 'adcd.is_del'=>0, + ]) + // ->where("adcd.bind_account_id LIKE ?", [$likePattern]) + ->field('adcd.id,add.acd_id,add.name,add.pic,add.content,add.page_measure,add.bluetooth_type,add.device_model') + ->find(); + if($result_device){ + unset($result_device['ROW_NUMBER']); + return $this->msg($result_device); + }else{ + return $this->msg(10004); + } + } + + + + ################################################################其他接口################################################################ + ################################################################其他接口################################################################ + + + + + + + + + + + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Download.php b/application/testapp/controller/Download.php new file mode 100644 index 0000000..c5b68c7 --- /dev/null +++ b/application/testapp/controller/Download.php @@ -0,0 +1,50 @@ +order('id desc')->find(); + // echo '你好,这里仅仅是个下载展示页面-1'; + // echo '
点击下载'; + $url = Db::table('test_app_version_log')->order('id desc')->find(); + $this->assign([ + + 'url' => $url['download_url'], + ]); + return $this->fetch(); + } + + public function demo2(){ + + $url = Db::table('test_app_version_log')->order('id desc')->find(); + + + $this->assign([ + + 'url' => $url['download_url'], + ]); + return $this->fetch(); + } + + public function ceshi(){ + $data = input(); + $url = 'https://klcz.pcxbc.com/open-api/calc/healthcalc/bodyfat3'; + $temporary_parameter = [ + 'weight'=>$data['weight'], + 'height'=>$data['height'], + 'age'=>$data['age'], + 'adc'=>$data['adc'], + 'gender'=>$data['gender'], + ]; + dump($temporary_parameter); + + $result = $this->postRequest($url,$temporary_parameter); + dump($result); + die; + } +} \ No newline at end of file diff --git a/application/testapp/controller/Index.php b/application/testapp/controller/Index.php new file mode 100644 index 0000000..9fa312b --- /dev/null +++ b/application/testapp/controller/Index.php @@ -0,0 +1,640 @@ +'test_app_card_body_data','6'=>'test_app_card_skip_data','8'=>'test_app_card_vitalcapacity_data','10'=>'test_app_card_data_sub_item_data']; + protected $index_use_db_name = [ + '1'=>'test_app_version_log', + '2'=>'test_app_user_data', + '3'=>'test_app_card_body_data', + '4'=>'test_app_device_code_data', + '5'=>'test_app_device_data', + '6'=>'test_app_card_data', + '7'=>'test_app_account_number', + '8'=>'test_app_card_data_sub_item', + ]; + // protected $card_key = ['2'=>'body','6'=>'skip','8'=>'vitalcapacity']; + protected $default_card = ['2','6','8']; + protected $card_data = [ + '2'=>['身体数据','body',['height'=>['身高','cm','-'],'weight'=>['体重','公斤','-'],'bmi'=>['BMI','无','-']]], + // '6'=>['跳绳数据','skip',['jump_time'=>['用时','无','--:--:--'],'jump_num'=>['本次次数','次','-'],'average_num'=>['平均成绩','个','-'],'jump_kcal'=>['卡路里','kcal','-']]], + '6'=>['跳绳数据','skip',['jump_time'=>['用时','无','--:--:--'],'jump_num'=>['本次次数','次','-'],'jump_kcal'=>['卡路里','kcal','-']]], + '8'=>['肺活量','vitalcapacity',['average'=>['本次数据','ml','-']]], + ]; + + protected $data_name_unit = [ + 'height'=>['身高','cm','test_pc_heightstand2'], + 'weight'=>['体重','公斤','test_pc_weightstand2'], + 'bmi'=>['BMI','','test_pc_bmistand2'], + 'average'=>['肺活量','ml','test_pc_vitalcapacity_standard'] + ]; + + 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'=>'大学三、四年级'] + ]; + + ################################################################个人资料卡################################################################ + ################################################################个人资料卡################################################################ + ################################################################个人资料卡################################################################ + + // 检测版本及判断是否登录失效 + public function login_invalid_version($data = ['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + // phpinfo(); + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + $result = Db::table($this->index_use_db_name['1'])->order('is_del,id desc')->find(); + if($result){ + $version = $result['version_num_original']; + $url = $result['download_url']; + }else{ + $version = ''; + $url = ''; + } + // dump(cache(null)); + // die; + if($this->token_time_validate($data['token']) === false){ + return $this->msg(-1,'未登录',['version'=>$version,'url'=>$url]); + }else{ + return $this->msg(['version'=>$version,'url'=>$url]); + } + + + } + // 创建用户 + public function create_user_data($data = ['aan_id'=>1,'height'=>'152.3','weight'=>'35.4','nickname'=>'钮祜禄测试1','birthday'=>'2019-04-20','gender'=>1,'grade'=>'grade_s_3','token'=>'57bd45e3a963b372ea2d873e4bd8d1f8']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $verify_result = $this->verify_parameters($data,'register'); + if(!is_array($verify_result)){ + return $this->msg(10001,$verify_result); + } + $result = Db::table($this->index_use_db_name['2'])->insertGetId($verify_result); + if($result){ + return $this->msg(['aud_id'=>$result]); + }else{ + return $this->msg(10002); + } + } + // 修改用户 + public function update_user_data($data = ['id'=>66,'nickname'=>'王小二','birthday'=>'2019-01-01','gender'=>1,'grade'=>'二年级','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $verify_result = $this->verify_parameters2($data,'update'); + if(!is_array($verify_result)){ + return $this->msg(10001,$verify_result); + } + $id_val = $verify_result['id']; + unset($verify_result['id']); + $result = Db::table($this->index_use_db_name['2'])->where(['id'=>$id_val])->update($verify_result); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + // 删除用户 + public function del_user_data($data = ['id'=>'26','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $result = Db::table($this->index_use_db_name['2'])->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + + // 获取账号下用户列表 + // $type 1获取列表,2获取详细信息 + public function get_user_card_list($data = ['aan_id'=>1,'type'=>1,'token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data) || !array_key_exists('aan_id', $data) || !array_key_exists('type', $data)){ + return $this->msg(10001); + } + + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $result = Db::table($this->index_use_db_name['2'])->where(['aan_id'=>$data['aan_id'],'is_del'=>0])->select(); + $temporary_data = []; + if($data['type'] == 1){ + for ($i=0; $i < count($result); $i++) { + array_push($temporary_data,['id'=>$result[$i]['id'],'nickname'=>$result[$i]['nickname']]); + } + }else{ + for ($i=0; $i < count($result); $i++) { + $result[$i]['age'] = $this->calculate_age($result[$i]['birthday']); + } + $temporary_data = $result; + } + return $this->msg($temporary_data); + } + + // 获取指定用户详细信息 + public function get_user_data_information($data = ['aud_id'=>1,'token'=>'57bd45e3a963b372ea2d873e4bd8d1f8']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + + if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // 获取用户信息 + $result = Db::table($this->index_use_db_name['2'])->where(['id'=>$data['aud_id']])->field('id,aan_id,nickname,head_pic,birthday,gender,card_order,target_weight,initial_weight,initial_date,weight')->find(); + // 获取用户身体卡片信息 + $weight_data_pd = Db::table($this->index_use_db_name['3'])->where(['aud_id'=>$data['aud_id']])->order('record_time desc')->field('id,weight_val,record_time')->find(); + + // dump($card_pic_color); + // die; + if(!$result){ + return $this->msg(10003); + } + unset($result['ROW_NUMBER']); + $result['age'] = $this->calculate_age($result['birthday']); + if($result['card_order'] === ''){ + $result['card_order'] = []; + $result['card_data_list'] = []; + $result['target_current'] = $this->base_target_initial_cumulative_weight([]); + + }else{ + $result['card_order'] = explode(',',$result['card_order']); + $calculation_results = $this->get_user_card_data_list($result,$result['id']); + $result['card_data_list'] = $calculation_results[0]; + $result['target_current'] = $calculation_results[1]; + } + + + if($weight_data_pd){ + $result['weight'] = $weight_data_pd['weight_val']; + } + + unset($result['target_weight']); + unset($result['initial_weight']); + unset($result['initial_date']); + + // 获取设备信息进入卡片 start + $likePattern = '%' . $result['aan_id'] . '%'; + $result_device = Db::table($this->index_use_db_name['4']) + ->alias('adcd') + ->join(''.$this->index_use_db_name['5'].' add','adcd.add_id = add.id','LEFT') + // ->where(['adcd.bind_account_id'=>$result['aan_id']]) + ->where("adcd.bind_account_id LIKE ?", [$likePattern]) + ->field('adcd.id,add.acd_id') + ->select(); + + $device_arr = []; + foreach ($result_device as $key => $value) { + if(!in_array($value['acd_id'],$device_arr)){ + array_push($device_arr,$value['acd_id']); + } + } + // dump($device_arr); + // die; + foreach ($result['card_data_list'] as $key => $value) { + if(in_array($value['acd_id'],$device_arr)){ + $result['card_data_list'][$key]['device_determine'] = true; + }else{ + $result['card_data_list'][$key]['device_determine'] = false; + } + // // 处理卡片的背景色背景图 + // foreach ($card_pic_color as $ck => $cv) { + // if($cv['id'] == $value['acd_id']){ + // $result['card_data_list'][$key]['background_color'] = $cv['background_color']; + // $result['card_data_list'][$key]['background_pic'] = $cv['background_pic']; + // } + // } + } + // 获取设备信息进入卡片 end + // 插入肺活量的卡片标准 + $result['address'] = $this->moren_gufen_diqu; + $result['vitalcapacity_data'] = $this->get_vitalcapacity_data($result['id']); + return $this->msg($result); + } + + // 获取所有卡片列表信息 + public function get_card_all_list($data = ['aud_id'=>1,'token'=>'57bd45e3a963b372ea2d873e4bd8d1f8']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $user_card_list = Db::table($this->index_use_db_name['2'])->where(['id'=>$data['aud_id'],'is_del'=>0])->field('id,card_order')->find(); + // dump($user_card_list); + // die; + if(!$user_card_list){ + return $this->msg(10003); + } + unset($user_card_list['ROW_NUMBER']); + $user_card_list['card_order'] = explode(',',$user_card_list['card_order']); + $all_card_list = Db::table($this->index_use_db_name['6'])->where(['is_del'=>0])->field('id,name,pic')->select(); + // dump($user_card_list); + // dump($all_card_list); + $result = ['user'=>[],'all'=>[]]; + foreach ($all_card_list as $key => $value) { + if(in_array($value['id'],$user_card_list['card_order'])){ + $result['user'][array_search($value['id'], $user_card_list['card_order'])] = ['id'=>$value['id'],'name'=>$value['name'],'pic'=>$value['pic']]; + }else{ + array_push($result['all'],['id'=>$value['id'],'name'=>$value['name'],'pic'=>$value['pic']]); + } + } + ksort($result['user']); + return $this->msg($result); + } + + // 保存用户的卡片排序 + public function save_user_card_order($data=['aud_id'=>11,'card_order'=>'2,8','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('card_order', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + if(!$this->is_num_array(explode(',',$data['card_order']))){ + return $this->msg(10001,'数据内参数格式或值错误'); + } + $result = Db::table($this->index_use_db_name['2'])->where(['id'=>$data['aud_id']])->update(['card_order'=>$data['card_order']]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + + } + + // 获取年级key列表 + public function get_grade_list(){ + $data = input('post.'); + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + + return $this->msg($this->grade_list); + + } + ################################获取账号下信息操作################################ + + // 获取账号下首页卡片的基础数据 + public function get_user_card_data_list($data,$aud_id){ + + $result = []; + $db_arr = []; + foreach ($data['card_order'] as $key => $value) { + $db_arr[$value] = Db::table($this->db_name[$value])->where(['aud_id'=>$aud_id,'is_del'=>'0'])->order('record_time desc')->limit(1)->select(); + + if($value >= 10){ + // dump($db_arr[$value]); + $temporary_data = Db::table($this->index_use_db_name['8'])->where(['id'=>$db_arr[$value][0]['acdsi_id']])->field('id,name')->find(); + $db_arr[$value][0]['acdsi_name'] = $temporary_data['name']; + } + if(count($db_arr[$value]) > 0){ + $db_arr[$value] = $db_arr[$value][0]; + }else{ + unset($db_arr[$value]); + } + } + + // 获取卡片背景图,及背景色信息及其他信息 + $card_all_data = Db::table($this->index_use_db_name['6'])->field('id,name,page_url_record,page_url_report,page_url_bluetooth,key_word,background_color,background_pic')->select(); + // $card_data + $card_all_data_result = []; + foreach ($card_all_data as $key => $value) { + $card_all_data_result[$value['id']] = $value; + } + // 获取卡片路径及卡片数组处理end + + // dump($this->card_data); + // dump($card_all_data_result); + // die; + // 添加目标体重于当前体重差数据 + if(array_key_exists('2', $db_arr)){ + $target_current = $this->base_target_initial_cumulative_weight([ + 'weight'=>$db_arr['2']['weight']>0?$db_arr['2']['weight']:0, + 'target_weight'=>$data['target_weight']>0?$data['target_weight']:0, + 'initial_weight'=>$data['initial_weight']>0?$data['initial_weight']:0, + 'initial_date'=>$data['initial_date']!=null?$data['initial_date']:0, + ]); + }else{ + $target_current = $this->base_target_initial_cumulative_weight([ + 'weight'=>0, + 'target_weight'=>$data['target_weight']>0?$data['target_weight']:0, + 'initial_weight'=>$data['initial_weight']>0?$data['initial_weight']:0, + 'initial_date'=>$data['initial_date']!=null?$data['initial_date']:0, + ]); + } + if(count($db_arr) <= 0){ + // 没有数据,传递一个空的卡片 + foreach ($data['card_order'] as $key => $value) { + $temporary_arr = []; + $temporary_arr['id'] = ''; + $temporary_arr['acd_id'] = $value; + $temporary_arr['record_time'] = ''; + $temporary_arr['card_name'] = $card_all_data_result[$value]['name']; + $temporary_arr['card_key'] = $card_all_data_result[$value]['key_word']; + $temporary_arr['page_url_record'] = $card_all_data_result[$value]['page_url_record']; + $temporary_arr['page_url_report'] = $card_all_data_result[$value]['page_url_report']; + $temporary_arr['page_url_bluetooth'] = $card_all_data_result[$value]['page_url_bluetooth']; + $temporary_arr['background_color'] = $card_all_data_result[$value]['background_color']; + $temporary_arr['background_pic'] = $card_all_data_result[$value]['background_pic']; + $temporary_arr['inside_data'] = []; + if(array_key_exists($value, $this->card_data)){ + foreach ($this->card_data[$value][2] as $k => $v) { + array_push($temporary_arr['inside_data'],[ + 'key'=>$k, + 'name'=>$v[0], + 'value'=>$v[2], + 'unit'=>$v[1]!='无'?$v[1]:'', + 'standard'=>'', + 'color'=>'' + ]); + } + }else{ + array_push($temporary_arr['inside_data'],[ + 'key'=>'last_time', + 'name'=>'最近一次', + 'value'=>"--", + 'unit'=>'', + 'standard'=>'*分', + 'color'=>'' + ]); + } + array_push($result,$temporary_arr); + } + }else{ + // dump($db_arr); + // die; + foreach ($data['card_order'] as $key => $value) { + $temporary_arr = []; + $temporary_arr['acd_id'] = $value; + $temporary_arr['card_name'] = $card_all_data_result[$value]['name']; + $temporary_arr['card_key'] = $card_all_data_result[$value]['key_word']; + $temporary_arr['page_url_record'] = $card_all_data_result[$value]['page_url_record']; + $temporary_arr['page_url_report'] = $card_all_data_result[$value]['page_url_report']; + $temporary_arr['page_url_bluetooth'] = $card_all_data_result[$value]['page_url_bluetooth']; + $temporary_arr['background_color'] = $card_all_data_result[$value]['background_color']; + $temporary_arr['background_pic'] = $card_all_data_result[$value]['background_pic']; + $temporary_arr['inside_data'] = []; + if(array_key_exists($value, $this->card_data)){ + if(array_key_exists($value,$db_arr)){ + $temporary_arr['id'] = $db_arr[$value]['id']; + $temporary_arr['record_time'] = $db_arr[$value]['record_time']; + foreach ($this->card_data[$value][2] as $k => $v) { + if($value == '2'){ + $tem_arr_2 = explode(',', $db_arr[$value][$k]); + }else if($value == '6' && $k == 'jump_time'){ + $time_conversion = $this->handle_hour_branch_second($db_arr[$value][$k]); + $tem_arr_2 = [$time_conversion['h'].':'.$time_conversion['m'].':'.$time_conversion['s'],'','']; + }else{ + $tem_arr_2 = [$db_arr[$value][$k],'','']; + } + + // dump($tem_arr_2); + array_push($temporary_arr['inside_data'],[ + 'key'=>$k, + 'name'=>$v[0], + 'value'=>$tem_arr_2[0], + 'unit'=>$v[1]!='无'?$v[1]:'', + 'standard'=>$tem_arr_2[1]!='无'?$tem_arr_2[1]:'', + 'color'=>$tem_arr_2[2]!='无'?$tem_arr_2[2]:'' + ]); + } + }else{ + $temporary_arr['id'] = ''; + $temporary_arr['record_time'] = ''; + foreach ($this->card_data[$value][2] as $k => $v) { + array_push($temporary_arr['inside_data'],[ + 'key'=>$k, + 'name'=>$v[0], + 'value'=>$v[2], + 'unit'=>$v[1]!='无'?$v[1]:'', + 'standard'=>'', + 'color'=>'' + ]); + } + } + }else{ + if(array_key_exists($value,$db_arr)){ + // 公共卡片内容 + $temporary_arr['id'] = $db_arr[$value]['id']; + $temporary_arr['record_time'] = $db_arr[$value]['record_time']; + array_push($temporary_arr['inside_data'],[ + 'key'=>'last_time', + // 'name'=>'最近一次', + 'name'=>$db_arr[$value]['acdsi_name'], + 'value'=>$db_arr[$value]['achievement'], + 'unit'=>$db_arr[$value]['unit'], + 'standard'=>$db_arr[$value]['score'].'分', + 'color'=>'' + ]); + }else{ + $temporary_arr['id'] = ''; + $temporary_arr['record_time'] = ''; + array_push($temporary_arr['inside_data'],[ + 'key'=>'last_time', + 'name'=>'最近一次', + 'value'=>"--", + 'unit'=>'', + 'standard'=>'*分', + 'color'=>'' + ]); + } + + } + + array_push($result,$temporary_arr); + + } + } + return [$result,$target_current]; + } + + + + ################################################################other################################################################ + ################################################################other################################################################ + ################################################################other################################################################ + + + public function verify_parameters($data,$type){ + // 设置验证 + $rule = [ + 'aan_id' => 'require|number', + 'nickname' => 'require|chsAlphaNum', + 'birthday' => 'require|date', + 'gender' => 'require|number|in:0,1,2', + 'grade' => 'require', + 'height' => 'require|number', + 'weight' => 'require|number', + // 'identity' => 'require|number', + ]; + $msg = [ + 'aan_id.require' => '账号信息缺失', + 'nickname.require' => '昵称缺失', + 'birthday.require' => '生日缺失', + 'gender.require' => '性别缺失', + 'grade.require' => '年级缺失', + 'height.require' => '身高缺失', + 'weight.require' => '体重缺失', + // 'identity.require' => '身份缺失', + + 'aan_id.number' => '账号信息格式错误', + 'nickname.chsAlphaNum' => '昵称只能是只能是汉字、字母', + 'birthday.date' => '生日信息格式错误', + 'gender.number' => '性别格式错误', + 'gender.in' => '性别信息错误', + 'height.number' => '身高必须为数字', + 'weight.number' => '体重必须为数字', + // 'identity.number' => '身份信息格式错误', + ]; + $validate = new Validate($rule,$msg); + $result = $validate->check($data); + if(!$result){ + return $validate->getError(); + } + + $parameter['aan_id'] = $data['aan_id']; + $parameter['nickname'] = $data['nickname']; + $parameter['birthday'] = $data['birthday']; + $parameter['gender'] = $data['gender']; + $parameter['grade'] = $data['grade']; + $parameter['card_order'] = '2,6,8'; + $parameter['height'] = $data['height']; + $parameter['weight'] = $data['weight']; + $parameter['head_pic'] = $data['gender'] == 2?'http://tc.pcxbc.com/tsf/2.png':'http://tc.pcxbc.com/tsf/1.png'; + // $parameter['identity_data'] = $data['identity']; + $parameter['create_time'] = date('Y-m-d H:i:s'); + $parameter['last_update_time'] = date('Y-m-d H:i:s'); + + $parameter_pd = Db::table($this->index_use_db_name['7'])->where(['id'=>$parameter['aan_id']])->count(); + if($parameter_pd <= 0){ + return '该账户不存在'; + } + $result = Db::table($this->index_use_db_name['2'])->where(['nickname'=>$parameter['nickname'],'aan_id'=>$parameter['aan_id'],'is_del'=>0])->count(); + if($result>0){ + return '该成员已存在'; + } + + return $parameter; + } + public function verify_parameters2($data,$type){ + // 设置验证 + $rule = [ + 'id' => 'require|number', + 'nickname' => 'require|chsAlphaNum', + 'birthday' => 'require|date', + 'gender' => 'require|number|in:0,1,2', + 'grade' => 'require', + 'height' => 'require|number', + 'weight' => 'require|number', + // 'identity' => 'require|number', + ]; + $msg = [ + 'id.require' => '用户信息缺失', + 'nickname.require' => '昵称缺失', + 'birthday.require' => '生日缺失', + 'gender.require' => '性别缺失', + 'grade.require' => '年级缺失', + 'height.require' => '身高缺失', + 'weight.require' => '体重缺失', + // 'identity.require' => '身份缺失', + + 'id.number' => '用户信息格式错误', + 'nickname.chsAlphaNum' => '昵称只能是只能是汉字、字母、数字', + 'birthday.date' => '生日信息格式错误', + 'gender.number' => '性别格式错误', + 'gender.in' => '性别信息错误', + 'height.number' => '身高必须为数字', + 'weight.number' => '体重必须为数字', + // 'identity.number' => '身份信息格式错误', + ]; + $validate = new Validate($rule,$msg); + $result = $validate->check($data); + if(!$result){ + return $validate->getError(); + } + + $parameter['id'] = $data['id']; + $parameter['nickname'] = $data['nickname']; + $parameter['birthday'] = $data['birthday']; + $parameter['height'] = $data['height']; + $parameter['weight'] = $data['weight']; + $parameter['gender'] = $data['gender']; + $parameter['grade'] = $data['grade']; + $parameter['head_pic'] = $data['gender'] == 2?'http://tc.pcxbc.com/tsf/2.png':'http://tc.pcxbc.com/tsf/1.png'; + // $parameter['identity_data'] = $data['identity']; + $parameter['last_update_time'] = date('Y-m-d H:i:s'); + return $parameter; + } + + + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Login.php b/application/testapp/controller/Login.php new file mode 100644 index 0000000..1c9f948 --- /dev/null +++ b/application/testapp/controller/Login.php @@ -0,0 +1,483 @@ +18530934717,'password'=>'ceshi','code'=>'746119']){ + // 验证是否前段发送过来的数据 + if(count(input('post.')) > 0){ + $data = input('post.'); + } + // 验证数据项是否完整 + if(!array_key_exists('data', $data) || !array_key_exists('password', $data) || !array_key_exists('code', $data)){ + return $this->msg(10001); + } + // 验证数据值是否合规 + if(!$data['data'] || !$data['password'] || !$data['code']){ + return $this->msg(10006); + } + // 验证是手机还是邮箱 + $montage_data = $this->is_tel_email($data['data']); + if($montage_data == false){ + return $this->msg(10005); + } + // 查询账号是否已经注册 + $inspect_repeat = Db::table('test_app_account_number')->where([$montage_data=>$data['data'],'is_del'=>0])->count(); + if($inspect_repeat >= 0){ + return $this->msg(10002,'注册失败,账号已存在'); + } + // 检查验证码 + $code_result = $this->check_code($data['data'],$data['code']); + if($code_result !== true){ + return $this->msg(10002,$code_result); + } + // 验证完之后 + $set_data = []; + if($montage_data == 'tel'){ + $set_data['tel'] = $data['data']; + }else{ + $set_data['email'] = $data['data']; + } + $set_data['password'] = $data['password']; + $set_data['head_pic'] = $this->default_head_pic; + $set_data['nickname'] = '用户'.time(); + $set_data['create_time'] = date('Y-m-d H:i:s'); + $set_data['token'] = md5($data['data'].$this->create_random_string(12).time()); + $result = Db::table('test_app_account_number')->insertGetId($set_data); + if($result){ + cache($set_data['token'],date('Y-m-d H:i:s'),$this->token_time); + return $this->msg(['token'=>$set_data['token'],'aan_id'=>$result]); + }else{ + return $this->msg(10002); + } + } + // 重置密码 + public function reset_password($data = ['data'=>'18530934717','password'=>'ceshi1','c_password'=>'ceshi1','code'=>'491661']){ + // 验证是否前段发送过来的数据 + if(count(input('post.')) > 0){ + $data = input('post.'); + } + // 验证数据项是否完整 + if(!array_key_exists('data', $data) || !array_key_exists('password', $data) || !array_key_exists('c_password', $data) || !array_key_exists('code', $data)){ + return $this->msg(10001); + } + // 验证数据值是否合规 + if($data['password'] != $data['c_password']){ + return $this->msg(10003,'两次密码不一致'); + } + if($data['password'] == ''){ + return $this->msg(10003,'密码不能为空'); + } + // 检查验证码 + $code_result = $this->check_code($data['data'],$data['code']); + if($code_result !== true){ + return $this->msg(10003,$code_result); + } + $t_y = $this->is_tel_email($data['data']); + if($t_y === false){ + return $this->msg(10003,'账号格式错误'); + } + // 检查账号是否存在 + $find_data = Db::table('test_app_account_number')->where([$t_y=>$data['data'],'is_del'=>0])->field('id,token')->find(); + if(!$find_data){ + return $this->msg(10003); + } + $result = Db::table('test_app_account_number')->where([$t_y=>$data['data']])->update(['password'=>$data['password']]); + if($result){ + + cache($find_data['token'],date('Y-m-d H:i:s'),$this->token_time); + return $this->msg(['token'=>$find_data['token'],'aan_id'=>$find_data['id']]); + }else{ + return $this->msg(10002); + } + } + + // 登录 + public function login_action($data = ['data'=>'18530934717','validate_data'=>'0932','type'=>'login','validate_type'=>'password']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('data', $data) || !array_key_exists('validate_data', $data) || !array_key_exists('validate_type', $data)){ + return $this->msg(10001); + } + // 检测是否为手机 + $montage_data = $this->is_tel_email($data['data']); + if($montage_data == false){ + return $this->msg(10005); + } + $verify_result[$montage_data] = $data['data']; + $verify_result['is_del'] = 0; + // dump($data); + // die; + // 检测校验途径 + if($data['validate_type'] == 'code'){ + $code_name = $data['data']; + if($this->check_code($code_name,$data['validate_data']) === true){ + $result = Db::table('test_app_account_number')->where($verify_result)->field('id,token')->find(); + if($result){ + + cache($result['token'],date('Y-m-d H:i:s'),$this->token_time); + return $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']]); + }else{ + $set_data['password'] = ''; + $set_data[$montage_data] = $data['data']; + $set_data['head_pic'] = $this->default_head_pic; + $set_data['nickname'] = '用户'.$data['data']; + $set_data['create_time'] = date('Y-m-d H:i:s'); + $set_data['token'] = md5($data['data'].$this->create_random_string(12).time()); + $result = Db::table('test_app_account_number')->insertGetId($set_data); + if($result){ + + cache($set_data['token'],date('Y-m-d H:i:s'),$this->token_time); + return $this->msg(['token'=>$set_data['token'],'aan_id'=>$result],'登录成功'); + }else{ + return $this->msg(10002); + } + } + }else{ + return $this->msg(10003,'登录失败,验证码错误或失效'); + } + }else if($data['validate_type'] == 'password'){ + // $verify_result['password'] = $data['validate_data']; + $result = Db::table('test_app_account_number')->where($verify_result)->field('id,token,password')->find(); + if($result){ + if($result['password'] == ''){ + return $this->msg(10003,'该账户未设密码,请用验证码登录'); + } + if($data['validate_data'] != $result['password']){ + return $this->msg(10003,'账号密码错误'); + }else{ + cache($result['token'],date('Y-m-d H:i:s'),$this->token_time); + return $this->msg(['token'=>$result['token'],'aan_id'=>$result['id']],'登录成功'); + } + }else{ + return $this->msg(10003,'账号未注册,请先注册'); + } + }else{ + return $this->msg(10003,'校验参数错误'); + } + + } + // 退出登录操作 + public function user_quit_account($data=['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + cache($data['token'],NULL); + return $this->msg([]); + } + + + // 删除账号 + public function delete_account($data=['token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + $result = Db::table('test_app_account_number')->where(['token'=>$data['token']])->update(['is_del'=>1]); + cache($data['token'], NULL); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + + + // 发送验证码 手机/邮箱 + /* 接口说明(发邮件) + * $data(手机或者邮箱信息) 字符串 + * $type(验证类型,是注册用,还是其他用途) 字符串 默认register(注册)(register、login、reset_password) + * $road(是手机还是邮箱还是其他) 字符串 默认tel或email + */ + public function send_phone_email_code($data = ['data'=>'18530934717']){ + + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('data', $data)){ + return $this->msg(10001); + } + + if(cache($data['data'])){ + return $this->msg(10002,'60秒仅可发送一次验证码'); + } + + $num = mt_rand(100000,999999); + if (preg_match('/^\d{11}$/', $data['data'])) { + $result = $this->send_tel_code($data['data'],$num); + $road = 'tel'; + }else{ + $result = $this->send_email_code([$data['data']],['title'=>'体测APP验证码','from_user_name'=>'体测APP','content'=>$num]); + // dump($result); + $road = 'email'; + } + // dump($result); + // dump($road); + // die; + if(is_array($result) && $result['code'] == 0){ + cache($data['data'], $num, $this->code_time); + // dump($data['data']."_".$data['road']."_".$data['type']); + // return $this->msg(['code'=>$num]); + return $this->msg([]); + // return true; + }else{ + return $this->msg(10010,'验证码发送失败'); + // return false; + } + } + + ################################内部调用################################ + /* 接口说明(发手机短信) + + */ + public function send_tel_code($tel,$code){ + // 初始化cURL会话 + $ch = curl_init(); + $headers = [ + 'Accept: application/json', + 'Content-Type: application/json', + ]; + // 设置头部信息 + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + // 设置请求的URL + $url = "http://sms.ybhdmob.com/Message/Send?token=ybhdmob"; + curl_setopt($ch, CURLOPT_URL, $url); + // 设置为POST请求 + curl_setopt($ch, CURLOPT_POST, 1); + // 设置POST数据 + $postData = array( + 'phone' => $tel, + // 'content' => '您好,欢迎使用Reedaw,您的手机验证码是:'.$code.',验证码三分钟内有效,若非本人操作,请忽略!' + 'content' => '【Reedaw】您好,欢迎使用Reedaw,您的验证码是:'.$code.',验证码一分钟内有效,若非本人操作,请忽略本短信' + ); + $postData = json_encode($postData); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); + // 设置返回结果不直接输出,而是返回到变量中 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + // 发送请求并获取响应 + $response = curl_exec($ch); + // 检查是否有错误发生 + if (curl_errno($ch)) { + $error_message = curl_error($ch); + return "请求错误: " . $error_message; + } + // 关闭cURL会话 + curl_close($ch); + // 处理响应 + + if ($response) { + return json_decode($response,true); + } else { + echo "未收到响应"; + } + } + /* 接口说明(发邮件) + * $address(收件人的邮箱地址) 数组 格式: ['460834639@qq.com','460834639@qq.com'.......] + * $content(邮件的主题数据信息) 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123'] + * $annex(附件路径信息) 字符串 + */ + public function send_email_code($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 = '
+ + + + + +
+ + + + + + + +
  + + + + + +
+
 
+
+ + + + + +
+
 
+ + QingCe! + +
 
+
+ + + + + +
+
 
+ + 感谢您选择青测产品! + +
 
+ + 以下6位数字是邮箱验证码,请在需要的位置填写以通过验证 + +
 
+ + (如果您从未请求发送邮箱验证码,请忽略此邮件) + +
 
+ + + + +
+ + + '.$content['content'].' + + +
+
 
+
+ + + + + +
+
 
+ + + + +
+
 
+ + © Zhengzhou Pinchuan Technology Co., Ltd. + +
 
+ + + +
 
+
+
+ +
 
+ +
+
'; + + $mail->Body = $neirong; //邮件主体内容 + // dump($address); + // die; + //发送 + if (!$mail->Send()) { + + return ['code' => 10003,'msg'=>$mail->ErrorInfo]; + // return $mail->ErrorInfo; + } else { + return ['code' => 0]; + // return 'success'; + } + } + + + + public function check_code($data = 18530934717 , $code = 123456){ + // // 默认验证码正确 + + if(cache($data) == false){ + return '验证码过期'; + }else{ + if($code != cache($data)){ + return '验证码错误'; + } + } + return true; + } + ################################################################other################################################################ + ################################################################other################################################################ + ################################################################other################################################################ + + + public function create_random_string($length = 12) + { + //创建随机字符 + $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + $str = ""; + for ($i = 0; $i < $length; $i++) { + $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); + } + return $str; + } + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Myinformation.php b/application/testapp/controller/Myinformation.php new file mode 100644 index 0000000..ba31ea0 --- /dev/null +++ b/application/testapp/controller/Myinformation.php @@ -0,0 +1,154 @@ +'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + + return $this->get_my_account_msg_action($data); + } + // 修改昵称 + public function update_my_nickname($data = ['token'=>'0dafb98a10995c98b5a33b7d59d986ca','nickname'=>'']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('nickname', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + + return $this->update_my_nickname_action($data); + } + // 邮箱/手机绑定 + public function update_my_account_msg($data = ['token'=>'0dafb98a10995c98b5a33b7d59d986ca','data'=>'tsf3920322@126.com','code'=>'123456']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('data', $data) || !array_key_exists('token', $data) || !array_key_exists('code', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + + return $this->update_my_account_msg_action($data); + } + + // 修改密码 + public function update_my_password($data = ['token'=>'0dafb98a10995c98b5a33b7d59d986ca','password'=>'ceshi1','c_password'=>'ceshi1']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('password', $data) || !array_key_exists('c_password', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + // unset($data['token']); + return $this->update_my_password_action($data); + } + + ################################################################业务################################################################ + ################################################################get_my_account_msg + public function get_my_account_msg_action($data){ + $result = Db::table('test_app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->find(); + if($result){ + return $this->msg([ + 'my_tel'=>$result['tel'], + 'my_email'=>$result['email'], + 'create_time'=>$result['create_time'], + 'token'=>$result['token'], + 'nickname'=>$result['nickname'], + 'head_pic'=>$result['head_pic'], + 'last_update_time'=>$result['update_time'], + ]); + }else{ + return $this->msg(10002); + } + } + ################################################################update_my_nickname + public function update_my_nickname_action($data){ + $result = Db::table('test_app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->update([ + 'nickname'=>$data['nickname'], + 'update_time'=>date('Y-m-d H:i:s') + ]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + ################################################################update_my_account_msg + public function update_my_account_msg_action($data){ + $login_action = new Login(); + $validate_result = $login_action->check_code($data['data'],$data['code']); + if($validate_result !== true){ + return $this->msg(10001,$validate_result); + } + $montage_data = $this->is_tel_email($data['data']); + if($montage_data == false){ + return $this->msg(10005); + } + // dump($data); + // die; + $result = Db::table('test_app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->update([ + $montage_data=>$data['data'], + 'update_time'=>date('Y-m-d H:i:s') + ]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + ################################################################update_my_password + public function update_my_password_action($data){ + if($data['password'] != $data['c_password']){ + return $this->msg(10003,'两次密码不一致'); + } + if($data['password'] == ''){ + return $this->msg(10003,'密码不能为空'); + } + $result = Db::table('test_app_account_number')->where(['token'=>$data['token'],'is_del'=>0])->update([ + 'password'=>$data['password'], + 'update_time'=>date('Y-m-d H:i:s') + ]); + if($result){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + + +} \ No newline at end of file diff --git a/application/testapp/controller/Pagingcontrast.php b/application/testapp/controller/Pagingcontrast.php new file mode 100644 index 0000000..6b8a0b6 --- /dev/null +++ b/application/testapp/controller/Pagingcontrast.php @@ -0,0 +1,602 @@ +'test_app_card_body_data','6'=>'test_app_card_skip_data','8'=>'test_app_card_vitalcapacity_data']; + protected $request_result = [ + '2'=>['height'=>['身高','cm'],'weight'=>['体重','kg'],'age'=>['年龄','岁'],'bmi'=>['BMI',''],'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 $pagesize = 10; + + ################################################请求接口################################################ + ################################################请求接口################################################ + ################################################请求接口################################################ + // 获取记录信息(分组)(包含身体、跳绳、肺活量) + public function get_all_record_data_group($data = ['aud_id'=>'26','s_time'=>'2024-04-01','e_time'=>'2024-06-12','token'=>'0dafb98a10995c98b5a33b7d59d986ca','type'=>'6']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data) || !array_key_exists('token', $data) || !array_key_exists('type', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + if(array_key_exists($data['type'],$this->db_name)){ + return $this->jump_transfer_interface_record($data,'group'); + }else{ + return $this->msg(10005); + } + } + // 获取记录信息(分页)(包含身体、跳绳、肺活量) + public function get_all_record_data_page($data = ['aud_id'=>'25','page'=>1,'token'=>'0dafb98a10995c98b5a33b7d59d986ca','type'=>'2']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('page', $data) || !array_key_exists('token', $data) || !array_key_exists('type', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + if(array_key_exists($data['type'],$this->db_name)){ + return $this->jump_transfer_interface_record($data,'page'); + }else{ + return $this->msg(10005); + } + } + // 获取详细历史数据信息(包含身体、跳绳、肺活量) + public function get_all_record_detailed_information($data = ['id'=>'39','type'=>'2','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('id', $data) || !array_key_exists('type', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + + return $this->jump_transfer_interface_detailed($data); + } + // 数据对比(包含身体、跳绳、肺活量) + public function get_all_card_data_contrast($data = ['before_id'=>'837','after_id'=>'836','type'=>'6','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $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->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // $data = explode(',',$data['id_arr']); + // dump($data); + // die; + return $this->jump_transfer_interface_data_contrast($data); + } + // 删除历史数据 + public function del_all_record_data($data = ['id'=>'29','type'=>'2','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('id', $data) || !array_key_exists('type', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $user_data = Db::table($this->db_name[$data['type']])->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($user_data){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + ################################################请求接口################################################ + ################################################请求接口################################################ + ################################################请求接口################################################ + + public function jump_transfer_interface_record($data,$str){ + if($data['type'] == '2'){ + return $this->get_body_record_data($data,$str); + }else if($data['type'] == '6'){ + return $this->get_skip_record_data($data,$str); + }else if($data['type'] == '8'){ + return $this->get_vitalcapacity_record_data($data,$str); + } + } + public function jump_transfer_interface_detailed($data){ + return $this->get_all_detaile_data_msg($data); + + // if($data['type'] == '2'){ + // return $this->get_body_detaile_data_msg($data); + // }else if($data['type'] == '6'){ + // return $this->get_skip_detaile_data_msg($data); + // // return $this->msg(10005); + // }else if($data['type'] == '8'){ + // // return $this->get_body_record_data($data,$str); + // } + } + public function jump_transfer_interface_data_contrast($data){ + 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); + } + } + + ################################################业务部分################################################ + + + // 获取记录信息列表(分组)-身体 + // 获取记录信息列表(分页)-身体 + public function get_body_record_data($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 test_app_card_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'=>$value['v1'], + 'v2'=>$value['v2'], + 'v3'=>$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('test_app_card_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('test_app_card_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'=>$value['height_val'], + 'v2'=>$value['weight_val'], + 'v3'=>$value['bmi_val'], + 'v1_name'=>'身高', + 'v2_name'=>'体重', + 'v3_name'=>'BMI', + 'record_time'=>$value['b_time'], + ]); + } + } + return $this->msg($return_result); + } + // 获取记录信息列表(分组)-跳绳 + // 获取记录信息列表(分页)-跳绳 + public function get_skip_record_data($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 test_app_card_skip_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) { + $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('test_app_card_skip_data')->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('test_app_card_skip_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) { + $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_vitalcapacity_record_data($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 test_app_card_vitalcapacity_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) { + // $time_t = $this->handle_hour_branch_second($value['v2']); + array_push($return_result, [ + 'id'=>$value['id'], + 'v1'=>$value['v1'], + 'v2'=>$value['v2'], + 'v3'=>$value['v3'], + 'v4'=>$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('test_app_card_vitalcapacity_data')->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('test_app_card_vitalcapacity_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) { + // $time_t = $this->handle_hour_branch_second($value['jump_time']); + array_push($return_result['rows'],[ + 'id'=>$value['id'], + 'v1'=>$value['one_val'], + 'v2'=>$value['two_val'], + 'v3'=>$value['three_val'], + 'v4'=>$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_msg($data){ + $result = Db::table($this->db_name[$data['type']])->where(['id'=>$data['id']])->find(); + if($result){ + $result_data = []; + foreach ($this->request_result[$data['type']] as $key => $value) { + $temporary_arr['key_name'] = $key; + $temporary_arr['name'] = $value[0]; + if($data['type'] == 2){ + if($key == 'un_fat_w_weight'){ + $temporary_arr['value'] = bcsub(explode(',',$result['weight'])[0],explode(',',$result['fat_w'])[0],2); + }else{ + $temporary_arr['value'] = explode(',',$result[$key])[0]; + } + }else{ + $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(10004); + } + + } + + + // 数据对比 + public function get_body_data_contrast($data){ + // dump($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, + REPLACE(CONVERT(varchar(10), acbd.record_time, 23), '-', '-') AS b_time, + aud.nickname, + aud.gender, + aud.birthday, + aud.head_pic + from test_app_card_body_data as acbd + left join test_app_user_data as aud on acbd.aud_id=aud.id + where acbd.id in ($data3) + and acbd.is_del = 0 + "); + // dump($result); + // die; + 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, ['height','weight','bmi','fat_r','fat_w','muscle','muscleval','water','proteinval','bone','protein','kcal','visceral','sfr'])){ + $before_arr = explode(',', $value); + $after_arr = explode(',', $calculate_arr['after'][$key]); + // $calculate_arr['before'][$key] = explode(',', $value); + + 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), + ]); + } + } + return $this->msg($return_data); + } + // 数据对比 + public function get_skip_data_contrast($data){ + // dump($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 test_app_card_skip_data as acsd + left join test_app_user_data 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'] = []; + // dump($calculate_arr); + // die; + 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){ + // dump($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 test_app_card_vitalcapacity_data as acsd + left join test_app_user_data 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'] = []; + // dump($calculate_arr); + // die; + 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); + } + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Skip.php b/application/testapp/controller/Skip.php new file mode 100644 index 0000000..1bfd9a3 --- /dev/null +++ b/application/testapp/controller/Skip.php @@ -0,0 +1,364 @@ +['跳绳个数','个数/个','#009DFF'],'jump_time'=>['跳绳时长','时长/分','#009DFF'],'jump_kcal'=>['消耗卡路里','卡路里/kcal','#009DFF']]; + + protected $result_end_data_mould = [ + 'name'=>'', + 'value'=>'', + 'unit'=>'', + 'standard'=>'', + 'color'=>'', + 'list'=>[] + ]; + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + // 手动记录 + public function skip_manual_recording($data = ['aud_id'=>'61','r_time'=>'2024-07-24','num'=>'369','time_m'=>'02','time_s'=>'42','type'=>'free','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + // dump(bcmul('1.23', '4.56', 2)); + // dump(bcround('18.777', 2)); + // // phpinfo(); + // // opcache_reset(); + // die; + + 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 $this->msg(10001); + } + if(!$this->isValidInteger($data['num']+0) || !$this->isValidInteger($data['time_m']+0) || !$this->isValidInteger($data['time_s']+0)){ + return $this->msg(10005,'跳绳数量或者分钟、秒钟值必须为整数'); + } + if($data['num'] <= 0){ + return $this->msg(10005,'跳绳数不能小于等于0'); + } + if(abs($data['time_s']) >= 60){ + return $this->msg(10005,'秒钟值不能大于60'); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + if($this->validate_user_identity($data['aud_id']) === false){ + return $this->msg(10003); + } + // die; + return $this->skip_manual_recording_action($data); + } + // 设备记录记录 + public function skip_manual_recording_device($data = ['aud_id'=>'58','num'=>'582','time_m'=>'10','time_s'=>'00','type'=>'free','kcal'=>'200','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $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 $this->msg(10001); + } + if(!$this->isValidInteger($data['num']+0) || !$this->isValidInteger($data['time_m']+0) || !$this->isValidInteger($data['time_s']+0)){ + return $this->msg(10005,'跳绳数量或者分钟、秒钟值必须为整数'); + } + if($data['num'] <= 0){ + return $this->msg(10005,'跳绳数不能小于等于0'); + } + if(abs($data['time_s']) >= 60){ + return $this->msg(10005,'秒钟值不能大于60'); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + if($this->validate_user_identity($data['aud_id']) === false){ + return $this->msg(10003); + } + return $this->skip_manual_recording_action($data); + } + // 今日数据 + public function skip_today_data($data = ['aud_id'=>'26','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // dump($data); + // die; + return $this->skip_today_data_action($data); + } + // 曲线 + public function skip_curve_chart($data = ['aud_id'=>'83','time'=>'2024-07-24','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + 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 $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->skip_curve_chart_action($data); + } + // 删除历史数据 + public function skip_del_record_data($data = ['id'=>'16','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $user_data = Db::table('test_app_card_skip_data')->where(['id'=>$data['id']])->update(['is_del'=>1]); + if($user_data){ + return $this->msg([]); + }else{ + return $this->msg(10002); + } + } + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################skip_manual_recording + public function skip_manual_recording_action($data){ + // 分秒转换为秒 + $data['time'] = abs($data['time_m'])*60+abs($data['time_s']); + $user_msg_content = Db::table('test_app_user_data')->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('test_app_card_body_data')->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('test_app_user_data')->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('test_app_card_skip_data')->insert($data_set); + $result = [ + 'today_jump_num'=>0, + 'today_jump_time'=>0, + 'today_jump_kcal'=>0, + ]; + $all_data = Db::table('test_app_card_skip_data')->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); + } + ################################################################skip_today_data + public function skip_today_data_action($data){ + $all_data = Db::table('test_app_card_skip_data')->where(['aud_id'=>$data['aud_id']])->whereTime('record_time','today')->field('jump_num,jump_time,jump_kcal')->select(); + $last_data = Db::table('test_app_card_skip_data')->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'] = str_replace('-', '/', $last_data['record_time']); + $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); + } + ################################################################skip_curve_chart + // 运动曲线 + public function skip_curve_chart_action($data){ + // public function skip_motion_curve($data = ['aud_id'=>'11','time_data'=>['2024','04']]){ + // public function skip_motion_curve($data = ['aud_id'=>'11','time_data'=>['2024','12','31']]){ + + + $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('test_app_card_skip_data')->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(); + // dump($result); + // die; + $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'; + } + // dump($key_condition); + 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]); + + // // 根据小时分组 + // 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); + // }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); + }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]); + } + } + } + // dump($temporary_arr); + 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); + } + + + ################################################################other################################################################ + ################################################################other################################################################ + ################################################################other################################################################ + + // 跳绳卡路里计算 + 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/testapp/controller/Sportstesting.php b/application/testapp/controller/Sportstesting.php new file mode 100644 index 0000000..c57616a --- /dev/null +++ b/application/testapp/controller/Sportstesting.php @@ -0,0 +1,737 @@ +'现场类项目', + 'xc_1'=>'第一类:素质项目Ⅰ(8分)', + 'xc_2'=>'第二类:素质项目Ⅱ(8分)', + 'xc_3'=>'第三类:运动能力Ⅰ(8分)', + 'xc_4'=>'第四类:运动能力Ⅱ(6分)', + 'gc'=>'过程类项目', + 'gc_8_m'=>'8年级体质健康统测(10分)', + 'gc_8_r'=>'8年级体育与健康知识机考(10分)', + ]; + protected $city_data_rule_is_choice = ['xc_2','xc_3','xc_4']; + + protected $type_all = [ + '1'=>'整数填数字(例肺活量)', + '2'=>'小数(例50米跑)', + '3'=>'拖动区间(例坐位体前屈:-15至30之间,需要有小数1位)', + '4'=>'分钟秒钟(例1000米跑)', + ]; + + + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + // 获取单个类型列表 + public function sportstesting_get_type_list($data = ['address'=>'上海','gender'=>'1','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + 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 $this->msg(10001); + } + // cache($data['token'], time()); + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->sportstesting_get_type_list_action($data); + } + // 获取地区类型列表 + public function sportstesting_get_region_list($data = ['parameter_data'=>'上海','gender'=>'1','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('gender', $data) || !array_key_exists('parameter_data', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + // cache($data['token'], time()); + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->sportstesting_get_region_list_action($data); + } + // 获取估分最后一次数据 + public function sportstesting_get_last_data($data = ['aud_id'=>'83','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // cache('sportstesting_get_last_data',json_encode($data)); + return $this->sportstesting_get_last_data_action($data); + } + // 计算并存储数据 + public function sportstesting_set_once_data($data = ['aud_id'=>'83','parameter_data'=>'辽宁,沈阳市','result_data'=>'','gender'=>'1','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + // $data = json_decode(cache('sportstesting_set_once_data'),true); + // dump($data); + + // die; + // return $this->dayin_data('sportstesting_set_once_data'); + if(count(input('post.')) > 0){ + $data = input('post.'); + } + + if(!array_key_exists('aud_id', $data) || !array_key_exists('parameter_data', $data) || !array_key_exists('result_data', $data) || !array_key_exists('gender', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if(is_array($data['result_data']) && !empty($data['result_data'])){ + // 是个数组且不为空数组 + foreach ($data['result_data'] as $key => $value) { + foreach ($value['list'] as $k => $v) { + if(count($v['list']) <= 0){ + return $this->msg(10010,$v['name'].'内并未选择内容'); + } + if($v['is_choice'] >= 0 && count($v['list']) < $v['is_choice']){ + return $this->msg(10010,$v['name'].'内并缺少选项,请选择'.$v['is_choice'].'个选项'); + } + } + } + } + + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + cache('sportstesting_set_once_data',json_encode($data)); + // return $this->msg($data); + unset($data['token']); + // return $this->msg($data); + + return $this->sportstesting_set_once_data_action2($data); + // return $this->sportstesting_set_once_data_action($data); + } + // 获取估分历史列表 + public function sportstesting_get_all_list($data = ['aud_id'=>'25','page'=>'1','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data) || !array_key_exists('page', $data)){ + return $this->msg(10001); + } + // cache($data['token'], time()); + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + // cache('sportstesting_get_all_list',json_encode($data)); + return $this->sportstesting_get_all_list_action($data); + } + // 获取估分历史详情 + public function sportstesting_get_one_details($data = ['id'=>'2','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + // cache($data['token'], time()); + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->sportstesting_get_one_details_action($data); + } + + // 获取估分已有的地区列表 + public function sportstesting_get_city_list($data = ['token'=>'caadd1be045a65f30b92aa805f1de54a','type'=>'1']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('token', $data) || !array_key_exists('type', $data)){ + return $this->msg(10001); + } + // cache($data['token'], time()); + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->sportstesting_get_city_list_action($data); + } + + ################################################################业务################################################################ + ################################################sportstesting_get_type_list + 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('test_admin_estimate')->where($db_condition)->find(); + $data = json_decode($data['content'],true); + + // dump($data); + // die; + $result = $this->handle_default_rule_list_content($data,$gender); + // die; + return $this->msg($result); + } + ################################################sportstesting_get_region_list + public function sportstesting_get_region_list_action($data){ + + $parameter_data = explode(',',$data['parameter_data']); + $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 + + $result['list'] = []; + $result['total_score'] = 0; + $data = Db::table('test_admin_estimate')->where($db_condition)->select(); + // dump($data); + // die; + if(count($data) > 0){ + if(count($data) > 1){ + // 查到不止一条规则 + return $this->msg(10004,'查询地址不够详细,请重新选择省市地区'); + } + // dump(568); + // die; + $data = json_decode($data[0]['content'],true); + $result = $this->handle_default_rule_list($data,$gender); + return $this->msg($result); + }else{ + return $this->msg(10004,'暂无该地区的估分规则,请选择其它地区'); + } + + } + ################################################sportstesting_get_last_data + public function sportstesting_get_last_data_action($data){ + $user_data = Db::table('test_app_sportstesting_data')->where(['aud_id'=>$data['aud_id']])->order('id desc')->find(); + + if($user_data){ + $address = explode(',',$user_data['address']); + $temporary_data = json_decode($user_data['content'],true); + + $result['list'] = $temporary_data; + $result['total_score'] = $user_data['score']; + $result['max_score'] = $user_data['max_score']; + $result['province'] = count($address)>=1?$address[0]:''; + $result['city'] = count($address)>=2?$address[1]:''; + $result['area'] = count($address)>=3?$address[2]:''; + return $this->msg($result); + }else{ + $user_msg_data = Db::table('test_app_user_data')->where(['id'=>$data['aud_id']])->field('id,gender')->find(); + if(!$user_msg_data){ + return $this->msg(10004); + } + $address = $this->default_address; + // dump($address); + // die; + + $address_data = $this->sportstesting_get_region_list_action(['parameter_data'=>$address,'gender'=>$user_msg_data['gender']]); + // dump(json_decode($address_data->getContent(),true)); + // dump(get_object_vars($address_data)); + // die; + $address_data = json_decode($address_data->getContent(),true); + // return $this->msg($address_data); + if($address_data['code'] == 10004){ + return $this->msg(10004); + } + $address = explode(',',$address); + $result['list'] = $address_data['data']; + $result['total_score'] = 0; + $result['province'] = count($address)>=1?$address[0]:''; + $result['city'] = count($address)>=2?$address[1]:''; + $result['area'] = count($address)>=3?$address[2]:''; + + return $this->msg($result); + } + } + ################################################sportstesting_get_all_list + public function sportstesting_get_all_list_action($data){ + $user_data_num = Db::table('test_app_sportstesting_data')->where(['aud_id'=>$data['aud_id']])->count(); + $user_data = Db::table('test_app_sportstesting_data')->where(['aud_id'=>$data['aud_id']])->page($data['page'],$this->page_num)->order('id desc')->select(); + // dump($user_data); + // die; + if($user_data){ + $result = []; + $result['totalrows'] = $user_data_num; + $result['rows'] = []; + $result['pageno'] = $data['page']; + $result['pagesize'] = $this->page_num; + $result['totalpage'] = ceil($result['totalrows']/$this->page_num); + foreach ($user_data as $key => $value) { + array_push($result['rows'],[ + 'id'=>$value['id'], + 'create_time'=>$value['create_time'], + 'score'=>$value['score'], + 'max_score'=>$value['max_score'], + 'address'=>$value['address'], + ]); + } + return $this->msg($result); + }else{ + return $this->msg(10004); + } + } + ################################################sportstesting_get_one_details + public function sportstesting_get_one_details_action($data){ + $user_data = Db::table('test_app_sportstesting_data')->where(['id'=>$data['id']])->find(); + + if($user_data){ + + $temporary_data['list'] = json_decode($user_data['content'],true); + // 压入表头 + foreach ($temporary_data['list'] as $key => $value) { + foreach ($value['list'] as $v1k => $v1v) { + array_unshift($temporary_data['list'][$key]['list'][$v1k]['list'],[ + 'name'=>'项目名', + 'value'=>'成绩', + 'total_score'=>'满分', + 'proportion_value'=>'得分', + ]); + } + } + $temporary_data['score'] = $user_data['score']; + $temporary_data['max_score'] = $user_data['max_score']; + $temporary_data['address'] = $user_data['address']; + $temporary_data['create_time'] = $user_data['create_time']; + return $this->msg($temporary_data); + }else{ + return $this->msg(10004); + } + } + ################################################sportstesting_set_once_data + public function sportstesting_set_once_data_action2($data){ + // $ceshi = [ + + // ]; + $return_result['total_score'] = 0; + $return_result['max_score'] = 0; + + $parameter_data = explode(',',$data['parameter_data']); + $gender = $data['gender']; + 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); + } + $find_data = Db::table('test_admin_estimate')->where($db_condition)->find(); + $find_data = json_decode($find_data['content'],true); + $recognition_rule = $find_data[$gender]; + // dump($recognition_rule); + // // 测试用删掉s + // $data['result_data'] = $this->handle_default_rule_list2($find_data,$gender); + // // 测试用删掉e + // dump($data); + // return $this->msg(10010); + foreach ($data['result_data'] as $key => $value) { + // 遍历一级($value['key'] = 现场考试) + // dump($value); + foreach ($value['list'] as $k2 => $v2) { + // 遍历二级级($v2['key'] = 第一类项目 + // dump($v2); + foreach ($v2['list'] as $k3 => $v3) { + // 遍历二级级($v3['name'] = 1000米跑) + $temporary_result = $this->obtaining_grades($recognition_rule[$value['key']][$v2['key']]['list'][$v3['name']]['content'],$v3); + $data['result_data'][$key]['list'][$k2]['list'][$k3] = $temporary_result; + // $data['result_data'][$key]['list'][$k2]['list'][$k3]['name'] = $temporary_result['name']."(该项满分:".$temporary_result['total_score'].")"; + $return_result['total_score'] = bcadd($return_result['total_score'],$temporary_result['proportion_value'],2); + $return_result['max_score'] = bcadd($return_result['max_score'],bcmul($v3['total_score'],$v3['proportion'],2),2); + } + } + } + // return $this->msg(999); + $return_result['list'] = $data['result_data']; + $user_sportstesting_set = Db::table('test_app_sportstesting_data')->insert([ + 'aud_id'=>$data['aud_id'], + 'content'=>json_encode($return_result['list']), + 'score'=>$return_result['total_score'], + 'max_score'=>$return_result['max_score'], + 'create_time'=>date('Y-m-d H:i:s'), + 'address'=>$data['parameter_data'], + ]); + + if($user_sportstesting_set){ + foreach ($return_result['list'] as $key => $value) { + foreach ($value['list'] as $v1k => $v1v) { + array_unshift($return_result['list'][$key]['list'][$v1k]['list'],[ + 'name'=>'项目名', + 'value'=>'成绩', + 'total_score'=>'满分', + 'proportion_value'=>'得分', + ]); + } + } + return $this->msg($return_result); + }else{ + return $this->msg(10002); + } + + } + ################################################sportstesting_get_city_list + public function sportstesting_get_city_list_action($type){ + if($type['type'] == '1'){ + // 已有地区列表 + $data = Db::table('test_admin_estimate')->field('id,province,city,area')->select(); + $result = []; + // 添加省份 + foreach ($data as $key => $value) { + if(!array_key_exists($value['province'],$result)){ + $result[$value['province']] = []; + } + } + // 添加市 + foreach ($data as $key => $value) { + if($value['city'] == '无'){ + continue; + }else{ + if(array_key_exists($value['province'],$result)){ + if(!array_key_exists($value['city'],$result[$value['province']])){ + $result[$value['province']][$value['city']] = []; + } + } + } + } + // 添加区县 + foreach ($data as $key => $value) { + if($value['area'] == '无'){ + continue; + }else{ + if(array_key_exists($value['province'],$result)){ + if(array_key_exists($value['city'],$result[$value['province']])){ + if(!array_key_exists($value['area'],$result[$value['province']][$value['city']])){ + array_push($result[$value['province']][$value['city']],$value['area']); + } + } + } + } + } + $return_result = []; + foreach ($result as $key => $value) { + $num = array_push($return_result,['name'=>$key,'list'=>[]]); + if(count($value)>0){ + foreach ($value as $city_k => $city_v) { + $num2 = array_push($return_result[$num-1]['list'],['name'=>$city_k,'list'=>$city_v]); + } + } + } + return $this->msg($result); + }else if($type['type'] == '2'){ + $data = Db::table('test_admin_estimate')->where(['type' => '2'])->field('id,content,city,area')->find(); + $result = json_decode($data['content'],true); + return $this->msg($result); + }else{ + return $this->msg(10005); + } + + + } + + + + + + ################################################################其他################################################################ + + public function calculate_minutes_seconds($a,$b){ + // 分解时间字符串 + $sjA = explode(':', $a); + $sjB = explode(':', $b); + $minutesA = $sjA[0]; + $secondsA = $sjA[1]; + $minutesB = $sjB[0]; + $secondsB = $sjB[1]; + // list($minutesA, $secondsA) = explode(':', $a); + // list($minutesB, $secondsB) = explode(':', $b); + + // 转换为秒 + $totalSecondsA = intval($minutesA) * 60 + intval($secondsA); + $totalSecondsB = intval($minutesB) * 60 + intval($secondsB); + + $result = $totalSecondsB - $totalSecondsA; + if($result <= 0){ + return [true,$result]; + }else{ + return [false,$result]; + } + // 比较两个时间(秒) + // return $totalSecondsB <= $totalSecondsA; + } + + + // 处理默认规则列表 + public function handle_default_rule_list($data,$gender){ + $temporary_arr = $data[$gender]; + $result = []; + foreach ($temporary_arr as $key => $value) { + $num = array_push($result,['name'=>$key,'key'=>$key,'list'=>[]]); + foreach ($value as $s_c_k => $s_c_v) { + if($s_c_v['choose_num'] == 0){ + $num2 = array_push($result[$num-1]['list'],[ + 'name'=>$s_c_k, + 'key'=>$s_c_k, + 'is_choice'=>$s_c_v['choose_num'], + 'list'=>[] + ]); + foreach ($s_c_v['list'] as $x_m_k => $x_m_v) { + array_push($result[$num-1]['list'][$num2-1]['list'],[ + 'name'=>$x_m_k, + 'proportion'=>$x_m_v['proportion'], + 'value'=>$x_m_v['value'], + 'proportion_value'=>null, + 'unit'=>$x_m_v['unit_data'], + 'type'=>$x_m_v['type'], + 'describe'=>$x_m_v['describe'], + 'total_score'=>$x_m_v['score'], + ]); + } + }else{ + $num2 = array_push($result[$num-1]['list'],['name'=>$s_c_k,'key'=>$s_c_k,'is_choice'=>$s_c_v['choose_num'],'list'=>[]]); + } + } + } + // dump($result); + // die; + return $result; + } + // 获取所有选择项内容 + public function handle_default_rule_list_content($data,$gender){ + $temporary_arr = $data[$gender]; + $result['list'] = []; + foreach ($temporary_arr as $key => $value) { + + foreach ($value as $k2 => $v2) { + if($v2['choose_num'] != 0){ + $temporary_arr = []; + $temporary_arr['key'] = $k2; + $temporary_arr['list'] = []; + // dump($v2); + foreach ($v2['list'] as $k3 => $v3) { + // dump($v3); + array_push($temporary_arr['list'],[ + 'name'=>$k3, + 'proportion'=>$v3['proportion'], + 'value'=>$v3['value'], + 'proportion_value'=>null, + 'unit'=>$v3['unit_data'], + 'type'=>$v3['type'], + 'describe'=>$v3['describe'], + 'total_score'=>$v3['score'], + ]); + } + // dump($temporary_arr); + array_push($result['list'],$temporary_arr); + } + } + } + return $result; + } + + // 取得成绩 + public function obtaining_grades($rule,$data){ + + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + // dump($data); + // dump($rule); + // die; + if($data['value'] != ''){ + if(count($rule) > 0){ + foreach ($rule as $key => $value) { + if($data['unit'] == '分/秒'){ + $rule_result = $this->convertMinutesSecondsToStringSeconds($value[0]); + $data_result = $this->convertMinutesSecondsToStringSeconds($data['value']); + }else{ + $rule_result = $value[0]; + $data_result = $data['value']; + } + switch ($value[1]) { + case "<=": + $result = $data_result <= $rule_result; + break; + case ">=": + $result = $data_result >= $rule_result; + break; + case "<": + $result = $data_result < $rule_result; + break; + case ">": + $result = $data_result > $rule_result; + break; + case "==": + $result = $data_result == $rule_result; + break; + case "!=": + $result = $data_result != $rule_result; + break; + default: + // 如果比较符号不是上述任何一个,可以抛出一个异常或错误 + throw new Exception("Unsupported comparison operator: " . $value[1]); + } + // dump($result); + if($result == true){ + $data['score'] = $value[2]; + // 计算比例后分值 + $proportional_post_score = bcmul($data['total_score'],$data['proportion'],2); + $data['proportion_value'] = bcmul($data['score'],bcdiv($proportional_post_score,100,2),2); + // 四舍五入一下结果 + $data['proportion_value'] = $this->roundToString($data['proportion_value'],1); + break; + } + } + }else{ + $data['score'] = $data['value'] <= $data['total_score']?bcmul(bcdiv($data['value'],$data['total_score'],20),100,2):100; + // 计算比例后分值 + // $proportional_post_score = bcmul($data['total_score'],$data['proportion'],2); + $data['proportion_value'] = $data['value'] <= $data['total_score']?$data['value']:$data['total_score']; + } + + }else{ + $data['score'] = 0; + // 计算比例后分值 + $proportional_post_score = bcmul($data['total_score'],$data['proportion'],2); + $data['proportion_value'] = bcmul($data['score'],bcdiv($proportional_post_score,100,2),1); + } + + return $data; + } + + // 弄一套可以计算的返回数据(删) + public function handle_default_rule_list2($data,$gender){ + $temporary_arr = $data[$gender]; + $result = []; + // dump($temporary_arr); + // die; + foreach ($temporary_arr as $key => $value) { + $num = array_push($result,['name'=>$key,'key'=>$key,'list'=>[]]); + + foreach ($value as $s_c_k => $s_c_v) { + if($s_c_v['choose_num'] == 0){ + $num2 = array_push($result[$num-1]['list'],[ + 'name'=>$s_c_k, + 'key'=>$s_c_k, + 'is_choice'=>$s_c_v['choose_num'], + 'list'=>[] + ]); + foreach ($s_c_v['list'] as $x_m_k => $x_m_v) { + $num3 = array_push($result[$num-1]['list'][$num2-1]['list'],[ + 'name'=>$x_m_k, + 'proportion'=>$x_m_v['proportion'], + 'value'=>'', + 'proportion_value'=>null, + 'unit'=>$x_m_v['unit_data'], + 'type'=>$x_m_v['type'], + 'describe'=>$x_m_v['describe'], + 'total_score'=>$x_m_v['score'], + ]); + // dump($x_m_k); + if($x_m_k == '1000米跑'){ + // dump('11'); + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '4:08'; + }else if($x_m_k == '50米跑'){ + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '7.3'; + }else if($x_m_k == '乒乓球'){ + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '25'; + }else if($x_m_k == '足球运球'){ + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '9.5'; + }else if($x_m_k == '机考'){ + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '8.3'; + }else if($x_m_k == '1000米'){ + // dump('22'); + $result[$num-1]['list'][$num2-1]['list'][$num3-1]['value'] = '4:08'; + } + // break; + } + }else{ + //循环次数 + $xh_num = $s_c_v['choose_num']; + $num2 = array_push($result[$num-1]['list'],['name'=>$s_c_k,'key'=>$s_c_k,'is_choice'=>$s_c_v['choose_num'],'list'=>[]]); + foreach ($s_c_v['list'] as $x_m_k => $x_m_v) { + array_push($result[$num-1]['list'][$num2-1]['list'],[ + 'name'=>$x_m_k, + 'proportion'=>$x_m_v['proportion'], + 'value'=>'', + 'proportion_value'=>null, + 'unit'=>$x_m_v['unit_data'], + 'type'=>$x_m_v['type'], + 'describe'=>$x_m_v['describe'], + 'total_score'=>$x_m_v['score'], + ]); + // dump($x_m_k); + if($x_m_k == '1000米跑'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '4:07'; + }else if($x_m_k == '50米跑'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '7.3'; + }else if($x_m_k == '乒乓球'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '25'; + }else if($x_m_k == '足球运球'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '9.5'; + }else if($x_m_k == '引体向上'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '8'; + }else if($x_m_k == '足球--运球射门'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '40'; + }else if($x_m_k == '体操双杠组合Ⅰ'){ + $result[$num-1]['list'][$num2-1]['list'][0]['value'] = '4'; + } + $xh_num = $xh_num -1; + if($xh_num <= 0){ + break; + } + + } + } + } + } + // dump($result); + // die; + // $result = json_encode($result); + return $result; + } + + + +} \ No newline at end of file diff --git a/application/testapp/controller/Vitalcapacity.php b/application/testapp/controller/Vitalcapacity.php new file mode 100644 index 0000000..6ef0041 --- /dev/null +++ b/application/testapp/controller/Vitalcapacity.php @@ -0,0 +1,403 @@ +'#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 $standard0 = ['优秀','良好','及格','不及格','无效']; + protected $standard = [ + ['min_val'=>'90','max_val'=>'100','text'=>'优秀','color'=>'#6492F6'], + ['min_val'=>'80','max_val'=>'89','text'=>'良好','color'=>'#5AD06D'], + ['min_val'=>'60','max_val'=>'79','text'=>'及格','color'=>'#FFAB00'], + ['min_val'=>'10','max_val'=>'59','text'=>'不及格','color'=>'#FF5656'], + ['min_val'=>'0','max_val'=>'9','text'=>'无效','color'=>'#FF5656'], + ]; + + protected $result_end_data_mould = [ + 'name'=>'', + 'value'=>'', + 'unit'=>'', + 'standard'=>'', + 'color'=>'', + 'list'=>[] + ]; + + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + ################################################################接口################################################################ + ################################################################接口################################################################ + ################################################################接口################################################################ + + // 手动数据记录 + public function vitalcapacity_save_record_data($data = ['aud_id'=>'83','one'=>'1523','two'=>'1825','three'=>'1896','time'=>'2024-07-23','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + 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 $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $data['one'] = $this->isPositiveNumber($data['one']) === false?0:$data['one']; + $data['two'] = $this->isPositiveNumber($data['one']) === false?0:$data['two']; + $data['three'] = $this->isPositiveNumber($data['one']) === false?0:$data['three']; + return $this->vitalcapacity_save_record_data_action($data); + } + // 设备数据记录 + public function vitalcapacity_save_record_data_device($data = ['aud_id'=>'99','one'=>'1523','two'=>'1825','three'=>'1896','flow'=>'88.88','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('flow', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + $data['one'] = $this->isPositiveNumber($data['one']) === false?0:$data['one']; + $data['two'] = $this->isPositiveNumber($data['one']) === false?0:$data['two']; + $data['three'] = $this->isPositiveNumber($data['one']) === false?0:$data['three']; + return $this->vitalcapacity_save_record_data_action($data); + } + // 数据报告 + public function vitalcapacity_data_report($data = ['aud_id'=>'83','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + + if(count(input('post.')) > 0){ + $data = input('post.'); + } + if(!array_key_exists('aud_id', $data) || !array_key_exists('token', $data)){ + return $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->vitalcapacity_data_report_action($data); + } + // 曲线 + public function vitalcapacity_curve_chart($data = ['aud_id'=>'83','time'=>'2024','token'=>'caadd1be045a65f30b92aa805f1de54a']){ + 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 $this->msg(10001); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001); + } + unset($data['token']); + return $this->vitalcapacity_curve_chart_action($data); + } + + ################################################################业务################################################################ + + ################################################################vitalcapacity_save_record_data + public function vitalcapacity_save_record_data_action($data){ + $temporary_arr['aud_id'] = $data['aud_id']; + $temporary_arr['record_time'] = array_key_exists('time', $data)?$data['time']:date('Y-m-d H:i:s'); + $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'; + // 处理记录时间 + if(strlen($temporary_arr['record_time']) <= 12){ + $temporary_arr['record_time'] = $this->addCurrentTimeToDateString($temporary_arr['record_time']); + } + + $user_msg = Db::name('test_app_user_data')->where(['id'=>$data['aud_id']])->field('grade,gender')->find(); + if($user_msg){ + // 根据性别&年级&年龄查规则 + if($user_msg['grade'] != 'nothing'){ + // 有年级项 + // 等级项(及格优秀良好等) + $achievement_judge_data = $this->vitalcapacity_achievement_judge(['average'=>$temporary_arr['average'],'grade'=>$user_msg['grade'],'gender'=>$user_msg['gender']]); + + $temporary_arr['score'] = $achievement_judge_data['score'].','.$achievement_judge_data['level'].','.$this->color[$achievement_judge_data['level']]; + $temporary_arr['score_val'] = $achievement_judge_data['score']; + // 获取肺活量标准 + + }else{ + $achievement_judge_data['level'] = "无"; + $temporary_arr['score'] = "0,无,无"; + $temporary_arr['score_val'] = "0"; + } + + }else{ + return $this->msg(10004); + } + + + $standard_data = $this->get_vitalcapacity_data($data['aud_id']); + // dump($standard_data); + // die; + $temporary_arr['standard_data'] = json_encode($standard_data); + // dump($temporary_arr); + // die; + $result = Db::table('test_app_card_vitalcapacity_data')->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'=>$achievement_judge_data['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); + } + } + ################################################################vitalcapacity_data_report + public function vitalcapacity_data_report_action($data){ + + $result = Db::table('test_app_card_vitalcapacity_data')->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); + // dump($result); + // die; + 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) + ]); + } + } + + ################################################################vitalcapacity_curve_chart + public function vitalcapacity_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); // 无效的时间数据格式 + } + + // dump($map); + // die; + + // 使用查询构造器进行查询 + $result = Db::name('test_app_card_vitalcapacity_data')->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(); + // dump($map); + // dump($result); + // die; + $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'; + } + // dump($map); + // dump($key_condition); + // die; + 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'] = []; + // dump($temporary_arr['title']); + foreach ($result as $k => $v) { + // dump($k); + // if($result[$k][$key] == 26.43){ + // dump(123); + // } + if($key_condition == 'hour'){ + // dump($result[$k][$key]); + // die; + 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]); + } + // dump($temporary_arr['line']['series'][0]['data']); + }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]); + } + } + } + // dump($temporary_arr); + array_push($return_data,$temporary_arr); + } + // dump($return_data); + // 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); + // } + // // dump($temporary_arr); + // dump($return_data); + // die; + return $this->msg($return_data); + } + + + + + ################################################################肺活量数据卡片接口################################################################ + ################################################################肺活量数据卡片接口################################################################ + // 加 bcadd(,,20) + // 减 bcsub(,,20) + // 乘 bcmul(,,20) + // 除 bcdiv(,,20) + + // 肺活量成绩判断 + public function vitalcapacity_achievement_judge($data){ + $str = "sex = ".$data['gender']." and ".$data['grade']." <= ".$data['average']; + $user_achievement = Db::name('test_pc_vitalcapacity_standard')->where($str)->order($data['grade'] .' desc')->field('level,score,'.$data['grade'])->limit(1)->select(); + // dump($data); + // dump($user_achievement); + if(count($user_achievement)<=0){ + $user_achievement[0] = ['level'=>'无效','score'=>'0']; + } + // dump($user_achievement); + return $user_achievement[0]; + } + // 肺活量判断区间 + public function vitalcapacity_standard_interval($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; + } + } + + $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; + } + // 肺活量判断区间(根据得分) + 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; + } + } + // dump($data); + // dump($val); + // dump($max); + // dump($min); + // dump($num); + + // 计算每份占比 + $share_value = bcdiv($temporary_qj[0]['max_val'],count($temporary_qj),1); + // 计算在这一段中占多少 + $result = bcsub($val,$min,1); + // dump($result); + $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); + // dump($share_value); + // $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; + } + + + ################################################################other################################################################ + ################################################################other################################################################ + ################################################################other################################################################ + + + +} \ No newline at end of file diff --git a/application/testapp/view/download/demo.html b/application/testapp/view/download/demo.html new file mode 100644 index 0000000..3b6977d --- /dev/null +++ b/application/testapp/view/download/demo.html @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + 下载页面-download + + + + + +
+
+ + +
下载
+ +
+
+ + + + + + diff --git a/application/testapp/view/download/demo2.html b/application/testapp/view/download/demo2.html new file mode 100644 index 0000000..2d9218f --- /dev/null +++ b/application/testapp/view/download/demo2.html @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + 下载页面 + + + + + +
+
+ +
打开微信小程序
+
下载
+ +
+
+ + + + + + diff --git a/public/appupdatefile/新建 XLS 工作表.xls b/public/appupdatefile/新建 XLS 工作表.xls deleted file mode 100644 index efc3a26cb66347579b68ca6547d6ffd972d20b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 zcmeHP2Urxzwyqfl7z88;C?GHdB}z_;5>$++U}C)@A_Ag!%x=XBdlGilN9zWcttZ)>Oyr_TB7)L)^ys=K-NvsUH0JqA@o zEO-+I(jZhJN-Q}Cjxka}lMrJ#!1D&7P)G|2fx~~o--v-P;HxQAo&rQ3L`8^L=gJWI z5LF{GWLX9*(=s}BN$l!vRfR9^3im5H>LGS3T=Bj`e zhYsK4n80ZSfBO(>O#4I)4@6lHI)1uqEUX#1Ik(<>O3&T>=sOXF^xX zhfy5#p%{Ga!cl^24Hx{-r~HC?hm=;-b{C~}oZ5DwMk7M3V}l(%K?AQ)KX831z4_GE zjM}z@Er%SUZ0=DKCm6qKL0_15ya;ZaeN&a@)newG|`U+ z1a~R&2T+pMQsj1&{&A$N2@X$&9LwuYB=u45Ed?LtJ~H&(WXM%y$lYY%^JVC3$#8a|e5}pCoPH?uv=%WsUgEJs$a-0=OljEHgCBI1m;SeT3G(R|dV##5G zM9XnT^;Ir_LpT+ai?v&veNp<0wX~M0E(8A^DF1Or#>h{ZoH8Li6-th?G)7MA({k)7 zv^*+`*7uMeg~4$M2@YG z3o95fXQOmQv&EKhN5_>kK(|E(X(X+2dim8LSu6+iPZ8Ek=p6R$-P>r;LW)dTii|Hs z#``K03QHUDB%Os$$#NDH8+B!r4wq)=(&6M4BNNboBbfuPu6 z4s61h=D?OQ&4Ddrngd(b*c?h%G*$r9sC|5r8f9OrUEC=_6Q_K9d>RcHr`R&aDYlGp ziY;TDdi(ZmBc8}9Q64g!GHv1%yR?i`Y#HMeTgEuWmdSJKV~Ruv5ogM*iBs&-GET8& zj8kkG;}l!QI8|6!*n}x|2ZW4am6aNk#JhtzB+)Gy2Qgt9rwItkq?BxkSi`gcH6Aog z$&QI0qbJh32;NOIL56qjAYB2B=>hP<>#Gvp!KzlHOa@5%CLqERNst1f^j9F3O+ji3 z8V#6cSrGh}o>(=4$l?SP8iS1DSc3x1i2{j?`c7hPSRkbV-w9&N0+BunHlvE|SRnNC z0uWGv8Pu6`+{@sk10;z!!P|HyFd)tF#2#!IkkWwf1aV-2IJqzrE>cXi8%=P0q)m)PCazLUS~Z&B zXow~%#02XiZ((GR1Y2AkU<*?iRROK~QHrWArTVc^)f83N&098I5>*dWF@;9efMs&1 zgW~9?V}=as7SuU9moHuit)UJ?>5Q2ZT2&X;#`%QPX{17SW@Pa2g5~iu>1NixsT({aA)knA(GaGvnBJ0boZ-1l zJ0gH590Cc&Ts}5KRHp-nXDn<9k5^<{pk5x=6du9=w5uFNNoW&*mS@30+ak34H$e*k zTAl?BtqYG_BsfI^#5pyU;FRf)ra+@yP7zL=Q!}}oilFV~b1DtmTrQ^~Xb1V6N`tnL z%P9k`3-u(yDGpTPoVJtTlo_y0Vfd8GDZ+_!+FmZFB4}s%oJxbXl*_3I+C@I6(x9#6 za>_vKLN}4%6i0G#POT+4Wkz&U;wGO{gcIk~MlPo!Xm|OXN`tnQ%c%(3Lq4a{pzY*x z%0TN9Pf1SQq;T3nf>XTRrw6@`@;OB~aZc^!aw>xEB%f1h&<=7r6+wH+=TsWBqg+lI zXkF4-l2dmnoH|KxinAY@(=PHkML2Ozo#k>Wg7%irsWfO8xtxliedKd04cb*Mr!@3v zz8)FPx*qFMG~s3`|ApF8Rtm}j`zrA8;T|EG{U7<_o(VWRPK=I>jdYN$gOB-W9g(IE z$oLf6_^C_vQs8VZL|p7@ZbT-lW^M!9ez2iY@wl>&MEUZKH1NHd1X;nl2j3M z;KPfqQ|=GRJNV*y?}BW@pOYiJj+Ln&=xJfm-7jR(;Yq%}g+m_=Y{<_rvl=K=T>bLW zx&Cd}>!q(9*WYFJuhV}tIaU8T$2Qo+!qxM9h~`rFGv(*4)Z#itnCJF4sCxNh{h0}E z_;bp&*4v$*AGg3id9v_J{m!*r^dIw-1#9MZxyc`Gz3;>-Bd7FH7WRA9ifUs^lV@5S ze|za_)&`erE3d7J*QrR-?q2TLD~LPp_3A&)e95@lQt|v2opE8krVbc;&bIja{*B)A zjzk9;7nt4S`_*Tys(YiLucV`*Vq!3AV`|mah9yS(m#GFF@w=5<^J1j^GS%!&kzFj; zsLkzdyJTEpQsDF3#OC&-Rnv-YZPEScO4KteH|;rp{mAfL`|~^A;;!hq@YU4`M;=VB zUE0uhy!(_ZWwSQ_Ug>u6`L69%H5F0E9zAlqSh;QdpM8UD#|>@!#UP^gfZL3se~lgD z)iQKec%SlWgHCfVAL#Gav-KjU4Vj_ICkDMR-k5y{#esKN(H>05!!v-l<%Fr_;JGQ+2OIh`nAq7wOkRCZW6_BF=|U) z#k<#`T~ZB>PiuJcxoY3LOrO<0(-IqMl{Z|`>fF8hoZgHNWksno>Vj%N-PkqKyWzpY z*6t06OZD)nk&^Sp2~As2vtJuU+NJ zmf7Pw8rR;=dtQ>|scoh7(73`#->cX#p?k{V_DQp*WOftQa(0!y@;dlF+&k}_%ey+y zNogh7*V{k-g@gnr4AXk`bNQUqc<+6a4rz9(D|^^=OWwV!cC&W&o?$cGDXFycI;$no zGY8oz)Xneb^gemYLQTt^B@q`_gpJmJVD8sSYhtgD5tW)_trL4`U%c{Qj9}xvIc0BF zt-ZAQ=NfnK$vJ_VS<|v#kA9K<#vs4<;y(w!59<0d&BRpyQ}*v=AFf@PoSq&qz%kNq zOnOG`r3X(ccP;s&=9>5Cu|AvLo%4_Hy~%r3&nzdyyHPiWX6Ke>zRYnwxW^>RI#5T^ zGT>unN$C#Fx|UOYt1l$}YI>)4{retqhMkIH%X0-Uu4GS-pQ`SXdFn(*BlGRY)DkBb zjkL6Qc<*?b+Ut8s=AA3g4ey+3TQ;rLtJFK|??*3P9kzLHUAq?}GJm|i?(CtH-6n2* zntIZ~VYpM`*aP~m_hV0d=>K{8Yo~SlEq~K7Q91ENZ}-RSqmG-?|L|+oT6vG%?4Cm| ztbKU8pQlYkd$ZfFT7DOJZ8gr$-+EKIQ{M>-N}eST+Zwzf+UY0n+%xIZj?VGkVn29k z>70ZOp`+L5a{8*y3NzO%e!os@X-yB~{>oX8a-5x(?f$ZR&Bz-?$+K10*e~7|rz2c= zxG;K8Ze0Go>Y}l6N>g-fx{h+}KFqxB*`L&m^VA+$+>BDZt`ag@t)0izlvXDrLN2;% z@40kzQ|>S$Z8IkgtKJ4xJ1^z*R_o_B(_@bKE34Z(ghjOdgk3mED!G%*}8qT>kqePZVL_Gzia&JNu4)o z@(*`Rw>_iqG%H{8l}69nc8L9s)pAE-UFy&$A6xYV#JTAcP%&BfNwVy?_uxvb!aS#$o? zBG#Z&O=!^g+3JS3OI~)pY$vp}kjeKXl7xH9Z4Do_FGCndU zfx2Ldt|x`Jiher^Y3{I6hwsbKI`*iUvGC_{XC2itUuT?{bv-4h{A`l-?kIT;rAI_S7WTO;f4fa3#qc8$1xNwd6<|9#hRi`1f= zNh5EYEMKi(=^k*SPH*6CkFcE!H(wI&JL_1wdcf(_U3O3Xc@sPq2aJ6ZzHYO_<3T4D zZI0Y})A-tf!yj(ZmrUvR4ccOtOlg#;UthFl7w8!RCHOpxeTk*@#qSTk($%lU8AqM; z`k7Ps6DQs{s+rUNVb--BHx<&KxT(AQSOoq4Qhlc#-#&BH$rWRdEn9V|)oABmoT9fH z@HW<0jYt^s4#Xu{2r{(c2E&JpZT$?-i zL)uQy4GV`pG25`o@8Yp*z3L~YtbMbRGvmC)iEz#76-0k&V7_qQ7f*vZV;oHMMl=NZ zCEU$Wv|4|mw9Zmcazf(B!BgWR z6Gq@Y#g3dS{m(jT`q%gRJnLzPJ_UPy`R%G_mMkb)Kco2K3JbkUclH(y`BWcJKDg^< zfnJQ=-N#3MOAgst|9EXuo4j{}tA~U}XGEkt-n{LPPtUB6RoFNMD$KIn{s$*7^!BpW zPoHTzT32rxT)n#E1O2?1h2|R{C|hjV@4cXS@BCFNVLofSC5+JVxG*i;;%f5cYm+~u zb%;?Ox^Q|&@BHpgrwS5aX-ojy5EZG!(E!rhqv$CQz8vNR4>*_>*)&t} zZVJj@Gab@sL$$)@XNC}T)0St0H_>!J2Q477yMsJS>}qsCOHa79XIn}yrg+ywdz#y5 zsrFJkBJGr@!o+WxMWBk%!`V(z$J7n9IEMIaL4<+JnGzVRxkF%IMXHij;Efa?=v^69 zL&$~?K(fVVI}7+fkOeH+B0$!H-(YxnA5LQ6rS(DZY06aUs2}wT`&jBD7H4?taV$xK zPgW9H8UY|1L!v?E1S^MO9DGM11DdfSwFslc83bvO@WXVJ=eS~-*m7q|ZbVJo*m4(= z4{OEwEKh+(Dquxt!`l2%_?_nPArdm*l}kRuoQnxUSRm$8AGgsT!Du%52u78Q7^2V) zTDLkbDZ^WuTzF|;gF4oNEq(~cC!e>xDeo5^=rfX%+fZ^_YCDsXq_J{thYx&+5$7jJ zIZaKebm4p!rJYV~+c#=I_pxLh<4QFhYJIF($LnBKUj@8^m2vo?PjC@E7zTfpKFpp& z3Se2QfB~RknrzW4It&2}P~_r^rR?C%)g}k2R^$ufh_6ZWpbgDq;YNV95io==O+a8O zWd%B>GKSxpjA1DQrTF2JLU;N@!++|6CasxuK`Hyf_Mf_-dHX-?7yqkuL6`2|zQw+Y z!v*tx6TSe0{ToI*YIuPg3F>=Yyd%deFus9~*He7690y1(h|KrA*p2@Qe=i1bxP?zE zHS)O?Smjimf6`Fm-t4Jz+ZVqmg$7dm_0_rm^d9|bym&Ad5m|dsW%<|8__kkDIU=H7 zgNgKgV>;TSo~*r?J*lMi|I7CE8rbJm$Z0=9(&2SGJm-j=b6Mx~)B;SJ9gyG_)Cknn z1gp6+W6j$S1EMvzQ!^sb$FLt#y701t z8@wLV0rvQQbu1wIk#6w68@j{KAKH0G*gL`$(ghyrqr?>??x5jFox78+kkS$U VA%!34y1~{3KGt=D9R7cY{{iq>7c2k( diff --git a/public/estimate/20240708082036_ceshi.xlsx b/public/estimate/20240708082036_ceshi.xlsx deleted file mode 100644 index fa3983b664dbea48b1a256fd3b9ac3de82f7f022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59253 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