SchoolPhysicalExamination/application/KitchenScale2/controller/app/Cookbook.php

1685 lines
72 KiB
PHP
Raw Normal View History

2025-11-21 19:13:01 +08:00
<?php
namespace app\KitchenScale2\controller\app;
use think\Db;
class Cookbook extends Base{
// protected $token_time = 2592000;//30天的秒数
protected $default_head_pic = 'http://tc.pcxbc.com/tsf/head_pic.png';
protected $page_num = 10;
protected $reedaw_db_msg = [
'zhanghao'=>'app_account_number',//账号表
'juese'=>'app_user_data',//角色表
];
protected $kitchenscale_db_msg = [
'cookbook'=>'app_user_cookbook',//菜谱表
'cookbook_food_relation'=>'app_user_cookbook_food_relation',//菜谱表
'cookbook_label'=>'app_user_cookbook_label',//菜谱标签表
'uploadimg'=>'app_user_upload_img',//素材表
'followlist'=>'app_user_follow_list',//关注列表
'collect_list'=>'app_user_collect_list',//收藏列表
'foodlist1'=>'app_z_national_standard_food_type_1',//食材列表3
'foodlist2'=>'app_z_national_standard_food_type_2',//食材列表3
'foodlist3'=>'app_z_national_standard_food_type_3',//食材列表3
'foodlist4'=>'app_z_national_standard_food_type_4',//食材列表3
'nutrition'=>'app_user_cookbook_nutrition',//能量
'vitamin'=>'app_user_cookbook_vitamin',//维生素
'mineral'=>'app_user_cookbook_mineral',//矿物质
'user_kcal_log'=>'app_user_kcal_log',//食材列表3
'user'=>'app_user_data',//用户表
];
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
################################################################接口################################################################
################################################################接口################################################################
################################################################接口################################################################
// 添加菜谱(OK)
public function add_cookbook(){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('cover', $data)){
return $this->msg(10001,'cover is miss');
}
if(!array_key_exists('description', $data)){
return $this->msg(10001,'description is miss');
}
if(!array_key_exists('cook_label', $data)){
return $this->msg(10001,'cook_label is miss');
}
if(!array_key_exists('food_list', $data)){
$data['food_list'] = [];
}
if(!array_key_exists('step_list', $data)){
$data['step_list'] = [];
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['cover'],'intnum')){
return $this->msg(10005,'cover type is error');
}
if(!$this->verify_data_is_ok($data['description'],'str')){
return $this->msg(10005,'description type is error');
}
if(!$this->verify_data_is_ok($data['cook_label'],'intnum')){
return $this->msg(10005,'cook_label type is error');
}
if (!is_array($data['food_list'])) {
return $this->msg(10005,'food_list type is error');
}
if (!is_array($data['step_list'])) {
return $this->msg(10005,'step_list type is error');
}
$return_data = $this->add_cookbook_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 修改菜谱(OK)
public function update_cookbook(){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('cover', $data)){
return $this->msg(10001,'cover is miss');
}
if(!array_key_exists('description', $data)){
return $this->msg(10001,'description is miss');
}
if(!array_key_exists('cook_label', $data)){
return $this->msg(10001,'cook_label is miss');
}
if(!array_key_exists('food_list', $data)){
$data['food_list'] = [];
}
if(!array_key_exists('step_list', $data)){
$data['step_list'] = [];
}
if(!array_key_exists('cookbook_id', $data)){
return $this->msg(10001,'cookbook_id is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['cover'],'intnum')){
return $this->msg(10005,'cover type is error');
}
if(!$this->verify_data_is_ok($data['description'],'str')){
return $this->msg(10005,'description type is error');
}
if(!$this->verify_data_is_ok($data['cook_label'],'intnum')){
return $this->msg(10005,'cook_label type is error');
}
if (!is_array($data['food_list'])) {
return $this->msg(10005,'food_list type is error');
}
if (!is_array($data['step_list'])) {
return $this->msg(10005,'step_list type is error');
}
if(!$this->verify_data_is_ok($data['cookbook_id'],'intnum')){
return $this->msg(10005,'cookbook_id type is error');
}
$return_data = $this->update_cookbook_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 根据菜谱标签查询列表(首页用)(OK)
public function find_by_cook_label($data=['token'=>'','cook_label'=>4,'page'=>'1']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('cook_label', $data)){
return $this->msg(10001,'cook_label is miss');
}
// if(!array_key_exists('page', $data)){
// return $this->msg(10001,'page is miss');
// }
if(!$this->verify_data_is_ok($data['cook_label'],'intnum')){
return $this->msg(10005,'cook_label type is error');
}
// if(!$this->verify_data_is_ok($data['page'],'intnum')){
// return $this->msg(10005,'page type is error');
// }
$return_data = $this->find_by_cook_label_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 根据食材详细查找列表(OK)
public function find_by_food($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','food_name'=>"2724,2670",'page'=>'1']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('food_name', $data)){
return $this->msg(10001,'food_name is miss');
}
// if(!array_key_exists('page', $data)){
// return $this->msg(10001,'page is miss');
// }
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['food_name'],'str')){
return $this->msg(10005,'tofood_nameken type is error');
}
// if(!$this->verify_data_is_ok($data['page'],'intnum')){
// return $this->msg(10005,'page type is error');
// }
$return_data = $this->find_by_food_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 查询食谱的详情(OK)
public function cookbook_details($data=['token'=>'','cookbook_id'=>'3594']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('cookbook_id', $data)){
return $this->msg(10001,'cookbook_id is miss');
}
if(!$this->verify_data_is_ok($data['cookbook_id'],'intnum')){
return $this->msg(10005,'cookbook_id type is error');
}
$return_data = $this->cookbook_details_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 关注行为(OK)
public function cookbook_follow($data=['token'=>'caadd1be045a65f3','being_followed'=>'caadd1be045a65f30b92aa805f1de54a']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('being_followed', $data)){
return $this->msg(10001,'cookbook_id is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['being_followed'],'str')){
return $this->msg(10005,'cookbook_id type is error');
}
$return_data = $this->cookbook_follow_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 点赞收藏菜谱(OK)
public function cookbook_like($data=['token'=>'caadd1be045a65f30b92aa805f1de54a','cookbook_id'=>'12']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!array_key_exists('cookbook_id', $data)){
return $this->msg(10001,'cookbook_id is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
if(!$this->verify_data_is_ok($data['cookbook_id'],'intnum')){
return $this->msg(10005,'cookbook_id type is error');
}
$return_data = $this->cookbook_like_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 计算当前食材重量的卡路里(OK)
public function food_count_kcal($data=['food_name'=>'鸡肉','food_weight'=>456.37]){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('food_name', $data)){
return $this->msg(10001,'food_name is miss');
}
if(!array_key_exists('food_weight', $data)){
return $this->msg(10001,'food_weight is miss');
}
if(!$this->verify_data_is_ok($data['food_name'],'str')){
return $this->msg(10005,'food_name type is error');
}
if(!$this->verify_data_is_ok($data['food_weight'],'num')){
return $this->msg(10005,'food_weight type is error');
}
$return_data = $this->food_count_kcal_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 食材列表查询接口(OK)
public function find_food($data=['food_name'=>'鸡肉']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('food_name', $data)){
return $this->msg(10001,'food_name is miss');
}
if(!$this->verify_data_is_ok($data['food_name'],'str')){
return $this->msg(10005,'food_name type is error');
}
$return_data = $this->find_food_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
// 获取所有食材列表
public function get_food_list(){
// 尝试捕获异常
// try {
if(count(input('post.')) > 0){
$data = input('post.');
}
// if(!array_key_exists('food_level2_id', $data)){
// return $this->msg(10001,'food_level2_id is miss');
// }
// if(!array_key_exists('page', $data)){
// return $this->msg(10001,'page is miss');
// }
// if(!$this->verify_data_is_ok($data['food_level2_id'],'intnum')){
// return $this->msg(10005,'food_level2_id type is error');
// }
// if(!$this->verify_data_is_ok($data['page'],'intnum')){
// return $this->msg(10005,'page type is error');
// }
$return_data = $this->get_food_list_action($data);
return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// // 记录日志
// $this->record_api_log($data, $logContent, null);
// return json(['status' => 'error', 'message' => '系统错误']);
// }
}
// 获取所有食谱label
2025-12-19 21:44:56 +08:00
// public function get_cookbook_label_list($data=['token'=>'caadd1be045a65f30b92aa805f1de54a']){
// // 尝试捕获异常
// try {
// if(count(input('post.')) > 0){
// $data = input('post.');
// }
// if(!array_key_exists('token', $data)){
// return $this->msg(10001,'token is miss');
// }
// if(!$this->verify_data_is_ok($data['token'],'str')){
// return $this->msg(10005,'token type is error');
// }
2025-11-21 19:13:01 +08:00
2025-12-19 21:44:56 +08:00
// $return_data = $this->get_cookbook_label_list_action($data);
// return $return_data;
// } catch (\Exception $e) {
// // 捕获异常
// $logContent["flie"] = $e->getFile();
// $logContent["line"] = $e->getLine();
// $logContent['all_content'] = "异常信息:\n";
// $logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
// $logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
// $logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
// $logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
// $logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// // 记录日志
// $this->record_api_log($data, $logContent, null);
// return json(['status' => 'error', 'message' => '系统错误']);
// }
// }
2025-11-21 19:13:01 +08:00
// 获取查询页页面导航食材列表
public function get_search_food_page_list($data=['token'=>'caadd1be045a65f30b92aa805f1de54a']){
// 尝试捕获异常
try {
if(count(input('post.')) > 0){
$data = input('post.');
}
if(!array_key_exists('token', $data)){
return $this->msg(10001,'token is miss');
}
if(!$this->verify_data_is_ok($data['token'],'str')){
return $this->msg(10005,'token type is error');
}
$return_data = $this->get_search_food_page_list_action($data);
return $return_data;
} catch (\Exception $e) {
// 捕获异常
$logContent["flie"] = $e->getFile();
$logContent["line"] = $e->getLine();
$logContent['all_content'] = "异常信息:\n";
$logContent['all_content'] .= "消息: " . $e->getMessage() . "\n";
$logContent['all_content'] .= "代码: " . $e->getCode() . "\n";
$logContent['all_content'] .= "文件: " . $e->getFile() . "\n";
$logContent['all_content'] .= "行号: " . $e->getLine() . "\n";
$logContent['all_content'] .= "跟踪信息:\n" . $e->getTraceAsString() . "\n";
// 记录日志
$this->record_api_log($data, $logContent, null);
return json(['status' => 'error', 'message' => '系统错误']);
}
}
#######################################################################action#######################################################################
#######################################################################action#######################################################################
#######################################################################action#######################################################################
public function add_cookbook_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
if(count($data['food_list']) < 1){
return $this->msg(10001,'至少添加一个食物');
}
if(count($data['step_list']) < 1){
return $this->msg(10001,'至少添加一个步骤');
}
$food_type = [];
// 检验一下food_list是否合规食材列表
foreach ($data['food_list'] as $key => $value) {
if (!array_key_exists('id', $value) || !array_key_exists('weight', $value)) {
return $this->msg(10001,'食材缺少id或者重量');
}
if(!$this->verify_data_is_ok($value['name'],'str')){
return $this->msg(10005,'食材名称格式错误');
}
if(!$this->verify_data_is_ok($value['weight'],'intnum')){
return $this->msg(10005,'食材重量格式错误,需整数数字');
}
if(!in_array($value['id'], $food_type)){
array_push($food_type, $value['id']);
}
}
// 检验一下step_list是否合规步骤列表
foreach ($data['step_list'] as $key => $value) {
if (!array_key_exists('description', $value) || !array_key_exists('pic_list', $value)) {
return $this->msg(10001,'步骤缺少描述或者图片');
}
if(!$this->verify_data_is_ok($value['description'],'str')){
return $this->msg(10005,'步骤描述格式错误,需要正常字符');
}
foreach ($value['pic_list'] as $k => $v) {
if(!$this->verify_data_is_ok($v,'intnum')){
return $this->msg(10005,'步骤中图片ID错误,需整数数字');
}
}
}
$cfc = Db::connect('cfc_db');
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
// 处理食材卡路里start
$kcal_data = $this->count_calorie($data['food_list'],$data['step_list']);
$data['food_list'] =$kcal_data;
// 处理食材卡路里end
// dump($data['food_list']);
// die;
$insert_data = [
'title'=>$data['title'],
'cover'=>$data['cover'],
'create_user_token'=>$user_data['token'],
'create_user_head_pic'=>$user_data['head_pic'],
'create_user_nickname'=>$user_data['nickname'],
'describe_data'=>$data['description'],
'food_data'=>json_encode($data['food_list']),
'step_data'=>json_encode($data['step_list']),
// 'food_type'=>implode(',', $food_type),
'cook_label'=>$data['cook_label'],
2025-11-28 19:45:05 +08:00
'is_del'=>1,
2025-11-21 19:13:01 +08:00
'create_time'=>date('Y-m-d H:i:s')
];
// dump($insert_data);
// die;
// 启动事务
Db::startTrans();
try{
$cook_book_result = $cfc->table($this->kitchenscale_db_msg['cookbook'])->insertGetId($insert_data);
$food_type_insert = [];
foreach ($food_type as $key => $value) {
array_push($food_type_insert,['cookbook_id'=>$cook_book_result,'food_id'=>$value]);
}
$cfc->table($this->kitchenscale_db_msg['cookbook_food_relation'])->insertAll($food_type_insert);
// 提交事务
Db::commit();
return $this->msg([]);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002);
}
// if($cook_book_result){
// return $this->msg([]);
// }else{
// return $this->msg(10002);
// }
}
public function update_cookbook_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
2026-02-03 18:56:47 +08:00
if(count($data['tags'][0]['list']) < 1){
2025-11-21 19:13:01 +08:00
return $this->msg(10001,'至少添加一个食物');
2026-02-03 18:56:47 +08:00
}else{
$data['food_list'] = $data['tags'][0]['list'];
2025-11-21 19:13:01 +08:00
}
if(count($data['step_list']) < 1){
return $this->msg(10001,'至少添加一个步骤');
}
$food_type = [];
// 检验一下food_list是否合规食材列表
foreach ($data['food_list'] as $key => $value) {
if (!array_key_exists('id', $value) || !array_key_exists('weight', $value)) {
return $this->msg(10001,'食材缺少id或者重量');
}
if(!$this->verify_data_is_ok($value['name'],'str')){
return $this->msg(10005,'食材名称格式错误');
}
if(!$this->verify_data_is_ok($value['weight'],'intnum')){
return $this->msg(10005,'食材重量格式错误,需整数数字');
}
if(!in_array($value['id'], $food_type)){
array_push($food_type, $value['id']);
}
}
// 检验一下step_list是否合规步骤列表
foreach ($data['step_list'] as $key => $value) {
if (!array_key_exists('description', $value) || !array_key_exists('pic_list', $value)) {
return $this->msg(10001,'步骤缺少描述或者图片');
}
if(!$this->verify_data_is_ok($value['description'],'str')){
return $this->msg(10005,'步骤描述格式错误,需要正常字符');
}
foreach ($value['pic_list'] as $k => $v) {
if(!$this->verify_data_is_ok($v,'intnum')){
return $this->msg(10005,'步骤中图片ID错误,需整数数字');
}
}
}
$cfc = Db::connect('cfc_db');
// 获取账号下信息以及用户信息
// $user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
// if(!$user_data){
// }
// 处理食材卡路里start
$kcal_data = $this->count_calorie($data['food_list'],$data['step_list']);
$data['food_list'] =$kcal_data;
// 处理食材卡路里end
// dump($data['food_list']);
// die;
$insert_data = [
'title'=>$data['title'],
'cover'=>$data['cover'],
'create_user_token'=>$user_data['token'],
'create_user_head_pic'=>$user_data['head_pic'],
'create_user_nickname'=>$user_data['nickname'],
'describe_data'=>$data['description'],
'food_data'=>json_encode($data['food_list']),
'step_data'=>json_encode($data['step_list']),
// 'food_type'=>implode(',', $food_type),
'cook_label'=>$data['cook_label'],
];
// 启动事务
Db::startTrans();
try{
$cook_book_result = $cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->update($insert_data);
$food_type_insert = [];
foreach ($food_type as $key => $value) {
array_push($food_type_insert,['cookbook_id'=>$data['cookbook_id'],'food_id'=>$value]);
}
$cfc->table($this->kitchenscale_db_msg['cookbook_food_relation'])->where('cookbook_id',$data['cookbook_id'])->delete();
$cfc->table($this->kitchenscale_db_msg['cookbook_food_relation'])->insertAll($food_type_insert);
// 提交事务
Db::commit();
return $this->msg([]);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002);
}
// dump($cook_book_result);
// die;
if($cook_book_result){
return $this->msg([]);
}else{
return $this->msg(10002);
}
}
public function find_by_cook_label_action($data){
$page_now = array_key_exists('page',$data)?$data['page']:1;
$page_total = $page_now;
$page_num = 20;
$cook_label = $data['cook_label'];
$cfc = Db::connect('cfc_db');
$content_num = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->where(['cook_label'=>$cook_label,'is_del'=>0])
->count();
$page_total = ceil($content_num/$page_num);
$content_list = $cfc->table($this->kitchenscale_db_msg['cookbook'])
->alias('a')
->join($this->kitchenscale_db_msg['uploadimg'].' b','a.cover = b.id','LEFT')
->where(['a.cook_label'=>$cook_label,'a.is_del'=>0])
->field('a.id,a.title,b.pic_url as cover,a.create_user_head_pic,a.create_user_nickname,a.likes_num')
// ->order('id DESC')
->page("$page_now,$page_num")
->select();
if(array_key_exists('token',$data)){
if($data['token'] != ''){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
// 获取用户收藏列表
$my_collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->where(['token'=>$data['token'],'is_del'=>0])
->column('cookbook_id');
// dump($my_collect_list);
// 处理菜谱收藏信息
foreach ($content_list as $key => $value) {
// if(in_array($value['id'],$my_collect_list)){
if(array_key_exists($value['id'],$my_collect_list)){
$content_list[$key]['is_me_like_it'] = 'yes';
}else{
$content_list[$key]['is_me_like_it'] = 'no';
}
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}else{
foreach ($content_list as $key => $value) {
$content_list[$key]['is_me_like_it'] = 'no';
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}
}else{
foreach ($content_list as $key => $value) {
$content_list[$key]['is_me_like_it'] = 'no';
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
}
// dump($content_list);
// die;
return $this->msg([
'page_now'=>$page_now,
'page_total'=>$page_total,
'content_list'=>$content_list
]);
}
public function find_by_food_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
$page_now = array_key_exists('page',$data)?$data['page']:1;
$page_total = $page_now;
$page_num = 20;
$food_name = $data['food_name'];
$cfc = Db::connect('cfc_db');
// $food_name = implode(',',$food_name);
// dump($food_name);
// die;
$content_num = $cfc->table($this->kitchenscale_db_msg['cookbook_food_relation'])
->where("food_id in ($food_name)")
->group('cookbook_id')
->field('count(distinct cookbook_id) as count') // 显式指定列名
->select(); // 然后获取结果
// dump($content_num);
$page_total = ceil(count($content_num)/$page_num);
$content_list = $cfc->table($this->kitchenscale_db_msg['cookbook_food_relation'])
->alias('a')
->join($this->kitchenscale_db_msg['cookbook'].' b','a.cookbook_id = b.id','LEFT')
->join($this->kitchenscale_db_msg['uploadimg'].' c','b.cover = c.id','LEFT')
->where("a.food_id in ($food_name)")
->field('b.id,b.title,c.pic_url as cover,b.create_user_head_pic,b.create_user_nickname,b.likes_num')
->group('b.id,b.title,c.pic_url,b.create_user_head_pic,b.create_user_nickname,b.likes_num')
->page("$page_now,$page_num")
->select();
// dump($food_name);
// dump($content_num);
// dump($page_total);
// dump($content_list);
// die;
// $content_num = $cfc->table($this->kitchenscale_db_msg['cookbook'])
// ->where("food_type like '%$food_name%'")
// ->count();
// $page_total = ceil($content_num/$page_num);
// $content_list = $cfc->table($this->kitchenscale_db_msg['cookbook'])
// ->alias('cookbook')
// ->join($this->kitchenscale_db_msg['uploadimg'].' uploadimg','cookbook.cover = uploadimg.id','LEFT')
// ->where("cookbook.food_type like '%$food_name%'")
// ->field('cookbook.id,cookbook.title,uploadimg.pic_url as cover,cookbook.create_user_head_pic,cookbook.create_user_nickname,cookbook.likes_num')
// ->page("$page_now,$page_num")
// ->select();
// 获取用户收藏列表
$my_collect_list = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->where(['token'=>$data['token']])
->column('cookbook_id');
// dump($my_collect_list);
// 处理菜谱收藏信息
foreach ($content_list as $key => $value) {
// if(in_array($value['id'],$my_collect_list)){
if(array_key_exists($value['id'],$my_collect_list)){
$content_list[$key]['is_me_like_it'] = 'yes';
}else{
$content_list[$key]['is_me_like_it'] = 'no';
}
if($value['cover'] == null){
$content_list[$key]['cover'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
unset($content_list[$key]['ROW_NUMBER']);
}
return $this->msg([
'page_now'=>$page_now,
'page_total'=>$page_total,
'content_list'=>$content_list
]);
}
public function cookbook_details_action($data){
$cfc = Db::connect('cfc_db');
$img_arr = [];
// 查询菜谱详情
$cookbook_data = $cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->find();
if(!$cookbook_data){
return $this->msg(10004,'菜谱不存在');
}
$cookbook_data['food_data'] = json_decode($cookbook_data['food_data'],true);
$cookbook_data['step_data'] = json_decode($cookbook_data['step_data'],true);
// $cookbook_data['food_type'] = explode(',',$cookbook_data['food_type']);
$cookbook_data_step_data_count = count($cookbook_data['step_data']);
// 设置需要的图片id
array_push($img_arr, $cookbook_data['cover']);
foreach ($cookbook_data['step_data'] as $key => $value) {
if(count($value['pic_list']) > 0){
foreach ($value['pic_list'] as $k => $v) {
if(!in_array($v, $img_arr)){
array_push($img_arr, $v);
}
}
}
}
// dump($cookbook_data);
// die;
$img_arr = implode(',',$img_arr);
// 查找需要的图片
$img_arr_data = $cfc->table($this->kitchenscale_db_msg['uploadimg'])->where("id in ($img_arr) AND is_del = 0")->field('id,pic_name,pic_url')->select();
$cookbook_img_data = [];
// 处理菜谱图片
foreach ($img_arr_data as $key => $value) {
$cookbook_img_data[$value['id']] = $value['pic_url'];
}
// 设置菜谱图片
foreach ($cookbook_data['step_data'] as $key => $value) {
$cookbook_data['step_data'][$key]['step_num'] = "步骤".($key+1).'/'.$cookbook_data_step_data_count;
$cookbook_data['step_data'][$key]['pic_url_list'] = [];
foreach ($value['pic_list'] as $k => $v) {
if(array_key_exists($v, $cookbook_img_data)){
array_push($cookbook_data['step_data'][$key]['pic_url_list'],$cookbook_img_data[$v]);
}else{
array_push($cookbook_data['step_data'][$key]['pic_url_list'],'https://tc.pcxbc.com/kitchenscale_all/diule.jpg');
}
}
}
// $cookbook_data['cover_id'] = $cookbook_data['cover'];
if(array_key_exists($cookbook_data['cover'], $cookbook_img_data)){
$cookbook_data['cover_pic_url'] = $cookbook_img_data[$cookbook_data['cover']];
}else{
$cookbook_data['cover_pic_url'] = 'https://tc.pcxbc.com/kitchenscale_all/diule.jpg';
}
if(array_key_exists($cookbook_data['cover'], $cookbook_img_data)){
if($data['token'] != ''){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
$collect_data = $cfc->table($this->kitchenscale_db_msg['collect_list'])
->where([
'token'=>$data['token'],
'cookbook_id'=>$data['cookbook_id'],
])
->find();
if($collect_data){
if($collect_data['is_del'] == 0){
// 如果有结果并且没被删过
$cookbook_data['collect_status'] = 'yes';
}else{
// 如果有结果被删过
$cookbook_data['collect_status'] = 'no';
}
}else{
// 如果没结果
$cookbook_data['collect_status'] = 'no';
}
}else{
$cookbook_data['collect_status'] = 'no';
}
}else{
$cookbook_data['collect_status'] = 'no';
}
2026-02-03 18:56:47 +08:00
// 处理营养物质 start(兼容处理)
// $cookbook_data['tags'] = [];
// array_push($cookbook_data['tags'],[
// 'title'=>'所需食材',
// 'desc'=>'重量',
// 'list'=>[],
// ]);
// array_push($cookbook_data['tags'],[
// 'title'=>'能量',
// 'desc'=>'含量',
// 'list'=>[],
// ]);
// array_push($cookbook_data['tags'],[
// 'title'=>'维生素',
// 'desc'=>'含量',
// 'list'=>[],
// ]);
// array_push($cookbook_data['tags'],[
// 'title'=>'矿物质',
// 'desc'=>'含量',
// 'list'=>[],
// ]);
// $cookbook_data_food_list = [];
// $cookbook_data_food_nutrition = [];//能量
// $cookbook_data_food_vitamin = [];//维生素
// $cookbook_data_food_mineral = [];//矿物质
// foreach ($cookbook_data['food_data'] as $key => $value) {
// $cookbook_data['tags'][0][] = [
// 'id'=>$value['id'],
// 'kcal'=>$value['kcal'],
// 'name'=>$value['name'],
// 'unit'=>$value['unit'],
// 'weight'=>$value['weight'],
// ];
// if(array_key_exists('nutrients_list',$value)){
// foreach ($value['nutrients_list'] as $k => $v) {
// if($v['type'] == 1){
// if(array_key_exists($v['name'],$cookbook_data_food_nutrition)){
// $cookbook_data_food_nutrition[$v['name']]['weight'] = bcadd($cookbook_data_food_nutrition[$v['name']]['weight'],,2)
// }else{
// }
// }else if($value['type'] == 2){
// }else if($value['type'] == 3){
// }
// }
// }else{
// }
// }
2025-11-21 19:13:01 +08:00
$nutrition = $cfc->table($this->kitchenscale_db_msg['nutrition'])->where(['cookbook_id'=>$data['cookbook_id']])->field('name_en,name_ch as name,unit,value as weight,nrv')->select();
$vitamin = $cfc->table($this->kitchenscale_db_msg['vitamin'])->where(['cookbook_id'=>$data['cookbook_id']])->field('name_en,name_ch as name,unit,value as weight,nrv')->select();
$mineral = $cfc->table($this->kitchenscale_db_msg['mineral'])->where(['cookbook_id'=>$data['cookbook_id']])->field('name_en,name_ch as name,unit,value as weight,nrv')->select();
$cookbook_data['tags'] = [];
array_push($cookbook_data['tags'],[
'title'=>'所需食材',
'desc'=>'重量',
'list'=>$cookbook_data['food_data'],
]);
if(count($nutrition)>0){
array_push($cookbook_data['tags'],[
'title'=>'能量',
'desc'=>'含量',
'list'=>$nutrition,
]);
}else{
array_push($cookbook_data['tags'],[
'title'=>'',
'desc'=>'',
'list'=>[],
]);
}
2026-02-03 18:56:47 +08:00
2025-11-21 19:13:01 +08:00
if(count($vitamin)>0){
array_push($cookbook_data['tags'],[
'title'=>'维生素',
'desc'=>'含量',
'list'=>$vitamin,
]);
}else{
array_push($cookbook_data['tags'],[
'title'=>'',
'desc'=>'',
'list'=>[],
]);
}
2026-02-03 18:56:47 +08:00
2025-11-21 19:13:01 +08:00
if(count($mineral)>0){
array_push($cookbook_data['tags'],[
'title'=>'矿物质',
'desc'=>'含量',
'list'=>$mineral,
]);
}else{
array_push($cookbook_data['tags'],[
'title'=>'',
'desc'=>'',
'list'=>[],
]);
}
2026-02-03 18:56:47 +08:00
// 处理营养物质 end
2025-11-21 19:13:01 +08:00
$cookbook_data['token'] = $cookbook_data['create_user_token'];
$cookbook_data['description'] = $cookbook_data['describe_data'];
// $cookbook_data['food_list'] = $cookbook_data['food_data'];
$cookbook_data['step_list'] = $cookbook_data['step_data'];
unset($cookbook_data['create_user_token']);
unset($cookbook_data['describe_data']);
unset($cookbook_data['food_data']);
unset($cookbook_data['step_data']);
unset($cookbook_data['create_time']);
unset($cookbook_data['food_type']);
unset($cookbook_data['ROW_NUMBER']);
unset($cookbook_data['is_del']);
return $this->msg($cookbook_data);
}
public function cookbook_follow_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
// dump($data);
$cfc = Db::connect('cfc_db');
// $cookbook_data = $cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->field('id,create_user_token')->find();
// if(!$cookbook_data){
// return $this->msg(10002,'未找到菜谱');
// }
if($data['token'] == $data['being_followed']){
// 如果查询跟作者一致
return $this->msg(10003,'不能关注自己');
}
$follow_data = $cfc->table($this->kitchenscale_db_msg['followlist'])
->where([
'follow_user_token'=>$data['token'],
'being_follow_user_token'=>$data['being_followed'],
])
->find();
$follow_data_state = 0;
if($follow_data){
if($follow_data['is_del'] == 0){
// 如果当前是关注状态
$follow_data_state = 1;
}else{
$follow_data_state = 0;
}
$follow_result= $cfc->table($this->kitchenscale_db_msg['followlist'])
->where(['id'=>$follow_data['id']])
->update(['is_del'=>$follow_data_state]);
}else{
$follow_result = $cfc->table($this->kitchenscale_db_msg['followlist'])
->insert([
'follow_user_token'=>$data['token'],
'being_follow_user_token'=>$data['being_followed'],
'create_time'=>date('Y-m-d H:i:s')
]);
}
if($follow_result){
return $this->msg([]);
}else{
return $this->msg(10002,'操作失败');
}
}
public function cookbook_like_action($data){
// 获取账号下信息以及用户信息
$user_data = Db::table($this->reedaw_db_msg['zhanghao'])->where(['token'=>$data['token']])->field('id,token,nickname,head_pic')->find();
if(!$user_data){
return $this->msg(20001,'账号信息错误');
}
$cfc = Db::connect('cfc_db');
$cookbook_data = $cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->field('id,create_user_token,likes_num')->find();
if(!$cookbook_data){
return $this->msg(10004,'未找到菜谱');
}
// return $this->msg(10002,'是这里');
// if($data['token'] == $cookbook_data['create_user_token']){
// // 如果查询跟作者一致
// return $this->msg(10002,'不能收藏自己');
// }
$like_data = $cfc->table($this->kitchenscale_db_msg['collect_list'])->where(['token'=>$data['token'],'cookbook_id'=>$data['cookbook_id']])->find();
$like_data_state = 0;
if($like_data){
if($like_data['is_del'] == 0){
// 如果当前是关注状态
$like_data_state = 1;
}else{
$like_data_state = 0;
}
// 启动事务
Db::startTrans();
try{
$cfc->table($this->kitchenscale_db_msg['collect_list'])
->where(['id'=>$like_data['id']])
->update(['is_del'=>$like_data_state]);
if($like_data_state == 0){
$cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->setInc('likes_num');
}else{
$cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->setDec('likes_num');
}
// 提交事务
Db::commit();
if($like_data_state==0){
$likes_num = $cookbook_data['likes_num']+1;
}else{
$likes_num = $cookbook_data['likes_num']-1;
if($likes_num <= 0){
$likes_num = 0;
}
}
return $this->msg([
'collect_status'=>$like_data_state==0?'yes':'no',
'likes_num'=>$likes_num
]);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002,'操作失败.');
}
}else{
// 启动事务
Db::startTrans();
try{
$cfc->table($this->kitchenscale_db_msg['collect_list'])
->insert([
'token'=>$data['token'],
'cookbook_id'=>$data['cookbook_id'],
'create_time'=>date('Y-m-d H:i:s')
]);
$cfc->table($this->kitchenscale_db_msg['cookbook'])->where(['id'=>$data['cookbook_id']])->setInc('likes_num');
// 提交事务
Db::commit();
return $this->msg([
'collect_status'=>"yes",
'likes_num'=>$cookbook_data['likes_num']+1
]);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $this->msg(10002,'操作失败');
}
}
}
public function food_count_kcal_action($data){
$cfc = Db::connect('cfc_db');
$food_data = $cfc->table($this->kitchenscale_db_msg['foodlist3'])->where(['name'=>$data['food_name']])->field("kcal")->find();
if(!$food_data){
return $this->msg(10004,'未登记的食材');
}
$weight = bcdiv($data['food_weight'],100,2);
$kcal = bcmul($weight,$food_data['kcal'],2);
return $this->msg(['value'=>$kcal,'unit'=>'kcal']);
}
public function find_food_action($data){
$cfc = Db::connect('cfc_db');
$food_data = $cfc->query("select f3.id,f3.food_name as name,f3.pic_url,f3.Calorie_val as kcal,f3.weight_unit as unit,f2.id as up_one_level_id,f1.id as up_two_level_id
from ".$this->kitchenscale_db_msg['foodlist3']." as f3
LEFT JOIN ".$this->kitchenscale_db_msg['foodlist2']." as f2
on f3.two_id = f2.id
LEFT JOIN ".$this->kitchenscale_db_msg['foodlist1']." as f1
on f2.one_id = f1.id
where f3.is_del=0 AND f3.food_name like '%".$data['food_name']."%'
");
if(count($food_data)>0){
for ($i=0; $i < count($food_data); $i++) {
if($food_data[$i]['pic_url'] != ''){
$food_data[$i]['pic_url'] = 'https://tc.pcxbc.com/kitchenscale_all'.$food_data[$i]['pic_url'];
}
}
return $this->msg($food_data);
}else{
return $this->msg(10004,'未找到该食材');
}
}
public function get_food_list_action($data){
if(!array_key_exists('page',$data)){
$data['page'] = 1;
}else{
if(!$this->verify_data_is_ok($data['page'],'intnum')){
$data['page'] = 1;
}
}
// $cp_page_num = 15;
// $cfc = Db::connect('cfc_db');
// $search_sql_str = "is_del = 0";
// if(!array_key_exists('search_data', $data)){
// $data['search_data'] = "";
// $ss = "";
// }else{
// if($data['search_data'] === ""){
// $data['search_data'] = "";
// $ss = "";
// }else{
// $ss = $data['search_data'];
// $data['search_data'] = " AND food_name LIKE '%".str_replace('[', '[[]', $ss)."%'";
// }
// }
// $search_sql_str = $search_sql_str.$data['search_data'];
// $content_num = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
// ->where($search_sql_str)
// ->count();
// $page_total = ceil($content_num/$cp_page_num);
// $collect_list = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
// ->where($search_sql_str)
// ->field('id,record_id,food_name as name,pic_url,Calorie_val as kcal,weight_unit as unit')
// ->page($data['page'],$cp_page_num)
// ->select();
$cp_page_num = 15;
$cfc = Db::connect('cfc_db');
$search_sql_str = "is_del = 0";
if(!array_key_exists('search_data', $data)){
$data['search_data'] = "";
$ss = "";
}else{
if($data['search_data'] === ""){
$data['search_data'] = "";
$ss = "";
}else{
$ss = $data['search_data'];
$data['search_data'] = " AND food_name LIKE '%".str_replace('[', '[[]', $ss)."%'";
}
}
$search_sql_str = $search_sql_str.$data['search_data'];
// 计算总数
$count_sql = "SELECT COUNT(*) as total FROM {$this->kitchenscale_db_msg['foodlist3']} WHERE {$search_sql_str}";
$count_result = $cfc->query($count_sql);
$content_num = $count_result[0]['total'] ?? 0;
$page_total = ceil($content_num/$cp_page_num);
// 计算分页偏移量
$page = max(1, intval($data['page']));
$offset = ($page - 1) * $cp_page_num;
// SQL Server分页查询 - 使用OFFSET FETCH语法SQL Server 2012及以上版本
$sql = "SELECT id, record_id, food_name as name, pic_url, Calorie_val as kcal, weight_unit as unit
FROM {$this->kitchenscale_db_msg['foodlist3']}
WHERE {$search_sql_str}
ORDER BY id
OFFSET {$offset} ROWS
FETCH NEXT {$cp_page_num} ROWS ONLY";
// dump($count_sql);
$collect_list = $cfc->query($sql);
if(count($collect_list) > 0){
$nutrients_list_id = [];
$nutrients_list_temporary = [];
foreach ($collect_list as $key => $value) {
$collect_list[$key]['pic_url'] = "https://tc.pcxbc.com/kitchenscale_all".$collect_list[$key]['pic_url'];
array_push($nutrients_list_id,$collect_list[$key]['record_id']);
$nutrients_list_temporary[$collect_list[$key]['record_id']] = [];
if (!is_numeric($collect_list[$key]['kcal'])) {
$collect_list[$key]['kcal'] = 0;
}
}
// 处理营养物质
$nutrients_list_data = $cfc->table($this->kitchenscale_db_msg['foodlist4'])
->where("father_id in (". implode(',',$nutrients_list_id) .")")
->field("father_id,name,name_ch,unit,value,type")
->select();
for ($i=0; $i < count($nutrients_list_data); $i++) {
if(!is_numeric($nutrients_list_data[$i]['value']) || $nutrients_list_data[$i]['value'] == 0){
2026-02-03 18:56:47 +08:00
array_push($nutrients_list_temporary[$nutrients_list_data[$i]['father_id']],[
'name'=>$nutrients_list_data[$i]['name'],
'name_ch'=>$nutrients_list_data[$i]['name_ch'],
'unit'=>$nutrients_list_data[$i]['unit'],
'value'=>0,
'type'=>$nutrients_list_data[$i]['type'],
'type_name'=>$nutrients_list_data[$i]['type'] == 1?'能量及宏量营养素':($nutrients_list_data[$i]['type'] == 2?'维生素':'矿物质'),
'color'=>$nutrients_list_data[$i]['type'] == 1?'#C4FFE0':($nutrients_list_data[$i]['type'] == 2?'#FFEFB7':'#7DA8E0')
]);
2025-11-21 19:13:01 +08:00
}else{
array_push($nutrients_list_temporary[$nutrients_list_data[$i]['father_id']],[
'name'=>$nutrients_list_data[$i]['name'],
'name_ch'=>$nutrients_list_data[$i]['name_ch'],
'unit'=>$nutrients_list_data[$i]['unit'],
'value'=>$nutrients_list_data[$i]['value'],
'type'=>$nutrients_list_data[$i]['type'],
'type_name'=>$nutrients_list_data[$i]['type'] == 1?'能量及宏量营养素':($nutrients_list_data[$i]['type'] == 2?'维生素':'矿物质'),
'color'=>$nutrients_list_data[$i]['type'] == 1?'#C4FFE0':($nutrients_list_data[$i]['type'] == 2?'#FFEFB7':'#7DA8E0')
]);
}
}
2026-02-03 18:56:47 +08:00
// dump($nutrients_list_temporary);
// die;
2025-11-21 19:13:01 +08:00
for ($i=0; $i < count($collect_list); $i++) {
$collect_list[$i]['nutrients_four'] = [];
$collect_list[$i]['nutrients_list'] = [];
$temporary_calculate = 0;
if(array_key_exists($collect_list[$i]['record_id'],$nutrients_list_temporary)){
$collect_list[$i]['nutrients_list'] = $nutrients_list_temporary[$collect_list[$i]['record_id']];
2026-02-03 18:56:47 +08:00
// 处理四大营养物质
2025-11-21 19:13:01 +08:00
foreach ($nutrients_list_temporary[$collect_list[$i]['record_id']] as $key => $value) {
2026-02-03 18:56:47 +08:00
// dump($value);
2025-11-21 19:13:01 +08:00
if($value['type'] == 1){
array_push($collect_list[$i]['nutrients_four'],[
'name'=>$value['name'] == 'Carbohydrate'?'碳水':$value['name_ch'],
'unit'=>$value['unit'],
'color'=>$value['name'] == 'Carbohydrate'?'#FFB169':($value['name'] == 'Fat'?'#ED7886':($value['name'] == 'Protein'?'#5180D8':'')),
'value'=>!is_numeric($value['value'])?0:$value['value'],
]);
// 如果不为卡路里
if($value['name'] != 'Calorie'){
$temporary_calculate = $temporary_calculate+$value['value'];
}
}
}
2026-02-03 18:56:47 +08:00
// dump($collect_list);
2025-11-21 19:13:01 +08:00
// 处理详情当中的环数据占比
foreach ($collect_list[$i]['nutrients_four'] as $k => $v) {
if($v['name'] != '卡路里'){
$collect_list[$i]['nutrients_four'][$k]['proportion'] = bcmul(bcdiv($v['value'],$temporary_calculate,2),100,0);
}else{
$collect_list[$i]['nutrients_four'][$k]['proportion'] = 0;
}
}
}
}
2026-02-03 18:56:47 +08:00
// dump($nutrients_list_data);
// die;
2025-11-21 19:13:01 +08:00
}
// 记录搜索历史
if(array_key_exists('token',$data) && $data['token'] != '' && $ss != ''){
$user_data = $cfc->table($this->kitchenscale_db_msg['user'])->where(['token'=>$data['token']])->field('id,token')->find();
if($user_data){
$this->add_search_history_action(['id'=>$user_data['id'],'search_data'=>$ss,'type'=>'food']);
}
}
return $this->msg([
'page_now'=>$data['page'],
'page_total'=>$page_total,
'content_list'=>$collect_list
]);
}
2025-12-19 21:44:56 +08:00
// public function get_cookbook_label_list_action(){
// $cfc = Db::connect('cfc_db');
// // 获取菜谱分类标签start
// $cook_label = $cfc->table($this->kitchenscale_db_msg['cookbook_label'])
// ->where("is_del = 0")
// ->field('id,name')
// ->select();
// $temporary_label = [];
// foreach ($cook_label as $key => $value) {
// unset($cook_label[$key]['ROW_NUMBER']);
// $cook_label[$key]['list'] = [];
// $temporary_label[$value['id']] = $key;
// }
// $content_list = $cfc->table($this->kitchenscale_db_msg['cookbook'])
// ->alias('a')
// ->join($this->kitchenscale_db_msg['uploadimg'].' b','a.cover = b.id','LEFT')
// ->where(['a.is_del'=>0])
// ->field('a.id,a.cook_label,a.title,b.pic_url as cover')
// ->select();
// foreach ($content_list as $key => $value) {
// unset($content_list[$key]['ROW_NUMBER']);
// array_push($cook_label[$temporary_label[$value['cook_label']]]['list'],$content_list[$key]);
// }
// return $this->msg($cook_label);
// // 获取菜谱分类标签end
// }
2025-11-21 19:13:01 +08:00
public function get_search_food_page_list_action($data){
$cfc = Db::connect('cfc_db');
// 获取菜谱分类标签start
// 蔬菜类id4 6 7
// 肉类id10 11 14
$data_list = $cfc->table($this->kitchenscale_db_msg['foodlist3'])
->where('two_id in (4,6,7,10,11,14) and is_popular = 1')
->field('id,food_name,two_id')
->select();
$result = [
'food'=>[
'title'=>'流行食材',
'list'=>[
[
'title'=>'蔬菜',
'list'=>[]
],
[
'title'=>'肉类',
'list'=>[]
],
]
],
'log'=>[],
];
foreach ($data_list as $key => $value) {
if($value['two_id'] == 4 || $value['two_id'] == 6 || $value['two_id'] == 7){
array_push($result['food']['list'][0]['list'],['id'=>$value['id'],'name'=>$value['food_name']]);
}else if($value['two_id'] == 10 || $value['two_id'] == 11 || $value['two_id'] == 14){
array_push($result['food']['list'][1]['list'],['id'=>$value['id'],'name'=>$value['food_name']]);
}
}
return $this->msg($result);
// 获取菜谱分类标签end
}
#######################################################################小工具#######################################################################
#######################################################################小工具#######################################################################
#######################################################################小工具#######################################################################
// 处理食材的卡路里
public function count_calorie($data,$step){
$foot_name = array_column($data, 'id');
$foot_name = array_unique($foot_name);
$cfc = Db::connect('cfc_db');
$foot_kcal = $cfc->table($this->kitchenscale_db_msg['foodlist3'])->where("id in ('".implode("','", $foot_name)."')")->field("id,food_name as name,Calorie_val as kcal")->select();
$foot_kcal2 = [];
foreach ($foot_kcal as $key => $value) {
$foot_kcal2[$value['name']] = [$value['id'],$value['kcal']];
}
// dump($data);
// dump($foot_kcal2);
// die;
foreach ($data as $key => $value) {
if(array_key_exists($value['name'], $foot_kcal2)){
$data[$key]['id'] = $foot_kcal2[$value['name']][0];
$data[$key]['kcal'] = $foot_kcal2[$value['name']][1];
}else{
$data[$key]['kcal'] = '0';
$data[$key]['id'] = 0;
}
$data[$key]['unit'] = 'g';
}
return $data;
}
// 加 bcadd(,,20)
// 减 bcsub(,,20)
// 乘 bcmul(,,20)
// 除 bcdiv(,,20)
2026-02-03 18:56:47 +08:00
2025-11-21 19:13:01 +08:00
public function chuli_shuju(){
$cfc = Db::connect('cfc_db');
// $foot_kcal = $cfc->table('app_user_cookbook')->field("food_data,id")->select();
// $foot_name = [];
// // dump($foot_kcal);
// foreach ($foot_kcal as $key => $value) {
// unset($foot_kcal[$key]['ROW_NUMBER']);
// $foot_kcal[$key]['food_data'] = json_decode($foot_kcal[$key]['food_data'],true);
// foreach ($foot_kcal[$key]['food_data'] as $k => $v) {
// $linshi_data = $v;
// // dump($linshi_data);
// $foot_kcal[$key]['food_data'][$k] = [];
// $foot_kcal[$key]['food_data'][$k]['name'] = $linshi_data['name'];
// $foot_kcal[$key]['food_data'][$k]['weight'] = $linshi_data['weight'];
// $foot_kcal[$key]['food_data'][$k]['unit'] = 'g';
// $foot_kcal[$key]['food_data'][$k]['kcal'] = rtrim($linshi_data['kcal'], "kcal");
// if(!in_array($linshi_data['name'], $foot_name)){
// array_push($foot_name,$linshi_data['name']);
// }
// }
// // $foot_kcal[$key]['food_data'] = $foot_kcal[$key]['food_data'][0];
// // $foot_kcal[$key]['food_data'] = json_encode($foot_kcal[$key]['food_data']);
// }
// $shicai = $cfc->table($this->kitchenscale_db_msg['foodlist3'])->where("name in ('".implode("','", $foot_name)."')")->field("id,name,kcal")->select();
// $shicai2 = [];
// foreach ($shicai as $key => $value) {
// $shicai2[$value['name']] = [$value['id'],$value['kcal']];
// }
// // dump($shicai2);
// foreach ($foot_kcal as $key => $value) {
// foreach ($foot_kcal[$key]['food_data'] as $k => $v) {
// $foot_kcal[$key]['food_data'][$k]['kcal'] = $shicai2[$v['name']][1];
// $foot_kcal[$key]['food_data'][$k]['id'] = $shicai2[$v['name']][0];
// }
// // $foot_kcal[$key]['food_data'] = $foot_kcal[$key]['food_data'][0];
// $foot_kcal[$key]['food_data'] = json_encode($foot_kcal[$key]['food_data']);
// }
// // dump($foot_kcal);
// // die;
// foreach ($foot_kcal as $key => $value) {
// $cfc->table('app_user_cookbook')->where(['id'=>$value['id']])->update(['food_data'=>$value['food_data']]);
// }
// dump($foot_kcal);
// die;
$sql = "SELECT father_id,count(*) as num FROM app_z_national_standard_food_type_4 GROUP BY father_id ORDER BY num DESC";
$result = $cfc->query($sql);
$aa = [];
foreach ($result as $key => $value) {
if($value['num'] >= 30){
$aa[] = $value['father_id'];
}
}
$bb = implode("','",$aa);
$sql2 = "SELECT id,father_id FROM app_z_national_standard_food_type_4 WHERE father_id IN ('".$bb."')";
$result2 = $cfc->query($sql2);
$cc = [];
foreach ($result2 as $key => $value) {
if (array_key_exists($value['father_id'], $cc)) {
// 基本用法
if (!in_array($value['id'], $cc[$value['father_id']])) {
$cc[$value['father_id']][] = $value['id'];
}
} else {
$cc[$value['father_id']] = [$value['id']];
}
}
$toDeleteStructured = [];
foreach ($cc as $key => $value) {
// 每个数组有58个元素后29个是需要删除的
$deletePart = array_slice($value, 29, 29);
$toDeleteStructured[$key] = $deletePart;
// $toDeleteStructured[$key] = count($deletePart);
}
foreach ($toDeleteStructured as $key => $value) {
$zz = implode("','",$value);
$result3 = $cfc->table('app_z_national_standard_food_type_4')
->where("id in ('".$zz."')")
->update(['is_del'=>1]);
dump($key);
dump($result3);
// $sql3 = "UPDATE app_z_national_standard_food_type_4 SET is_del = 1 WHERE id IN (".$zz.")";
// $result3 = $cfc->query($sql3);
}
// foreach ($toDeleteStructured as $key => $value) {
// foreach ($value as $k => $v) {
// $dd[] = $v;
// }
// }
// $zz = implode(",",$dd);
// $sql3 = "UPDATE app_z_national_standard_food_type_4 SET is_del = 1 WHERE id IN (".$zz.")";
// $result3 = $cfc->query($sql3);
// dump($result3);
// dump($toDeleteStructured);
}
}