Nav apraksta

TemplateController.php 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. <?php
  2. /**
  3. * Created by Sublime.
  4. * User: Williamslife Wang
  5. * Date: 17/10/18
  6. * Time: 上午11:20
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Http\Controllers\Controller;
  10. use App\Admin;
  11. use Illuminate\Http\Request;
  12. use App\Templates;
  13. use App\TemplatesSalers;
  14. use App\TemplatesSource;
  15. use App\TemplatesSourceSalers;
  16. use App\AdminRole;
  17. use App\TemplatesLog;
  18. use App\CustDetail;
  19. use App\Order;
  20. use App\Services\OssServices as oss;
  21. use Illuminate\Support\Facades\DB;
  22. class TemplateController extends Controller
  23. {
  24. /**
  25. * @return \Illuminate\View\View
  26. */
  27. public function index(Request $request)
  28. {
  29. $page = (int)$request->input('page');
  30. $pageSize = 20;
  31. if($page<=0){
  32. $page = 1;
  33. }
  34. $offset = ($page-1) * $pageSize;
  35. $count = Templates::where('is_del',0)->count();
  36. if ($count > 1) {
  37. // 总页数
  38. $pages = ceil($count/$pageSize);
  39. }else{
  40. // 总页数
  41. $pages = 1;
  42. }
  43. $result = Templates::where('is_del',0)->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  44. $result = json_decode(json_encode($result),true);
  45. foreach($result as $k=>&$v){
  46. # 获取销售
  47. $salers = TemplatesSalers::select('templates_salers.*', 'admin.realname as admin_name')->leftJoin('admin', 'admin.id', '=', 'templates_salers.admin_id')->where('templates_salers.t_id', $v['id'])->where('templates_salers.is_del', 0)->get();
  48. $v['salers'] = $salers;
  49. $v['salers_k'] = count($salers);
  50. }
  51. return view('template/index', ['result' =>$result,
  52. 'page' =>$page,
  53. 'count' =>$count,
  54. 'pages' =>$pages,
  55. ]);
  56. }
  57. /**
  58. * @return \Illuminate\View\View
  59. */
  60. public function create()
  61. {
  62. return view('template/create');
  63. }
  64. /**
  65. * @param Request $request
  66. * @return \Illuminate\Http\RedirectResponse
  67. */
  68. public function store(Request $request)
  69. {
  70. $this->validate($request, [
  71. 'url' => 'required|unique:templates',
  72. ], [
  73. 'url.required' => '模板链接不能为空',
  74. 'url.unique' => '该模板链接已存在',
  75. ]);
  76. $template = new Templates();
  77. $template->url = trim($request->input('url'));
  78. $template->note = trim($request->input('note'));
  79. //图片上传 阿里云oss
  80. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  81. $file = $request->file('img');
  82. $ossClient=new oss();
  83. // 上传阿里云
  84. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  85. $img=$file['oss-request-url'];
  86. $template->img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  87. }
  88. $template->save();
  89. return redirect('/admin/template/index')->with('info', '添加模板成功');
  90. }
  91. /**
  92. * @param $id
  93. * @return \Illuminate\View\View
  94. */
  95. public function edit($id)
  96. {
  97. $template = Templates::findOrFail($id);
  98. return view('template/edit', ['template' => $template, 'id'=>$id]);
  99. }
  100. /**
  101. * @param Request $request
  102. * @return \Illuminate\Http\RedirectResponse
  103. */
  104. public function update(Request $request)
  105. {
  106. $id = (int)$request->input('id');
  107. $this->validate($request, [
  108. 'url' => 'required|unique:templates,url,'.$id.',id',
  109. ], [
  110. 'url.required' => '模板链接不能为空',
  111. 'url.unique' => '该模板链接已存在',
  112. ]);
  113. $template = Templates::findOrFail($id);
  114. $template->url = trim($request->input('url'));
  115. $template->note = trim($request->input('note'));
  116. //图片上传 阿里云oss
  117. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  118. $file = $request->file('img');
  119. $ossClient=new oss();
  120. // 上传阿里云
  121. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  122. $img=$file['oss-request-url'];
  123. $template->img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  124. }
  125. $template->save();
  126. return redirect('/admin/template/index')->with('info', '修改模板成功');
  127. }
  128. /**
  129. * @param $id
  130. * @return \Illuminate\Http\RedirectResponse
  131. */
  132. public function assignSalers(Request $request)
  133. {
  134. $t_id = (int)$request->input('id');
  135. $salers = $request->input('salers');
  136. $assign_type = (int)$request->input('assign_type');
  137. if( empty($salers) ){
  138. exit('<script>parent.layer.msg("分配失败,未选择销售!",{icon:2,time:2000}); var index=parent.layer.getFrameIndex(window.name); parent.layer.close(index);</script>');
  139. }
  140. if($assign_type == 1){
  141. //平均分配
  142. $count = count($salers);
  143. $weight_avg = round(1000 / $count) / 10;
  144. }else{
  145. $weights = array();
  146. $total = 0;
  147. foreach( $salers as $k=>$id ){
  148. $weight_id = 'weight'.$id;
  149. $weights[$k] = trim( $request->input($weight_id) );
  150. if(!$weights[$k]){
  151. $weights[$k] = 0;
  152. }
  153. $total += $weights[$k];
  154. }
  155. if($total>100){
  156. exit('<script>parent.layer.msg("分配权重之和不能超过100!",{icon:2,time:2000}); var index=parent.layer.getFrameIndex(window.name); parent.layer.close(index);</script>');
  157. }
  158. }
  159. //如果已经有 ,删除未选中
  160. TemplatesSalers::where('t_id', $t_id)->whereNotIn('admin_id',$salers)->update(['is_del'=>1]);
  161. foreach( $salers as $k=>$admin_id ){
  162. if($assign_type == 1){
  163. $weight = $weight_avg;
  164. }else{
  165. $weight = $weights[$k];
  166. }
  167. TemplatesSalers::updateOrCreate( ['t_id'=>$t_id, 'admin_id'=>$admin_id], ['is_del'=>0, 'weight'=>$weight] );
  168. }
  169. exit('<script>parent.layer.msg("操作成功!",{icon:1,time:1000}); var index=parent.layer.getFrameIndex(window.name); parent.location.href="/admin/template/index";parent.layer.close(index);</script>');
  170. }
  171. /**
  172. * 获取分配销售
  173. * @return \Illuminate\View\View
  174. */
  175. public function getAssigns(Request $request){
  176. $id = $request->input('id');
  177. #销售筛选
  178. //$saler_ids = DB::table('admin_role')->where('role_name', '销售')->lists('user_id');
  179. $adminList = Admin::select('id', 'realname', 'username', 'team_id')->where('id','>', 1)->where(function ($query) {
  180. $query->whereNotNull('qrcode')->where('qrcode', '<>', '');
  181. })->get();
  182. $adminList = json_decode(json_encode($adminList), true);
  183. $assign_admin = TemplatesSalers::where('t_id', $id)->where('is_del', 0)->lists('weight', 'admin_id');
  184. $team_info = DB::table('teams')->lists('name', 'id');
  185. foreach($adminList as &$admin){
  186. if( isset($assign_admin[$admin['id']]) ){
  187. $admin['weight'] = $assign_admin[$admin['id']];
  188. }else{
  189. $admin['weight'] = '';
  190. }
  191. if(isset($team_info[$admin['team_id']])){
  192. $admin['team_name'] = $team_info[$admin['team_id']];
  193. }else{
  194. $admin['team_name'] = '';
  195. }
  196. }
  197. return view('template/assign', [
  198. 'adminlist' =>$adminList,
  199. 'id' =>$id
  200. ]);
  201. }
  202. /**
  203. * @return \Illuminate\View\View
  204. */
  205. public function logindex(Request $request)
  206. {
  207. $page = (int)$request->input('page');
  208. $pageSize = 20;
  209. if($page<=0){
  210. $page = 1;
  211. }
  212. $offset = ($page-1) * $pageSize;
  213. $count = TemplatesLog::count();
  214. if ($count > 1) {
  215. // 总页数
  216. $pages = ceil($count/$pageSize);
  217. }else{
  218. // 总页数
  219. $pages = 1;
  220. }
  221. $result = TemplatesLog::orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  222. $result = json_decode(json_encode($result),true);
  223. foreach($result as $k=>&$v){
  224. # 获取销售名字
  225. $v['admin_name'] = Admin::where('id', $v['admin_id'])->pluck('realname');
  226. }
  227. return view('template/logindex', ['result' =>$result,
  228. 'page' =>$page,
  229. 'count' =>$count,
  230. 'pages' =>$pages,
  231. ]);
  232. }
  233. /**
  234. * 销售引流模板分配日志报表
  235. */
  236. public function templateLogReport(Request $request){
  237. $admin_id = (int)$request->input('admin_id');
  238. $team_id = (int)$request->input('team_id');
  239. $stime = $request->input('stime');
  240. $etime = $request->input('etime');
  241. //假如有团队筛选,检索销售队员
  242. $sale_ids = null;
  243. if($team_id>0){
  244. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  245. }
  246. $page = (int)$request->input('page');
  247. $pageSize = 20;
  248. if($page<=0){
  249. $page = 1;
  250. }
  251. $offset = ($page-1) * $pageSize;
  252. $count = TemplatesLog::select(DB::raw('left(create_time,10) as day,admin_id'))->where(function($query) use($admin_id, $stime, $etime, $sale_ids){
  253. if($admin_id>0) $query->where('admin_id', $admin_id);
  254. if($stime) $query->where('create_time', '>=', $stime);
  255. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  256. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  257. })->groupBy('day')->groupBy('admin_id')->get();
  258. $count = count($count);
  259. if ($count > 1) {
  260. // 总页数
  261. $pages = ceil($count/$pageSize);
  262. }else{
  263. // 总页数
  264. $pages = 1;
  265. }
  266. $result = TemplatesLog::select(DB::raw('left(create_time,10) as day,admin_id,count(1) as tcount, count(if(type=1,true,null)) as pv_count'))->where(function($query) use($admin_id, $stime, $etime, $sale_ids){
  267. if($admin_id>0) $query->where('admin_id', $admin_id);
  268. if($stime) $query->where('create_time', '>=', $stime);
  269. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  270. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  271. })->groupBy('day')->groupBy('admin_id')->orderBy('day', 'desc')->offset($offset)->limit($pageSize)->get();
  272. $result = json_decode(json_encode($result), true);
  273. foreach($result as $k=>&$v){
  274. //获取销售当天加粉情况
  275. $custDetail = CustDetail::select('fan_add', 'new_reply', 'new_consult', 'old_consult', 'admin_name')->where('dtime', $v['day'])->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  276. if(!empty($custDetail)){
  277. $v['fan_add'] = $custDetail->fan_add;
  278. $v['new_reply'] = $custDetail->new_reply;
  279. $v['old_consult'] = $custDetail->old_consult;
  280. $v['new_consult'] = $custDetail->new_consult;
  281. $v['admin_name'] = $custDetail->admin_name;
  282. }else{
  283. $v['fan_add'] = '';
  284. $v['new_reply'] = '';
  285. $v['old_consult'] = '';
  286. $v['new_consult'] = '';
  287. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  288. }
  289. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  290. //点击率
  291. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  292. $v['change_rate'] = $v['long_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['long_count'], 4 ) * 100 . '%' : '';
  293. }
  294. $teamList = DB::table('teams')->select('id', 'name')->get();
  295. $teamList = json_decode(json_encode($teamList), true);
  296. $adminList = DB::table('admin')->select('id', 'realname', 'username')->where('id','>', 1)->get();
  297. $adminList = json_decode(json_encode($adminList), true);
  298. return view('template/templateLogReport', ['result'=>$result,
  299. 'page' =>$page,
  300. 'count' =>$count,
  301. 'pages' =>$pages,
  302. 'teamlist' =>$teamList,
  303. 'adminlist' =>$adminList,
  304. 'team_id' =>$team_id,
  305. 'admin_id' =>$admin_id,
  306. 'stime' =>$stime,
  307. 'etime' =>$etime,
  308. ]);
  309. }
  310. /**
  311. * 销售引流模板分配日志报表
  312. */
  313. public function templateLogReport_export(Request $request){
  314. $admin_id = (int)$request->input('admin_id');
  315. $team_id = (int)$request->input('team_id');
  316. $stime = $request->input('stime');
  317. $etime = $request->input('etime');
  318. //假如有团队筛选,检索销售队员
  319. $sale_ids = null;
  320. if($team_id>0){
  321. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  322. }
  323. $result = TemplatesLog::select(DB::raw('left(create_time,10) as day,admin_id,count(1) as tcount, count(if(type=1,true,null)) as pv_count'))->where(function($query) use($admin_id, $stime, $etime, $sale_ids){
  324. if($admin_id>0) $query->where('admin_id', $admin_id);
  325. if($stime) $query->where('create_time', '>=', $stime);
  326. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  327. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  328. })->groupBy('day')->groupBy('admin_id')->orderBy('day', 'desc')->get();
  329. $result = json_decode(json_encode($result), true);
  330. foreach($result as $k=>&$v){
  331. //获取销售当天加粉情况
  332. $custDetail = CustDetail::select('fan_add', 'new_reply', 'new_consult', 'old_consult', 'admin_name')->where('dtime', $v['day'])->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  333. if(!empty($custDetail)){
  334. $v['fan_add'] = $custDetail->fan_add;
  335. $v['new_reply'] = $custDetail->new_reply;
  336. $v['old_consult'] = $custDetail->old_consult;
  337. $v['new_consult'] = $custDetail->new_consult;
  338. $v['admin_name'] = $custDetail->admin_name;
  339. }else{
  340. $v['fan_add'] = '';
  341. $v['new_reply'] = '';
  342. $v['old_consult'] = '';
  343. $v['new_consult'] = '';
  344. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  345. }
  346. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  347. //点击率
  348. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  349. $v['change_rate'] = $v['long_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['long_count'], 4 ) * 100 . '%' : '';
  350. }
  351. $indexKey = ['day','admin_name','pv_count','long_count','fan_add','click_rate','change_rate','new_reply','new_consult','old_consult'];
  352. $title = ['日期', '销售名', 'PV量', '长按次数', '加粉数', '点击率', '转化率', '新粉回复数', '新粉询价数', '老粉询价数'];
  353. $filename = 'xiaoshoudaofen_'.date('Y-m-d_H').'.xlsx';
  354. return Order::export_excel($result, $filename, $indexKey, $title);
  355. }
  356. /*
  357. * @return \Illuminate\View\View
  358. */
  359. public function sourceindex(Request $request)
  360. {
  361. $page = (int)$request->input('page');
  362. $pageSize = 20;
  363. if($page<=0){
  364. $page = 1;
  365. }
  366. $offset = ($page-1) * $pageSize;
  367. $count = TemplatesSource::where('is_del',0)->count();
  368. if ($count > 1) {
  369. // 总页数
  370. $pages = ceil($count/$pageSize);
  371. }else{
  372. // 总页数
  373. $pages = 1;
  374. }
  375. $result = TemplatesSource::where('is_del',0)->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  376. $result = json_decode(json_encode($result),true);
  377. foreach($result as $k=>&$v){
  378. # 获取销售
  379. $salers = TemplatesSourceSalers::select('templates_source_salers.*', 'admin.realname as admin_name')->leftJoin('admin', 'admin.id', '=', 'templates_source_salers.admin_id')->where('templates_source_salers.t_id', $v['id'])->where('templates_source_salers.is_del', 0)->get();
  380. $v['salers'] = $salers;
  381. $v['salers_k'] = count($salers);
  382. # 获取模板图
  383. $v['img'] = Templates::where('id', $v['t_id'])->pluck('img');
  384. }
  385. return view('template/sourceindex', ['result' =>$result,
  386. 'page' =>$page,
  387. 'count' =>$count,
  388. 'pages' =>$pages,
  389. ]);
  390. }
  391. /**
  392. * @return \Illuminate\View\View
  393. */
  394. public function sourcecreate()
  395. {
  396. return view('template/sourcecreate');
  397. }
  398. /**
  399. * @param Request $request
  400. * @return \Illuminate\Http\RedirectResponse
  401. */
  402. public function sourcestore(Request $request)
  403. {
  404. $this->validate($request, [
  405. 't_id' => 'required',
  406. ], [
  407. 't_id.required' => '模板不能为空',
  408. ]);
  409. $template = new TemplatesSource();
  410. $template->t_id = intval($request->input('t_id'));
  411. $template->note = trim($request->input('note'));
  412. //图片上传 阿里云oss
  413. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  414. $file = $request->file('img');
  415. $ossClient=new oss();
  416. // 上传阿里云
  417. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  418. $img=$file['oss-request-url'];
  419. $template->back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  420. }
  421. if($template->save()){
  422. //生成连接
  423. $template->url = $this->createSourceUrl($template->t_id, $template->id);
  424. $template->save();
  425. }
  426. return redirect('/admin/template/sourceindex')->with('info', '添加模板成功');
  427. }
  428. /**
  429. * @param $id
  430. * @return \Illuminate\View\View
  431. */
  432. public function sourceedit($id)
  433. {
  434. $template = TemplatesSource::findOrFail($id);
  435. return view('template/sourceedit', ['template' => $template, 'id'=>$id]);
  436. }
  437. /**
  438. * @param Request $request
  439. * @return \Illuminate\Http\RedirectResponse
  440. */
  441. public function sourceupdate(Request $request)
  442. {
  443. $id = (int)$request->input('id');
  444. $this->validate($request, [
  445. 't_id' => 'required',
  446. ], [
  447. 't_id.required' => '模板不能为空',
  448. ]);
  449. $template = TemplatesSource::findOrFail($id);
  450. $t_id = (int)$request->input('t_id');
  451. if( $template->t_id != $t_id ){
  452. //模板更改,生成新连接
  453. $template->t_id = $t_id;
  454. $template->url = $this->createSourceUrl($t_id, $template->id);
  455. }
  456. $template->note = trim($request->input('note'));
  457. //图片上传 阿里云oss
  458. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  459. $file = $request->file('img');
  460. $ossClient=new oss();
  461. // 上传阿里云
  462. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  463. $img=$file['oss-request-url'];
  464. $template->back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  465. }
  466. $template->save();
  467. return redirect('/admin/template/sourceindex')->with('info', '修改成功');
  468. }
  469. }