KFMessageController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <?php
  2. namespace Modules\WechatPlatform\Http\Controllers;
  3. use App\Jobs\WechatPlatform\GZHSendKFMessage;
  4. use Catch\Base\CatchController;
  5. use Illuminate\Foundation\Validation\ValidatesRequests;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\DB;
  8. use Modules\WechatPlatform\Services\WechatPlatformConstService;
  9. class KFMessageController extends CatchController
  10. {
  11. use ValidatesRequests;
  12. /**
  13. * 客服消息列表
  14. * @param Request $request
  15. */
  16. public function list(Request $request) {
  17. $name = $request->input('name');
  18. $messageType = $request->input('messageType');
  19. $status = $request->input('status');
  20. $sendAtStart = $request->input('send_at_start');
  21. $sendAtEnd = $request->input('send_at_end');
  22. $gzhid = $request->input('gzh_id');
  23. $result = DB::table('wechat_kf_messages')
  24. ->where([
  25. ['is_enabled' , '=', 1],
  26. ['user_id', '=', $this->getLoginUserId()]
  27. ])->when($name, function ($query, $name){
  28. return $query->where('name', 'like', '%'. $name. '%');
  29. })->when($messageType, function ($query, $messageType){
  30. return $query->where('message_type', $messageType);
  31. })->when($status, function ($query, $status){
  32. return $query->where('status', $status);
  33. })->when($sendAtStart, function ($query, $sendAtStart){
  34. return $query->where('start_at', '>=', $sendAtStart);
  35. })->when($sendAtEnd, function ($query, $sendAtEnd){
  36. return $query->where('start_at', '<=', $sendAtEnd . ' 23:59:59');
  37. })->when($gzhid, function ($query, $gzhid){
  38. return $query->where('gzh_ids', 'like', '%#'. $gzhid . '#%');
  39. })->orderBy('id', 'desc')
  40. ->paginate($request->input('limit', 20));
  41. $gzhIds = $gzhs = collect();
  42. $result->pluck('gzh_ids')->every(function ($item) use ($gzhIds){
  43. $gzhIds->merge(explode('#', trim($item, '#')));
  44. });
  45. if($gzhIds->isNotEmpty()) {
  46. $gzhs = DB::table('wechat_authorization_infos')
  47. ->whereIn('id', $gzhIds)
  48. ->select('id', 'nick_name')
  49. ->get()->keyBy('id');
  50. }
  51. foreach ($result as $item) {
  52. $item->gzh_names = $this->strGzhId($item->gzh_ids, $gzhs);
  53. $item->status_str = WechatPlatformConstService::KF_MESSAGE_STATUS_MAPPER[$item->status] ?? '';
  54. $item->message_content_arr = \json_decode($item->message_content, true);
  55. $item->message_type = WechatPlatformConstService::KF_MESSAGE_TYPE_MAPPER[$item->message_type] ?? '';
  56. // todo:完善
  57. $item->uc_str = '';
  58. }
  59. return $result;
  60. }
  61. private function strGzhId($gzh_ids, $gzhs) {
  62. if(!$gzh_ids){
  63. return '';
  64. }
  65. $gzh_names = collect();
  66. foreach (explode('#', trim($gzh_ids, '#')) as $gzh_id) {
  67. $gzh_names->push($gzhs->get($gzh_id)->nick_name ?? 'ID:'. $gzh_id);
  68. }
  69. return $gzh_names->unique()->join(', ');
  70. }
  71. /**
  72. * 新增
  73. * @param Request $request
  74. */
  75. public function add(Request $request) {
  76. $this->validate($request, [
  77. 'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
  78. 'u_type' => 'required|in:1,2', 'uc_unique_key' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
  79. ]);
  80. $now = date('Y-m-d H:i:s');
  81. DB::table('wechat_kf_messages')
  82. ->insert([
  83. 'name' => $request->input('name'),
  84. 'message_type' => $request->input('message_type'),
  85. 'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
  86. 'u_type' => $request->input('u_type', 1),
  87. 'uc_unique_key' => $request->input('uc_unique_key', ''),
  88. 'send_at' => $request->input('send_at'),
  89. 'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND,
  90. 'user_id' => $this->getLoginUserId(),
  91. 'created_at' => $now,
  92. 'updated_at' => $now,
  93. ]);
  94. return 'ok';
  95. }
  96. /**
  97. * 修改客服消息内容
  98. * @param Request $request
  99. */
  100. public function updateContent(Request $request) {
  101. $this->validate($request, [
  102. 'id' => 'required',
  103. 'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
  104. 'u_type' => 'required|in:1,2', 'uc_unique_key' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
  105. ]);
  106. $now = date('Y-m-d H:i:s');
  107. DB::table('wechat_kf_messages')
  108. ->where([
  109. ['id', '=', $request->input('id')],
  110. ['user_id', '=', $this->getLoginUserId()],
  111. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  112. ['is_enabled', '=', 1],
  113. ])->update([
  114. 'name' => $request->input('name'),
  115. 'message_type' => $request->input('message_type'),
  116. 'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
  117. 'u_type' => $request->input('u_type', '1'),
  118. 'uc_unique_key' => $request->input('uc_unique_key', ''),
  119. 'send_at' => $request->input('send_at'),
  120. 'updated_at' => $now,
  121. ]);
  122. return 'ok';
  123. }
  124. /**
  125. * 修改配置的公众号
  126. * @param Request $request
  127. */
  128. public function updateGZH(Request $request){
  129. $this->validate($request, [
  130. 'id' => 'required',
  131. 'gzh_ids' => 'required|array'
  132. ]);
  133. $now = date('Y-m-d H:i:s');
  134. DB::table('wechat_kf_messages')
  135. ->where([
  136. ['id', '=', $request->input('id')],
  137. ['user_id', '=', $this->getLoginUserId()],
  138. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  139. ['is_enabled', '=', 1],
  140. ])->update([
  141. 'gzh_ids' => sprintf('#%s#', join('#', array_unique($request->input('gzh_ids')))),
  142. 'updated_at' => $now,
  143. ]);
  144. return 'ok';
  145. }
  146. /**
  147. * 停止发送
  148. * @param Request $request
  149. */
  150. public function stop(Request $request) {
  151. $this->validate($request, [
  152. 'id' => 'required'
  153. ]);
  154. $now = date('Y-m-d H:i:s');
  155. DB::table('wechat_kf_messages')
  156. ->where([
  157. ['id', '=', $request->input('id')],
  158. ['user_id', '=', $this->getLoginUserId()],
  159. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  160. ['is_enabled', '=', 1],
  161. ])->update([
  162. 'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_STOP,
  163. 'updated_at' => $now,
  164. ]);
  165. return 'ok';
  166. }
  167. /**
  168. * 删除
  169. * @param Request $request
  170. */
  171. public function delete(Request $request){
  172. $this->validate($request, [
  173. 'id' => 'required'
  174. ]);
  175. $now = date('Y-m-d H:i:s');
  176. DB::table('wechat_kf_messages')
  177. ->where([
  178. ['id', '=', $request->input('id')],
  179. ['user_id', '=', $this->getLoginUserId()],
  180. ['status', '<>', WechatPlatformConstService::KF_MESSAGE_STATUS_SENDING],
  181. ['is_enabled', '=', 1],
  182. ])->update([
  183. 'is_enabled' => 0,
  184. 'updated_at' => $now,
  185. ]);
  186. DB::table('wechat_kf_message_send_records')
  187. ->where([
  188. ['message_id', '=', $request->input('id')],
  189. ['is_enabled', '=', 1]
  190. ])->update([
  191. 'is_enabled' => 0,
  192. 'updated_at' => $now,
  193. ]);
  194. return 'ok';
  195. }
  196. /**
  197. * 测试发送
  198. * @param Request $request
  199. */
  200. public function testSend(Request $request) {
  201. $this->validate($request, [
  202. 'gzh_id' => 'required', 'message_id' => 'required', 'openid' => 'required'
  203. ]);
  204. GZHSendKFMessage::dispatch([
  205. 'gzhId' => $request->input('gzh_id'),
  206. 'messageId' => $request->input('message_id'),
  207. 'openid' => $request->input('openid'),
  208. 'isTest' => true,
  209. 'traceInfo' => getTraceContext()->getTraceInfo(),
  210. ])->onQueue('{duanju_manage}.wechatPlatform.sendKFMessage')
  211. ->onConnection('queue-redis');
  212. return 'ok';
  213. }
  214. }