ufutx.dma/app/Http/Controllers/Admin/GuideController.php
2026-03-04 14:42:40 +08:00

457 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Events\OperationLoggedEvent;
use App\Facades\CommonService;
use App\Facades\UserService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\MakeGuide;
use App\Models\DmaProcess;
use App\Models\Food;
use App\Models\Guide;
use App\Models\GuideTemplate;
use App\Models\Order;
use App\Models\User;
use App\Services\ChatService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use function PHPUnit\Framework\isNull;
class GuideController extends Controller
{
use ResponseJson;
public function orderGuides(Request $request, Order $order)
{
$guides = $order->guides();
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$guides = $guides->where(function ($sql) use($keyword) {
$sql->where('phase_title', 'like', '%'.$keyword.'%');
});
}
$guides = $guides->paginate();
foreach ($guides as $guide)
{
$guide->hint = json_decode($guide->hint);
$guide->menu = $menus = json_decode($guide->menu);
$guide->price = 0;
foreach ($menus as $menu) {
foreach ($menu->nutrient as $item) {
if(!isset($item->price)){
continue;
}
$guide->price += get_two_float($item->number*$item->price,2);
}
}
$guide->price = get_two_float($guide->price,2);
}
return $this->success('ok', $guides);
}
public function userGuides(Request $request, User $user)
{
$order = $user->payOrders()->first();
$order_id = $order?$order->id:null;
$guides = Guide::where('order_id', $order_id);
$keyword = $request->input('keyword');
if ($keyword) {
$keyword = trim($keyword);
$guides = $guides->where(function ($sql) use($keyword) {
$sql->where('phase_title', 'like', '%'.$keyword.'%');
});
}
$guides = $guides->paginate();
foreach ($guides as $guide)
{
$guide->hint = json_decode($guide->hint);
$guide->menu = json_decode($guide->menu);
}
return $this->success('ok', $guides);
}
public function orderGuide(Request $request, Guide $guide)
{
$guide->menu = json_decode($guide->menu);
return $this->success('ok', $guide);
}
public function updateGuide(Request $request, Guide $guide)
{
$phase_date = $request->input('phase_date');
if ($phase_date) {
$is_exists = Guide::where('order_id', $guide->order_id)->where('phase_date', $phase_date)->where('id', '<>', $guide->id)->exists();
if ($is_exists) return $this->failure("当前日期餐单已存在");
$guide->phase_date = $phase_date;
}
$phase_title = $request->input("phase_title");
if ($phase_title) {
$guide->phase_title = $phase_title;
}
$menu = $request->input('menu', []);
if ($request->has('menu')) {
$guide->menu = json_encode($menu, JSON_UNESCAPED_UNICODE);
}
$hint = $request->input('hint');
if ($request->has('hint')) {
$guide->hint = json_encode($hint, JSON_UNESCAPED_UNICODE);
}
$guide->save();
//操作记录
OperationLoggedEvent::dispatch("更新了订单 $guide->order_id 的餐单:$guide->id");
return $this->success('ok');
}
public function deleteOrderGuide(Request $request, Guide $guide)
{
$guide->delete();
return $this->success('ok');
}
public function addOrderGuide(Request $request, Order $order)
{
$phase_date = $request->input('phase_date');
if (empty($phase_date)) return $this->failure("请选择日期");
$phase_title = $request->input("phase_title");
if (empty($phase_title)) return $this->failure("请输入名称");
$menu = $request->input('menu')?:[];
// if (empty($menu)) return $this->failure("请输入餐单信息");
$hint = $request->input('hint')?:[];
$is_exists = $order->guides()->where('phase_date', $phase_date)->exists();
if ($is_exists) return $this->failure("当前日期餐单已存在");
$guide = $order->guides()->create(['user_id'=>$order->user_id, 'phase_date'=>$phase_date, 'phase_title'=>$phase_title, 'menu'=>json_encode($menu, JSON_UNESCAPED_UNICODE), 'hint'=>json_encode($hint, JSON_UNESCAPED_UNICODE)]);
//发送餐单信息
$chatService = new ChatService();
$params = [];
$params['phase_date'] = $phase_date;
$chatService->sendGroupMsg($order->user_id,'方案信息','系统已为您生成好订单方案,请点击查看详情','https://image.fulllinkai.com/202311/27/fd67ab8389d4ff1c5832ddda72cd0dc1.png','yfheal://app/push/MineMenu',$params);
return $this->success('ok', $guide);
}
/**
* 复制最近一次餐单
* @param Request $request
*/
public function copyOrderGuide(Request $request,Order $order){
$phase_date = $request->input('phase_date');
if (empty($phase_date)) return $this->failure("请选择日期");
$date = date('Y-m-d');
if($phase_date < $date){
return $this->failure("创建餐单时间不得小于当天");
}
//判断该用户当天是否存在餐单
$is_exists = $order->guides()->where('user_id',$order->user_id)->where('phase_date', $phase_date)->exists();
if ($is_exists) return $this->failure("当前日期餐单已存在");
$beforeGuide = $order->guides()->where('user_id',$order->user_id)->where('phase_date','<',$phase_date)->orderByDesc('phase_date')->first();
if(!$beforeGuide){
return $this->failure("不存在历史餐单,请先创建");
}
//复制历史最近一次餐单
$guide = $order->guides()->create(['user_id'=>$order->user_id, 'phase_date'=>$phase_date, 'phase_title'=>$beforeGuide->phase_title, 'menu'=>$beforeGuide->menu, 'hint'=>$beforeGuide->hint]);
$guide->menu = json_decode($guide->menu,true);
$guide->hint = json_decode($guide->hint,true);
return $this->success('ok', $guide);
}
public function makeGuide(Request $request, Order $order)
{
$user = $order->user;
$user_info = $user->userInfo;
//检查信息 个人信息,症状自诉,体检报告;
$res = UserService::checkUserInfo($user, $user_info);
if (empty($res)) return $this->failure("未完成个人信息");
//自述症状
$res = UserService::checkSymptoms($user_info);
if (empty($res)) return $this->failure("未完成个人自述症状");
//体检报告
$res = $user->medicalReports()->count();
if (empty($res)) return $this->failure("未完成体检报告");
//生成餐单 第三方
if (config('app.env') == 'production') {
$this->httpMakeGuide($user, $order);
}else {
$this->httpMakeGuideTest($order, $user, $user_info);
}
//操作记录
OperationLoggedEvent::dispatch("给订单:$order->id 生成了餐单");
return $this->success('ok');
}
/**
* 获取营养素和食物
* @param Request $request
*/
public function getOrderFood(Request $request){
try {
$order_id = $request->get('order_id');
$order = Order::where('id',$order_id)->first();
$scheme = $order->scheme?$order->scheme->scheme:[];
foreach ($scheme as $item){
$item->type = 'NUTRIENT';
}
$foods = Food::where('type',Food::TYPE_FOOD)->select('id','name','icon','unit','price','stock as num','type')->orderByDesc('id')->get();
$result = collect($scheme)->merge($foods)->toArray();
return $this->success('ok', $result);
}catch (\Exception $e){
return $this->failure('获取失败');
}
}
public function httpMakeGuide($user, $order)
{
Cache::put('guide_status_'.$order->id, 'MAKING');
MakeGuide::dispatch($user)->onQueue('health');
}
public function httpMakeGuideTest($order, $user, $user_info)
{
//餐单
$menu = [
"morning"=> [
"food"=> [[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]],
"nutrient"=> [[
"title"=> "蛋白粉",
"unit"=> "",
"number"=> 50
], [
"title"=> "倍力健",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]]
],
"forenoon"=> [
"food"=> [[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]],
"nutrient"=> [[
"title"=> "蛋白粉",
"unit"=> "",
"number"=> 50
], [
"title"=> "倍力健",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]]
],
"noon"=> [
"food"=> [[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]],
"nutrient"=> [[
"title"=> "蛋白粉",
"unit"=> "",
"number"=> 50
], [
"title"=> "倍力健",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]]
],
"afternoon"=> [
"food"=> [[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]],
"nutrient"=> [[
"title"=> "蛋白粉",
"unit"=> "",
"number"=> 50
], [
"title"=> "倍力健",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]]
],
"evening"=> [
"food"=> [[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]],
"nutrient"=> [[
"title"=> "蛋白粉",
"unit"=> "",
"number"=> 50
], [
"title"=> "倍力健",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]]
]
];
$nutrient = [
[
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "水煮蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
], [
"title"=> "茶叶蛋",
"unit"=> "",
"number"=> 1,
"pic"=> "https://hbimg.b0.upaiyun.com/62620088daaf8b47e66f8b843e7641de2a4075a43bdf3-brWb6h_fw658"
]
];
$user_info->nutrient = $nutrient;
$user_info->save();
for ($index = 1; $index <= 49; $index++) {
$date = date('Y-m-d', strtotime("+ $index days",));
$menu_title = $menu['morning']['food'][0]['title'];
$menu['morning']['food'][0]['title'] = $menu_title.$index;
$order->guides()->create([
'user_id'=>$user->id,
'phase_date'=>$date,
'phase_title'=>'清洁日'.$index,
'menu'=> json_encode($menu, JSON_UNESCAPED_UNICODE),
'hint'=>json_encode(["注意饮食".$index], JSON_UNESCAPED_UNICODE),
]);
$menu['morning']['food'][0]['title'] = $menu_title;
}
}
public function getGuideTemplate($order_id){
$templates = GuideTemplate::where('order_id',$order_id)
// ->where('status',GuideTemplate::STATUS_OPEN)
->select('type','effect_guide')->get();
foreach ($templates as $template){
$template->effect_guide = json_decode($template->effect_guide);
}
return $this->success('ok',$templates);
}
public function getGuideDate(Request $request,$order_id){
$date = $request->get('date');
$start_date = date('Y-m-01', strtotime($date));
$end_date = date('Y-m-d', strtotime("$start_date + 1 month -1 day"));
$dailies = CommonService::daliy($start_date, $end_date);
$date_arr = [];
$send_arr = [];
$guide_arr = [];
foreach ($dailies as $daily){
$guide = Guide::where('order_id',$order_id)->where('phase_date',$daily)->first();
if(!empty($guide)){
switch ($guide->phase_title) {
case "准备日":
$date_arr[] = 1;
break;
case "装修日":
$date_arr[] = 2;
break;
case "清洁日":
$date_arr[] = 3;
break;
}
}else{
$date_arr[] = 0;
}
$send_arr[] = $guide->send_status??0;
if(isset($guide->menu)){
$menu = json_decode($guide->menu,true);
}else{
$menu = [];
}
$guide_arr[] = $menu;
}
$res = [];
$res["date_arr"] = $date_arr;
$res["send_status"] = $send_arr;
$res["guide"] = $guide_arr;
return $this->success('ok',$res);
}
}