NoticeLogic.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace addons\ReservationService\common\logic;
  3. use addons\ReservationService\common\enums\ReservationServiceEnum;
  4. use addons\ReservationService\common\models\ReservationServiceNotice;
  5. use addons\ReservationService\common\models\ReservationServiceOrder;
  6. use addons\ReservationService\common\models\ReservationServiceUser;
  7. use common\enums\OrderStatusEnum;
  8. use common\enums\RabbitMqEnum;
  9. use common\enums\ShippingTypeEnum;
  10. use common\enums\StatusEnum;
  11. use common\helpers\FormatHelper;
  12. use common\models\common\MallSetting;
  13. use common\models\order\Order;
  14. use common\models\user\User;
  15. use yii\helpers\Json;
  16. class NoticeLogic
  17. {
  18. /**
  19. * @param array $params
  20. * @return void
  21. * @throws \Exception
  22. */
  23. public function send(array $params)
  24. {
  25. \Yii::error(__METHOD__ . " 发送短信 " . Json::encode($params));
  26. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $params,
  27. self::class, 'async_handle');
  28. }
  29. /**
  30. * @param $params
  31. * @return void|bool
  32. */
  33. public function async_handle($params)
  34. {
  35. if (empty($params['id'])) return;
  36. try {
  37. /**
  38. * @var $order Order
  39. */
  40. $order = Order::getOne([
  41. ['id' => $params['id']]
  42. ]);
  43. if (empty($order)) {
  44. return;
  45. }
  46. //获取主商城短信配置
  47. $mall_config = MallSetting::getConfByGroup($order->mall_id, ['notice_sms'], true);
  48. $mall_sms = $mall_config['notice_sms']['platform']['value'];
  49. $sms_key = $params['sms_key'];
  50. if ($mall_sms != 'aliyun') $sms_key = $params['sms_key'].'_'.$mall_sms;
  51. $sms = \Yii::$app->services->setting->addons->get($order->mall_id, ReservationServiceEnum::ADDONS_NAME, "sms.$sms_key") ?? '[]';
  52. $sms_config = !empty($sms) ? Json::decode($sms) : null;
  53. $sms_config = $sms_config['data'] ?? null;
  54. if (empty($sms_config) || empty($sms_config['template_id']) || empty($sms_config['content'])) {
  55. \Yii::error(__METHOD__ . " 未配置短信模板 {$params['id']}");
  56. return true;
  57. }
  58. /**
  59. * @var $user User
  60. */
  61. $user = $order->getUser()->one();
  62. /**
  63. * @var $reserve ReservationServiceOrder
  64. */
  65. $reserve = ReservationServiceOrder::getOne([
  66. ['mall_id' => $order->mall_id],
  67. ['user_id' => $order->user_id],
  68. ['status' => StatusEnum::ENABLED],
  69. // ['service_status' => StatusEnum::DISABLED],
  70. ['order_id' => $order['id']],
  71. ]);
  72. /**
  73. * @var $staff ReservationServiceUser
  74. */
  75. $staff = $reserve->getStaff()->one();
  76. // 默认为收货人手机号码
  77. $mobile = $order->mobile;
  78. switch ($sms_key) {
  79. case ReservationServiceEnum::SMS_KEY_RESERVE:
  80. // 发送给技师
  81. case ReservationServiceEnum::SMS_KEY_RESERVE_QCLOUD:
  82. // 发送给技师
  83. case ReservationServiceEnum::SMS_KEY_RESERVE_SUBMAIL:
  84. // 发送给技师
  85. $mobile = $staff->mobile;
  86. break;
  87. case ReservationServiceEnum::SMS_KEY_AGREE:
  88. // 发送给买家
  89. case ReservationServiceEnum::SMS_KEY_REJECT:
  90. // 发送给买家
  91. break;
  92. }
  93. $collect_vars = [];
  94. foreach ($order as $key => $value) {
  95. if (in_array($key, ['created_at', 'updated_at', 'pay_time', 'shipping_time',
  96. 'sign_time', 'consign_time', 'finish_time', 'close_time']) && !empty($value)) {
  97. $value = date("Y-m-d H:i:s");
  98. }
  99. $collect_vars["order.{$key}"] = $value;
  100. }
  101. foreach ($user as $key => $value) {
  102. if (in_array($key, ['created_at', 'updated_at', 'birthday', 'junior_at', 'last_login_at', 'upgrade_level_at',
  103. 'inviter_at']) && !empty($value)) {
  104. $value = date("Y-m-d H:i:s");
  105. }
  106. $collect_vars["user.{$key}"] = $value;
  107. }
  108. foreach ($staff as $key => $value) {
  109. if (in_array($key, ['created_at', 'updated_at']) && !empty($value)) {
  110. $value = date("Y-m-d H:i:s");
  111. }
  112. $collect_vars["staff.{$key}"] = $value;
  113. }
  114. foreach ($reserve as $key => $value) {
  115. if (in_array($key, ['created_at', 'updated_at', 'service_start_at', 'service_end_at']) && !empty($value)) {
  116. $value = date("Y-m-d H:i:s");
  117. }
  118. $collect_vars["reserve_order.{$key}"] = $value;
  119. }
  120. $message_data = [];
  121. $content = $sms_config['content'];
  122. if (!empty($sms_config['vars'])) {
  123. $var_keys = array_column($sms_config['vars'], 'name', 'key');
  124. foreach (ReservationServiceEnum::SMS_KEYS_MAP as $key => $value) {
  125. if (!empty($var_keys[$key])) {
  126. switch ($mall_sms) {
  127. case 'aliyun':
  128. $message_data[substr($var_keys[$key], 2, -1)] = $collect_vars[$key] ?? '';
  129. break;
  130. case 'qcloud':
  131. $message_data[substr($var_keys[$key], 1, -1)] = $collect_vars[$key] ?? '';
  132. break;
  133. case 'submail':
  134. $message_data[substr($var_keys[$key], 5, -1)] = $collect_vars[$key] ?? '';
  135. break;
  136. }
  137. $content = str_replace($var_keys[$key], $collect_vars[$key] ?? '', $content);
  138. }
  139. }
  140. }
  141. $sms_message_attr = [
  142. 'content' => $content, // 需要自己格式化内容?
  143. 'template' => $sms_config['template_id'],
  144. 'data' => $message_data,
  145. 'mall_sms' => $mall_sms,
  146. ];
  147. $area_code = '86';// 初始化区号
  148. $gateways = 'domestic';// 默认国内短信
  149. // 检测是登录并且区号不为空则使用国际短信
  150. if (!empty($user->area_code) && $user->area_code != $area_code) {
  151. $gateways = 'international';
  152. $area_code = $user->area_code;
  153. }
  154. ReservationServiceNotice::setData($order->mall_id, $user['id'], $gateways, $area_code,
  155. $mobile, time(), $sms_message_attr);
  156. } catch (\Exception $e) {
  157. var_dump($e->getMessage(), $e->getFile(), $e->getLine());
  158. \Yii::error(FormatHelper::exception($e, __METHOD__));
  159. return false;
  160. }
  161. }
  162. }