No Description

TemplateController.php 38KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  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\TemplatesBackimg;
  19. use App\CustDetail;
  20. use App\Order;
  21. use App\Services\OssServices as oss;
  22. use Illuminate\Support\Facades\DB;
  23. class TemplateController extends Controller
  24. {
  25. /**
  26. * @return \Illuminate\View\View
  27. */
  28. public function index(Request $request)
  29. {
  30. $page = (int)$request->input('page');
  31. $pageSize = 20;
  32. if($page<=0){
  33. $page = 1;
  34. }
  35. $offset = ($page-1) * $pageSize;
  36. $count = Templates::where('is_del',0)->count();
  37. if ($count > 1) {
  38. // 总页数
  39. $pages = ceil($count/$pageSize);
  40. }else{
  41. // 总页数
  42. $pages = 1;
  43. }
  44. $result = Templates::where('is_del',0)->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  45. $result = json_decode(json_encode($result),true);
  46. foreach($result as $k=>&$v){
  47. # 获取销售
  48. $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)->where('admin.is_use', 1)->get();
  49. $v['salers'] = $salers;
  50. $v['salers_k'] = count($salers);
  51. }
  52. return view('template/index', ['result' =>$result,
  53. 'page' =>$page,
  54. 'count' =>$count,
  55. 'pages' =>$pages,
  56. ]);
  57. }
  58. /**
  59. * @return \Illuminate\View\View
  60. */
  61. public function create()
  62. {
  63. return view('template/create');
  64. }
  65. /**
  66. * @param Request $request
  67. * @return \Illuminate\Http\RedirectResponse
  68. */
  69. public function store(Request $request)
  70. {
  71. $this->validate($request, [
  72. 'url' => 'required|unique:templates',
  73. ], [
  74. 'url.required' => '模板链接不能为空',
  75. 'url.unique' => '该模板链接已存在',
  76. ]);
  77. $template = new Templates();
  78. $template->url = trim($request->input('url'));
  79. $template->note = trim($request->input('note'));
  80. //图片上传 阿里云oss
  81. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  82. $file = $request->file('img');
  83. $ossClient=new oss();
  84. // 上传阿里云
  85. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  86. $img=$file['oss-request-url'];
  87. $template->img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  88. }
  89. $template->save();
  90. return redirect('/admin/template/index')->with('info', '添加模板成功');
  91. }
  92. /**
  93. * @param $id
  94. * @return \Illuminate\View\View
  95. */
  96. public function edit($id)
  97. {
  98. $template = Templates::findOrFail($id);
  99. return view('template/edit', ['template' => $template, 'id'=>$id]);
  100. }
  101. /**
  102. * @param Request $request
  103. * @return \Illuminate\Http\RedirectResponse
  104. */
  105. public function update(Request $request)
  106. {
  107. $id = (int)$request->input('id');
  108. $this->validate($request, [
  109. 'url' => 'required|unique:templates,url,'.$id.',id',
  110. ], [
  111. 'url.required' => '模板链接不能为空',
  112. 'url.unique' => '该模板链接已存在',
  113. ]);
  114. $template = Templates::findOrFail($id);
  115. $template->url = trim($request->input('url'));
  116. $template->note = trim($request->input('note'));
  117. //图片上传 阿里云oss
  118. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  119. $file = $request->file('img');
  120. $ossClient=new oss();
  121. // 上传阿里云
  122. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  123. $img=$file['oss-request-url'];
  124. $template->img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  125. }
  126. $template->save();
  127. return redirect('/admin/template/index')->with('info', '修改模板成功');
  128. }
  129. /**
  130. * @param $id
  131. * @return \Illuminate\Http\RedirectResponse
  132. */
  133. public function assignSalers(Request $request)
  134. {
  135. $s_id = (int)$request->input('id');
  136. $salers = $request->input('salers');
  137. $assign_type = (int)$request->input('assign_type');
  138. if( empty($salers) ){
  139. exit('<script>parent.layer.msg("分配失败,未选择销售!",{icon:2,time:2000}); var index=parent.layer.getFrameIndex(window.name); parent.layer.close(index);</script>');
  140. }
  141. if($assign_type == 1){
  142. //平均分配
  143. $count = count($salers);
  144. $weight_avg = round(1000 / $count) / 10;
  145. }else{
  146. $weights = array();
  147. $total = 0;
  148. foreach( $salers as $k=>$id ){
  149. $weight_id = 'weight'.$id;
  150. $weights[$k] = trim( $request->input($weight_id) );
  151. if(!$weights[$k]){
  152. $weights[$k] = 0;
  153. }
  154. $total += $weights[$k];
  155. }
  156. if($total>100){
  157. exit('<script>parent.layer.msg("分配权重之和不能超过100!",{icon:2,time:2000}); var index=parent.layer.getFrameIndex(window.name); parent.layer.close(index);</script>');
  158. }
  159. }
  160. //如果已经有 ,删除未选中
  161. TemplatesSourceSalers::where('s_id', $s_id)->whereNotIn('admin_id',$salers)->update(['is_del'=>1]);
  162. foreach( $salers as $k=>$admin_id ){
  163. if($assign_type == 1){
  164. $weight = $weight_avg;
  165. }else{
  166. $weight = $weights[$k];
  167. }
  168. TemplatesSourceSalers::updateOrCreate( ['s_id'=>$s_id, 'admin_id'=>$admin_id], ['is_del'=>0, 'weight'=>$weight] );
  169. }
  170. exit('<script>parent.layer.msg("操作成功!",{icon:1,time:1000}); var index=parent.layer.getFrameIndex(window.name); parent.location.href="/admin/template/sourceindex";parent.layer.close(index);</script>');
  171. }
  172. /**
  173. * 获取分配销售
  174. * @return \Illuminate\View\View
  175. */
  176. public function getAssigns(Request $request){
  177. $id = $request->input('id');
  178. #销售筛选
  179. //$saler_ids = DB::table('admin_role')->where('role_name', '销售')->lists('user_id');
  180. $adminList = Admin::select('id', 'realname', 'username', 'team_id')->where('id','>', 1)->where('is_use', 1)->where(function ($query) {
  181. $query->whereNotNull('qrcode')->where('qrcode', '<>', '');
  182. })->get();
  183. $adminList = json_decode(json_encode($adminList), true);
  184. $assign_admin = TemplatesSourceSalers::where('s_id', $id)->where('is_del', 0)->lists('weight', 'admin_id');
  185. $team_info = DB::table('teams')->lists('name', 'id');
  186. foreach($adminList as &$admin){
  187. if( isset($assign_admin[$admin['id']]) ){
  188. $admin['weight'] = $assign_admin[$admin['id']];
  189. }else{
  190. $admin['weight'] = '';
  191. }
  192. if(isset($team_info[$admin['team_id']])){
  193. $admin['team_name'] = $team_info[$admin['team_id']];
  194. }else{
  195. $admin['team_name'] = '';
  196. }
  197. }
  198. return view('template/assign', [
  199. 'adminlist' =>$adminList,
  200. 'id' =>$id
  201. ]);
  202. }
  203. /**
  204. * @return \Illuminate\View\View
  205. */
  206. public function logindex(Request $request)
  207. {
  208. $page = (int)$request->input('page');
  209. $pageSize = 20;
  210. if($page<=0){
  211. $page = 1;
  212. }
  213. $offset = ($page-1) * $pageSize;
  214. $count = TemplatesLog::count();
  215. if ($count > 1) {
  216. // 总页数
  217. $pages = ceil($count/$pageSize);
  218. }else{
  219. // 总页数
  220. $pages = 1;
  221. }
  222. $result = TemplatesLog::orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  223. $result = json_decode(json_encode($result),true);
  224. foreach($result as $k=>&$v){
  225. # 获取销售名字
  226. $v['admin_name'] = Admin::where('id', $v['admin_id'])->pluck('realname');
  227. }
  228. return view('template/logindex', ['result' =>$result,
  229. 'page' =>$page,
  230. 'count' =>$count,
  231. 'pages' =>$pages,
  232. ]);
  233. }
  234. /**
  235. * 销售引流模板分配日志报表
  236. */
  237. public function templateLogReport(Request $request){
  238. $admin_id = (int)$request->input('admin_id');
  239. $team_id = (int)$request->input('team_id');
  240. $stime = $request->input('stime');
  241. $etime = $request->input('etime');
  242. //假如有团队筛选,检索销售队员
  243. $sale_ids = null;
  244. if($team_id>0){
  245. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  246. }
  247. $page = (int)$request->input('page');
  248. $pageSize = 20;
  249. if($page<=0){
  250. $page = 1;
  251. }
  252. $offset = ($page-1) * $pageSize;
  253. $count = TemplatesLog::select(DB::raw('left(create_time,10) as day,admin_id'))->where(function($query) use($admin_id, $stime, $etime, $sale_ids){
  254. if($admin_id>0) $query->where('admin_id', $admin_id);
  255. if($stime) $query->where('create_time', '>=', $stime);
  256. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  257. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  258. })->groupBy('day')->groupBy('admin_id')->get();
  259. $count = count($count);
  260. if ($count > 1) {
  261. // 总页数
  262. $pages = ceil($count/$pageSize);
  263. }else{
  264. // 总页数
  265. $pages = 1;
  266. }
  267. $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){
  268. if($admin_id>0) $query->where('admin_id', $admin_id);
  269. if($stime) $query->where('create_time', '>=', $stime);
  270. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  271. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  272. })->groupBy('day')->groupBy('admin_id')->orderBy('day', 'desc')->offset($offset)->limit($pageSize)->get();
  273. $result = json_decode(json_encode($result), true);
  274. foreach($result as $k=>&$v){
  275. //获取销售当天加粉情况
  276. $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();
  277. if(!empty($custDetail)){
  278. $v['fan_add'] = $custDetail->fan_add;
  279. $v['new_reply'] = $custDetail->new_reply;
  280. $v['old_consult'] = $custDetail->old_consult;
  281. $v['new_consult'] = $custDetail->new_consult;
  282. $v['admin_name'] = $custDetail->admin_name;
  283. }else{
  284. $v['fan_add'] = '';
  285. $v['new_reply'] = '';
  286. $v['old_consult'] = '';
  287. $v['new_consult'] = '';
  288. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  289. }
  290. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  291. //点击率
  292. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  293. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  294. }
  295. $teamList = DB::table('teams')->select('id', 'name')->get();
  296. $teamList = json_decode(json_encode($teamList), true);
  297. $adminList = DB::table('admin')->select('id', 'realname', 'username')->where('id','>', 1)->get();
  298. $adminList = json_decode(json_encode($adminList), true);
  299. return view('template/templateLogReport', ['result'=>$result,
  300. 'page' =>$page,
  301. 'count' =>$count,
  302. 'pages' =>$pages,
  303. 'teamlist' =>$teamList,
  304. 'adminlist' =>$adminList,
  305. 'team_id' =>$team_id,
  306. 'admin_id' =>$admin_id,
  307. 'stime' =>$stime,
  308. 'etime' =>$etime,
  309. ]);
  310. }
  311. /**
  312. * 销售引流模板分配日志报表
  313. */
  314. public function templateLogReport_export(Request $request){
  315. $admin_id = (int)$request->input('admin_id');
  316. $team_id = (int)$request->input('team_id');
  317. $stime = $request->input('stime');
  318. $etime = $request->input('etime');
  319. //假如有团队筛选,检索销售队员
  320. $sale_ids = null;
  321. if($team_id>0){
  322. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  323. }
  324. $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){
  325. if($admin_id>0) $query->where('admin_id', $admin_id);
  326. if($stime) $query->where('create_time', '>=', $stime);
  327. if($etime) $query->where('create_time', '<=', $etime. ' 23:59:59');
  328. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  329. })->groupBy('day')->groupBy('admin_id')->orderBy('day', 'desc')->get();
  330. $result = json_decode(json_encode($result), true);
  331. foreach($result as $k=>&$v){
  332. //获取销售当天加粉情况
  333. $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();
  334. if(!empty($custDetail)){
  335. $v['fan_add'] = $custDetail->fan_add;
  336. $v['new_reply'] = $custDetail->new_reply;
  337. $v['old_consult'] = $custDetail->old_consult;
  338. $v['new_consult'] = $custDetail->new_consult;
  339. $v['admin_name'] = $custDetail->admin_name;
  340. }else{
  341. $v['fan_add'] = '';
  342. $v['new_reply'] = '';
  343. $v['old_consult'] = '';
  344. $v['new_consult'] = '';
  345. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  346. }
  347. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  348. //点击率
  349. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  350. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  351. }
  352. $indexKey = ['day','admin_name','pv_count','long_count','fan_add','click_rate','change_rate','new_reply','new_consult','old_consult'];
  353. $title = ['日期', '销售名', 'PV量', '长按次数', '加粉数', '点击率', '转化率', '新粉回复数', '新粉询价数', '老粉询价数'];
  354. $filename = 'xiaoshoudaofen_'.date('Y-m-d_H').'.xlsx';
  355. return Order::export_excel($result, $filename, $indexKey, $title);
  356. }
  357. /*
  358. * @return \Illuminate\View\View
  359. */
  360. public function sourceindex(Request $request)
  361. {
  362. $page = (int)$request->input('page');
  363. $pageSize = 20;
  364. if($page<=0){
  365. $page = 1;
  366. }
  367. $offset = ($page-1) * $pageSize;
  368. $count = TemplatesSource::where('is_del',0)->count();
  369. if ($count > 1) {
  370. // 总页数
  371. $pages = ceil($count/$pageSize);
  372. }else{
  373. // 总页数
  374. $pages = 1;
  375. }
  376. $result = TemplatesSource::where('is_del',0)->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  377. $result = json_decode(json_encode($result),true);
  378. foreach($result as $k=>&$v){
  379. # 获取销售
  380. $salers = TemplatesSourceSalers::select('templates_source_salers.*', 'admin.realname as admin_name')->leftJoin('admin', 'admin.id', '=', 'templates_source_salers.admin_id')->where('templates_source_salers.s_id', $v['id'])->where('templates_source_salers.is_del', 0)->where('admin.is_use', 1)->get();
  381. $v['salers'] = $salers;
  382. $v['salers_k'] = count($salers);
  383. # 获取模板图
  384. $v['img'] = Templates::where('id', $v['t_id'])->pluck('img');
  385. }
  386. return view('template/sourceindex', ['result' =>$result,
  387. 'page' =>$page,
  388. 'count' =>$count,
  389. 'pages' =>$pages,
  390. ]);
  391. }
  392. /**
  393. * @return \Illuminate\View\View
  394. */
  395. public function sourcecreate()
  396. {
  397. $templates = Templates::where('is_del', 0)->whereNotNull('url')->get();
  398. $back_imgs = TemplatesBackimg::where('is_del', 0)->whereNotNull('back_img')->where('t_id', 1)->lists('back_img');
  399. return view('template/sourcecreate', ['templates'=>$templates, 'back_imgs'=>$back_imgs]);
  400. }
  401. /**
  402. * @param Request $request
  403. * @return \Illuminate\Http\RedirectResponse
  404. */
  405. public function sourcestore(Request $request)
  406. {
  407. $t_id = intval($request->input('t_id'));
  408. $back_vali_str = '';
  409. if($t_id != 4){
  410. $back_vali_str = 'required';
  411. }
  412. $this->validate($request, [
  413. 't_id' => 'required',
  414. 'back_img' => $back_vali_str,
  415. ], [
  416. 't_id.required' => '模板不能为空',
  417. 'back_img.required' => '背景图不能为空',
  418. ]);
  419. $template = new TemplatesSource();
  420. $template->t_id = $t_id;
  421. $template->note = trim($request->input('note'));
  422. $template->back_img = trim($request->input('back_img'));
  423. //图片上传 阿里云oss
  424. /*
  425. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  426. $file = $request->file('img');
  427. $ossClient=new oss();
  428. // 上传阿里云
  429. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  430. $img=$file['oss-request-url'];
  431. $template->back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  432. #保存背景图
  433. TemplatesBackimg::insert(['back_img'=>$template->back_img]);
  434. }
  435. */
  436. //新模板数据
  437. if($template->t_id == 4){
  438. $arr = array();
  439. $arr['title'] = trim($request->input('title'));
  440. $arr['text1'] = trim($request->input('text1'));
  441. $arr['text2'] = trim($request->input('text2'));
  442. $arr['text3'] = trim($request->input('text3'));
  443. $arr['img1'] = '';
  444. $arr['img2_1'] = '';
  445. $arr['img2_2'] = '';
  446. $arr['img3'] = '';
  447. if ($request->hasFile('img1') && $request->file('img1')->isValid()) {
  448. $file = $request->file('img1');
  449. $ossClient=new oss();
  450. // 上传阿里云
  451. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  452. $img=$file['oss-request-url'];
  453. $arr['img1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  454. }
  455. if ($request->hasFile('img2_1') && $request->file('img2_1')->isValid()) {
  456. $file = $request->file('img2_1');
  457. $ossClient=new oss();
  458. // 上传阿里云
  459. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  460. $img=$file['oss-request-url'];
  461. $arr['img2_1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  462. }
  463. if ($request->hasFile('img2_2') && $request->file('img2_2')->isValid()) {
  464. $file = $request->file('img2_2');
  465. $ossClient=new oss();
  466. // 上传阿里云
  467. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  468. $img=$file['oss-request-url'];
  469. $arr['img2_2']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  470. }
  471. if ($request->hasFile('img3') && $request->file('img3')->isValid()) {
  472. $file = $request->file('img3');
  473. $ossClient=new oss();
  474. // 上传阿里云
  475. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  476. $img=$file['oss-request-url'];
  477. $arr['img3']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  478. }
  479. $template->new_context = json_encode($arr);
  480. }
  481. if($template->save()){
  482. //生成连接
  483. $template->url = $this->createSourceUrl($template->t_id, $template->id);
  484. $template->save();
  485. }
  486. return redirect('/admin/template/sourceindex')->with('info', '添加模板成功');
  487. }
  488. /**
  489. * @param $id
  490. * @return \Illuminate\View\View
  491. */
  492. public function sourceedit($id)
  493. {
  494. $templates = Templates::where('is_del', 0)->whereNotNull('url')->get();
  495. $template = TemplatesSource::findOrFail($id);
  496. $back_imgs = TemplatesBackimg::where('is_del', 0)->whereNotNull('back_img')->where('t_id', $template->t_id)->lists('back_img');
  497. $new_context = array();
  498. if($template->t_id==4){
  499. $new_context = json_decode($template->new_context,true);
  500. }
  501. return view('template/sourceedit', ['template' => $template, 'id'=>$id, 'templates' => $templates, 'back_imgs'=>$back_imgs, 'new_context'=>$new_context]);
  502. }
  503. /**
  504. * @param Request $request
  505. * @return \Illuminate\Http\RedirectResponse
  506. */
  507. public function sourceupdate(Request $request)
  508. {
  509. $id = (int)$request->input('id');
  510. $template = TemplatesSource::findOrFail($id);
  511. $template->note = trim($request->input('note'));
  512. $template->back_img = trim($request->input('back_img'));
  513. //是否是新图文模板
  514. //新模板数据
  515. if($template->t_id == 4){
  516. $new_context = json_decode($template->new_context, true);
  517. $arr = $new_context;
  518. $arr['title'] = trim($request->input('title'));
  519. $arr['text1'] = trim($request->input('text1'));
  520. $arr['text2'] = trim($request->input('text2'));
  521. $arr['text3'] = trim($request->input('text3'));
  522. if ($request->hasFile('img1') && $request->file('img1')->isValid()) {
  523. $file = $request->file('img1');
  524. $ossClient=new oss();
  525. // 上传阿里云
  526. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  527. $img=$file['oss-request-url'];
  528. $arr['img1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  529. }
  530. if ($request->hasFile('img2_1') && $request->file('img2_1')->isValid()) {
  531. $file = $request->file('img2_1');
  532. $ossClient=new oss();
  533. // 上传阿里云
  534. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  535. $img=$file['oss-request-url'];
  536. $arr['img2_1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  537. }
  538. if ($request->hasFile('img2_2') && $request->file('img2_2')->isValid()) {
  539. $file = $request->file('img2_2');
  540. $ossClient=new oss();
  541. // 上传阿里云
  542. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  543. $img=$file['oss-request-url'];
  544. $arr['img2_2']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  545. }
  546. if ($request->hasFile('img3') && $request->file('img3')->isValid()) {
  547. $file = $request->file('img3');
  548. $ossClient=new oss();
  549. // 上传阿里云
  550. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  551. $img=$file['oss-request-url'];
  552. $arr['img3']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  553. }
  554. $template->new_context = json_encode($arr);
  555. }
  556. $template->save();
  557. return redirect('/admin/template/sourceindex')->with('info', '修改成功');
  558. }
  559. public function createSourceUrl($t_id, $id){
  560. $url = Templates::where('id', $t_id)->pluck('url');
  561. if($url){
  562. return $url . '?id='.$id;
  563. }
  564. return false;
  565. }
  566. public function uploadBack(Request $request){
  567. $img = $request->input('img');
  568. if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $res)) {
  569. //获取图片类型
  570. $type = $res[2];
  571. // 临时文件
  572. $tmpfname = tempnam("/image/", "FOO");
  573. //保存图片
  574. $handle = fopen($tmpfname, "w");
  575. //阿里云oss上传的文件目录
  576. if (fwrite($handle, base64_decode(str_replace($res[1], '', $img))))
  577. {
  578. $ossClient=new oss();
  579. // 上传阿里云
  580. $file = $ossClient->upload($type, $tmpfname, 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  581. fclose($handle);
  582. unlink($tmpfname);
  583. $img=$file['oss-request-url'];
  584. $back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  585. #保存背景图
  586. $t_id = (int)$request->input('t_id');
  587. $res = TemplatesBackimg::insert(['back_img'=>$back_img, 't_id'=>$t_id]);
  588. exit($back_img);
  589. }
  590. exit('0');
  591. }
  592. }
  593. public function getTempback($t_id){
  594. $result = TemplatesBackimg::where('t_id', $t_id)->lists('back_img');
  595. exit(json_encode($result));
  596. }
  597. /**
  598. * 销售引流模板分配月报
  599. */
  600. public function templateLogMonthReport(Request $request){
  601. $admin_id = (int)$request->input('admin_id');
  602. $team_id = (int)$request->input('team_id');
  603. $stime = $request->input('stime');
  604. $etime = $request->input('etime');
  605. //假如有团队筛选,检索销售队员
  606. $sale_ids = null;
  607. if($team_id>0){
  608. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  609. }
  610. $page = (int)$request->input('page');
  611. $pageSize = 20;
  612. if($page<=0){
  613. $page = 1;
  614. }
  615. $offset = ($page-1) * $pageSize;
  616. $mstime = '';
  617. $metime = '';
  618. if($stime){
  619. $mstime = date('Y-m-1', strtotime($stime));
  620. }
  621. if($etime){
  622. $metime = date('Y-m-1', strtotime($etime.' +1 month'));
  623. }
  624. $_start = '2019-11-01';
  625. $count = TemplatesLog::select(DB::raw('left(create_time,7) as month,admin_id'))->where('create_time', '>', $_start)->where(function($query) use($admin_id, $mstime, $metime, $sale_ids){
  626. if($admin_id>0) $query->where('admin_id', $admin_id);
  627. if($mstime) $query->where('create_time', '>=', $mstime);
  628. if($metime) $query->where('create_time', '<', $metime);
  629. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  630. })->groupBy('month')->groupBy('admin_id')->get();
  631. $count = count($count);
  632. if ($count > 1) {
  633. // 总页数
  634. $pages = ceil($count/$pageSize);
  635. }else{
  636. // 总页数
  637. $pages = 1;
  638. }
  639. $result = TemplatesLog::select(DB::raw('left(create_time,7) as month,admin_id,count(1) as tcount, count(if(type=1,true,null)) as pv_count'))->where('create_time', '>', $_start)->where(function($query) use($admin_id, $mstime, $metime, $sale_ids){
  640. if($admin_id>0) $query->where('admin_id', $admin_id);
  641. if($mstime) $query->where('create_time', '>=', $mstime);
  642. if($metime) $query->where('create_time', '<', $metime);
  643. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  644. })->groupBy('month')->groupBy('admin_id')->orderBy('month', 'desc')->get();
  645. $result = json_decode(json_encode($result), true);
  646. foreach($result as $k=>&$v){
  647. //起止时间
  648. $s_time = date('Y-m-1', strtotime($v['month']));
  649. $e_time = date('Y-m-1', strtotime($v['month'].' +1 month'));
  650. //获取销售当月加粉情况
  651. $custDetail = CustDetail::select(DB::raw('sum(fan_add) as fan_add'))->whereRaw('left(dtime,7)="'.$v['month'].'"')->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  652. if(!empty($custDetail)){
  653. $v['fan_add'] = $custDetail->fan_add;
  654. }else{
  655. $v['fan_add'] = '';
  656. }
  657. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  658. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  659. //点击率
  660. //$v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  661. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  662. //1.获取当月新粉
  663. $phones = DB::table('customers')->whereRaw('left(fanTime,7)="'.$v['month'].'"')->lists('phone');
  664. $order = Order::select(DB::raw('count(1) as order_count, count(distinct(receiverMobile)) as cust_count, sum(receivedAmount) as order_amount'))->where('admin_id', $v['admin_id'])->whereIn('receiverMobile', $phones)->whereRaw('left(createTime,7)="'.$v['month'].'"')->where('is_del', 0)->first();
  665. //当月新粉下单单数
  666. $v['order_count'] = $order->order_count;
  667. //当月新粉下单人数
  668. $v['cust_count'] = $order->cust_count;
  669. //当月粉丝复购单数
  670. $v['fugou_order_count'] = $order->order_count - $order->cust_count;
  671. //当月粉丝总销售额
  672. $v['order_amount'] = $order->order_amount;
  673. //新粉下单率
  674. $v['new_order_rate'] = $v['fan_add']>0 ? round($v['cust_count'] / $v['fan_add'], 4) * 100 . '%' : '';
  675. //新粉复购率
  676. //复购用户数 = 下单超过一单的用户数
  677. $order_cust_fugou = Order::select(DB::raw('count(1) as counts,receiverMobile'))->where('admin_id', $v['admin_id'])->whereIn('receiverMobile', $phones)->where('is_del', 0)->whereRaw('left(createTime,7)="'.$v['month'].'"')->groupBy('receiverMobile')->having('counts', '>', 1)->get();
  678. $customer_fugou_count = count($order_cust_fugou);
  679. $v['cust_fugou_rate'] = $v['cust_count']>0 ? round($customer_fugou_count / $v['cust_count'], 4) * 100 . '%' : '';
  680. //新粉订单复购率
  681. $v['order_fugou_rate'] = $order->cust_count>0 ? round($v['fugou_order_count'] / $order->cust_count, 4) * 100 . '%' : '';
  682. //当月粉丝人均销售额
  683. $v['avg_amount'] = $v['fan_add']>0 ? round($order->order_amount / $v['fan_add'], 2) : '';
  684. }
  685. $sort_c = array_column($result, 'avg_amount');
  686. array_multisort($sort_c,SORT_DESC,$result);
  687. $result = array_slice($result, $offset, $pageSize);
  688. $teamList = DB::table('teams')->select('id', 'name')->get();
  689. $teamList = json_decode(json_encode($teamList), true);
  690. $adminList = DB::table('admin')->select('id', 'realname', 'username')->where('id','>', 1)->get();
  691. $adminList = json_decode(json_encode($adminList), true);
  692. return view('template/templateLogMonthReport', ['result'=>$result,
  693. 'page' =>$page,
  694. 'count' =>$count,
  695. 'pages' =>$pages,
  696. 'teamlist' =>$teamList,
  697. 'adminlist' =>$adminList,
  698. 'team_id' =>$team_id,
  699. 'admin_id' =>$admin_id,
  700. 'stime' =>$stime,
  701. 'etime' =>$etime,
  702. ]);
  703. }
  704. /**
  705. * 销售引流模板分配月报
  706. */
  707. public function templateLogMonthReport_export(Request $request){
  708. $admin_id = (int)$request->input('admin_id');
  709. $team_id = (int)$request->input('team_id');
  710. $stime = $request->input('stime');
  711. $etime = $request->input('etime');
  712. //假如有团队筛选,检索销售队员
  713. $sale_ids = null;
  714. if($team_id>0){
  715. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  716. }
  717. $mstime = '';
  718. $metime = '';
  719. if($stime){
  720. $mstime = date('Y-m-1', strtotime($stime));
  721. }
  722. if($etime){
  723. $metime = date('Y-m-1', strtotime($etime.' +1 month'));
  724. }
  725. $_start = '2019-11-01';
  726. $result = TemplatesLog::select(DB::raw('left(create_time,7) as month,admin_id,count(1) as tcount, count(if(type=1,true,null)) as pv_count'))->where('create_time', '>', $_start)->where(function($query) use($admin_id, $mstime, $metime, $sale_ids){
  727. if($admin_id>0) $query->where('admin_id', $admin_id);
  728. if($mstime) $query->where('create_time', '>=', $mstime);
  729. if($metime) $query->where('create_time', '<', $metime);
  730. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  731. })->groupBy('month')->groupBy('admin_id')->orderBy('month', 'desc')->get();
  732. $result = json_decode(json_encode($result), true);
  733. foreach($result as $k=>&$v){
  734. //获取销售当月加粉情况
  735. $custDetail = CustDetail::select(DB::raw('sum(fan_add) as fan_add'))->whereRaw('left(dtime,7)="'.$v['month'].'"')->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  736. if(!empty($custDetail)){
  737. $v['fan_add'] = $custDetail->fan_add;
  738. }else{
  739. $v['fan_add'] = '';
  740. }
  741. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  742. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  743. //点击率
  744. //$v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  745. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  746. //1.获取当月新粉
  747. $phones = DB::table('customers')->whereRaw('left(fanTime,7)="'.$v['month'].'"')->lists('phone');
  748. $order = Order::select(DB::raw('count(1) as order_count, count(distinct(receiverMobile)) as cust_count, sum(receivedAmount) as order_amount'))->where('admin_id', $v['admin_id'])->whereIn('receiverMobile', $phones)->whereRaw('left(createTime,7)="'.$v['month'].'"')->where('is_del', 0)->first();
  749. //当月新粉下单单数
  750. $v['order_count'] = $order->order_count;
  751. //当月新粉下单人数
  752. $v['cust_count'] = $order->cust_count;
  753. //当月粉丝复购单数
  754. $v['fugou_order_count'] = $order->order_count - $order->cust_count;
  755. //当月粉丝总销售额
  756. $v['order_amount'] = $order->order_amount;
  757. //新粉下单率
  758. $v['new_order_rate'] = $v['fan_add']>0 ? round($v['cust_count'] / $v['fan_add'], 4) * 100 . '%' : '';
  759. //新粉复购率
  760. //复购用户数 = 下单超过一单的用户数
  761. $order_cust_fugou = Order::select(DB::raw('count(1) as counts,receiverMobile'))->where('admin_id', $v['admin_id'])->whereIn('receiverMobile', $phones)->where('is_del', 0)->whereRaw('left(createTime,7)="'.$v['month'].'"')->groupBy('receiverMobile')->having('counts', '>', 1)->get();
  762. $customer_fugou_count = count($order_cust_fugou);
  763. $v['cust_fugou_rate'] = $v['cust_count']>0 ? round($customer_fugou_count / $v['cust_count'], 4) * 100 . '%' : '';
  764. //新粉订单复购率
  765. $v['order_fugou_rate'] = $order->cust_count>0 ? round($v['fugou_order_count'] / $order->cust_count, 4) * 100 . '%' : '';
  766. //当月粉丝人均销售额
  767. $v['avg_amount'] = $v['fan_add']>0 ? round($order->order_amount / $v['fan_add'], 2) : '';
  768. }
  769. $sort_c = array_column($result, 'avg_amount');
  770. array_multisort($sort_c,SORT_DESC,$result);
  771. $indexKey = ['month','admin_name','pv_count','long_count','fan_add','cust_count','order_count','fugou_order_count','order_amount','change_rate','new_order_rate','cust_fugou_rate','order_fugou_rate','avg_amount'];
  772. $title = ['月份', '销售名', '当月PV量', '当月长按次数', '当月上报加粉数', '当月新粉下单人数', '新粉下单单数', '当月粉丝复购单数', '当月粉丝总销售额', '粉丝转化率', '新粉下单率', '新粉复购率', '新粉订单复购率', '当月粉丝人均销售额'];
  773. $filename = 'daofenyuebao_'.date('Y-m-d_H').'.xlsx';
  774. return Order::export_excel($result, $filename, $indexKey, $title);
  775. }
  776. }