services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $params, self::class, 'async_handle'); } /** * @param $params * @return void|bool */ public function async_handle($params) { if (empty($params['id'])) return; $order = Order::getOne([ ['id' => $params['id']] ]); if (empty($order)) return; $status = intval($params['status']); $sms_config = \Yii::$app->services->setting->addons->get($order->mall_id, CommunityEnum::ADDONS_NAME, 'basic.sms') ?? '[]'; $sms_config = Json::decode($sms_config); // 买家与卖家 foreach ($sms_config as $sms_key => $sms_value) { if (in_array($sms_key, ["seller_{$status}", "buyer_{$status}"])) { // 执行发送 try { $to_type = strpos($sms_key, "seller") !== false ? StatusEnum::ENABLED : StatusEnum::DISABLED; // 发送对象 $is_continue = false; switch ($status) { case OrderStatusEnum::NOT_PAY: case OrderStatusEnum::PAY: // 两个都需要 - 团长/买家,买家仅限于送货上门的订单才需要 // 如果是发送给买家的短信,那么判断是否为配送上门 if (strpos($sms_key, "buyer") !== false && $order->shipping_type != ShippingTypeEnum::MERCHANT_DISTRIBUTION) { // 需要发短信给买家 $is_continue = true; } if (strpos($sms_key, "seller") !== false) $sms_value['send_day'] = 0; // 卖家收短信为当时就收 break; case OrderStatusEnum::SING: case OrderStatusEnum::ACCOMPLISH: case OrderStatusEnum::SHIPMENTS: } if ($is_continue) continue; $user = $order->user->toArray(); if (empty($user)) return; $area_code = '86';// 初始化区号 $gateways = 'domestic';// 默认国内短信 // 检测是登录并且区号不为空则使用国际短信 if (!empty($user['area_code']) && $user['area_code'] != '86') { $gateways = 'international'; $area_code = $user['area_code']; } // $sms = new Sms($order->mall_id, $gateways); // order, head, user $collect_vars = []; foreach ($order as $key => $value) { if (in_array($key, ['created_at', 'updated_at', 'pay_time', 'shipping_time', 'sign_time', 'consign_time', 'finish_time', 'close_time']) && !empty($value)) { $value = date("Y-m-d H:i:s"); } $collect_vars["order.{$key}"] = $value; } foreach ($user as $key => $value) { if (in_array($key, ['created_at', 'updated_at', 'birthday', 'junior_at', 'last_login_at', 'upgrade_level_at', 'inviter_at']) && !empty($value)) { $value = date("Y-m-d H:i:s"); } $collect_vars["user.{$key}"] = $value; } $headOrder = CommunityHeadOrder::getOne([ ['order_id' => $order->id] ]); $head = $headOrder->head->toArray(); foreach ($head as $key => $value) { if (in_array($key, ['created_at', 'updated_at']) && !empty($value)) { $value = date("Y-m-d H:i:s"); } $collect_vars["head.{$key}"] = $value; } $message_data = []; $content = $sms_value['content']; $var_keys = array_column($sms_value['vars'], 'name', 'key'); foreach (CommunityEnum::SMS_KEYS as $key => $value) { if (!empty($var_keys[$key])) { $message_data[substr($var_keys[$key], 2, -1)] = $collect_vars[$key] ?? ''; $content = str_replace($var_keys[$key], $collect_vars[$key] ?? '', $content); } } $sms_message_attr = [ 'content' => $content, // 需要自己格式化内容? 'template' => $sms_value['id'], 'data' => $message_data ]; $send_at = time(); $send_day = intval($sms_value['send_day'] ?? 0); if (!empty($send_day) && $send_day > 0) { $send_at += $send_day * 86400; // 天 } CommunityNotice::setData($order->mall_id, $user['id'], $gateways, $area_code, $to_type == StatusEnum::ENABLED ? $head['mobile'] : $user['mobile'], $send_at, $sms_message_attr); // $message = new SmsMessage($sms_message_attr); // // // 接受角色不一样,有可能是买家,有可能是团长 // $mobile = new PhoneNumber($to_type == StatusEnum::ENABLED ? $head['mobile'] : $user['mobile'], $area_code); // // $sms->easySms->send($mobile, $message); } catch (\Exception $e) { \Yii::error(FormatHelper::exception($e, __METHOD__)); // return false; } } } } }