AppealController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?php
  2. namespace App\Admin\Controllers\Content;
  3. use App\Admin\Extensions\Tools\DialogTool;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\Appeal;
  6. use App\Models\AuditReason;
  7. use App\Models\Subsite;
  8. use Encore\Admin\Controllers\HasResourceActions;
  9. use Encore\Admin\Facades\Admin;
  10. use Encore\Admin\Form;
  11. use Encore\Admin\Grid;
  12. use Encore\Admin\Grid\Filter;
  13. use Encore\Admin\Layout\Content;
  14. use Encore\Admin\Show;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Cache;
  17. use App\Services\Common\EmailService;
  18. class AppealController extends Controller
  19. {
  20. use HasResourceActions;
  21. protected $emailService;
  22. /**
  23. * AppealController constructor.
  24. * @param $emailService
  25. */
  26. public function __construct(EmailService $emailService)
  27. {
  28. $this->emailService = $emailService;
  29. }
  30. /**
  31. * Index interface.
  32. *
  33. * @param Content $content
  34. * @return Content
  35. */
  36. public function index(Content $content)
  37. {
  38. return $content
  39. ->header('账号申诉')
  40. ->description(' ')
  41. ->body(view('admin.content.appeal')->with(['grid'=>$this->grid()]));
  42. }
  43. /**
  44. * Show interface.
  45. *
  46. * @param mixed $id
  47. * @param Content $content
  48. * @return Content
  49. */
  50. public function show($id, Content $content)
  51. {
  52. return $content
  53. ->header('Detail')
  54. ->description('description')
  55. ->body($this->detail($id));
  56. }
  57. /**
  58. * Edit interface.
  59. *
  60. * @param mixed $id
  61. * @param Content $content
  62. * @return Content
  63. */
  64. public function edit($id, Content $content)
  65. {
  66. return $content
  67. ->header('Edit')
  68. ->description('description')
  69. ->body($this->form()->edit($id));
  70. }
  71. /**
  72. * Create interface.
  73. *
  74. * @param Content $content
  75. * @return Content
  76. */
  77. public function create(Content $content)
  78. {
  79. return $content
  80. ->header('Create')
  81. ->description('description')
  82. ->body($this->form());
  83. }
  84. /**
  85. * Make a grid builder.
  86. *
  87. * @return Grid
  88. */
  89. protected function grid()
  90. {
  91. $grid = new Grid(new Appeal);
  92. if (get_subsite_id() != 0) {
  93. $where['subsite_id'] = get_subsite_id();
  94. $grid->model()->where($where)->orderBy('status', 'asc')->orderBy('created_at', 'desc');
  95. } else {
  96. $grid->model()->orderBy('status', 'asc')->orderBy('created_at', 'desc');
  97. }
  98. $grid->real_name('真实姓名');
  99. $grid->status('处理状态')->display(function () {
  100. return $this->status?'已处理':'<span style="color:#ff0000;">未处理</span>';
  101. });
  102. $grid->description('申诉描述')->display(function () {
  103. return '<span class="vtip" title="'.$this->description.'">'.cut_str($this->description, 35, 0, "...").'</span>';
  104. })->width(300);
  105. $grid->mobile('手机号码');
  106. $grid->email('联系邮箱')->width(300);
  107. if(get_subsite_open()){
  108. $grid->subsite_id('所属分站')->display(function () {
  109. $subsites = Cache::get('subsites_list');
  110. if (array_has($subsites, $this->subsite_id)) {
  111. return $subsites[$this->subsite_id]['sitename'];
  112. }
  113. return '';
  114. });
  115. }
  116. $grid->created_at('申诉时间');
  117. $grid->actions(function ($actions) {
  118. if (Admin::user()->can('content_appeal_audit')) {
  119. $actions->append("<button class='btn btn-primary btn-xs jobaudit' data-code=".$actions->row['id'].">处理</button>");
  120. }
  121. if ($actions->row->status == 0 && Admin::user()->can('content_appeal_sendemail')) {
  122. $actions->append("<button class='btn btn-primary btn-xs send_email' data-code=".$actions->row['id']." data-email=".$actions->row['email']."><i class='fa fa-envelope-o'></i> 发送邮件</button>");
  123. }
  124. if (Admin::user()->can('content_appeal_delete')) {
  125. $actions->disableDelete(false);
  126. }
  127. });
  128. if (Admin::user()->can('content_appeal_delete')) {
  129. $grid->tools(function ($tools) {
  130. $tools->batch(function ($batch) {
  131. $batch->disableDelete(false);
  132. });
  133. });
  134. }
  135. if (!Admin::user()->can('content_appeal_delete') && !Admin::user()->can('content_appeal_audit')) {
  136. $grid->disableRowSelector();
  137. }
  138. $grid->filter(function (Filter $filter) {
  139. $filter->disableIdFilter();
  140. $filter->column(2/3, function ($filter) {
  141. $subsites = Subsite::where(array('effective'=>1))->orderBy('order', 'asc')->get()->pluck('sitename', 'id')->toArray();
  142. if ($subsites) {
  143. $subsites = array('' => '不限', '0' => '总站') + $subsites;
  144. $filter->equal('subsite_id', '所属分站')->select($subsites);
  145. }
  146. if (get_subsite_id() == 0) {
  147. $nums = Appeal::where(array('status'=>'0'))->get()->count();
  148. } else {
  149. $nums = Appeal::where(array('status'=>'0', 'subsite_id'=>get_subsite_id()))->get()->count();
  150. }
  151. $num_html ='';
  152. if ($nums>0) {
  153. //$num_html = '<span style="color:#ff0000;">('.$nums.')</span>';
  154. $num_html = '('.$nums.')';
  155. }
  156. $status_option = array('0'=>'未处理'.$num_html,'1'=>'已处理');
  157. $status_option = array(''=>'不限')+$status_option;
  158. $filter->equal('status', '处理状态')->radio($status_option);
  159. $date3 = date('Y-m-d', strtotime("-3 day"));
  160. $date7 = date('Y-m-d', strtotime("-7 day"));
  161. $date30 = date("Y-m-d", strtotime("-1 month"));
  162. $date180 = date("Y-m-d", strtotime("-6 month"));
  163. $date360 = date("Y-m-d", strtotime("-1 year"));
  164. $date_option = array(
  165. '' => '不限',
  166. $date3 => '三天内',
  167. $date7 => '一周内',
  168. $date30 => '一月内',
  169. $date180 => '半年内',
  170. $date360 => '一年内',
  171. );
  172. $filter->where(function ($query) {
  173. $query->where('created_at', '>=', "{$this->input}");
  174. }, '申诉时间', 'created_at')->radio($date_option);
  175. });
  176. });
  177. //审核功能
  178. if (Admin::user()->can('content_appeal_audit')) {
  179. $grid->tools(function ($tools) {
  180. $form = new \Encore\Admin\Widgets\Form();
  181. $form->action(route('appeal.audit'));
  182. $status_option = array('0'=>'未处理','1'=>'已处理');
  183. $form->radio('status', '将所选账号申诉设置为:')->options($status_option)->default(1)->setWidth(8, 4);
  184. $form->hidden('ids');
  185. $form->json('val');
  186. $config = array('title'=>'处理账号申诉','button'=>'处理','dialog_cancel' => "取消", 'dialog_ok' => "确认", 'is_batch' => true);
  187. $tools->append(new DialogTool($form, $config));
  188. });
  189. }
  190. /*$grid->tools(function (Grid\Tools $tools) {
  191. $tools->disableRefreshButton();
  192. });*/
  193. return $grid;
  194. }
  195. public function audit(Request $request)
  196. {
  197. $rst = $request->validate(['status'=>'required'], array('status.required'=>'请选择处理状态'));
  198. $ids = $request->input('ids');
  199. if (empty($ids)) {
  200. if($request->type) {
  201. admin_toastr('请选择需要处理的数据', 'error');
  202. return back();
  203. }else{
  204. return admin_toastr('请选择需要处理的数据', 'error');
  205. }
  206. }
  207. $id_arr = explode(',', $ids);
  208. $update_data = array(
  209. 'status' => $request->input('status'),
  210. 'updated_at' => date('Y-m-d H:i:s', time())
  211. );
  212. if (Appeal::whereIn('id', $id_arr)->update($update_data) === false) {
  213. if($request->type) {
  214. admin_toastr('处理失败', 'error');
  215. return back();
  216. }else{
  217. return admin_toastr('处理失败', 'error');
  218. }
  219. } else {
  220. //添加审核日志
  221. $reason_data = array('ids'=>$id_arr,'status'=>$request->input('status'),'type'=>'7');
  222. if ($request->input('audit')=='1') {
  223. $reason_data['reason'] = '将所选账号申诉设置为已处理';
  224. } else {
  225. $reason_data['reason'] = '将所选账号申诉设置为未处理';
  226. }
  227. AuditReason::addData($reason_data);
  228. if($request->type) {
  229. admin_toastr('处理成功', 'success');
  230. return back();
  231. }else{
  232. return admin_toastr('处理成功', 'success');
  233. }
  234. }
  235. }
  236. /**
  237. * Make a show builder.
  238. *
  239. * @param mixed $id
  240. * @return Show
  241. */
  242. protected function detail($id)
  243. {
  244. $show = new Show(Appeal::findOrFail($id));
  245. $show->id('ID');
  246. $show->real_name('真实姓名');
  247. $show->mobile('手机号码');
  248. $show->email('联系邮箱');
  249. $show->description('描述');
  250. if(get_subsite_open()){
  251. $show->subsite_id('所属分站')->as(function ($subsite_id) {
  252. if ($subsite_id) {
  253. $Subsite = Subsite::findOrFail($subsite_id);
  254. return $Subsite->sitename;
  255. }
  256. return '总站';
  257. });
  258. }
  259. $show->status('处理状态')->as(function ($status) {
  260. if ($status) {
  261. return '已处理';
  262. }
  263. return '未处理';
  264. });
  265. $show->created_at('申诉时间');
  266. $show->updated_at('处理时间');
  267. /*$show->panel()->tools(function ($tools) {
  268. $tools->disableEdit();
  269. $tools->disableDelete();
  270. });*/
  271. return $show;
  272. }
  273. /**
  274. * Make a form builder.
  275. *
  276. * @return Form
  277. */
  278. protected function form()
  279. {
  280. $form = new Form(new Appeal);
  281. $form->display('ID');
  282. $form->display('Created at');
  283. $form->display('Updated at');
  284. return $form;
  285. }
  286. //发送邮件
  287. public function sendEmail(Request $request)
  288. {
  289. $username = $request->input('username', '');
  290. $password = $request->input('pwd', '');
  291. $email = $request->input('email', '');
  292. $id = $request->input('ids', '');
  293. if (!$username) {
  294. admin_toastr('请输入登录用户名!', 'error');
  295. return back();
  296. }
  297. if (!$password) {
  298. admin_toastr('请输入登录密码!', 'error');
  299. return back();
  300. }
  301. if (!$id || !$email) {
  302. admin_toastr('发送失败,参数错误!', 'error');
  303. return back();
  304. }
  305. if (!fieldRegex($email, 'email')) {
  306. admin_toastr('发送失败,邮箱格式错误!', 'error');
  307. return back();
  308. }
  309. $body = '您好,您的帐号申诉已被受理!您的登录账号是:'.$username.',登录密码是:'.$password.'。';
  310. $title = '账号申诉回执邮件';
  311. $this->emailService->sendMail($email, EmailService::TEMPLATE_SEND_CONTENT, ['title'=>$title], ['content'=>$body]);
  312. //修改处理字段
  313. $update_data = array(
  314. 'status' => 1,
  315. 'updated_at' => date('Y-m-d H:i:s', time())
  316. );
  317. $id_arr = explode(',', $id);
  318. Appeal::whereIn('id', $id_arr)->update($update_data);
  319. admin_toastr('回执邮件发送成功!', 'success');
  320. return back();
  321. }
  322. }