SchoolPhysicalExamination/application/NewReedaw/controller/app/Userbody.php

1576 lines
70 KiB
PHP
Raw Normal View History

2026-02-03 18:56:47 +08:00
<?php
namespace app\NewReedaw\controller\app;
use think\Db;
use app\NewReedaw\controller\app\Cardparts;
use app\NewReedaw\controller\app\Calculatebody;
class Userbody extends Base{
protected $body_db_name = [
'zhanghao'=>'app_account_number',
'juese'=>'app_user_data',
'body_data'=>'app_card_body_data',
'bmi'=>'pc_bmistand',
'heigh'=>'pc_heightstand',
'weigh'=>'pc_weightstand',
'chufang1'=>'pc_childrenprescription',
'chufang2'=>'pc_childprescriptionbyage',
];
protected $age_limit = 16;
protected $pagesize = 15;
2026-03-06 18:02:49 +08:00
protected $detailed_model_1 = [ //详情里面的数据模板
"name"=>"", //名称
"value"=>"0", //值
"unit"=>"", // 单位
"desc"=>'',// 描述
"standard"=>"", //标准值
"standard_color"=>"#000000", //标准颜色
"list"=>[], //标准列表
"key_name"=>'', //标准列表
"offset"=>0, //标准列表
"tip"=>'', //小妙招
];
2026-02-03 18:56:47 +08:00
protected $merged_data = [
'score' => [
'name' => '身体得分',
'unit' => '分',
2026-03-06 18:02:49 +08:00
"description"=>"身体得分指综合评估身体健康状况的指标。",
'list' => [
'偏低' => '#C2831C',
'标准' => '#F5A623',
'偏高' => '#14CBAD',
'高' => '#0F9982'
],
'standard_list' => [
['min_val'=>'0','max_val'=>'70','text'=>'较差','color'=>'#C2831C'],
['min_val'=>'71','max_val'=>'80','text'=>'一般','color'=>'#F5A623'],
['min_val'=>'81','max_val'=>'90','text'=>'良好','color'=>'#14CBAD'],
['min_val'=>'91','max_val'=>'100','text'=>'很棒','color'=>'#0F9982'],
]
2026-02-03 18:56:47 +08:00
],
'height' => [
'name' => '身高',
'unit' => 'cm',
2026-03-06 18:02:49 +08:00
"description"=>"人体纵向部分的长度,源于人体的纵向生长,受遗传因素的影响较大",
'list' => [
'矮'=>'#FD5759',
'偏矮'=>'#FAAD01',
'标准'=>'#5BD068',
'偏高'=>'#6793F4',
'高'=>'#3D67D3',
],
'standard_list' => [
['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'],
]
2026-02-03 18:56:47 +08:00
],
'weight' => [
'name' => '体重',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"体重指人体的重量,通常用斤、公斤或磅作为单位来衡量。体重是人体健康的重要指标,但需要结合身高、体型和体脂率等因素来综合评估。",
'list' => [
'低'=>'#FD5759',
'偏低'=>'#FAAD01',
'标准'=>'#5BD068',
'偏高'=>'#FAAD01',
'高'=>'#FD5759',
],
'standard_list' => [
['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'=>'#FAAD01'],
['min_val'=>'','max_val'=>'','text'=>'高','color'=>'#FD5759'],
]
2026-02-03 18:56:47 +08:00
],
'bmi' => [
'name' => 'BMI',
'unit' => '',
2026-03-06 18:02:49 +08:00
"description"=>"BMI是身体质量指数(BodyMassIndex)的缩写,是一种常用的衡量人体肥胖程度的指标",
'list' => [
'消瘦'=>'#FDDA6B',
'正常'=>'#5BD068',
'偏重'=>'#FAAD01',
'肥胖'=>'#FD5759',
],
'standard_list' => [
['min_val'=>'0','max_val'=>'','text'=>'消瘦','color'=>'#FDDA6B'],
['min_val'=>'','max_val'=>'','text'=>'正常','color'=>'#5BD068'],
['min_val'=>'','max_val'=>'','text'=>'偏重','color'=>'#FAAD01'],
['min_val'=>'','max_val'=>'50','text'=>'肥胖','color'=>'#FD5759'],
]
2026-02-03 18:56:47 +08:00
],
'fat_r' => [
'name' => '脂肪率',
'unit' => '%',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'偏低' => '#FCDB67',
'标准' => '#58D268',
'偏高' => '#FCAA00',
'高' => '#FD5752'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
]
2026-02-03 18:56:47 +08:00
]
],
'fat_w' => [
'name' => '脂肪量',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'偏低' => '#FCDB67',
'标准' => '#58D268',
'偏高' => '#FCAA00',
'高' => '#FD5752'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
]
2026-02-03 18:56:47 +08:00
]
],
'muscle' => [
'name' => '肌肉率',
'unit' => '%',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FFDA68',
'标准' => '#59CD6F',
'优' => '#3C64D4'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'muscleval' => [
'name' => '肌肉量',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FFDA68',
'标准' => '#59CD6F',
'优' => '#3C64D4'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'water' => [
'name' => '水分',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FED966',
'标准' => '#58CF6B',
'优' => '#3A68D7'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'bone' => [
'name' => '骨重',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FED966',
'标准' => '#58CF6F',
'优' => '#3A68D7'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
],
]
2026-02-03 18:56:47 +08:00
]
],
'protein' => [
'name' => '蛋白率',
'unit' => '%',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FED966',
'标准' => '#58CF6F',
'优' => '#3A68D7'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'proteinval' => [
'name' => '蛋白量',
'unit' => 'kg',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FED966',
'标准' => '#58CF6F',
'优' => '#3A68D7'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'kcal' => [
'name' => '基础代谢',
'unit' => 'kcal',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'偏低' => '#FF5656',
'优' => '#3A68D4'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
['min_val'=>'0','max_val'=>'','text'=>'偏低','color'=>'#ff5656'],
['min_val'=>'','max_val'=>'9999','text'=>'优','color'=>'#3C66D2'],
2026-02-03 18:56:47 +08:00
]
],
'visceral' => [
'name' => '内脏指数',
'unit' => '',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'标准' => '#55CF6C',
'警惕' => '#FEAC00',
'危险' => '#FB5A52'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'], //红
]
2026-02-03 18:56:47 +08:00
]
],
'sfr' => [
'name' => '皮下脂肪',
'unit' => '%',
2026-03-06 18:02:49 +08:00
"description"=>"",
2026-02-03 18:56:47 +08:00
'list' => [
'不足' => '#FCDB68',
'标准' => '#59D16F',
'偏高' => '#FEAB03'
2026-03-06 18:02:49 +08:00
],
'standard_list' => [
'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'],
]
2026-02-03 18:56:47 +08:00
]
],
'body_level' => [
'name' => '肥胖等级',
'unit' => '',
2026-03-06 18:02:49 +08:00
"description"=>"肥胖等级指根据个体BMI来评估一个人是否超重或肥胖的指标。",
'list' => [],
'standard_list' => []
2026-02-03 18:56:47 +08:00
],
'body_type' => [
'name' => '身体类型',
'unit' => '',
2026-03-06 18:02:49 +08:00
"description"=>"身体类型是对人体外形的总体描述和评定",
'list' => [],
'standard_list' => []
2026-02-03 18:56:47 +08:00
],
'body_age' => [
'name' => '身体年龄',
'unit' => '岁',
2026-03-06 18:02:49 +08:00
"description"=>"身体年龄指衡量身体健康状况的指标它反映了一个人的生理状态相对于实际年龄的健康程度。相关模型主要与BMI有关。",
'list' => [],
'standard_list' => []
2026-02-03 18:56:47 +08:00
]
];
2026-03-06 18:02:49 +08:00
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','优'=>'#3A68D4'],
'visceral'=>['标准'=>'#55CF6C','警惕'=>'#FEAC00','危险'=>'#FB5A52'],
'sfr'=>['不足'=>'#FCDB68','标准'=>'#59D16F','偏高'=>'#FEAB03'],
2026-02-03 18:56:47 +08:00
];
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]],
];
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
// 测试token=>'caadd1be045a65f30b92aa805f1de54a'
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 获取角色报告(简要)
public function body_report_brief(){
$data = input('post.');
try {
if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){
return $this->msg(10001);
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type error');
}
return $this->body_report_brief_action($data);
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
2026-03-06 18:02:49 +08:00
$logContent['all_content'] .= "函数: body_report_brief" . "\n";
2026-02-03 18:56:47 +08:00
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 获取角色报告(详细)
public function body_report_detailed(){
$data = input('post.');
try {
if(!array_key_exists('token', $data) || !array_key_exists('aud_id', $data)){
return $this->msg(10001);
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type error');
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type error');
}
return $this->body_report_detailed_action($data);
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
2026-03-06 18:02:49 +08:00
$logContent['all_content'] .= "函数: body_report_detailed" . "\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 手动记录
public function manual_record(){
$data = input('post.');
try {
if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('token', $data)){
return $this->msg(10001);
}
unset($data['token']);
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type error');
}
if(!$this->verify_data_is_ok($data['time'],'datetime')){
return $this->msg(10005,'time type error');
}
$temporary_data = $this->convertHeightAndWeight($data['height'],$data['weight']);
if($temporary_data['height_in_cm'] == false){
return $this->msg(10005,'身高单位错误');
}
if($temporary_data['weight_in_kg'] == false){
return $this->msg(10005,'体重单位错误');
}
$data['height'] = $temporary_data['height_in_cm'];
$data['weight'] = $temporary_data['weight_in_kg'];
if(strlen($data['time']) <= 12){
// 时间日期转换,把'Y-m-d'转换成'Y-m-d H:i:s'格式
$data['time'] = $this->addCurrentTimeToDateString($data['time']);
}
return $this->set_user_body_data($data,'by_hand_means');
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "函数: manual_record" . "\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 设备记录
public function device_record(){
$data = input('post.');
try {
if(!array_key_exists('aud_id', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data) || !array_key_exists('adc', $data) || !array_key_exists('token', $data)){
return $this->msg(10001);
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type error');
}
if(!$this->verify_data_is_ok($data['adc'],'num')){
return $this->msg(10005,'adc type error');
}
$temporary_data = $this->convertHeightAndWeight($data['height'],$data['weight']);
if($temporary_data['height_in_cm'] == false){
return $this->msg(10005,'身高单位错误');
}
if($temporary_data['weight_in_kg'] == false){
return $this->msg(10005,'体重单位错误');
}
// 检测设备传过来的info信息
if(array_key_exists('info', $data)){
if (!is_array($data['info'])) {
return $this->msg(10005,'info参数格式错误');
}else{
$info_data_arr =['bodyage','fat_r','muscle','kcal','visceral','sfr','water','bone','fatlevlval','protein','bmi'];
foreach ($data['info'] as $key => $value) {
if (!in_array($key, $info_data_arr)) {
return $this->msg(10005,'info参数格式错误-2');
}
}
}
}
$data['height'] = $temporary_data['height_in_cm'];
$data['weight'] = $temporary_data['weight_in_kg'];
$data['time'] = date('Y-m-d H:i:s');
return $this->set_user_body_data($data,'by_device');
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "函数: device_record" . "\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
// 修改目标体重
public function set_target_weight(){
$data = input('post.');
try {
if(!array_key_exists('aud_id', $data) || !array_key_exists('weight', $data) || !array_key_exists('token', $data)){
return $this->msg(10001);
}
if(!$this->verify_data_is_ok($data['aud_id'],'intnum')){
return $this->msg(10005,'aud_id type error');
}
if(!$this->verify_data_is_ok($data['weight'],'num')){
return $this->msg(10005,'weight type error');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type error');
}
$data['time'] = date('Y-m-d H:i:s');
return $this->set_target_weight_action($data);
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "函数: set_target_weight" . "\n";
2026-02-03 18:56:47 +08:00
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
$this->record_api_log($data, $logContent, null);
return $this->msg(99999);
}
}
################################################################action################################################################
################################################################action################################################################
public function body_report_brief_action($data){
$result_return = [
2026-03-06 18:02:49 +08:00
'top_list'=>[
[
"name"=>"体重",
'time'=>'',
"value"=>"0",
"unit"=>"kg",
"standard"=>"",
"standard_color"=>"#77E46C",
'target_weight'=>'0',
'target_weight_unit'=>'kg'
],
[
"name"=>"身高",
'time'=>'',
"value"=>"0",
"unit"=>"cm",
"standard"=>"",
"standard_color"=>"#FEA63D",
],
[
"name"=>"BMI",
'time'=>'',
"value"=>"0",
"unit"=>"",
"standard"=>"",
"standard_color"=>"#FF8072",
],
2026-02-03 18:56:47 +08:00
],
2026-03-06 18:02:49 +08:00
// 'weight'=>
// 'height'=>
// 'bmi'=>
2026-02-03 18:56:47 +08:00
'card_list'=>[
],
];
$body_last_data = Db::query("
select
Top 1
acbd.id,
acbd.acd_id,
acbd.record_type,
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.height_val,
acbd.weight,
acbd.weight_val,
acbd.bmi,
acbd.body_age,
acbd.head_circumference,
aud.birthday,aud.gender,aud.target_weight,aud.initial_weight,aud.initial_date
from ".$this->body_db_name['body_data']." as acbd
left join ".$this->body_db_name['juese']." as aud on acbd.aud_id=aud.id
where acbd.is_del=0 and acbd.aud_id='".$data['aud_id']."'
order by acbd.record_time desc
");
if(count($body_last_data) <= 0){
return $this->msg($result_return);
}
// return $this->msg($body_last_data);
$record_time = substr($body_last_data[0]['record_time'], 11, 5);
// 处理体重
$temporary_weight = explode(',',$body_last_data[0]['weight']);
2026-03-06 18:02:49 +08:00
$result_return['top_list'][0]['time'] = $record_time;
$result_return['top_list'][0]['value'] = $temporary_weight[0];
$result_return['top_list'][0]['standard'] = $temporary_weight[1] == '无'?'':$temporary_weight[1];
$result_return['top_list'][0]['standard_color'] = $temporary_weight[2] == '无'?'':$temporary_weight[2];
$result_return['top_list'][0]['target_weight'] = $body_last_data[0]['target_weight'];
$result_return['top_list'][0]['key_name'] = 'weight';
2026-02-03 18:56:47 +08:00
// 处理身高
$temporary_height = explode(',',$body_last_data[0]['height']);
2026-03-06 18:02:49 +08:00
$result_return['top_list'][1]['time'] = $record_time;
$result_return['top_list'][1]['value'] = $temporary_height[0];
$result_return['top_list'][1]['standard'] = $temporary_height[1] == '无'?'':$temporary_height[1];
$result_return['top_list'][1]['standard_color'] = $temporary_height[2] == '无'?'':$temporary_height[2];
$result_return['top_list'][1]['key_name'] = 'height';
2026-02-03 18:56:47 +08:00
// 处理BMI
$temporary_bmi = explode(',',$body_last_data[0]['bmi']);
2026-03-06 18:02:49 +08:00
$result_return['top_list'][2]['time'] = $record_time;
$result_return['top_list'][2]['value'] = $temporary_bmi[0];
$result_return['top_list'][2]['standard'] = $temporary_bmi[1] == '无'?'':$temporary_bmi[1];
$result_return['top_list'][2]['standard_color'] = $temporary_bmi[2] == '无'?'':$temporary_bmi[2];
$result_return['top_list'][2]['key_name'] = 'bmi';
// 如果有心率
// 如果有头围
2026-02-03 18:56:47 +08:00
// 处理卡片数据
if($body_last_data[0]['record_type'] == 'by_hand_means'){
return $this->msg($result_return);
}else{
// 设置卡片顺序
$set_order = [
'fat_r', //体脂率
'fat_w', //脂肪量
'muscle', //肌肉率
'muscleval', //肌肉量
'protein', //蛋白率
'proteinval', //蛋白量
'water', //水分
'sfr', //皮下脂肪
'body_level', //肥胖等级☆
'visceral', //内脏指数
'bone', //骨重
'body_type', //身体类型☆
'score', //身体得分☆
'body_age', //身体年龄☆
];
foreach ($set_order as $key => $value) {
if($value == 'body_level' || $value == 'body_type' || $value == 'body_age' || $value == 'score'){
// 如果是特殊数据
$result_return['card_list'][] = [
'name'=>$this->merged_data[$value]['name'],
'icon'=>'',
'value'=>$body_last_data[0][$value],
'unit'=>$this->merged_data[$value]['unit'],
'standard'=>'',
'standard_color'=>'',
2026-03-06 18:02:49 +08:00
'key_name'=>$value,
2026-02-03 18:56:47 +08:00
];
}else{
// 分割数据
$temporary_data_1 = explode(',',$body_last_data[0][$value]);
// 设置默认标准颜色
$standard_color = '#121212';
// 处理标准颜色
if(array_key_exists($temporary_data_1[1],$this->merged_data[$value]['list'])){
$standard_color = $this->merged_data[$value]['list'][$temporary_data_1[1]];
}
$result_return['card_list'][] = [
'name'=>$this->merged_data[$value]['name'],
'icon'=>'',
'value'=>$temporary_data_1[0],
'unit'=>$this->merged_data[$value]['unit'],
'standard'=>$temporary_data_1[1],
'standard_color'=>$standard_color,
2026-03-06 18:02:49 +08:00
'key_name'=>$value,
2026-02-03 18:56:47 +08:00
];
}
}
}
return $this->msg($result_return);
}
public function body_report_detailed_action($data){
2026-03-06 18:02:49 +08:00
$result_return = [];
2026-02-03 18:56:47 +08:00
$body_last_data = Db::query("
select
Top 1
acbd.id,
acbd.acd_id,
acbd.record_type,
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.height_val,
acbd.weight,
acbd.weight_val,
acbd.bmi,
acbd.body_age,
acbd.head_circumference,
aud.birthday,aud.gender,aud.target_weight,aud.initial_weight,aud.initial_date
from ".$this->body_db_name['body_data']." as acbd
left join ".$this->body_db_name['juese']." as aud on acbd.aud_id=aud.id
where acbd.is_del=0 and acbd.aud_id='".$data['aud_id']."'
order by acbd.record_time desc
");
if(count($body_last_data) <= 0){
return $this->msg($result_return);
}
2026-03-06 18:02:49 +08:00
// return $this->msg($body_last_data);
2026-02-03 18:56:47 +08:00
// 设置卡片顺序
$set_order = [
'weight', //体重
2026-03-06 18:02:49 +08:00
'height', //身高
// '', //心率
// 'bmr', //BMR 静态基础代谢
'bmi', //BMI
2026-02-03 18:56:47 +08:00
'fat_r', //体脂率
'fat_w', //脂肪量
'muscle', //肌肉率
'muscleval', //肌肉量
'protein', //蛋白率
'proteinval', //蛋白量
'water', //水分
'sfr', //皮下脂肪
'visceral', //内脏指数
'bone', //骨重
'body_type', //身体类型☆
'body_level', //肥胖等级☆
'body_age', //身体年龄☆
'score', //身体得分☆
];
2026-03-06 18:02:49 +08:00
$temporary_model = [];
foreach ($set_order as $key => $value) {
$temporary_model = [];
if($value == 'body_type' || $value == 'body_level'){
$temporary_model = $this->detailed_model_1;
$temporary_model['name'] = $this->merged_data[$value]['name'];
$temporary_model['value'] = '';
$temporary_model['unit'] = '';
$temporary_model['desc'] = $this->merged_data[$value]['description'];
$temporary_model['standard'] = $body_last_data[0][$value];
$temporary_model['key_name'] = $value;
$result_return[] = $temporary_model;
}else if($value == 'weight' || $value == 'height' || $value == 'bmi'){
$temporary_data_array = explode(',',$body_last_data[0][$value]);
$temporary_model = $this->detailed_model_1;
$temporary_model['name'] = $this->merged_data[$value]['name'];
$temporary_model['value'] = $temporary_data_array[0];
$temporary_model['unit'] = $this->merged_data[$value]['unit'];
$temporary_model['desc'] = $this->merged_data[$value]['description'];
$temporary_model['standard'] = $temporary_data_array[1];
$temporary_model['standard_color'] = $temporary_data_array[1] == '无'?'':$this->merged_data[$value]['list'][$temporary_data_array[1]];
$temporary_model['list'] = $this->process_hwb_standard_action($body_last_data[0]['birthday'],$value,$body_last_data[0]['age'],$body_last_data[0]['gender']);
$temporary_model['key_name'] = $value;
$temporary_model['offset'] = $this->process_offset_action($temporary_data_array[0],$temporary_model['list']);
$result_return[] = $temporary_model;
}else if($value == 'score' || $value == 'body_age'){
$temporary_model = $this->detailed_model_1;
$temporary_model['name'] = $this->merged_data[$value]['name'];
$temporary_model['value'] = $body_last_data[0][$value];
$temporary_model['unit'] = $this->merged_data[$value]['unit'];
$temporary_model['desc'] = $this->merged_data[$value]['description'];
$temporary_model['key_name'] = $value;
$temporary_model['list'] = $this->process_other_standard_action($body_last_data[0],$value);
$temporary_model['offset'] = $this->process_offset_action($temporary_model['value'],$temporary_model['list']);
$temporary_model['standard'] = $this->process_special_offset_action($temporary_model['value'],$temporary_model['list'])['standard'];
$temporary_model['standard_color'] = $this->process_special_offset_action($temporary_model['value'],$temporary_model['list'])['standard_color'];
$result_return[] = $temporary_model;
}else{
if($body_last_data[0]['record_type'] == 'by_device_adc'){
$temporary_data_array = explode(',',$body_last_data[0][$value]);
$temporary_model = $this->detailed_model_1;
$temporary_model['name'] = $this->merged_data[$value]['name'];
$temporary_model['value'] = $temporary_data_array[0];
$temporary_model['unit'] = $this->merged_data[$value]['unit'];
$temporary_model['desc'] = $this->merged_data[$value]['description'];
$temporary_model['standard'] = array_key_exists(1,$temporary_data_array)?$temporary_data_array[1]:'';
// dump($temporary_model['standard']);
if($temporary_model['standard'] == ''){
$temporary_model['standard_color'] = "#000000";
}else if($temporary_model['standard'] == '异常'){
$temporary_model['standard_color'] = "#FD5759";
}else{
$temporary_model['standard_color'] = $this->merged_data[$value]['list'][$temporary_data_array[1]];
}
$temporary_model['list'] = $temporary_model['standard'] == ''?[]:$this->process_other_standard_action($body_last_data[0],$value);
// dump($value);
// dump($temporary_model['list']);
$temporary_model['key_name'] = $value;
$temporary_model['offset'] = $temporary_model['standard'] == ''?0:$this->process_offset_action($temporary_data_array[0],$temporary_model['list']);
if($temporary_model['standard'] == '异常'){
$temporary_model = $this->handling_exceptions($temporary_model);
}
$result_return[] = $temporary_model;
}else{
continue;
}
}
}
return $this->msg($result_return);
2026-02-03 18:56:47 +08:00
}
2026-03-06 18:02:49 +08:00
// 用户身体数据卡片记录
public function set_user_body_data($data,$type){
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
// 判断头围数据是否存在是否合理
if(array_key_exists('head_data', $data)){
if(!$this->verify_data_is_ok($data['head_data'],'num')){
return $this->msg(10005);
}
$data['head_circumference'] = $data['head_data'];
}else{
$data['head_circumference'] = 0;
}
// 查询用户信息
$user_data = Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->field('birthday,gender,target_weight,initial_weight,initial_date')->find();
if(!$user_data){
return $this->msg(10003);
}
// 如果最初体重设置为null
if($user_data['initial_date'] == null){
Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->update(['initial_weight'=>$data['weight'],'initial_date'=>$data['time']]);
// $target_current = $this->base_target_initial_cumulative_weight([
// 'weight'=>$data['weight'],
// 'target_weight'=>$user_data['target_weight'],
// 'initial_weight'=>$data['weight'],
// 'initial_date'=>$data['time'],
// ]);
}else{
// $target_current = $this->base_target_initial_cumulative_weight([
// 'weight'=>$data['weight'],
// 'target_weight'=>$user_data['target_weight'],
// 'initial_weight'=>$user_data['initial_weight'],
// 'initial_date'=>$user_data['initial_date'],
// ]);
}
// 设置身高、体重、年龄、性别、阶段称谓、头围、生日、阻抗
$result_data['height'] = $data['height'];
$result_data['weight'] = $data['weight'];
$result_data['age'] = $this->calculate_age($user_data['birthday']);
$result_data['gender'] = $user_data['gender'];
$result_data['head_circumference'] = $data['head_circumference'];
$result_data['birthday'] = $user_data['birthday'];
// 如果原始数据存在阻抗
if(array_key_exists('adc', $data)){
if($data['adc'] > 0){
// 如果阻抗大于0那就使用传过来的阻抗
$result_data['adc'] = $data['adc'];
$type = "by_device_adc";
}else{
$result_data['adc'] = 550;
$type = "by_device";
}
}
$calculate_body_formula = new Calculatebody();
// 计算身体数据
$get_body_value = $calculate_body_formula->calculate_body_data_result($result_data);
if($get_body_value === false){
return $this->msg(10002);
}
// 如果年纪小于三岁处理头围数据star
$standardlist = [];
if($result_data['age'] < 3){
if(array_key_exists('standardlist',$get_body_value)){
$standardlist = $get_body_value['standardlist'];
foreach ($standardlist as $key => $value) {
if($value['name'] == 'head' && count($value['list'] ) > 0){
$standardlist = $value;
}
}
$standardlist['list2'] = [];
foreach ($standardlist['list'] as $key => $value) {
array_push($standardlist['list2'],[
'min_val'=>$value['minvalue'],
'max_val'=>$value['maxvalue'],
'text'=>$value['text'],
'color'=>$value['color']
]);
}
unset($standardlist['list']);
unset($get_body_value['standardlist']);
}
}else{
if(array_key_exists('standardlist',$get_body_value)){
unset($get_body_value['standardlist']);
}
}
// 如果年纪小于三岁处理头围数据end
$get_body_value['gender'] = $user_data['gender'];
$get_body_value['birthday'] = $user_data['birthday'];
// 添加身高、体重、bmi、头围如果有的标尺标准
$get_body_value = $this->hwb_standard($get_body_value);
$enumeration_data = [
'fat_r'=>'脂肪率',
'muscle'=>'肌肉率',
'kcal'=>'基础代谢',
'visceral'=>'内脏指数',
'sfr'=>'皮下脂肪',
'water'=>'水分',
'bone'=>'骨重',
'protein'=>'蛋白率',
'bodyage'=>'身体年龄'
];
// 根据秤传过来的数据,去处理要存的结果
if(array_key_exists('info', $data)){
foreach ($data['info'] as $key => $value) {
if($key == 'bmi'){
if($value > 0){
$get_body_value['BMI'] = $value;
$get_body_value['BMI2'] = explode(',',$get_body_value['BMI2']);
$get_body_value['BMI2'][0] = $value;
$get_body_value['BMI2'] = implode(',',$get_body_value['BMI2']);
}
}else if($key == 'bodyage'){
$get_body_value[$enumeration_data[$key]] = $value;
}else if($key == 'fatlevlval'){
continue;
}else{
if($value > 0){
$get_body_value[$enumeration_data[$key]][0] = $value;
}
}
}
}
$set_data = [
'acd_id'=>2,
'aud_id'=>$data['aud_id'],
'record_time'=>array_key_exists('time', $data)?$data['time']:date('Y-m-d H:i:s'),
'create_time'=>date('Y-m-d H:i:s'),
'last_update_time'=>date('Y-m-d H:i:s'),
'age'=>$get_body_value['age'],
'height'=>$get_body_value['身高2'],
'height_val'=>$get_body_value['身高'],
'weight'=>$get_body_value['体重2'],
'weight_val'=>$get_body_value['体重'],
'bmi'=>$get_body_value['BMI2'],
'bmi_val'=>$get_body_value['BMI'],
'score'=>$get_body_value['身体得分'],
'fat_r'=> implode(',',$get_body_value['脂肪率']),
'fat_w'=>implode(',',$get_body_value['脂肪量']),
'muscle'=>implode(',',$get_body_value['肌肉率']),
'muscleval'=>implode(',',$get_body_value['肌肉量']),
'water'=>implode(',',$get_body_value['水分']),
'proteinval'=>implode(',',$get_body_value['蛋白量']),
'bone'=>implode(',',$get_body_value['骨重']),
'protein'=>implode(',',$get_body_value['蛋白率']),
'kcal'=>implode(',',$get_body_value['基础代谢']),
'visceral'=>implode(',',$get_body_value['内脏指数']),
'sfr'=>implode(',',$get_body_value['皮下脂肪']),
'body_level'=>$get_body_value['肥胖等级'],
'body_type'=>$get_body_value['身体类型'],
'body_age'=>$get_body_value['身体年龄'],
'record_type' => $type,
'head_circumference' => $result_data['age'] < 3?json_encode($standardlist):"",
];
if(strlen($set_data['record_time']) <= 12){
// 时间日期转换,把'Y-m-d'转换成'Y-m-d H:i:s'格式
$set_data['record_time'] = $this->addCurrentTimeToDateString($set_data['record_time']);
}
// 启动事务
Db::startTrans();
try{
$set_user_data = Db::table($this->body_db_name['body_data'])->insert($set_data);
$update_arr = [
'height'=>$get_body_value['身高'],
'weight'=>$get_body_value['体重']
];
if($data['head_circumference']>0){
$update_arr['head_data'] = $data['head_circumference'];
}
$update_user_data = Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->update($update_arr);
// 提交事务
Db::commit();
return $this->msg([]);
// return $this->msg([
// 'acd_id'=>2,
// 'height'=>$get_body_value['身高'].',CM',
// 'weight'=>$get_body_value['体重'].',公斤',
// 'bmi'=>$get_body_value['BMI'],
// 'target_current'=>$target_current,
// ]);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002);
}
}
// 用户身体数据卡片记录
public function set_target_weight_action($data){
$user_data = Db::table($this->body_db_name['juese'])->where(['id'=>$data['aud_id']])->update(['target_weight'=>$data['weight']]);
if($user_data){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
2026-02-03 18:56:47 +08:00
################################################################工具################################################################
################################################################工具################################################################
2026-03-06 18:02:49 +08:00
// 处理身高体重BMI的标准
public function process_hwb_standard_action($birthday,$key_name,$age,$gender_val){
$month_num = $this->calculateAgeInMonthsWithPrecision($birthday);
if($age < $this->age_limit){
$result_data = $this->merged_data[$key_name]['standard_list'];
if($key_name == 'bmi'){
$bhw_date = Db::table($this->body_db_name['bmi'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
if($bhw_date){
$result_data[0]['max_val'] = $bhw_date[0]['f1sd'];
$result_data[0]['max_val'] = $bhw_date[0]['f1sd'];
$result_data[1]['min_val'] = $bhw_date[0]['f1sd'];
$result_data[1]['max_val'] = $bhw_date[0]['z1sd'];
$result_data[2]['min_val'] = $bhw_date[0]['z1sd'];
$result_data[2]['max_val'] = $bhw_date[0]['z2sd'];
$result_data[3]['min_val'] = $bhw_date[0]['z2sd'];
}
}else if($key_name == 'height'){
$bhw_date = Db::table($this->body_db_name['heigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
if($bhw_date){
$result_data[0]['max_val'] = $bhw_date[0]['f2sd'];
$result_data[1]['min_val'] = $bhw_date[0]['f2sd'];
$result_data[1]['max_val'] = $bhw_date[0]['f1sd'];
$result_data[2]['min_val'] = $bhw_date[0]['f1sd'];
$result_data[2]['max_val'] = $bhw_date[0]['z1sd'];
$result_data[3]['min_val'] = $bhw_date[0]['z1sd'];
$result_data[3]['max_val'] = $bhw_date[0]['z2sd'];
$result_data[4]['min_val'] = $bhw_date[0]['z2sd'];
$result_data[4]['max_val'] = $bhw_date[0]['z3sd'];
}
}else if($key_name == 'weight'){
$bhw_date = Db::table($this->body_db_name['weigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
// dump($bhw_date);
if($bhw_date){
$result_data[0]['max_val'] = $bhw_date[0]['f2sd'];
$result_data[1]['min_val'] = $bhw_date[0]['f2sd'];
$result_data[1]['max_val'] = $bhw_date[0]['f1sd'];
$result_data[2]['min_val'] = $bhw_date[0]['f1sd'];
$result_data[2]['max_val'] = $bhw_date[0]['z1sd'];
$result_data[3]['min_val'] = $bhw_date[0]['z1sd'];
$result_data[3]['max_val'] = $bhw_date[0]['z2sd'];
$result_data[4]['min_val'] = $bhw_date[0]['z2sd'];
$result_data[4]['max_val'] = $bhw_date[0]['z3sd'];
}
}
}else{
$result_data = [];
}
return $result_data;
}
// 处理其他的标注列表
public function process_other_standard_action($data,$key_name){
if($key_name == 'body_age'){
$result_data = [
['min_val'=>'0','max_val'=>$data['age'],'text'=>'年轻','color'=>'#14CBAD'], //淡黄
['min_val'=>$data['age'],'max_val'=>bcadd(bcsub($data['age'],0,2),$data['age'],2),'text'=>'偏大','color'=>'#F53F31'], //绿
];
}else if($key_name == 'score'){
$result_data = $this->merged_data['score']['standard_list'];
}else{
$gender_val = $data['gender'] == 2?'woman':'man';
if($key_name == 'fat_r'){
if($data['age'] < 30){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['29'];
}else{
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['30'];
}
}else if($key_name == 'fat_w'){
if($data['age'] < 30){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['29'];
}else{
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['30'];
}
$result_data = $this->calculate_new_standard($result_data,$data['weight_val'],$key_name,$data['age'],$gender_val);
}else if($key_name == 'muscle' || $key_name == 'protein' || $key_name == 'water' || $key_name == 'sfr' || $key_name == 'visceral'){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val];
}else if($key_name == 'muscleval' || $key_name == 'proteinval'){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val];
$result_data = $this->calculate_new_standard($result_data,$data['weight_val'],$key_name,$data['age'],$gender_val);
}else if($key_name == 'bone'){
if($gender_val == 'man'){
if($data['weight_val'] < 60){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['60'];
}else if($data['weight_val'] >= 60 && $data['weight_val'] < 75){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['60_75'];
}else{
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['75'];
}
}else{
if($data['weight_val'] < 45){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['45'];
}else if($data['weight_val'] >= 45 && $data['weight_val'] < 60){
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['45_60'];
}else{
$result_data = $this->merged_data[$key_name]['standard_list'][$gender_val]['60'];
}
}
}
}
return $result_data;
}
// 处理一般落点
public function process_offset_action($val, $list) {
$count = count($list);
if($count <= 0){
return 0;
}
// dump($val);
// dump($list);
// die;
// 边界检查:小于最小值
$firstMin = floatval($list[0]['min_val']);
if (floatval($val) < $firstMin) {
return '0';
}
// 边界检查:大于最大值
$lastMax = floatval($list[$count-1]['max_val']);
if (floatval($val) > $lastMax) {
return '100';
}
// 找到数值所在的区间
for ($i = 0; $i < $count; $i++) {
$item = $list[$i];
$valNum = floatval($val);
$minNum = floatval($item['min_val']);
$maxNum = floatval($item['max_val']);
// 如果是第一个区间,包含最小值
if ($i == 0 && $valNum <= $maxNum) {
$index = $i;
break;
}
// 如果是最后一个区间,包含最大值
elseif ($i == $count - 1 && $valNum >= $minNum) {
$index = $i;
break;
}
// 中间区间
elseif ($valNum >= $minNum && $valNum < $maxNum) {
$index = $i;
break;
}
}
if (!isset($index)) {
return '0';
}
// 计算基准值
$itemPercent = bcdiv('100', strval($count), 20);
$basePercent = bcmul(strval($index), $itemPercent, 20);
// 计算当前区间内的百分比
$item = $list[$index];
$minVal = $item['min_val'];
$maxVal = $item['max_val'];
$rangeWidth = bcsub($maxVal, $minVal, 20);
// 如果范围宽度为0直接返回基准百分比
if (floatval($rangeWidth) == 0) {
$result = bcdiv($basePercent, '1', 1);
return $result;
}
$offset = bcsub($val, $minVal, 20);
$percentInRange = bcdiv($offset, $rangeWidth, 20);
$currentPercent = bcmul($percentInRange, $itemPercent, 20);
// 计算总百分比并格式化
$result = bcadd($basePercent, $currentPercent, 1);
// $result = bcdiv($totalPercent, '1', 1);
return $result;
}
// 处理特殊落点下的标准值
public function process_special_offset_action($val, $list) {
$return_data['standard'] = '';
$return_data['standard_color'] = '#000000';
if($val<$list[0]['min_val']){
$return_data['standard'] = $list[0]['text'];
$return_data['standard_color'] = $list[0]['color'];
return $return_data;
}
if($val>$list[count($list)-1]['max_val']){
$return_data['standard'] = $list[count($list)-1]['text'];
$return_data['standard_color'] = $list[count($list)-1]['color'];
return $return_data;
}
foreach ($list as $key => $value) {
if($val >= $value['min_val'] && $val <= $value['max_val']){
$return_data['standard'] = $value['text'];
$return_data['standard_color'] = $value['color'];
break;
}
}
return $return_data;
}
// 计算新标准
public function calculate_new_standard($data,$w,$k,$age=0,$gender='man'){
$temporary_arr = [];
if($k != 'kcal'){
foreach ($data as $key => $value) {
array_push($temporary_arr,[
'min_val'=>bcmul($w,bcdiv($value['min_val'],100,2),2),
'max_val'=>bcmul($w,bcdiv($value['max_val'],100,2),2),
'text'=>$value['text'],
'color'=>$value['color']
]);
}
}else{
// BMR标准值(男) BMR标准值(女)
// 60.9*体重(kg)-54 61.0*体重(kg)-51
// 22.7*体重(kg)+495 22.5*体重(kg)+499
// 17.5*体重(kg)+651 12.2*体重(kg)+746
// 15.3*体重(kg)+679 14.7*体重(kg)+496
// 11.6*体重(kg)+879 8.7*体重(kg)+820
$vv_val = 0;
if($age < 3){
if($gender == 'man'){
$vv_val = bcsub(bcmul(60.9,$w,2),54,2);
}else{
$vv_val = bcsub(bcmul(61.0,$w,2),51,2);
}
}else if($age >= 3 && $age < 10){
if($gender == 'man'){
$vv_val = bcadd(bcmul(22.7,$w,2),495,2);
}else{
$vv_val = bcadd(bcmul(22.5,$w,2),499,2);
}
}else if($age >= 10 && $age < 18){
if($gender == 'man'){
$vv_val = bcadd(bcmul(17.5,$w,2),651,2);
}else{
$vv_val = bcadd(bcmul(12.2,$w,2),746,2);
}
}else if($age >= 18 && $age < 30){
if($gender == 'man'){
$vv_val = bcadd(bcmul(15.3,$w,2),679,2);
}else{
$vv_val = bcadd(bcmul(14.7,$w,2),496,2);
}
}else{
if($gender == 'man'){
$vv_val = bcadd(bcmul(11.6,$w,2),879,2);
}else{
$vv_val = bcadd(bcmul(8.7,$w,2),820,2);
}
}
$data[0]['max_val'] = $vv_val;
$data[1]['min_val'] = $vv_val;
$temporary_arr = $data;
}
return $temporary_arr;
}
//
public function hwb_standard($data){
$linshi_data = [];
$month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday']);
$gender_val = $data['gender'];
if($data['age'] < $this->age_limit){
foreach ($data as $key => $value) {
if($key =='身高'){
$linshi_data['身高'] = $this->merged_data['height']['standard_list'];
$bhw_date = Db::table($this->body_db_name['heigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
if($bhw_date){
$linshi_data['身高'][0]['max_val'] = $bhw_date[0]['f2sd'];
$linshi_data['身高'][1]['min_val'] = $bhw_date[0]['f2sd'];
$linshi_data['身高'][1]['max_val'] = $bhw_date[0]['f1sd'];
$linshi_data['身高'][2]['min_val'] = $bhw_date[0]['f1sd'];
$linshi_data['身高'][2]['max_val'] = $bhw_date[0]['z1sd'];
$linshi_data['身高'][3]['min_val'] = $bhw_date[0]['z1sd'];
$linshi_data['身高'][3]['max_val'] = $bhw_date[0]['z2sd'];
$linshi_data['身高'][4]['min_val'] = $bhw_date[0]['z2sd'];
$linshi_data['身高'][4]['max_val'] = $bhw_date[0]['z3sd'];
}
}else if($key =='体重'){
$linshi_data['体重'] = $this->merged_data['weight']['standard_list'];
$bhw_date = Db::table($this->body_db_name['weigh'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
if($bhw_date){
$linshi_data['体重'][0]['max_val'] = $bhw_date[0]['f2sd'];
$linshi_data['体重'][1]['min_val'] = $bhw_date[0]['f2sd'];
$linshi_data['体重'][1]['max_val'] = $bhw_date[0]['f1sd'];
$linshi_data['体重'][2]['min_val'] = $bhw_date[0]['f1sd'];
$linshi_data['体重'][2]['max_val'] = $bhw_date[0]['z1sd'];
$linshi_data['体重'][3]['min_val'] = $bhw_date[0]['z1sd'];
$linshi_data['体重'][3]['max_val'] = $bhw_date[0]['z2sd'];
$linshi_data['体重'][4]['min_val'] = $bhw_date[0]['z2sd'];
$linshi_data['体重'][4]['max_val'] = $bhw_date[0]['z3sd'];
}
}else if($key =='BMI'){
$linshi_data['BMI'] = $this->merged_data['bmi']['standard_list'];
$bhw_date = Db::table($this->body_db_name['bmi'])->where("Month <= $month_num and Sex = '$gender_val'")->order('Month desc')->limit(1)->select();
if($bhw_date){
$linshi_data['BMI'][0]['max_val'] = $bhw_date[0]['f1sd'];
$linshi_data['BMI'][1]['min_val'] = $bhw_date[0]['f1sd'];
$linshi_data['BMI'][1]['max_val'] = $bhw_date[0]['z1sd'];
$linshi_data['BMI'][2]['min_val'] = $bhw_date[0]['z1sd'];
$linshi_data['BMI'][2]['max_val'] = $bhw_date[0]['z2sd'];
$linshi_data['BMI'][3]['min_val'] = $bhw_date[0]['z2sd'];
}
}
}
foreach ($linshi_data as $key => $value) {
foreach ($value as $k => $v) {
if($data[$key] >= $v['min_val'] && $data[$key] < $v['max_val']){
// 如果落在区间内
$data[$key.'2'] = $data[$key].','.$v['text'].','.$v['color'];
break;
}
}
// 如果$key.'2'没有被设置
if(!array_key_exists($key.'2', $data)){
if($data[$key] < $value[0]['min_val']){
// 如果小于最小值
$data[$key.'2'] = $data[$key].','.$value[0]['text'].','.$value[0]['color'];
}else if($data[$key] >= $value[count($value)-1]['max_val']){
// 如果大于最大值
$data[$key.'2'] = $data[$key].','.$value[count($value)-1]['text'].','.$value[count($value)-1]['color'];
}
}
}
// die;
}else{
$data['身高2'] = $data['身高'].',无,无';
$data['体重2'] = $data['体重'].',无,无';
$data['BMI2'] = $data['BMI'].',无,无';
}
return $data;
}
2026-02-03 18:56:47 +08:00
2026-03-06 18:02:49 +08:00
// 处理异常
public function handling_exceptions($data){
for ($i=0; $i < count($data['list']); $i++) {
if($data['value']>=$data['list'][$i]['min_val'] && $data['value']<$data['list'][$i]['max_val']){
$data['standard'] = $data['list'][$i]['text'];
$data['color'] = $data['list'][$i]['color'];
break;
}
}
if($data['standard'] == '异常'){
if($data['value'] <= $data['list'][0]['min_val']){
$data['standard'] = $data['list'][0]['text'];
$data['color'] = $data['list'][0]['color'];
}else if($data['value'] >= $data['list'][count($data['list'])-1]['max_val']){
$data['standard'] = $data['list'][count($data['list'])-1]['text'];
$data['color'] = $data['list'][count($data['list'])-1]['color'];
}
}
return $data;
2026-02-03 18:56:47 +08:00
}
}