文件
2026-09-23 17:04:10 +08:00

115 行
3.8 KiB
PHP

<?php
namespace addons\shopro\listener\order;
use addons\shopro\exception\Exception;
use addons\shopro\model\Cart;
use addons\shopro\model\Config;
use addons\shopro\model\Order;
use addons\shopro\model\Store;
use addons\shopro\model\User;
/**
* 支付成功事件监听
*/
class Payed
{
// 订单支付成功事件
public function orderPayedAfter(&$params) {
// 订单对象
$order = $params["order"];
// 重新查询带明细项的完整订单
$order = Order::with("item")->where("id", $order["id"])->find();
$items = $order ? $order["item"] : [];
// 1. 订单提交后只创建唯一打印任务;实际云打印由独立队列执行。
$this->queuePrintOrder($order);
// 2. 门店管理员通知
$storeIds = [];
foreach ($items as $item) {
if (in_array($item["dispatch_type"], ["store", "selfetch"]) && $item["store_id"]) {
$storeIds[] = $item["store_id"];
}
}
$data = [];
if ($storeIds) {
$data = [];
// 存在门店,查询门店管理员
$stores = Store::with(["userStore.user"])->where("id", "in", $storeIds)->select();
foreach ($stores as $key => $store) {
$userStoreList = $store["user_store"] ? : [];
unset($store["user_store"]);
// 当前门店所有用户管理员
$userList = [];
foreach ($userStoreList as $user) {
if ($user["user"]) {
$userList[] = $user["user"];
}
}
// 有用户才能发送消息
if ($userList) {
$data[] = [
"store" => $store,
"userList" => $userList
];
}
}
}
// 存在要通知的门店管理员
if ($data) {
// 按门店为单位发送通知
foreach ($data as $key => $sendData) {
\addons\shopro\library\notify\Notify::send(
$sendData["userList"],
new \addons\shopro\notifications\store\Order([
"store" => $sendData["store"],
"order" => $order,
"event" => "store_order_new"
])
);
}
}
}
protected function queuePrintOrder($order)
{
if (!$order) {
return;
}
try {
$task = \think\Db::name('shopro_order_print_task')->where('order_id', $order['id'])->find();
if (!$task) {
try {
\think\Db::name('shopro_order_print_task')->insert([
'order_id' => $order['id'],
'order_sn' => $order['order_sn'],
'status' => 0,
'attempts' => 0,
'created_at' => time(),
'updated_at' => time(),
]);
$task = true;
} catch (\Exception $e) {
// 唯一索引冲突表示另一个事件已创建任务,禁止重复入队。
$task = \think\Db::name('shopro_order_print_task')->where('order_id', $order['id'])->find();
}
}
if ($task && (!is_array($task) || (int)$task['status'] !== 1)) {
\think\Queue::push('\\addons\\shopro\\job\\OrderPrint@handle', ['order_id' => $order['id']], 'shopro-high');
}
} catch (\Exception $e) {
\think\Log::record('创建小票打印任务失败,订单ID ' . $order['id'] . ': ' . $e->getMessage(), 'error');
}
}
}