Нет описания

TemplateController.php 40KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  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. $self_role = session('role_name');
  243. if($self_role == '销售' || $self_role == '分销销售'){
  244. $admin_id = session('admin_id');
  245. }
  246. if($self_role == '管理员'){
  247. //只能看自己团队的
  248. $self_id = session('admin_id');
  249. $team_id = DB::table('admin')->where('id', $self_id)->pluck('team_id');
  250. }
  251. //假如有团队筛选,检索销售队员
  252. $sale_ids = null;
  253. if($team_id>0){
  254. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  255. }
  256. $page = (int)$request->input('page');
  257. $pageSize = 20;
  258. if($page<=0){
  259. $page = 1;
  260. }
  261. $offset = ($page-1) * $pageSize;
  262. $count = TemplatesLog::select('idate','admin_id')->where(function($query) use($admin_id, $stime, $etime, $sale_ids){
  263. if($admin_id>0) $query->where('admin_id', $admin_id);
  264. if($stime) $query->where('idate', '>=', $stime);
  265. if($etime) $query->where('idate', '<=', $etime);
  266. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  267. })->groupBy('idate')->groupBy('admin_id')->get();
  268. $count = count($count);
  269. if ($count > 1) {
  270. // 总页数
  271. $pages = ceil($count/$pageSize);
  272. }else{
  273. // 总页数
  274. $pages = 1;
  275. }
  276. $result = TemplatesLog::select(DB::raw('idate,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){
  277. if($admin_id>0) $query->where('admin_id', $admin_id);
  278. if($stime) $query->where('idate', '>=', $stime);
  279. if($etime) $query->where('idate', '<=', $etime);
  280. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  281. })->groupBy('idate')->groupBy('admin_id')->orderBy('idate', 'desc')->offset($offset)->limit($pageSize)->get();
  282. $result = json_decode(json_encode($result), true);
  283. foreach($result as $k=>&$v){
  284. //获取销售当天加粉情况
  285. $custDetail = CustDetail::select('fan_add', 'new_reply', 'new_consult', 'old_consult', 'admin_name')->where('dtime', $v['idate'])->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  286. if(!empty($custDetail)){
  287. $v['fan_add'] = $custDetail->fan_add;
  288. $v['new_reply'] = $custDetail->new_reply;
  289. $v['old_consult'] = $custDetail->old_consult;
  290. $v['new_consult'] = $custDetail->new_consult;
  291. $v['admin_name'] = $custDetail->admin_name;
  292. }else{
  293. $v['fan_add'] = '';
  294. $v['new_reply'] = '';
  295. $v['old_consult'] = '';
  296. $v['new_consult'] = '';
  297. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  298. }
  299. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  300. //点击率
  301. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  302. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  303. }
  304. $teamList = DB::table('teams')->select('id', 'name')->where(function($query) use($team_id, $self_role){
  305. if($self_role == '管理员') $query->where('id', $team_id);
  306. })->where('type', 1)->get();
  307. $teamList = json_decode(json_encode($teamList), true);
  308. $adminList = DB::table('admin')->select('id', 'realname', 'username')->where(function($query) use($team_id, $self_role){
  309. if($self_role == '管理员') $query->where('team_id', $team_id);
  310. })->where('id','>', 1)->where('is_use', 1)->get();
  311. $adminList = json_decode(json_encode($adminList), true);
  312. return view('template/templateLogReport', ['result'=>$result,
  313. 'page' =>$page,
  314. 'count' =>$count,
  315. 'pages' =>$pages,
  316. 'teamlist' =>$teamList,
  317. 'adminlist' =>$adminList,
  318. 'team_id' =>$team_id,
  319. 'admin_id' =>$admin_id,
  320. 'stime' =>$stime,
  321. 'etime' =>$etime,
  322. 'self_role' =>$self_role,
  323. ]);
  324. }
  325. /**
  326. * 销售引流模板分配日志报表
  327. */
  328. public function templateLogReport_export(Request $request){
  329. $admin_id = (int)$request->input('admin_id');
  330. $team_id = (int)$request->input('team_id');
  331. $stime = $request->input('stime');
  332. $etime = $request->input('etime');
  333. $self_role = session('role_name');
  334. if($self_role == '销售' || $self_role == '分销销售'){
  335. $admin_id = session('admin_id');
  336. }
  337. if($self_role == '管理员'){
  338. //只能看自己团队的
  339. $self_id = session('admin_id');
  340. $team_id = DB::table('admin')->where('id', $self_id)->pluck('team_id');
  341. }
  342. //假如有团队筛选,检索销售队员
  343. $sale_ids = null;
  344. if($team_id>0){
  345. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  346. }
  347. $result = TemplatesLog::select(DB::raw('idate,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){
  348. if($admin_id>0) $query->where('admin_id', $admin_id);
  349. if($stime) $query->where('idate', '>=', $stime);
  350. if($etime) $query->where('idate', '<=', $etime);
  351. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  352. })->groupBy('idate')->groupBy('admin_id')->orderBy('idate', 'desc')->get();
  353. $result = json_decode(json_encode($result), true);
  354. foreach($result as $k=>&$v){
  355. //获取销售当天加粉情况
  356. $custDetail = CustDetail::select('fan_add', 'new_reply', 'new_consult', 'old_consult', 'admin_name')->where('dtime', $v['idate'])->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  357. if(!empty($custDetail)){
  358. $v['fan_add'] = $custDetail->fan_add;
  359. $v['new_reply'] = $custDetail->new_reply;
  360. $v['old_consult'] = $custDetail->old_consult;
  361. $v['new_consult'] = $custDetail->new_consult;
  362. $v['admin_name'] = $custDetail->admin_name;
  363. }else{
  364. $v['fan_add'] = '';
  365. $v['new_reply'] = '';
  366. $v['old_consult'] = '';
  367. $v['new_consult'] = '';
  368. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  369. }
  370. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  371. //点击率
  372. $v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  373. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  374. }
  375. $indexKey = ['idate','admin_name','pv_count','long_count','fan_add','click_rate','change_rate','new_reply','new_consult','old_consult'];
  376. $title = ['日期', '销售名', 'PV量', '长按次数', '加粉数', '点击率', '转化率', '新粉回复数', '新粉询价数', '老粉询价数'];
  377. $filename = 'xiaoshoudaofen_'.date('Y-m-d_H').'.xlsx';
  378. return Order::export_excel($result, $filename, $indexKey, $title);
  379. }
  380. /*
  381. * @return \Illuminate\View\View
  382. */
  383. public function sourceindex(Request $request)
  384. {
  385. $page = (int)$request->input('page');
  386. $pageSize = 20;
  387. if($page<=0){
  388. $page = 1;
  389. }
  390. $offset = ($page-1) * $pageSize;
  391. $count = TemplatesSource::where('is_del',0)->count();
  392. if ($count > 1) {
  393. // 总页数
  394. $pages = ceil($count/$pageSize);
  395. }else{
  396. // 总页数
  397. $pages = 1;
  398. }
  399. $result = TemplatesSource::where('is_del',0)->orderBy('id', 'desc')->offset($offset)->limit($pageSize)->get();
  400. $result = json_decode(json_encode($result),true);
  401. foreach($result as $k=>&$v){
  402. # 获取销售
  403. $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();
  404. $v['salers'] = $salers;
  405. $v['salers_k'] = count($salers);
  406. # 获取模板图
  407. $v['img'] = Templates::where('id', $v['t_id'])->pluck('img');
  408. }
  409. return view('template/sourceindex', ['result' =>$result,
  410. 'page' =>$page,
  411. 'count' =>$count,
  412. 'pages' =>$pages,
  413. ]);
  414. }
  415. /**
  416. * @return \Illuminate\View\View
  417. */
  418. public function sourcecreate()
  419. {
  420. $templates = Templates::where('is_del', 0)->whereNotNull('url')->get();
  421. $back_imgs = TemplatesBackimg::where('is_del', 0)->whereNotNull('back_img')->where('t_id', 1)->lists('back_img');
  422. return view('template/sourcecreate', ['templates'=>$templates, 'back_imgs'=>$back_imgs]);
  423. }
  424. /**
  425. * @param Request $request
  426. * @return \Illuminate\Http\RedirectResponse
  427. */
  428. public function sourcestore(Request $request)
  429. {
  430. $t_id = intval($request->input('t_id'));
  431. $back_vali_str = '';
  432. if($t_id != 4){
  433. $back_vali_str = 'required';
  434. }
  435. $this->validate($request, [
  436. 't_id' => 'required',
  437. 'back_img' => $back_vali_str,
  438. ], [
  439. 't_id.required' => '模板不能为空',
  440. 'back_img.required' => '背景图不能为空',
  441. ]);
  442. $template = new TemplatesSource();
  443. $template->t_id = $t_id;
  444. $template->note = trim($request->input('note'));
  445. $template->back_img = trim($request->input('back_img'));
  446. //图片上传 阿里云oss
  447. /*
  448. if ($request->hasFile('img') && $request->file('img')->isValid()) {
  449. $file = $request->file('img');
  450. $ossClient=new oss();
  451. // 上传阿里云
  452. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  453. $img=$file['oss-request-url'];
  454. $template->back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  455. #保存背景图
  456. TemplatesBackimg::insert(['back_img'=>$template->back_img]);
  457. }
  458. */
  459. //新模板数据
  460. if($template->t_id == 4){
  461. $arr = array();
  462. $arr['title'] = trim($request->input('title'));
  463. $arr['text1'] = trim($request->input('text1'));
  464. $arr['text2'] = trim($request->input('text2'));
  465. $arr['text3'] = trim($request->input('text3'));
  466. $arr['img1'] = '';
  467. $arr['img2_1'] = '';
  468. $arr['img2_2'] = '';
  469. $arr['img3'] = '';
  470. if ($request->hasFile('img1') && $request->file('img1')->isValid()) {
  471. $file = $request->file('img1');
  472. $ossClient=new oss();
  473. // 上传阿里云
  474. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  475. $img=$file['oss-request-url'];
  476. $arr['img1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  477. }
  478. if ($request->hasFile('img2_1') && $request->file('img2_1')->isValid()) {
  479. $file = $request->file('img2_1');
  480. $ossClient=new oss();
  481. // 上传阿里云
  482. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  483. $img=$file['oss-request-url'];
  484. $arr['img2_1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  485. }
  486. if ($request->hasFile('img2_2') && $request->file('img2_2')->isValid()) {
  487. $file = $request->file('img2_2');
  488. $ossClient=new oss();
  489. // 上传阿里云
  490. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  491. $img=$file['oss-request-url'];
  492. $arr['img2_2']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  493. }
  494. if ($request->hasFile('img3') && $request->file('img3')->isValid()) {
  495. $file = $request->file('img3');
  496. $ossClient=new oss();
  497. // 上传阿里云
  498. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  499. $img=$file['oss-request-url'];
  500. $arr['img3']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  501. }
  502. $template->new_context = json_encode($arr);
  503. }
  504. if($template->save()){
  505. //生成连接
  506. $template->url = $this->createSourceUrl($template->t_id, $template->id);
  507. $template->save();
  508. }
  509. return redirect('/admin/template/sourceindex')->with('info', '添加模板成功');
  510. }
  511. /**
  512. * @param $id
  513. * @return \Illuminate\View\View
  514. */
  515. public function sourceedit($id)
  516. {
  517. $templates = Templates::where('is_del', 0)->whereNotNull('url')->get();
  518. $template = TemplatesSource::findOrFail($id);
  519. $back_imgs = TemplatesBackimg::where('is_del', 0)->whereNotNull('back_img')->where('t_id', $template->t_id)->lists('back_img');
  520. $new_context = array();
  521. if($template->t_id==4){
  522. $new_context = json_decode($template->new_context,true);
  523. }
  524. return view('template/sourceedit', ['template' => $template, 'id'=>$id, 'templates' => $templates, 'back_imgs'=>$back_imgs, 'new_context'=>$new_context]);
  525. }
  526. /**
  527. * @param Request $request
  528. * @return \Illuminate\Http\RedirectResponse
  529. */
  530. public function sourceupdate(Request $request)
  531. {
  532. $id = (int)$request->input('id');
  533. $template = TemplatesSource::findOrFail($id);
  534. $template->note = trim($request->input('note'));
  535. $template->back_img = trim($request->input('back_img'));
  536. //是否是新图文模板
  537. //新模板数据
  538. if($template->t_id == 4){
  539. $new_context = json_decode($template->new_context, true);
  540. $arr = $new_context;
  541. $arr['title'] = trim($request->input('title'));
  542. $arr['text1'] = trim($request->input('text1'));
  543. $arr['text2'] = trim($request->input('text2'));
  544. $arr['text3'] = trim($request->input('text3'));
  545. if ($request->hasFile('img1') && $request->file('img1')->isValid()) {
  546. $file = $request->file('img1');
  547. $ossClient=new oss();
  548. // 上传阿里云
  549. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  550. $img=$file['oss-request-url'];
  551. $arr['img1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  552. }
  553. if ($request->hasFile('img2_1') && $request->file('img2_1')->isValid()) {
  554. $file = $request->file('img2_1');
  555. $ossClient=new oss();
  556. // 上传阿里云
  557. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  558. $img=$file['oss-request-url'];
  559. $arr['img2_1']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  560. }
  561. if ($request->hasFile('img2_2') && $request->file('img2_2')->isValid()) {
  562. $file = $request->file('img2_2');
  563. $ossClient=new oss();
  564. // 上传阿里云
  565. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  566. $img=$file['oss-request-url'];
  567. $arr['img2_2']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  568. }
  569. if ($request->hasFile('img3') && $request->file('img3')->isValid()) {
  570. $file = $request->file('img3');
  571. $ossClient=new oss();
  572. // 上传阿里云
  573. $file = $ossClient->upload($file->getClientOriginalExtension(), $file->getRealPath(), 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  574. $img=$file['oss-request-url'];
  575. $arr['img3']=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  576. }
  577. $template->new_context = json_encode($arr);
  578. }
  579. $template->save();
  580. return redirect('/admin/template/sourceindex')->with('info', '修改成功');
  581. }
  582. public function createSourceUrl($t_id, $id){
  583. $url = Templates::where('id', $t_id)->pluck('url');
  584. if($url){
  585. return $url . '?id='.$id;
  586. }
  587. return false;
  588. }
  589. public function uploadBack(Request $request){
  590. $img = $request->input('img');
  591. if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $res)) {
  592. //获取图片类型
  593. $type = $res[2];
  594. // 临时文件
  595. $tmpfname = tempnam("/image/", "FOO");
  596. //保存图片
  597. $handle = fopen($tmpfname, "w");
  598. //阿里云oss上传的文件目录
  599. if (fwrite($handle, base64_decode(str_replace($res[1], '', $img))))
  600. {
  601. $ossClient=new oss();
  602. // 上传阿里云
  603. $file = $ossClient->upload($type, $tmpfname, 'upload/seafoodPic'.date("Y-m-d",time()).'/'.date('His'));
  604. fclose($handle);
  605. unlink($tmpfname);
  606. $img=$file['oss-request-url'];
  607. $back_img=str_replace("kx-youhuiquan.oss-cn-beijing.aliyuncs.com","imgs.726p.com",$img);
  608. #保存背景图
  609. $t_id = (int)$request->input('t_id');
  610. $res = TemplatesBackimg::insert(['back_img'=>$back_img, 't_id'=>$t_id]);
  611. exit($back_img);
  612. }
  613. exit('0');
  614. }
  615. }
  616. public function getTempback($t_id){
  617. $result = TemplatesBackimg::where('t_id', $t_id)->lists('back_img');
  618. exit(json_encode($result));
  619. }
  620. /**
  621. * 销售引流模板分配月报
  622. */
  623. public function templateLogMonthReport(Request $request){
  624. $admin_id = (int)$request->input('admin_id');
  625. $team_id = (int)$request->input('team_id');
  626. $stime = $request->input('stime');
  627. $etime = $request->input('etime');
  628. $self_role = session('role_name');
  629. if($self_role == '销售' || $self_role == '分销销售'){
  630. $admin_id = session('admin_id');
  631. }
  632. if($self_role == '管理员'){
  633. //只能看自己团队的
  634. $self_id = session('admin_id');
  635. $team_id = DB::table('admin')->where('id', $self_id)->pluck('team_id');
  636. }
  637. //假如有团队筛选,检索销售队员
  638. $sale_ids = null;
  639. if($team_id>0){
  640. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  641. }
  642. $page = (int)$request->input('page');
  643. $pageSize = 20;
  644. if($page<=0){
  645. $page = 1;
  646. }
  647. $offset = ($page-1) * $pageSize;
  648. $mstime = '';
  649. $metime = '';
  650. if($stime){
  651. $mstime = date('Y-m-1', strtotime($stime));
  652. }
  653. if($etime){
  654. $metime = date('Y-m-1', strtotime($etime.' +1 month'));
  655. }
  656. $_start = '2019-11-01';
  657. $count = TemplatesLog::select(DB::raw('mdate,admin_id'))->where('create_time', '>', $_start)->where(function($query) use($admin_id, $mstime, $metime, $sale_ids){
  658. if($admin_id>0) $query->where('admin_id', $admin_id);
  659. if($mstime) $query->where('create_time', '>=', $mstime);
  660. if($metime) $query->where('create_time', '<', $metime);
  661. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  662. })->groupBy('mdate')->groupBy('admin_id')->get();
  663. $count = count($count);
  664. if ($count > 1) {
  665. // 总页数
  666. $pages = ceil($count/$pageSize);
  667. }else{
  668. // 总页数
  669. $pages = 1;
  670. }
  671. $result = TemplatesLog::select(DB::raw('mdate,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){
  672. if($admin_id>0) $query->where('admin_id', $admin_id);
  673. if($mstime) $query->where('create_time', '>=', $mstime);
  674. if($metime) $query->where('create_time', '<', $metime);
  675. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  676. })->groupBy('mdate')->groupBy('admin_id')->orderBy('mdate', 'desc')->get();
  677. $result = json_decode(json_encode($result), true);
  678. foreach($result as $k=>&$v){
  679. //起止时间
  680. $s_time = date('Y-m-1', strtotime($v['mdate']));
  681. $e_time = date('Y-m-1', strtotime($v['mdate'].' +1 month'));
  682. //获取销售当月加粉情况
  683. $custDetail = CustDetail::select(DB::raw('sum(fan_add) as fan_add'))->whereRaw('left(dtime,7)="'.$v['mdate'].'"')->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  684. if(!empty($custDetail)){
  685. $v['fan_add'] = $custDetail->fan_add;
  686. }else{
  687. $v['fan_add'] = '';
  688. }
  689. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  690. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  691. //点击率
  692. //$v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  693. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  694. //1.获取当月新粉
  695. $phones = DB::table('customers')->whereRaw('left(fanTime,7)="'.$v['mdate'].'"')->lists('phone');
  696. $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['mdate'].'"')->where('is_del', 0)->first();
  697. //当月新粉下单单数
  698. $v['order_count'] = $order->order_count;
  699. //当月新粉下单人数
  700. $v['cust_count'] = $order->cust_count;
  701. //当月粉丝复购单数
  702. $v['fugou_order_count'] = $order->order_count - $order->cust_count;
  703. //当月粉丝总销售额
  704. $v['order_amount'] = $order->order_amount;
  705. //新粉下单率
  706. $v['new_order_rate'] = $v['fan_add']>0 ? round($v['cust_count'] / $v['fan_add'], 4) * 100 . '%' : '';
  707. //新粉复购率
  708. //复购用户数 = 下单超过一单的用户数
  709. $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['mdate'].'"')->groupBy('receiverMobile')->having('counts', '>', 1)->get();
  710. $customer_fugou_count = count($order_cust_fugou);
  711. $v['cust_fugou_rate'] = $v['cust_count']>0 ? round($customer_fugou_count / $v['cust_count'], 4) * 100 . '%' : '';
  712. //新粉订单复购率
  713. $v['order_fugou_rate'] = $order->cust_count>0 ? round($v['fugou_order_count'] / $order->cust_count, 4) * 100 . '%' : '';
  714. //当月粉丝人均销售额
  715. $v['avg_amount'] = $v['fan_add']>0 ? round($order->order_amount / $v['fan_add'], 2) : '';
  716. }
  717. $sort_c = array_column($result, 'avg_amount');
  718. array_multisort($sort_c,SORT_DESC,$result);
  719. $result = array_slice($result, $offset, $pageSize);
  720. $teamList = DB::table('teams')->select('id', 'name')->where(function($query) use($team_id, $self_role){
  721. if($self_role == '管理员') $query->where('id', $team_id);
  722. })->where('type', 1)->get();
  723. $teamList = json_decode(json_encode($teamList), true);
  724. $adminList = DB::table('admin')->select('id', 'realname', 'username')->where(function($query) use($team_id, $self_role){
  725. if($self_role == '管理员') $query->where('team_id', $team_id);
  726. })->where('id','>', 1)->where('is_use', 1)->get();
  727. $adminList = json_decode(json_encode($adminList), true);
  728. return view('template/templateLogMonthReport', ['result'=>$result,
  729. 'page' =>$page,
  730. 'count' =>$count,
  731. 'pages' =>$pages,
  732. 'teamlist' =>$teamList,
  733. 'adminlist' =>$adminList,
  734. 'team_id' =>$team_id,
  735. 'admin_id' =>$admin_id,
  736. 'stime' =>$stime,
  737. 'etime' =>$etime,
  738. 'self_role' =>$self_role,
  739. ]);
  740. }
  741. /**
  742. * 销售引流模板分配月报
  743. */
  744. public function templateLogMonthReport_export(Request $request){
  745. $admin_id = (int)$request->input('admin_id');
  746. $team_id = (int)$request->input('team_id');
  747. $stime = $request->input('stime');
  748. $etime = $request->input('etime');
  749. $self_role = session('role_name');
  750. if($self_role == '销售' || $self_role == '分销销售'){
  751. $admin_id = session('admin_id');
  752. }
  753. if($self_role == '管理员'){
  754. //只能看自己团队的
  755. $self_id = session('admin_id');
  756. $team_id = DB::table('admin')->where('id', $self_id)->pluck('team_id');
  757. }
  758. //假如有团队筛选,检索销售队员
  759. $sale_ids = null;
  760. if($team_id>0){
  761. $sale_ids = DB::table('admin')->where('team_id', $team_id)->lists('id');
  762. }
  763. $mstime = '';
  764. $metime = '';
  765. if($stime){
  766. $mstime = date('Y-m-1', strtotime($stime));
  767. }
  768. if($etime){
  769. $metime = date('Y-m-1', strtotime($etime.' +1 month'));
  770. }
  771. $_start = '2019-11-01';
  772. $result = TemplatesLog::select(DB::raw('mdate,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){
  773. if($admin_id>0) $query->where('admin_id', $admin_id);
  774. if($mstime) $query->where('create_time', '>=', $mstime);
  775. if($metime) $query->where('create_time', '<', $metime);
  776. if($sale_ids !== null) $query->whereIn('admin_id', $sale_ids);
  777. })->groupBy('mdate')->groupBy('admin_id')->orderBy('mdate', 'desc')->get();
  778. $result = json_decode(json_encode($result), true);
  779. foreach($result as $k=>&$v){
  780. //获取销售当月加粉情况
  781. $custDetail = CustDetail::select(DB::raw('sum(fan_add) as fan_add'))->whereRaw('left(dtime,7)="'.$v['mdate'].'"')->where('admin_id', $v['admin_id'])->where('is_del', 0)->first();
  782. if(!empty($custDetail)){
  783. $v['fan_add'] = $custDetail->fan_add;
  784. }else{
  785. $v['fan_add'] = '';
  786. }
  787. $v['admin_name'] = DB::table('admin')->where('id', $v['admin_id'])->pluck('realname');
  788. $v['long_count'] = $v['tcount'] - $v['pv_count'];
  789. //点击率
  790. //$v['click_rate'] = $v['pv_count']>0 && $v['long_count']>0 ? round( $v['long_count'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  791. $v['change_rate'] = $v['pv_count']>0 && $v['fan_add']>0 ? round( $v['fan_add'] / $v['pv_count'], 4 ) * 100 . '%' : '';
  792. //1.获取当月新粉
  793. $phones = DB::table('customers')->whereRaw('left(fanTime,7)="'.$v['mdate'].'"')->lists('phone');
  794. $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['mdate'].'"')->where('is_del', 0)->first();
  795. //当月新粉下单单数
  796. $v['order_count'] = $order->order_count;
  797. //当月新粉下单人数
  798. $v['cust_count'] = $order->cust_count;
  799. //当月粉丝复购单数
  800. $v['fugou_order_count'] = $order->order_count - $order->cust_count;
  801. //当月粉丝总销售额
  802. $v['order_amount'] = $order->order_amount;
  803. //新粉下单率
  804. $v['new_order_rate'] = $v['fan_add']>0 ? round($v['cust_count'] / $v['fan_add'], 4) * 100 . '%' : '';
  805. //新粉复购率
  806. //复购用户数 = 下单超过一单的用户数
  807. $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['mdate'].'"')->groupBy('receiverMobile')->having('counts', '>', 1)->get();
  808. $customer_fugou_count = count($order_cust_fugou);
  809. $v['cust_fugou_rate'] = $v['cust_count']>0 ? round($customer_fugou_count / $v['cust_count'], 4) * 100 . '%' : '';
  810. //新粉订单复购率
  811. $v['order_fugou_rate'] = $order->cust_count>0 ? round($v['fugou_order_count'] / $order->cust_count, 4) * 100 . '%' : '';
  812. //当月粉丝人均销售额
  813. $v['avg_amount'] = $v['fan_add']>0 ? round($order->order_amount / $v['fan_add'], 2) : '';
  814. }
  815. $sort_c = array_column($result, 'avg_amount');
  816. array_multisort($sort_c,SORT_DESC,$result);
  817. $indexKey = ['mdate','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'];
  818. $title = ['月份', '销售名', '当月PV量', '当月长按次数', '当月上报加粉数', '当月新粉下单人数', '新粉下单单数', '当月粉丝复购单数', '当月粉丝总销售额', '粉丝转化率', '新粉下单率', '新粉复购率', '新粉订单复购率', '当月粉丝人均销售额'];
  819. $filename = 'daofenyuebao_'.date('Y-m-d_H').'.xlsx';
  820. return Order::export_excel($result, $filename, $indexKey, $title);
  821. }
  822. }