添加线上版备份文件夹

This commit is contained in:
tsf 2024-09-30 16:52:40 +08:00
parent 4aaf47fe0e
commit d7a9bf5154
16 changed files with 7409 additions and 0 deletions

View File

@ -0,0 +1,460 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use think\Cache;
use think\Log;
class Base extends Controller{
protected $ceshiyong_token = ['caadd1be045a65f30b92aa805f1de54a','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('app_data_log')->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('app_card_data')->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('app_user_data')->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(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('app_user_data')->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
pc_vitalcapacity_standard
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;
// }
// }
}
}

View File

@ -0,0 +1,657 @@
<?php
namespace app\app\controller;
use think\Controller;
class Calculatebody extends Base{
// 默认阻抗值
protected $default_adc = 550;
// 体重 = weight weight
// 身高 = height height
// BMI = bmi bmi
// age = age age
// 身体得分 = cmi cmi
// 脂肪量 = fat_w bfrval
// 脂肪率 = fat_r bfr
// 肌肉量 = muscleval romval
// 肌肉率 = muscle rom
// 水分 = water vwc
// 蛋白量 = proteinval ppval
// 蛋白率 = protein pp
// 骨重 = bone bm
// 基础代谢 = kcal bmr
// 内脏指数 = visceral uvi
// 皮下脂肪 = sfr sfr
// 肥胖等级 = standard_level fatlevel fatlevelName
// 身体年龄 = bodyage bodyage
// 去脂体重 = lbm lbm
// 身体类型 = body body
public function calculate_body_data_result($data = ['weight'=>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
// dump(bcmul($mheight, $mheight,20));
// $bmi = bcmul(bcdiv($weight, bcmul($mheight, $mheight,20), 20), '10.0', 20); // 先算除法再算乘法
$bmi = bcdiv($weight, bcmul($mheight, $mheight,20), 2);
// $bmi = bcdiv($bmi, '10.0', 2); // 最后除以10保留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 = bcmul(bcdiv($weight, bcmul($mheight, $mheight,20), 20), '10.0', 20);
// $num = bcdiv($num, '10.0', 2); // 确保最后结果也保留20位小数
$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;
// dump($gender);
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
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]);
}
}

View File

@ -0,0 +1,781 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use app\bj\controller\Common;
use think\Log;
use \think\Validate;
use app\app\controller\Calculatebody;
use app\app\controller\Cardparts;
use app\app\controller\Skip;
class Card extends Base{
protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
protected $age_limit = 16;
protected $unit_symbol = ['score'=>'分','height'=>'CM','weight'=>'公斤','bmi'=>'','fat_r'=>'%','fat_w'=>'kg','muscle'=>'%','muscleval'=>'kg','water'=>'kg','bone'=>'kg','protein'=>'%','proteinval'=>'kg','kcal'=>'kcal','visceral'=>'','sfr'=>'%',];
protected $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]],
];
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 详细卡片信息
// $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);
}
// cache($data['token'], time());
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);
}
// // 删除历史数据
// public function card_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('app_card_body_data')->where(['id'=>$data['id']])->update(['is_del'=>1]);
// if($user_data){
// return $this->msg([]);
// }else{
// return $this->msg(10002);
// }
// }
// // 数据对比
// public function card_data_contrast($data = ['before_id'=>'24','after_id'=>'25','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){
// if(count(input('post.')) > 0){
// $data = input('post.');
// }
// if(!array_key_exists('before_id', $data) || !array_key_exists('after_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']);
// // $data = explode(',',$data['id_arr']);
// // dump($data);
// // die;
// return $this->body_data_contrast($data);
// }
################################################################业务接口################################################################
################################################################业务接口################################################################
################################################card_data_detailed
// 用户身体数据卡片获取
public function get_user_body_data($data){
// $result = Db::table('app_card_body_data')
// ->alias('acbd')
// ->join('app_user_data aud','acbd.aud_id = aud.id','LEFT')
// ->where(['acbd.aud_id'=>$data['aud_id']])
// ->order('acbd.record_time desc')
// ->field('acbd.*,aud.birthday,aud.gender,aud.target_weight,aud.initial_weight,aud.initial_date')
// ->find();
// dump($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 app_card_body_data as acbd
left join app_user_data 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('pc_bmistand')->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('pc_heightstand')->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('pc_weightstand')->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('pc_childrenprescription')->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('pc_childprescriptionbyage')->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);
// $user_data_list = Db::query("
// select
// record_time,
// $card_body_curve_arr
// from app_card_body_data
// where aud_id='".$data['aud_id']."'
// and record_time between '".$data['s_time']."'
// and '".$data['e_time']."'
// order by record_time desc
// ");
// dump($card_body_curve_arr);
// dump($this->card_body_curve_arr);
// dump($data);
// $data['s_time'] = $this->adjustDateTime($data['s_time'],'subtract');
// $data['e_time'] = $this->adjustDateTime($data['e_time'],'add');
// dump($data);
// die;
$data['s_time'] = $data['s_time'].' 00:00:00';
$data['e_time'] = $data['e_time'].' 23:59:59';
$user_data_list = Db::table('app_card_body_data')
->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('app_user_data')->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('app_user_data')->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('app_card_body_data')->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('pc_heightstand2')->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('pc_weightstand2')->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('pc_bmistand2')->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 app_card_body_data as acbd
left join app_user_data 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('app_user_data')->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
################################################################其他接口################################################################
################################################################其他接口################################################################
}

View File

@ -0,0 +1,481 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use app\bj\controller\Common;
use think\Log;
use \think\Validate;
use app\app\controller\Calculatebody;
use app\app\controller\Skip;
class Cardparts extends Base{
protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
protected $parameter_aggregate_top = [
'weight'=>'反映和衡量一个人健康状况的重要标志之一',
'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){
// dump($data);
// die;
// $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');
// dump($data);
// dump($temporary_arr);
// die;
// 处理格式(顶部)
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]);
}
// dump($temporary_arr);
// die;
// 处理顶部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;
// dump($data);
// dump($w);
// dump($k);
}
// 处理异常
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;
}
}

View File

@ -0,0 +1,452 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use app\bj\controller\Common;
use think\Log;
use \think\Validate;
use app\app\controller\Calculatebody;
use app\app\controller\Cardparts;
use app\app\controller\Skip;
use Exception;
class Cardpublic extends Base{
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'=>'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);
}
return $this->get_label_list_action($data);
}
################################################################action################################################################
################################################################action################################################################
##################################################get_card_content##################################################
public function get_card_content_action($data){
// 查找用户是存在
$user_data = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('id,gender')->find();
if(!$user_data){
return $this->msg(10004);
}
// 卡片是否存在,以及是否含有子项
$card_data_sub_item = Db::table('app_card_data_sub_item')->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('app_card_data_sub_item_data')->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('app_card_data_sub_item_data')->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('app_user_data')->where(['id'=>$data['aud_id']])->field('id,gender')->find();
if(!$user_data){
return $this->msg(10004);
}
// 查找项目是否存在,以及获取项目信息
$card_data_sub_item_data = Db::table('app_card_data_sub_item')->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('app_card_data_sub_item_data')->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('app_user_data')->where(['id'=>$data['aud_id']])->field('id,gender')->find();
if(!$user_data){
return $this->msg(10004);
}
$label_data = Db::table('app_card_data_sub_item')->where("acd_id = ".$data['acd_id']." and suit_gender LIKE '%".$user_data['gender']."%'")->field('name,unit,type')->select();
if(count($label_data)<=0){
return $this->msg(10004);
}
foreach ($label_data as $key => $value) {
if($value['type'] == 1){
$label_data[$key]['default_value'] = '0';
}else if($value['type'] == 2){
$label_data[$key]['default_value'] = '0.0';
}else if($value['type'] == 4){
$label_data[$key]['default_value'] = '0:00';
}
unset($label_data[$key]['ROW_NUMBER']);
}
return $this->msg($label_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('admin_estimate')->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;
}
}

View File

@ -0,0 +1,283 @@
<?php
namespace app\app\controller;
use think\Db;
use think\Log;
class Device extends Base{
protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 获取系统设备列表
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);
}
// cache($data['token'],time());
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);
}
// cache($data['token'],time());
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);
}
// cache($data['token'],time());
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);
}
// cache($data['token'],time());
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);
}
cache($data['token'],time());
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('app_device_data')->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('app_account_number')->where(['token'=>$data['token']])->field('id,token')->find();
if(!$result_user){
return $this->msg(10003);
}
$device_code_data = Db::table('app_device_code_data')->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('app_device_code_data')->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,'更新失败');
}
}
// 仅单用户可以绑定
// if($device_code_data['bind_account_id']){
// return $this->msg(10003,'设备已被绑定');
// }else{
// $device_binding = Db::table('app_device_code_data')->where(['machine_code'=>$data['device_mac']])->update([
// 'bind_account_id'=>$result_user['id'],
// ]);
// if($device_binding){
// return $this->msg([]);
// }else{
// return $this->msg(10002,'更新失败');
// }
// }
}
$device_binding = Db::table('app_device_code_data')->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('app_account_number')->where(['token'=>$data['token']])->field('id,token')->find();
if(!$result_user){
return $this->msg(10003);
}
$likePattern = '%' . $result_user['id'] . '%';
$device_code_data = Db::table('app_device_code_data')
->alias('adcd')
->join('app_device_data 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('app_account_number')->where(['token'=>$data['token']])->field('id,token')->find();
if(!$result_user){
return $this->msg(10003);
}
$device_binding_user = Db::table('app_device_code_data')
->alias('adcd')
->join('app_device_data 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('app_device_code_data')->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('app_account_number')->where(['token'=>$data['token']])->field('id,token')->find();
// dump($user_id);
// die;
$likePattern = '%' . $user_id['id'] . '%';
$result_device = Db::table('app_device_code_data')
->alias('adcd')
->join('app_device_data 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);
}
}
################################################################其他接口################################################################
################################################################其他接口################################################################
}

View File

@ -0,0 +1,50 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
class Download extends Base{
public function demo(){
// $num = Db::table('app_version_log')->order('id desc')->find();
// echo '你好,这里仅仅是个下载展示页面-1';
// echo '<br><a href="'.$num['download_url'].'">点击下载</a>';
$url = Db::table('app_version_log')->order('id desc')->find();
$this->assign([
'url' => $url['download_url'],
]);
return $this->fetch();
}
public function demo2(){
$url = Db::table('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;
}
}

View File

@ -0,0 +1,593 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use app\bj\controller\Common;
use think\Log;
use \think\Validate;
class Index extends Base{
protected $moren_gufen_diqu = '上海,上海';
protected $db_name = ['2'=>'app_card_body_data','6'=>'app_card_skip_data','8'=>'app_card_vitalcapacity_data'];
// 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','pc_heightstand2'],
'weight'=>['体重','公斤','pc_weightstand2'],
'bmi'=>['BMI','','pc_bmistand2'],
'average'=>['肺活量','ml','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('app_version_log')->order('is_del,id desc')->find();
if($result){
$version = $result['version_num_original'];
$url = $result['download_url'];
}else{
$version = '';
$url = '';
}
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'=>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_parameters($data,'register');
if(!is_array($verify_result)){
return $this->msg(10001,$verify_result);
}
$result = Db::table('app_user_data')->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('app_user_data')->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('app_user_data')->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'=>66,'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('app_user_data')->where(['aan_id'=>$data['aan_id'],'is_del'=>0])->select();
// $result = Db::table('app_user_data')->where(['aan_id'=>$aan_id])->field('id,nickname')->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']);
// array_push($temporary_data,['id'=>$result[$i]['id'],'nickname'=>$result[$i]['nickname'],'age'=>$this->calculate_age($result[$i]['birthday'])]);
}
$temporary_data = $result;
}
return $this->msg($temporary_data);
}
// 获取指定用户详细信息
public function get_user_data_information($data = ['aud_id'=>92,'token'=>'caadd1be045a65f30b92aa805f1de54a']){
if(count(input('post.')) > 0){
$data = input('post.');
}
// dump(input('post.'));
// dump(input('get.'));
// // dump($data);
// die;
if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){
return $this->msg(10001);
}
// cache($data['token'],time());
if($this->token_time_validate($data['token']) === false){
return $this->msg(20001);
}
unset($data['token']);
$result = Db::table('app_user_data')->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('app_card_body_data')->where(['aud_id'=>$data['aud_id']])->order('record_time desc')->field('id,weight_val,record_time')->find();
// dump($weight_data_pd);
// 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'];
}
// $result['birthday'] = str_replace('-', '/', $result['birthday']);
// foreach ($result['card_data_list'] as $key => $value) {
// // dump($key);
// if($key == 'record_time' && $value != ''){
// // dump(111);
// $result['card_data_list'][$key] = str_replace('-', '/', $result['card_data_list'][$key]);
// }
// }
unset($result['target_weight']);
unset($result['initial_weight']);
unset($result['initial_date']);
// 获取设备信息进入卡片 start
$likePattern = '%' . $result['aan_id'] . '%';
$result_device = Db::table('app_device_code_data')
->alias('adcd')
->join('app_device_data 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;
}
}
$result['address'] = $this->moren_gufen_diqu;
// 插入肺活量的卡片标准
$result['vitalcapacity_data'] = $this->get_vitalcapacity_data($result['id']);
// 获取设备信息进入卡片 end
return $this->msg($result);
}
// 获取所有卡片列表信息
public function get_card_all_list($data = ['aud_id'=>83,'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']);
$user_card_list = Db::table('app_user_data')->where(['id'=>$data['aud_id'],'is_del'=>0])->field('id,card_order')->find();
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('app_card_data')->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('app_user_data')->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);
// $temporary_arr = Db::table('app_identity_data')->cache(true,60)->select();
// $result = [['id'=>'nothing','name'=>'无']];
// // dump();
// // die;
// foreach ($temporary_arr as $key => $value) {
// array_push($result,['id'=>$value['id'],'name'=>$value['content']]);
// }
// return $this->msg(['grade_list'=>$this->grade_list,'identity_list'=>$result]);
}
################################获取账号下信息操作################################
// 获取账号下首页卡片的基础数据
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();
// dump($db_arr[$value]);
if(count($db_arr[$value]) > 0){
$db_arr[$value] = $db_arr[$value][0];
}else{
unset($db_arr[$value]);
}
}
// 获取卡片路径及卡片数组处理start
$card_all_data = Db::table('app_card_data')->field('id,page_url_record,page_url_report,page_url_bluetooth')->select();
$card_all_data_result = [];
foreach ($card_all_data as $key => $value) {
$card_all_data_result[$value['id']] = [
'page_url_record'=>$value['page_url_record'],
'page_url_report'=>$value['page_url_report'],
'page_url_bluetooth'=>$value['page_url_bluetooth']
];
}
// 获取卡片路径及卡片数组处理end
// dump($db_arr);
// 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'] = $this->card_data[$value][0];
$temporary_arr['card_key'] = $this->card_data[$value][1];
$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['inside_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'=>''
]);
}
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'] = $this->card_data[$value][0];
$temporary_arr['card_key'] = $this->card_data[$value][1];
$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['inside_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'=>''
]);
}
}
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('app_account_number')->where(['id'=>$parameter['aan_id']])->count();
if($parameter_pd <= 0){
return '该账户不存在';
}
$result = Db::table('app_user_data')->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;
}
}

View File

@ -0,0 +1,485 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use think\Cache;
use think\Log;
use \think\Validate;
use PHPMailer\PHPMailer\PHPMailer;
class Login extends Base{
protected $code_time = 50;
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 注册
public function register_action($data = ['data'=>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('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('app_account_number')->insertGetId($set_data);
if($result){
cache($set_data['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('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('app_account_number')->where([$t_y=>$data['data']])->update(['password'=>$data['password']]);
if($result){
cache($find_data['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'=>'746119','type'=>'login','validate_type'=>'code']){
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;
// 检测校验途径
if($data['validate_type'] == 'code'){
$code_name = $data['data'];
if($this->check_code($code_name,$data['validate_data']) === true){
$result = Db::table('app_account_number')->where($verify_result)->field('id,token')->find();
if($result){
cache($result['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('app_account_number')->insertGetId($set_data);
if($result){
cache($set_data['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('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'], 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('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']){
// dump(cache('linshi'));
// die;
// $data = input('post.');
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);
// 处理响应
// dump($response);
cache('linshi', $response);
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 = '<div style="margin: 0; padding: 0;">
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background: #f3f3f3; min-width: 350px; font-size: 1px; line-height: normal;">
<tbody><tr>
<td align="center" valign="top">
<table cellpadding="0" cellspacing="0" border="0" width="750" class="table750" style="width: 100%; max-width: 750px; min-width: 350px; background: #f3f3f3;">
<tbody><tr>
<td class="mob_pad" width="25" style="width: 25px; max-width: 25px; min-width: 25px;">&nbsp;</td>
<td align="center" valign="top" style="background: #ffffff;">
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="width: 100% !important; min-width: 100%; max-width: 100%; background: #f3f3f3;">
<tbody><tr>
<td align="right" valign="top">
<div class="top_pad" style="height: 25px; line-height: 25px; font-size: 23px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="left" valign="top">
<div style="height: 39px; line-height: 39px; font-size: 37px;">&nbsp;</div>
<font class="mob_title1" face="\'Source Sans Pro\', sans-serif" color="#1a1a1a" style="font-size: 52px; line-height: 55px; font-weight: 300; letter-spacing: -1.5px;">
<span class="mob_title1" style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #fb966e; font-size: 48px; line-height: 55px; font-weight: 700; letter-spacing: -1.5px;">QingCe!</span>
</font>
<div style="height: 73px; line-height: 73px; font-size: 71px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="left" valign="top">
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #585858; font-size: 24px; line-height: 32px;">感谢您选择青测产品!</span>
</font>
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #585858; font-size: 24px; line-height: 32px;">以下6位数字是邮箱验证码请在需要的位置填写以通过验证</span>
</font>
<div style="height: 18px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#585858" style="font-size: 24px; line-height: 32px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #aaaaaa; font-size: 16px; line-height: 32px;">(如果您从未请求发送邮箱验证码,请忽略此邮件)</span>
</font>
<div style="height: 33px; line-height: 33px; font-size: 31px;">&nbsp;</div>
<table class="mob_btn" cellpadding="0" cellspacing="0" border="0" style="background: #fb966e; border-radius: 4px;">
<tbody><tr>
<td align="center" valign="top">
<span style="display: block; border: 1px solid #fb966e; border-radius: 0px; padding: 6px 12px; font-family: \'Nunito\', Arial, Verdana, Tahoma, Geneva, sans-serif; color: #ffffff; font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">
<font face="\'Nunito\', sans-serif" color="#ffffff" style="font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">
<span style="font-family: \'Nunito\', Arial, Verdana, Tahoma, Geneva, sans-serif; color: #ffffff; font-size: 20px; line-height: 30px; text-decoration: none; white-space: nowrap; font-weight: 600;">'.$content['content'].'</span>
</font>
</span>
</td>
</tr>
</tbody></table>
<div style="height: 75px; line-height: 75px; font-size: 73px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="width: 100% !important; min-width: 100%; max-width: 100%; background: #f3f3f3;">
<tbody><tr>
<td align="center" valign="top">
<div style="height: 34px; line-height: 34px; font-size: 32px;">&nbsp;</div>
<table cellpadding="0" cellspacing="0" border="0" width="88%" style="width: 88% !important; min-width: 88%; max-width: 88%;">
<tbody><tr>
<td align="center" valign="top">
<div style="height:12px; line-height: 34px; font-size: 32px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#868686" style="font-size: 17px; line-height: 20px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #868686; font-size: 17px; line-height: 20px;">© Zhengzhou Pinchuan Technology Co., Ltd. </span>
</font>
<div style="height: 3px; line-height: 3px; font-size: 1px;">&nbsp;</div>
<font face="\'Nunito\', sans-serif" color="#1a1a1a" style="font-size: 17px; line-height: 20px;">
<span style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #1a1a1a; font-size: 17px; line-height: 20px;"><a target="_blank" style="font-family: \'Nunito\', Arial, Tahoma, Geneva, sans-serif; color: #1a1a1a; font-size: 17px; line-height: 20px; text-decoration: none;" href="https://paoluz.link/"></a></span>
</font>
<div style="height: 35px; line-height: 35px; font-size: 33px;">&nbsp;</div>
</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</td>
<td class="mob_pad" width="25" style="width: 25px; max-width: 25px; min-width: 25px;">&nbsp;</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
</div>';
$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){
// // 默认验证码正确
// return true;
// dump($data);
// dump(cache($data));
// die;
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;
}
}

View File

@ -0,0 +1,154 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use app\app\controller\Login;
class Myinformation extends Base{
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 获取账号下信息
public function get_my_account_msg($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->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('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('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('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('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);
}
}
}

View File

@ -0,0 +1,606 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
use \think\Validate;
use app\app\controller\Calculatebody;
use app\app\controller\Skip;
class Pagingcontrast extends Base{
protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
protected $db_name = ['2'=>'app_card_body_data','6'=>'app_card_skip_data','8'=>'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 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('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('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 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('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('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 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('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('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 app_card_body_data as acbd
left join 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 app_card_skip_data as acsd
left join 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 app_card_vitalcapacity_data as acsd
left join 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);
}
}

View File

@ -0,0 +1,365 @@
<?php
namespace app\app\controller;
use think\Controller;
use think\Db;
class Skip extends Base{
protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
protected $curve_data_format = ['jump_num'=>['跳绳个数','个数/个','#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('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('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('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('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('app_card_skip_data')->insert($data_set);
$result = [
'today_jump_num'=>0,
'today_jump_time'=>0,
'today_jump_kcal'=>0,
];
$all_data = Db::table('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('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('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('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
];
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,404 @@
<?php
namespace app\app\controller;
use think\Controller;
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']];
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('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('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('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('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('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################################################################
}

View File

@ -0,0 +1,171 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1,minimum-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no, email=no">
<meta name="full-screen" content="true">
<meta name="screen-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="360-fullscreen" content="true">
<title>下载页面-download</title>
<script src="/x_admin/js/jq.js"></script>
<style>
*{
padding: 0 0;
margin: 0 0;
}
.big_box{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
.content_1{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
overflow: auto;
padding: 10vw;
box-sizing: border-box;
font-size: 4vw;
}
.download{
width: 40vw;
height: 10vw;
background-color: darkgray;
border-radius: 5vw;
text-align: center;
line-height: 10vw;
font-weight: bold;
text-decoration: none;
color: white;
margin-top: 10vw;
}
img{
width: 25vw;
margin-bottom: 20vw;
}
.jump{
width: 40vw;
height: 10vw;
color: white;
background-color: darkgray;
border-radius: 5vw;
text-align: center;
line-height: 10vw;
font-weight: bold;
margin-bottom: 10vw;
}
.ts{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.8);
}
.ts_box{
width: 85vw;
height: 27vw;
position: absolute;
top: 20%;
left: 12%;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: space-evenly;
align-items: flex-start;
font-size: 5vw;
color: white;
font-weight: bold;
}
.ts_pic{
width: 32vw;
height: 40vw;
position: absolute;
top: 0%;
right: 0%;
background: url(/tsf/registered_arrow.png) no-repeat;
background-size: contain;
background-position: center;
}
a{
margin-top: 10vw;
text-decoration: none;
color: blue;
}
</style>
</head>
<body id="box_k">
<div class="big_box">
<div class="content_1">
<img src="http://tc.pcxbc.com/tsf/logo.png" alt="">
<!-- <div class="jump" onclick="jump()">打开微信小程序</div> -->
<div class="download" onclick="download()">下载</div>
<!-- <a href="javascript:;">已安装? 打开Reedaw&nbsp;></a> -->
</div>
</div>
<div class="ts" style="display: none;">
<div class="ts_box">
<div>1、点击右上角“ ··· ”</div>
<div>2、在菜单中选择“在浏览器中打开”</div>
</div>
<div class="ts_pic"></div>
</div>
</body>
</html>
<script>
var str_url = "{$url}";
function isWeixin() {
var ua = navigator.userAgent.toLowerCase();
return /micromessenger/i.test(ua);
}
function isIOS() {
var userAgent = navigator.userAgent || navigator.vendor || window.opera;
return /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream;
}
function jump(){
window.location.href = 'weixin://dl/business/?appid=wx3e50e84030fe0d1e&path=pages/index/index';
}
$('.ts').on('click',function(){
$(this).hide()
})
function download(){
if (isWeixin()) {
console.log('当前在微信环境中');
$('.ts').show()
} else {
console.log('当前不在微信环境中');
if (isIOS()) {
console.log('当前是iOS设备');
// 在这里执行iOS设备下的特定代码
window.location.href = "https://apps.apple.com/app/reedaw/id6654906497";
} else {
console.log('当前不是iOS设备');
// 在这里执行非iOS设备下的代码
window.location.href = str_url;
}
}
}
</script>

View File

@ -0,0 +1,171 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1,minimum-scale=1, maximum-scale=1,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no, email=no">
<meta name="full-screen" content="true">
<meta name="screen-orientation" content="portrait">
<meta name="x5-fullscreen" content="true">
<meta name="360-fullscreen" content="true">
<title>下载页面</title>
<script src="/x_admin/js/jq.js"></script>
<style>
*{
padding: 0 0;
margin: 0 0;
}
.big_box{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
}
.content_1{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
overflow: auto;
padding: 10vw;
box-sizing: border-box;
font-size: 4vw;
}
.download{
width: 40vw;
height: 10vw;
background-color: darkgray;
border-radius: 5vw;
text-align: center;
line-height: 10vw;
font-weight: bold;
text-decoration: none;
color: white;
margin-top: 10vw;
}
img{
width: 25vw;
margin-bottom: 20vw;
}
.jump{
width: 40vw;
height: 10vw;
color: white;
background-color: darkgray;
border-radius: 5vw;
text-align: center;
line-height: 10vw;
font-weight: bold;
margin-bottom: 10vw;
}
.ts{
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.8);
}
.ts_box{
width: 85vw;
height: 27vw;
position: absolute;
top: 20%;
left: 12%;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
justify-content: space-evenly;
align-items: flex-start;
font-size: 5vw;
color: white;
font-weight: bold;
}
.ts_pic{
width: 32vw;
height: 40vw;
position: absolute;
top: 0%;
right: 0%;
background: url(/tsf/registered_arrow.png) no-repeat;
background-size: contain;
background-position: center;
}
a{
margin-top: 10vw;
text-decoration: none;
color: blue;
}
</style>
</head>
<body id="box_k">
<div class="big_box">
<div class="content_1">
<img src="http://tc.pcxbc.com/tsf/logo.png" alt="">
<div class="jump" onclick="jump()">打开微信小程序</div>
<div class="download" onclick="download()">下载</div>
<!-- <a href="javascript:;">已安装? 打开Reedaw&nbsp;></a> -->
</div>
</div>
<div class="ts" style="display: none;">
<div class="ts_box">
<div>1、点击右上角“ ··· ”</div>
<div>2、在菜单中选择“在浏览器中打开”</div>
</div>
<div class="ts_pic"></div>
</div>
</body>
</html>
<script>
var str_url = "{$url}";
function isWeixin() {
var ua = navigator.userAgent.toLowerCase();
return /micromessenger/i.test(ua);
}
function isIOS() {
var userAgent = navigator.userAgent || navigator.vendor || window.opera;
return /iPad|iPhone|iPod/.test(userAgent) && !window.MSStream;
}
function jump(){
window.location.href = 'weixin://dl/business/?appid=wx3e50e84030fe0d1e&path=pages/index/index';
}
$('.ts').on('click',function(){
$(this).hide()
})
function download(){
if (isWeixin()) {
console.log('当前在微信环境中');
$('.ts').show()
} else {
console.log('当前不在微信环境中');
if (isIOS()) {
console.log('当前是iOS设备');
// 在这里执行iOS设备下的特定代码
window.location.href = "https://apps.apple.com/app/reedaw/id6654906497";
} else {
console.log('当前不是iOS设备');
// 在这里执行非iOS设备下的代码
window.location.href = str_url;
}
}
}
</script>