KFMessageController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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\Common\Errors\Errors;
  9. use Modules\Common\Exceptions\CommonBusinessException;
  10. use Modules\WechatPlatform\Models\WechatKfMessageModel;
  11. use Modules\WechatPlatform\Services\WechatPlatformConstService;
  12. class KFMessageController extends CatchController
  13. {
  14. use ValidatesRequests;
  15. /**
  16. * 客服消息列表
  17. * @param Request $request
  18. */
  19. public function list(Request $request) {
  20. $name = $request->input('name');
  21. $messageType = $request->input('message_type');
  22. $status = $request->input('status');
  23. $sendAtStart = $request->input('send_at_start');
  24. $sendAtEnd = $request->input('send_at_end');
  25. $gzhid = $request->input('gzh_id');
  26. $result = DB::table('wechat_kf_messages')
  27. ->where([
  28. ['is_enabled' , '=', 1],
  29. ['user_id', '=', $this->getLoginUserId()]
  30. ])->when($name, function ($query, $name){
  31. return $query->where('name', 'like', '%'. $name. '%');
  32. })->when($messageType, function ($query, $messageType){
  33. return $query->where('message_type', $messageType);
  34. })->when($status, function ($query, $status){
  35. return $query->where('status', $status);
  36. })->when($sendAtStart, function ($query, $sendAtStart){
  37. return $query->where('send_at', '>=', $sendAtStart);
  38. })->when($sendAtEnd, function ($query, $sendAtEnd){
  39. return $query->where('send_at', '<=', $sendAtEnd . ' 23:59:59');
  40. })->when($gzhid, function ($query, $gzhid){
  41. return $query->where('gzh_ids', 'like', '%#'. $gzhid . '#%');
  42. })->orderBy('id', 'desc')
  43. ->paginate($request->input('limit', 20));
  44. $gzhIds = $gzhs = $ugs = collect();
  45. foreach ($result->pluck('gzh_ids') as $item) {
  46. $gzhIds = $gzhIds->merge(explode('#', trim($item, '#')));
  47. }
  48. $gzhIds = $gzhIds->diff([''])->unique();
  49. if($gzhIds->isNotEmpty()) {
  50. $gzhs = DB::table('wechat_authorization_infos')
  51. ->whereIn('id', $gzhIds)
  52. ->select('id', 'nick_name')
  53. ->get()->keyBy('id');
  54. }
  55. $ugIds = $result->pluck('ug_id')->diff([0]);
  56. if($ugIds->isNotEmpty()) {
  57. $ugs = DB::table('user_groups')->whereIn('id', $ugIds)
  58. ->select('id', 'name')->get()->keyBy('id');
  59. }
  60. foreach ($result as $item) {
  61. $item->gzh_names = $this->strGzhId($item->gzh_ids, $gzhs);
  62. $item->status_str = WechatPlatformConstService::KF_MESSAGE_STATUS_MAPPER[$item->status] ?? '';
  63. $item->message_content_arr = \json_decode($item->message_content, true);
  64. $item->message_type_str = WechatPlatformConstService::KF_MESSAGE_TYPE_MAPPER[$item->message_type] ?? '';
  65. $item->ug_str = $ugs->get($item->ug_id)->name ?? '';
  66. $gzh_ids = trim($item->gzh_ids, '#');
  67. if($gzh_ids) {
  68. $item->gzh_ids_arr = collect(explode('#', $gzh_ids))->map(function ($item){
  69. return intval($item);
  70. });
  71. } else {
  72. $item->gzh_ids_arr = [];
  73. }
  74. }
  75. return $result;
  76. }
  77. private function strGzhId($gzh_ids, $gzhs) {
  78. if(!$gzh_ids){
  79. return '';
  80. }
  81. $gzh_names = collect();
  82. foreach (explode('#', trim($gzh_ids, '#')) as $gzh_id) {
  83. if($gzh_id) {
  84. $gzh_names->push($gzhs->get($gzh_id)->nick_name ?? 'ID:'. $gzh_id);
  85. }
  86. }
  87. return $gzh_names->unique()->join(', ');
  88. }
  89. /**
  90. * 新增
  91. * @param Request $request
  92. */
  93. public function add(Request $request) {
  94. $this->validate($request, [
  95. 'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
  96. 'u_type' => 'required|in:1,2', 'ug_id' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
  97. ]);
  98. $now = date('Y-m-d H:i:s');
  99. DB::table('wechat_kf_messages')
  100. ->insert([
  101. 'name' => $request->input('name'),
  102. 'message_type' => $request->input('message_type'),
  103. 'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
  104. 'u_type' => $request->input('u_type', 1),
  105. 'ug_id' => $request->input('ug_id', 0),
  106. 'send_at' => $request->input('send_at'),
  107. 'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND,
  108. 'user_id' => $this->getLoginUserId(),
  109. 'created_at' => $now,
  110. 'updated_at' => $now,
  111. ]);
  112. return 'ok';
  113. }
  114. /**
  115. * 修改客服消息内容
  116. * @param Request $request
  117. */
  118. public function updateContent(Request $request) {
  119. $this->validate($request, [
  120. 'id' => 'required',
  121. 'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
  122. 'u_type' => 'required|in:1,2', 'ug_id' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
  123. ]);
  124. $now = date('Y-m-d H:i:s');
  125. DB::table('wechat_kf_messages')
  126. ->where([
  127. ['id', '=', $request->input('id')],
  128. ['user_id', '=', $this->getLoginUserId()],
  129. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  130. ['is_enabled', '=', 1],
  131. ])->update([
  132. 'name' => $request->input('name'),
  133. 'message_type' => $request->input('message_type'),
  134. 'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
  135. 'u_type' => $request->input('u_type', '1'),
  136. 'ug_id' => $request->input('ug_id', 0),
  137. 'send_at' => $request->input('send_at'),
  138. 'updated_at' => $now,
  139. ]);
  140. return 'ok';
  141. }
  142. /**
  143. * 修改配置的公众号
  144. * @param Request $request
  145. */
  146. public function updateGZH(Request $request){
  147. $this->validate($request, [
  148. 'id' => 'required',
  149. ]);
  150. $message = WechatKfMessageModel::where([
  151. ['id', '=', $request->input('id')],
  152. ['user_id', '=', $this->getLoginUserId()],
  153. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  154. ['is_enabled', '=', 1],
  155. ])->first();
  156. if($message) {
  157. $allGzhIds = $request->input('gzh_ids');
  158. if(2 == $message->u_type && collect($allGzhIds)->isNotEmpty()) {
  159. $configGzhIds = DB::table('gzh_ug_maps')
  160. ->where([
  161. ['is_enabled', '=', 1],
  162. ['ug_id', '=', $message->id]
  163. ])->select('gzh_id')->get()->pluck('gzh_id');
  164. if(collect($allGzhIds)->diff($configGzhIds)->isNotEmpty()) {
  165. $gzhNames = DB::table('wechat_authorization_infos')
  166. ->whereIn('id', collect($allGzhIds)->diff($configGzhIds)->unique())
  167. ->select( 'nick_name')
  168. ->get()->pluck('nick_name')->join(', ');
  169. CommonBusinessException::throwError([
  170. Errors::OPENPLATFORM_UG_MAP_GZH_NOT_EXIST[0], $gzhNames. ' 等公众号没有配置对应用户分群'
  171. ]);
  172. }
  173. }
  174. $message->gzh_ids = sprintf('#%s#', join('#', array_unique($request->input('gzh_ids'))));
  175. $message->save();
  176. }
  177. return 'ok';
  178. }
  179. /**
  180. * 停止发送
  181. * @param Request $request
  182. */
  183. public function stop(Request $request) {
  184. $this->validate($request, [
  185. 'id' => 'required'
  186. ]);
  187. $now = date('Y-m-d H:i:s');
  188. DB::table('wechat_kf_messages')
  189. ->where([
  190. ['id', '=', $request->input('id')],
  191. ['user_id', '=', $this->getLoginUserId()],
  192. ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
  193. ['is_enabled', '=', 1],
  194. ])->update([
  195. 'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_STOP,
  196. 'updated_at' => $now,
  197. ]);
  198. return 'ok';
  199. }
  200. /**
  201. * 删除
  202. * @param Request $request
  203. */
  204. public function delete(Request $request){
  205. $this->validate($request, [
  206. 'ids' => 'required'
  207. ]);
  208. $now = date('Y-m-d H:i:s');
  209. foreach ($request->input('ids') as $id) {
  210. DB::table('wechat_kf_messages')
  211. ->where([
  212. ['id', '=', $id],
  213. ['user_id', '=', $this->getLoginUserId()],
  214. ['status', '<>', WechatPlatformConstService::KF_MESSAGE_STATUS_SENDING],
  215. ['is_enabled', '=', 1],
  216. ])->update([
  217. 'is_enabled' => 0,
  218. 'updated_at' => $now,
  219. ]);
  220. DB::table('wechat_kf_message_send_records')
  221. ->where([
  222. ['message_id', '=', $id],
  223. ['is_enabled', '=', 1]
  224. ])->update([
  225. 'is_enabled' => 0,
  226. 'updated_at' => $now,
  227. ]);
  228. }
  229. return 'ok';
  230. }
  231. /**
  232. * 测试发送
  233. * @param Request $request
  234. */
  235. public function testSend(Request $request) {
  236. $this->validate($request, [
  237. 'gzh_id' => 'required', 'message_id' => 'required', 'openid' => 'required'
  238. ]);
  239. GZHSendKFMessage::dispatch([
  240. 'gzhId' => $request->input('gzh_id'),
  241. 'messageId' => $request->input('message_id'),
  242. 'openid' => $request->input('openid'),
  243. 'isTest' => true,
  244. 'traceInfo' => getTraceContext()->getTraceInfo(),
  245. ])->onQueue('{duanju_manage}.wechatPlatform.sendKFMessage')
  246. ->onConnection('queue-redis');
  247. return 'ok';
  248. }
  249. }