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

197 lines
7.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Facades\CommonService;
use App\Facades\TaskService;
use App\Facades\WechatService;
use App\Http\Response\ResponseJson;
//use App\Jobs\SendTemplateNotice;
use App\Models\DmaProcess;
use App\Models\DmaProcessLog;
use App\Models\Group;
use App\Models\GroupUser;
use App\Models\MarkOrderLog;
use App\Models\Order;
use App\Models\OrderOperateLog;
use App\Models\Service;
use App\Models\ServiceRole;
use App\Services\ChatService;
use App\Validators\OfflineOrderValidator;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class OrderController extends Controller
{
use ResponseJson;
public function payOrder(Request $request, $service_id)
{
$service = Service::find($service_id);
$user = auth()->user();
if ($user->payOrders()->count())
return $this->failure("该服务暂不支持多次购买");
$order_arr = [
'user_id' => $user->id,
'price' => $service->price,
'type' => 'SERVICE',
'type_id' => $service_id,
'pay_status' => 'UNPAID',
'trade_no' => CommonService::getTradeNO(),
'name' => $request->input('name'),
'mobile' => $request->input('mobile'),
'desc' => $service->title,
'is_hook' => 0,
'invite_name' => $request->input('invite_name'),
'invite_mobile' => $request->input('invite_mobile'),
];
if ($service->price) {
$callback = config('app.url') . '/api/notify/orders/' . $order_arr['trade_no'];
$config = WechatService::mpPay($order_arr['trade_no'], $user->wechat->openid, $service->price, $service->title, $callback);
} else {
$order_arr['pay_status'] = 'PAID';
$order_arr['is_hook'] = 1;
}
$order = Order::create($order_arr);
$order->config = $config;
//todo 通知
if ($order->price == 0)
$this->sendNotice($order);
return $this->success('ok', $order);
}
public function notifyOrder($trade_no)
{
$order = Order::where('trade_no', $trade_no)->first();
if (empty($order))
throw new \Exception("订单不存在");
if ($order->is_hook)
return true;
//查询订单
// $result = false;
$result = WechatService::mpPaid($trade_no);
if (empty($result)) {//成功
DB::beginTransaction();
Order::where("id", $order->id)->update(['pay_status' => 'PAID', 'is_hook' => 1]);
//生成聊天组
$order->group()->create(['name' => $order->user->name . '服务群']);
GroupUser::firstOrCreate(['user_id' => $order->user_id, 'group_id' => $order->group->id]);
DB::commit();
//订阅通知通知
$this->sendNotice($order);
} else {//失败
Order::where("id", $order->id)->update(['err_msg' => $result]);
}
return true;
}
public function sendNotice($order)
{
$params = [
'touser' => $order->user->openid,
'template_id' => config('wechat.sub_tpls.pay_success'),
'page' => '/pages/users/myOrder',
'miniprogram_state' => 'formal',
"lang" => "zh_CN",
'data' => [
'thing1' => ["value" => $order->desc],
'character_string3' => ["value" => $order->trade_no],
'time2' => ["value" => $order->created_at->toDatetimeString()],
'thing4' => ["value" => '点击查看详情']
]
];
// SendTemplateNotice::dispatch($params)->onQueue('health');
}
public function orders()
{
$orders = Order::with('service:id,title,pic,subtitle')->where('user_id', auth()->id())->where('pay_status', 'PAID')->orderByDesc('id')->simplePaginate();
return $this->success('OK', $orders);
}
public function order(Request $request, $order_id)
{
$order = Order::find($order_id);
return $this->success('OK', $order);
}
public function bindUser(Request $request, $order_id)
{
try {
$data = $request->all();
//数据验证
$validator = new OfflineOrderValidator();
$validator->scene('bindUser')->validate($data);
//获取订单信息
$order = Order::query()->find($order_id);
if ($order->user_id != 0) {
throw new \Exception('无法绑定。此订单此前已被绑定。');
}
if ($order->mobile != $data['mobile']) {
throw new \Exception('手机号不匹配');
}
if ($order->mobile != $data['name']) {
throw new \Exception('姓名不匹配');
}
//绑定
$user = auth()->user();
$order->user_id = $user->id;
$order->save();
return $this->success('绑定成功');
} catch (\Exception $e) {
return $this->jsonResponse(1, $e->getMessage());
}
}
public function getOrderLog(Request $request)
{
try {
$order = Order::where('user_id', auth()->id())->orderByDesc('id')->first();
$list = OrderOperateLog::where('order_id', $order->id)->orderBy('created_at', 'desc')->get();
return $this->success('ok', $list);
} catch (\Exception $e) {
return $this->jsonResponse(1, $e->getMessage());
}
}
public function updateServerStatus(Request $request)
{
$user = auth()->user();
$service_status = $request->input('service_status');
$orderModel = new Order();
$orderModel->updateServerStatus($user, $service_status);
//确认收货才发送消息
if ($service_status == "FINISHED") {
$order = Order::getPayOrder($user->id);
$chatService = new ChatService();
$chatService->sendImMsgUserToUser($order->id, '确认收货', "用户" . ($order->name ?? "") . '已确认收货,请客服设置餐单', 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', config('app.url') . '/work/#/h5/appEditUserMenu', [ServiceRole::CUSTOMER]);
$chatService->sendImMsgUserToUser($order->id, '系统通知', '请所有服务人员与用户[' . $order->name . ']进行第一次视频通话', 'https://image.fulllinkai.com/202403/29/dea3e0c27107cdf178635d2a41199e5e.png', '', [ServiceRole::MAIN_COACH, ServiceRole::COACH, ServiceRole::CUSTOMER]);
// 待办事项-主教练
$theme = "请邀请所有服务人员进行「用户" . $order->name . "」服务的第一次「视频通话」,并将相关视频链接转发给“友福服务”";
TaskService::AddTask(0, 0, $theme, [1], $order->id);
// 待办事项-客服
$theme = "请标记「用户" . $order->name . "」的方案开始并确认方案开始时间";
if (empty($order->status)) {
TaskService::AddTask(0, 0, $theme, [3], $order->id);
}
DmaProcessLog::addUserProcessLog($order->user_id ?? 0, $order->id ?? 0, 1, "user_take_delivery", "用户确认收货", auth()->user()->id ?? 0, 0);
}
return $this->success("ok");
}
}