ufutx.dma/app/Console/Commands/OrderSchemeRemainMsg.php
2026-03-04 14:42:40 +08:00

225 lines
8.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Facades\GuideService;
use App\Facades\TaskService;
use App\Facades\WechatService;
use App\Models\DmaProcessLog;
use App\Models\Food;
use App\Models\Guide;
use App\Models\GuideScheme;
use App\Models\Order;
use App\Models\ServiceRole;
use App\Models\ServiceRoleOrder;
use App\Models\ServiceUser;
use App\Services\ChatService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class OrderSchemeRemainMsg extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'order:scheme:remain:msg {--order_id=}';
/**
* The console command description.
*
* @var string
*/
protected $description = '方案营养素余量通知';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$order_id = $this->option('order_id');
// 需要检查的餐单方案
$schemes = $this->getStartingSchemes($order_id);
// 检查方案中的营养素是否预警
foreach ($schemes as $scheme) {
$msg = $this->rateResult($scheme);
Log::info($msg);
$this->info($msg);
if ($msg) {
$chatService = new ChatService();
$chatService->sendImMsgUserToUser($scheme->order_id, '系统通知', $msg, 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', 'yfheal://app/push/IMGroup', [ServiceRole::MAIN_COACH, ServiceRole::COACH, ServiceRole::CUSTOMER]);
}
}
return Command::SUCCESS;
}
public function getStartingSchemes($order_id)
{
$order_ids = Order::where('status', 'STARTING')->where('user_id', '<>', 0);
if ($order_id) {
$order_ids = $order_ids->where("id", $order_id);
}
$order_ids = $order_ids->select('id')->pluck('id')->toArray();
$schemes = GuideScheme::whereIn('order_id', $order_ids)->select('order_id', 'scheme')->select('scheme', 'order_id')->get();
return $schemes;
}
public function rateResult($scheme)
{
$order = Order::find($scheme->order_id);
$msg = "";
// 当天营养素和使用量
$guideFoods = $this->getGuideFood($scheme);
// 方案中所有营养素和份数
$scheme = $scheme->scheme;
foreach ($guideFoods as $food) {
// 营养素信息
$foodObj = Food::find($food["id"]);
if (empty($foodObj))
continue;
// 总量 = 份数 * 量
$schemeObj = collect($scheme)->where("id", $food["id"])->first();
if (empty($schemeObj))
continue;
$num = $schemeObj->num;
$total_num = round($num * $foodObj->quantity);
// 已使用的量
$use_num = $this->getUseGuideNum($order->id, $foodObj->id);
// 余量
$remain_num = round($total_num - $use_num);
if ($remain_num < 0) {
$remain_num = 0;
}
// 比例
$rate = round($remain_num / $total_num, 2);
// 是否超过10%
if ($rate < 0.1) {
Log::info("总量:" . $total_num . " 使用量:" . $use_num . " 剩余量:" . $remain_num . " 剩余比例:" . $rate);
$msg .= '营养素id:' . $foodObj->id . ' 营养素:' . $foodObj->name . ' 余量:' . $remain_num . " 剩余率:" . $rate . '%' . "\n";
}
}
$msg_title = '订单号:' . $order->trade_no . "\n" . "餐单日期:" . date("Y-m-d") . "\n" . '用户:' . $order->name . "\n" . '电话:' . $order->mobile . "\n";
if ($msg) {
$msg = $msg_title . $msg;
}
return $msg;
}
public function getUseGuideNum($order_id, $food_id)
{
$num = 0;
$guides = Guide::where("order_id", $order_id)->where("phase_date", "<=", date("Y-m-d"))->get();
foreach ($guides as $guide) {
$menu = json_decode($guide->menu);
foreach ($menu as $item) {
foreach ($item->nutrient as $nutrient) {
if ($nutrient->id != $food_id)
continue;
$num += $nutrient->oneNum;
}
}
}
return $num;
}
public function getGuideFood($scheme)
{
Log::info("获取当天餐单营养素订单:" . $scheme->order_id);
$idArr = [];
$array = [];
// 餐单日历
$guide = Guide::where("order_id", $scheme->order_id)->where("phase_date", date("Y-m-d"))->first();
if (empty($guide))
return $array;
$menu = json_decode($guide->menu);
foreach ($menu as $item) {
foreach ($item->nutrient as $nutrient) {
if (in_array($nutrient->id, $idArr)) {
$array[$nutrient->title] = ["id" => $nutrient->id, "title" => $nutrient->title, "num" => $nutrient->oneNum + $array[$nutrient->title]["num"]];
} else {
$idArr[] = $nutrient->id;
$array[$nutrient->title] = ["id" => $nutrient->id, "title" => $nutrient->title, "num" => $nutrient->oneNum];
}
}
}
return $array;
}
public function backup()
{
$order_ids = Order::where('status', 'STARTING')->where('user_id', '<>', 0)->select('id')->pluck('id')->toArray();
$schemes = GuideScheme::whereIn('order_id', $order_ids)->select('order_id', 'scheme')->pluck('scheme', 'order_id');
$guides = Guide::whereIn('order_id', $order_ids)->orderBy('phase_date', 'asc')->get();
$new_guides = [];
foreach ($guides as $guide) {
$new_guides[$guide->order_id]['guides'][] = $guide;
if (!isset($new_guides[$guide->order_id]['scheme'])) {
$new_guides[$guide->order_id]['scheme'] = [];
}
if (isset($schemes[$guide->order_id])) {
$new_guides[$guide->order_id]['scheme'] = json_decode($schemes[$guide->order_id]);
}
}
$order_scheme = [];
foreach ($new_guides as $order_id => $item) {
[$guides_arr, $scheme_food, $flag, $msg] = GuideService::getQuantity($item['scheme'], $item['guides']);
if (empty($msg)) {
continue;
}
$order_scheme[] = $msg;
}
//重组数组
$new_scheme = [];
foreach ($order_scheme as $sub_array) {
foreach ($sub_array as $item) {
$new_scheme[] = $item;
}
}
//遍历数据
$orderIds = [];
foreach ($new_scheme as $value) {
if ($value['rate'] > 20) {
continue;
}
if (in_array($value["order_id"], $orderIds))
continue;
$orderIds[] = $value["order_id"];
$order = Order::where('id', $value['order_id'])->first();
// $service_user_ids = ServiceRoleOrder::where('order_id',$value['order_id'])->distinct()->pluck('user_id');
// $work_user_ids = ServiceUser::whereIn('user_id',$service_user_ids)->pluck('work_user_id');
$message = '订单号:' . $order->trade_no . "\n" . '餐单日期:' . $value['phase_date'] . "\n" . '餐单类型:' . $value['phase_title'] . "\n" . '用户:' . $order->name . "\n" . '电话:' . $order->mobile . "\n" . '营养素:' . $value['title'] . "\n" . '余量:' . $value['remain_quantity'] . "\n" . "剩余率:" . $value['rate'] . '%';
// foreach ($work_user_ids as $work){
// if(!$work){
// continue;
// }
// WechatService::sendWorkMessage($work,'text',['content'=>$message]);
// }
$chatService = new ChatService();
$chatService->sendImMsgUserToUser($order->id, '系统通知', $message, 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', 'yfheal://app/push/IMGroup', [ServiceRole::MAIN_COACH, ServiceRole::COACH, ServiceRole::CUSTOMER]);
}
foreach ($orderIds as $orderId) {
$order = Order::where('id', $orderId)->first();
DmaProcessLog::addUserProcessLog($order->user_id ?? 0, $order->id ?? 0, 1, "lack_nutrient", "用户营养素余量不足", 0, 5);
DmaProcessLog::addUserProcessLog($order->user_id ?? 0, $order->id ?? 0, 1, "send_lack_nutrient", "系统发送营养素余量通知", 0, 5);
}
}
}