NoticeLogic.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace addons\Community\common\logic;
  3. use addons\Community\common\enums\CommunityEnum;
  4. use addons\Community\common\models\CommunityHeadOrder;
  5. use addons\Community\common\models\CommunityNotice;
  6. use common\enums\OrderStatusEnum;
  7. use common\enums\RabbitMqEnum;
  8. use common\enums\ShippingTypeEnum;
  9. use common\enums\StatusEnum;
  10. use common\helpers\FormatHelper;
  11. use common\helpers\sms\Sms;
  12. use common\models\order\Order;
  13. use common\models\user\User;
  14. use Overtrue\EasySms\Exceptions\InvalidArgumentException;
  15. use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
  16. use Overtrue\EasySms\PhoneNumber;
  17. use yii\helpers\Json;
  18. class NoticeLogic
  19. {
  20. /**
  21. * @param array $params
  22. * @return void
  23. * @throws \Exception
  24. */
  25. public function send(array $params)
  26. {
  27. \Yii::error(__METHOD__ . " 发送短信 " . Json::encode($params));
  28. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $params,
  29. self::class, 'async_handle');
  30. }
  31. /**
  32. * @param $params
  33. * @return void|bool
  34. */
  35. public function async_handle($params)
  36. {
  37. if (empty($params['id'])) return;
  38. $order = Order::getOne([
  39. ['id' => $params['id']]
  40. ]);
  41. if (empty($order)) return;
  42. $status = intval($params['status']);
  43. $sms_config = \Yii::$app->services->setting->addons->get($order->mall_id, CommunityEnum::ADDONS_NAME, 'basic.sms') ?? '[]';
  44. $sms_config = Json::decode($sms_config);
  45. // 买家与卖家
  46. foreach ($sms_config as $sms_key => $sms_value) {
  47. if (in_array($sms_key, ["seller_{$status}", "buyer_{$status}"])) { // 执行发送
  48. try {
  49. $to_type = strpos($sms_key, "seller") !== false ? StatusEnum::ENABLED : StatusEnum::DISABLED;
  50. // 发送对象
  51. $is_continue = false;
  52. switch ($status) {
  53. case OrderStatusEnum::NOT_PAY:
  54. case OrderStatusEnum::PAY:
  55. // 两个都需要 - 团长/买家,买家仅限于送货上门的订单才需要
  56. // 如果是发送给买家的短信,那么判断是否为配送上门
  57. if (strpos($sms_key, "buyer") !== false &&
  58. $order->shipping_type != ShippingTypeEnum::MERCHANT_DISTRIBUTION) {
  59. // 需要发短信给买家
  60. $is_continue = true;
  61. }
  62. if (strpos($sms_key, "seller") !== false) $sms_value['send_day'] = 0; // 卖家收短信为当时就收
  63. break;
  64. case OrderStatusEnum::SING:
  65. case OrderStatusEnum::ACCOMPLISH:
  66. case OrderStatusEnum::SHIPMENTS:
  67. }
  68. if ($is_continue) continue;
  69. $user = $order->user->toArray();
  70. if (empty($user)) return;
  71. $area_code = '86';// 初始化区号
  72. $gateways = 'domestic';// 默认国内短信
  73. // 检测是登录并且区号不为空则使用国际短信
  74. if (!empty($user['area_code']) && $user['area_code'] != '86') {
  75. $gateways = 'international';
  76. $area_code = $user['area_code'];
  77. }
  78. // $sms = new Sms($order->mall_id, $gateways);
  79. // order, head, user
  80. $collect_vars = [];
  81. foreach ($order as $key => $value) {
  82. if (in_array($key, ['created_at', 'updated_at', 'pay_time', 'shipping_time',
  83. 'sign_time', 'consign_time', 'finish_time', 'close_time']) && !empty($value)) {
  84. $value = date("Y-m-d H:i:s");
  85. }
  86. $collect_vars["order.{$key}"] = $value;
  87. }
  88. foreach ($user as $key => $value) {
  89. if (in_array($key, ['created_at', 'updated_at', 'birthday', 'junior_at', 'last_login_at', 'upgrade_level_at',
  90. 'inviter_at']) && !empty($value)) {
  91. $value = date("Y-m-d H:i:s");
  92. }
  93. $collect_vars["user.{$key}"] = $value;
  94. }
  95. $headOrder = CommunityHeadOrder::getOne([
  96. ['order_id' => $order->id]
  97. ]);
  98. $head = $headOrder->head->toArray();
  99. foreach ($head as $key => $value) {
  100. if (in_array($key, ['created_at', 'updated_at']) && !empty($value)) {
  101. $value = date("Y-m-d H:i:s");
  102. }
  103. $collect_vars["head.{$key}"] = $value;
  104. }
  105. $message_data = [];
  106. $content = $sms_value['content'];
  107. $var_keys = array_column($sms_value['vars'], 'name', 'key');
  108. foreach (CommunityEnum::SMS_KEYS as $key => $value) {
  109. if (!empty($var_keys[$key])) {
  110. $message_data[substr($var_keys[$key], 2, -1)] = $collect_vars[$key] ?? '';
  111. $content = str_replace($var_keys[$key], $collect_vars[$key] ?? '', $content);
  112. }
  113. }
  114. $sms_message_attr = [
  115. 'content' => $content, // 需要自己格式化内容?
  116. 'template' => $sms_value['id'],
  117. 'data' => $message_data
  118. ];
  119. $send_at = time();
  120. $send_day = intval($sms_value['send_day'] ?? 0);
  121. if (!empty($send_day) && $send_day > 0) {
  122. $send_at += $send_day * 86400; // 天
  123. }
  124. CommunityNotice::setData($order->mall_id, $user['id'], $gateways, $area_code,
  125. $to_type == StatusEnum::ENABLED ? $head['mobile'] : $user['mobile'], $send_at, $sms_message_attr);
  126. // $message = new SmsMessage($sms_message_attr);
  127. //
  128. // // 接受角色不一样,有可能是买家,有可能是团长
  129. // $mobile = new PhoneNumber($to_type == StatusEnum::ENABLED ? $head['mobile'] : $user['mobile'], $area_code);
  130. //
  131. // $sms->easySms->send($mobile, $message);
  132. } catch (\Exception $e) {
  133. \Yii::error(FormatHelper::exception($e, __METHOD__));
  134. // return false;
  135. }
  136. }
  137. }
  138. }
  139. }