No Description

TemplateController.php 44KB

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