SendController.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace App\Http\Controllers\Admin\Sms;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\SmsHistory;
  6. use App\Models\SmsBook;
  7. use App\Models\SmsUser;
  8. use App\Models\SmsLib;
  9. use App\Models\User;
  10. use App\Models\DTO\SearchData;
  11. class SendController extends Controller
  12. {
  13. private SmsHistory $smsHistoryModel;
  14. private SmsBook $smsBookModel;
  15. private SmsUser $smsUserModel;
  16. private User $userModel;
  17. private SmsLib $smsLib;
  18. public function __construct(
  19. SmsHistory $smsHistory,
  20. SmsBook $smsBook,
  21. SmsUser $smsUser,
  22. User $user,
  23. SmsLib $smsLib
  24. ) {
  25. $this->smsHistoryModel = $smsHistory;
  26. $this->smsBookModel = $smsBook;
  27. $this->smsUserModel = $smsUser;
  28. $this->userModel = $user;
  29. $this->smsLib = $smsLib;
  30. }
  31. /**
  32. * 문자 발송 관리
  33. * @method GET
  34. * @see /admin/sms/send
  35. */
  36. public function index()
  37. {
  38. return view('admin.sms.send.index', [
  39. 'actionURL' => route('admin.sms.send.store'),
  40. 'csrfToken' => csrf_token(),
  41. 'smsGroups' => $this->smsBookModel->all()
  42. ]);
  43. }
  44. /**
  45. * 회원 연락처 전체 조회
  46. * @method GET
  47. * @see /admin/sms/send/user
  48. */
  49. public function user(Request $request)
  50. {
  51. $params = SearchData::fromRequest($request);
  52. $params->receiveSms = 1;
  53. $params->actionURL = route('admin.sms.send.store');
  54. $userData = $this->userModel->data($params);
  55. if ($userData->rows > 0) {
  56. $num = listNum($userData->total, $params->page, $params->perPage);
  57. foreach ($userData->list as $i => $row) {
  58. $row->num = $num--;
  59. $userData->list[$i] = $row;
  60. }
  61. }
  62. return view('admin.sms.send.contact', [
  63. 'userData' => $userData,
  64. 'params' => $params
  65. ]);
  66. }
  67. /**
  68. * 회원 연락처 그룹 조회
  69. * @method GET
  70. * @see /admin/sms/send/book
  71. */
  72. public function book(Request $request)
  73. {
  74. $params = SearchData::fromRequest($request);
  75. $params->smsBookID = $request->get('book');
  76. $params->actionURL = route('admin.sms.send.store');
  77. $userData = $this->smsUserModel->data($params);
  78. if ($userData->rows > 0) {
  79. $num = listNum($userData->total, $params->page, $params->perPage);
  80. foreach ($userData->list as $i => $row) {
  81. $row->num = $num--;
  82. $row->id = $row->user_id;
  83. $userData->list[$i] = $row;
  84. }
  85. }
  86. return view('admin.sms.send.contact', [
  87. 'userData' => $userData,
  88. 'params' => $params
  89. ]);
  90. }
  91. /**
  92. * 문자 발송 저장
  93. * @method POST
  94. * @see /admin/sms/send
  95. */
  96. public function store(Request $request)
  97. {
  98. $rules = [
  99. 'user_ids' => 'required|string',
  100. 'sms_subject' => 'required|string|max:30',
  101. 'sms_content' => 'required|string|max:2000',
  102. 'sms_tel' => 'nullable|required_without:sms_per_tel',
  103. 'sms_per_tel' => 'nullable|required_without:sms_tel',
  104. 'sms_is_reserve' => 'numeric|nullable|in:0,1',
  105. 'sms_reserve_at' => 'string|nullable|date'
  106. ];
  107. $attributes = [
  108. 'user_ids' => '수신 회원 PK',
  109. 'sms_subject' => '제목',
  110. 'sms_content' => '내용',
  111. 'sms_tel' => '발신 번호',
  112. 'sms_per_tel' => '발신 번호',
  113. 'sms_is_reserve' => '예약 여부',
  114. 'sms_reserve_at' => '예약 일시'
  115. ];
  116. $posts = $this->validate($request, $rules, [], $attributes);
  117. $userIDs = json_decode($posts['user_ids'], true); // input.hidden 으로 user_id 와 연락처를 받음
  118. $sendNumber = []; // 수신번호
  119. foreach ($userIDs as $userID => $tel) {
  120. if($userID) {
  121. $sendNumber[$userID] = $tel;
  122. }else{
  123. $sendNumber[] = $tel;
  124. }
  125. }
  126. // 개인 발송
  127. if($posts['sms_per_tel']) {
  128. foreach(explode(',', $posts['sms_per_tel']) as $tel) {
  129. $sendNumber[] = $tel;
  130. }
  131. }
  132. $result = $this->smsLib->send($sendNumber, [
  133. 'userID' => UID, // 발신자 PK
  134. 'subject' => $posts['sms_subject'],
  135. 'content' => $posts['sms_content'],
  136. 'isReserve' => ($posts['sms_is_reserve'] ?? 0),
  137. 'reserveAt' => ($posts['sms_reserve_at'] ?? null)
  138. ]);
  139. if (!$result) {
  140. return back()->withErrors($this->smsLib->errors())->withInput();
  141. }
  142. $message = $this->smsLib->report();
  143. return redirect()->route('admin.sms.send.index')->with('message', $message);
  144. }
  145. }