Record.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. <?php
  2. namespace app\mall\admin;
  3. use app\admin\controller\Admin;
  4. use think\Db;
  5. use think\Request;
  6. use think\Validate;
  7. use app\common\builder\ZBuilder;
  8. class Record extends Admin
  9. {
  10. public function index($status='0'){
  11. $list_tab = [
  12. '0' => ['title' => '每月新增用户', 'url' => url('index', ['status' => '0'])],
  13. '1' => ['title' => '用户地区排行', 'url' => url('index', ['status' => '1'])],
  14. '2' => ['title' => '用户订单排行', 'url' => url('index', ['status' => '2'])],
  15. ];
  16. $user_count=db('users')->count('id');
  17. $year=date('Y');
  18. $month=date('m');
  19. $st=strtotime($year.'-'.$month.'-01 00:00:00');
  20. if($month=='12'){
  21. $en_year=$year+1;
  22. $en_month=1;
  23. }else{
  24. $en_year=$year;
  25. $en_month=$month+1;
  26. }
  27. $en=strtotime($en_year.'-'.$en_month.'-01 00:00:00')-1;
  28. $user_month_count=db('users')->where('created_at','between',$st.','.$en)->count('id');
  29. $tips="当前总用户数量:<b>{$user_count}</b>人,本月新增用户:<b>{$user_month_count}</b>人。";
  30. switch ($status) {
  31. case '0':
  32. $request_url=$_SERVER["REQUEST_URI"];
  33. $url_arr=parse_url($request_url);
  34. if(isset($url_arr['query'])){
  35. parse_str($url_arr['query'], $query_arr);
  36. if(isset($query_arr['status']) && $query_arr['status']==0){
  37. $pix=true;
  38. }else{
  39. $pix=false;
  40. }
  41. }else{
  42. $pix=false;
  43. }
  44. $map = $this->getMap();
  45. if (empty($map) || (!isset($map['year']) && !isset($map['month']))) {
  46. if($pix){
  47. $s_year=2018;
  48. $s_month=1;
  49. }else{
  50. $s_year=$year;
  51. $s_month=$month;
  52. }
  53. }elseif(!isset($map['year']) && isset($map['month'])){
  54. $s_year=2018;
  55. $s_month=$map['month'];
  56. }elseif(!isset($map['month']) && isset($map['year'])){
  57. $s_year=$map['year'];
  58. $s_month=1;
  59. }else{
  60. $s_year=$map['year'];
  61. $s_month=$map['month'];
  62. }
  63. if($s_month=='12'){
  64. $en_year=$s_year+1;
  65. $en_month=1;
  66. }else{
  67. $en_year=$s_year;
  68. $en_month=$s_month+1;
  69. }
  70. $st=strtotime($s_year.'-'.$s_month.'-01 00:00:00');
  71. $en=strtotime($en_year.'-'.$en_month.'-01 00:00:00')-1;
  72. $for=ceil(($en-$st)/(24*60*60));
  73. $data_list=[];
  74. for ($i=1; $i <= $for; $i++) {
  75. $st_d=strtotime($s_year.'-'.$s_month.'-'.$i.' 00:00:00');
  76. $en_d=strtotime($s_year.'-'.$s_month.'-'.$i.' 23:59:59');
  77. $data_list[]=[
  78. 'day'=>'第'.$i.'日',
  79. 'count'=>db('users')->where('created_at','between',$st_d.','.$en_d)->count('id')
  80. ];
  81. }
  82. session('user_add_excel_year',$s_year);
  83. session('user_add_excel_month',$s_month);
  84. session('user_add_excel_data',$data_list);
  85. $months=['2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'十一月','12'=>'十二月'];
  86. $years=[];
  87. for ($i=2019; $i <= 2118; $i++) {
  88. $years[$i]=$i.'年';
  89. }
  90. return ZBuilder::make('table')
  91. ->setPageTitle('') // 设置页面标题
  92. ->setPageTips($tips) // 设置页面提示信息
  93. ->setTabNav($list_tab, $status)//分组
  94. ->hideCheckbox() //隐藏第一列多选框
  95. ->addTopSelect('year', '2018年', $years, $year) //添加顶部下拉筛选
  96. ->addTopSelect('month', '一月', $months, $month) //添加顶部下拉筛选
  97. ->addColumns([
  98. ['day', '第几日'],
  99. ['count', '新增用户数'],
  100. ]) //添加多列数据
  101. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excel',['status'=>0])])
  102. ->setRowList($data_list) // 设置表格数据
  103. ->fetch();
  104. break;
  105. case '1':
  106. $map = $this->getMap();
  107. session('user_region_rank_excel_map',$map);
  108. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  109. $where=" WHERE created_at<=".strtotime($map['created_at'][1][1])." && created_at>=".strtotime($map['created_at'][1][0]);
  110. }else{
  111. $where="";
  112. }
  113. $data=Db::query("SELECT area_id,COUNT(id) AS counts from ".config('database.prefix')."users {$where} GROUP BY area_id ORDER BY counts DESC LIMIT 100");
  114. $data_list=[];
  115. foreach ($data as $key => $value) {
  116. $area=db('regions')->where('id',$value['area_id'])->find();
  117. $city=db('regions')->where('id',$area['parent_id'])->find();
  118. $province=db('regions')->where('id',$city['parent_id'])->find();
  119. $region=$province['name'].' '.$city['name'].' '.$area['name'];
  120. if($key==0){
  121. $rank=$key+1;
  122. }else{
  123. if($value['counts']!=$data[$key-1]['counts']){
  124. $rank=$key+1;
  125. }
  126. }
  127. $data_list[]=['rank'=>$rank,'region'=>$region,'counts'=>$value['counts']];
  128. }
  129. session('user_region_rank_excel_data',$data_list);
  130. return ZBuilder::make('table')
  131. ->setPageTitle('') // 设置页面标题
  132. ->setPageTips($tips) // 设置页面提示信息
  133. ->setTabNav($list_tab, $status)//分组
  134. ->hideCheckbox() //隐藏第一列多选框
  135. ->addTimeFilter('created_at') // 添加时间段筛选
  136. ->addColumns([
  137. ['rank', '排名'],
  138. ['region', '地区'],
  139. ['counts', '数量'],
  140. ]) //添加多列数据
  141. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excel',['status'=>1])])
  142. ->setRowList($data_list) // 设置表格数据
  143. ->fetch();
  144. break;
  145. case '2':
  146. $map = $this->getMap();
  147. session('user_order_rank_excel_map',$map);
  148. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  149. $where=" WHERE created_at<=".strtotime($map['created_at'][1][1])." && created_at>=".strtotime($map['created_at'][1][0])." && state=1";
  150. }else{
  151. $where=" WHERE state=1";
  152. }
  153. $data=Db::query("SELECT user_id,SUM(pay_amount) AS sums from ".config('database.prefix')."trades{$where} GROUP BY user_id ORDER BY sums DESC LIMIT 100");
  154. $data_list=[];
  155. foreach ($data as $key => $value) {
  156. if($key==0){
  157. $rank=$key+1;
  158. }else{
  159. if($value['sums']!=$data[$key-1]['sums']){
  160. $rank=$key+1;
  161. }
  162. }
  163. $pix=['rank'=>$rank];
  164. $user=db('users')->where('id',$value['user_id'])->find();
  165. if($user){
  166. $pix['name']=$user['name'];
  167. $pix['mobile']=$user['mobile'];
  168. }else{
  169. $pix['name']='';
  170. $pix['mobile']='';
  171. }
  172. $pix['sums']=$value['sums'];
  173. $count1=db('orders')->where('user_id',$value['user_id'])->where('state','in','1,3,4,5,8')->where('refund_state','in','-1,0,1,2,3,6,9,10,11')->count('id');
  174. $count2=db('collage_orders')->where('user_id',$value['user_id'])->where('state','in','1,4')->count('id');
  175. $pix['order_counts']=$count1+$count2;
  176. $sum1=db('orders a')->join('order_products b','a.id=b.order_id','LEFT')->where('a.user_id',$value['user_id'])->where('a.state','in','1,3,4,5,8')->where('a.refund_state','in','-1,0,1,2,3,6,9,10,11')->sum('b.num');
  177. $sum2=db('collage_orders')->where('user_id',$value['user_id'])->where('state','in','1,4')->sum('num');
  178. $pix['product_sums']=$sum1+$sum2;
  179. $data_list[]=$pix;
  180. }
  181. session('user_order_rank_excel_data',$data_list);
  182. return ZBuilder::make('table')
  183. ->setPageTitle('') // 设置页面标题
  184. ->setPageTips($tips) // 设置页面提示信息
  185. ->setTabNav($list_tab, $status)//分组
  186. ->hideCheckbox() //隐藏第一列多选框
  187. ->addTimeFilter('created_at') // 添加时间段筛选
  188. ->addColumns([
  189. ['rank', '排名'],
  190. ['name', '用户名'],
  191. ['mobile', '联系电话'],
  192. ['sums', '订单总金额'],
  193. ['order_counts', '订单总数量'],
  194. ['product_sums', '包含商品总数量'],
  195. ]) //添加多列数据
  196. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excel',['status'=>2])])
  197. ->setRowList($data_list) // 设置表格数据
  198. ->fetch();
  199. break;
  200. default:
  201. break;
  202. }
  203. }
  204. public function excel($status){
  205. switch ($status) {
  206. case '0':
  207. $header = array(
  208. '第几日'=>'string',//text
  209. '新增用户数'=>'string',//text
  210. );
  211. $data_list = session('user_add_excel_data');
  212. $year=session('user_add_excel_year');
  213. $month=session('user_add_excel_month');
  214. $file_name = $year.'年'.$month.'月每日新增用户数量-'.mt_rand(1000,9999).'.xlsx'; //下载文件名
  215. $file_dir = "excels/users/adds/"; //下载文件存放目录
  216. do_rmdir($file_dir,false);//先清空文件夹
  217. break;
  218. case '1':
  219. $header = array(
  220. '排名'=>'string',//text
  221. '地区'=>'string',//text
  222. '数量'=>'string',//text
  223. );
  224. $map = session('user_region_rank_excel_map');
  225. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  226. $date='('.explode(' ',$map['created_at'][1][0])[0].'至'.explode(' ',$map['created_at'][1][1])[0].')-';
  227. }else{
  228. $date='';
  229. }
  230. $data_list = session('user_region_rank_excel_data');
  231. $file_name = '用户地区排行-'.$date.mt_rand(1000,9999).'.xlsx'; //下载文件名
  232. $file_dir = "excels/users/regions/ranks/"; //下载文件存放目录
  233. do_rmdir($file_dir,false);//先清空文件夹
  234. break;
  235. case '2':
  236. $header = array(
  237. '排名'=>'string',//text
  238. '用户名'=>'string',//text
  239. '联系电话'=>'string',//text
  240. '订单总金额'=>'string',//text
  241. '订单总数量'=>'string',//text
  242. '包含商品总数量'=>'string',//text
  243. );
  244. $map = session('user_order_rank_excel_map');
  245. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  246. $date='('.explode(' ',$map['created_at'][1][0])[0].'至'.explode(' ',$map['created_at'][1][1])[0].')-';
  247. }else{
  248. $date='';
  249. }
  250. $data_list = session('user_order_rank_excel_data');
  251. $file_name = '用户订单排行-'.$date.mt_rand(1000,9999).'.xlsx'; //下载文件名
  252. $file_dir = "excels/users/regions/ranks/"; //下载文件存放目录
  253. do_rmdir($file_dir,false);//先清空文件夹
  254. break;
  255. default:
  256. $this->error('请求错误');
  257. break;
  258. }
  259. $rows = $data_list;
  260. import('PHP_XLSXWriter-master.xlsxwriter', EXTEND_PATH,'.class.php');
  261. $writer = new \XLSXWriter();
  262. $writer->writeSheetHeader('Sheet1', $header);
  263. foreach($rows as $row){
  264. $row=array_values($row);
  265. $writer->writeSheetRow('Sheet1', $row);
  266. }
  267. $writer->writeToFile($file_dir.$file_name);
  268. //检查文件是否存在
  269. if (! file_exists ( $file_dir . $file_name )) {
  270. $this->error('文件未生成成功,请重试');
  271. } else {
  272. header('Location:'.config('mall.public_url').$file_dir.$file_name);
  273. die;
  274. }
  275. }
  276. public function supplier($status='0'){
  277. $list_tab = [
  278. '0' => ['title' => '交易额排行', 'url' => url('supplier', ['status' => '0'])],
  279. '1' => ['title' => '订单数量排行', 'url' => url('supplier', ['status' => '1'])],
  280. '2' => ['title' => '交易商品数量排行', 'url' => url('supplier', ['status' => '2'])],
  281. ];
  282. switch ($status) {
  283. case '0':
  284. return ZBuilder::make('table')
  285. ->setPageTitle('') // 设置页面标题
  286. ->setPageTips('') // 设置页面提示信息
  287. ->setTabNav($list_tab, $status)//分组
  288. ->hideCheckbox() //隐藏第一列多选框
  289. ->addTimeFilter('created_at') // 添加时间段筛选
  290. /*->addColumns([
  291. ['rank', '排名'],
  292. ['name', '供应商'],
  293. ['counts', '订单数量'],
  294. ]) //添加多列数据*/
  295. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excelsupplier',['status'=>0])])
  296. //->setRowList($data_list) // 设置表格数据
  297. ->fetch();
  298. break;
  299. case '1':
  300. $map = $this->getMap();
  301. session('supplier_order_rank_excel_map',$map);
  302. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  303. $where=" WHERE a.created_at<=".strtotime($map['created_at'][1][1])." && a.created_at>=".strtotime($map['created_at'][1][0])." && a.state in (1,3,4,5,8) && a.refund_state in (-1,0,1,2,3,6,9,10,11) && a.is_purchase=1 && a.supplier_product_state=1";
  304. }else{
  305. $where=" WHERE a.state in (1,3,4,5,8) && a.refund_state in (-1,0,1,2,3,6,9,10,11) && a.is_purchase=1 && a.supplier_product_state=1";
  306. }
  307. $data=Db::query("SELECT b.name,COUNT(a.id) AS counts from ".config('database.prefix')."orders a LEFT JOIN ".config('database.prefix')."suppliers b ON a.supplier_id=b.id{$where} GROUP BY a.supplier_id ORDER BY counts DESC LIMIT 100");
  308. $data_list=[];
  309. foreach ($data as $key => $value) {
  310. if($key==0){
  311. $rank=$key+1;
  312. }else{
  313. if($value['counts']!=$data[$key-1]['counts']){
  314. $rank=$key+1;
  315. }
  316. }
  317. $data_list[]=['rank'=>$rank,'name'=>$value['name'],'counts'=>$value['counts']];
  318. }
  319. session('supplier_order_rank_excel_data',$data_list);
  320. return ZBuilder::make('table')
  321. ->setPageTitle('') // 设置页面标题
  322. ->setPageTips('') // 设置页面提示信息
  323. ->setTabNav($list_tab, $status)//分组
  324. ->hideCheckbox() //隐藏第一列多选框
  325. ->addTimeFilter('created_at') // 添加时间段筛选
  326. ->addColumns([
  327. ['rank', '排名'],
  328. ['name', '供应商'],
  329. ['counts', '订单数量'],
  330. ]) //添加多列数据
  331. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excelsupplier',['status'=>1])])
  332. ->setRowList($data_list) // 设置表格数据
  333. ->fetch();
  334. break;
  335. case '2':
  336. $map = $this->getMap();
  337. session('supplier_product_rank_excel_map',$map);
  338. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  339. $where=" WHERE a.created_at<=".strtotime($map['created_at'][1][1])." && a.created_at>=".strtotime($map['created_at'][1][0])." && a.state in (1,3,4,5,8) && a.refund_state in (-1,0,1,2,3,6,9,10,11) && a.is_purchase=1 && a.supplier_product_state=1";
  340. }else{
  341. $where=" WHERE a.state in (1,3,4,5,8) && a.refund_state in (-1,0,1,2,3,6,9,10,11) && a.is_purchase=1 && a.supplier_product_state=1";
  342. }
  343. $data=Db::query("SELECT b.name,SUM(c.num) AS nums from ".config('database.prefix')."orders a LEFT JOIN ".config('database.prefix')."suppliers b ON a.supplier_id=b.id LEFT JOIN ".config('database.prefix')."order_products c ON a.id=c.order_id{$where} GROUP BY a.supplier_id ORDER BY nums DESC LIMIT 100");
  344. $data_list=[];
  345. foreach ($data as $key => $value) {
  346. if($key==0){
  347. $rank=$key+1;
  348. }else{
  349. if($value['nums']!=$data[$key-1]['nums']){
  350. $rank=$key+1;
  351. }
  352. }
  353. $data_list[]=['rank'=>$rank,'name'=>$value['name'],'nums'=>$value['nums']];
  354. }
  355. session('supplier_product_rank_excel_data',$data_list);
  356. return ZBuilder::make('table')
  357. ->setPageTitle('') // 设置页面标题
  358. ->setPageTips('') // 设置页面提示信息
  359. ->setTabNav($list_tab, $status)//分组
  360. ->hideCheckbox() //隐藏第一列多选框
  361. ->addTimeFilter('created_at') // 添加时间段筛选
  362. ->addColumns([
  363. ['rank', '排名'],
  364. ['name', '供应商'],
  365. ['nums', '交易商品数量'],
  366. ]) //添加多列数据
  367. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excelsupplier',['status'=>2])])
  368. ->setRowList($data_list) // 设置表格数据
  369. ->fetch();
  370. break;
  371. default:
  372. break;
  373. }
  374. }
  375. public function excelsupplier($status){
  376. switch ($status) {
  377. case '0':
  378. break;
  379. case '1':
  380. $header = array(
  381. '排名'=>'string',//text
  382. '供应商'=>'string',//text
  383. '订单数量'=>'string',//text
  384. );
  385. $map = session('supplier_order_rank_excel_map');
  386. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  387. $date='('.explode(' ',$map['created_at'][1][0])[0].'至'.explode(' ',$map['created_at'][1][1])[0].')-';
  388. }else{
  389. $date='';
  390. }
  391. $data_list=session('supplier_order_rank_excel_data');
  392. $file_name = '供应商订单数量排行-'.$date.mt_rand(1000,9999).'.xlsx'; //下载文件名
  393. $file_dir = "excels/suppliers/orders/ranks/"; //下载文件存放目录
  394. do_rmdir($file_dir,false);//先清空文件夹
  395. break;
  396. case '2':
  397. $header = array(
  398. '排名'=>'string',//text
  399. '供应商'=>'string',//text
  400. '交易商品数量'=>'string',//text
  401. );
  402. $map = session('supplier_product_rank_excel_map');
  403. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  404. $date='('.explode(' ',$map['created_at'][1][0])[0].'至'.explode(' ',$map['created_at'][1][1])[0].')-';
  405. }else{
  406. $date='';
  407. }
  408. $data_list=session('supplier_product_rank_excel_data');
  409. $file_name = '供应商交易商品数量排行-'.$date.mt_rand(1000,9999).'.xlsx'; //下载文件名
  410. $file_dir = "excels/suppliers/products/ranks/"; //下载文件存放目录
  411. do_rmdir($file_dir,false);//先清空文件夹
  412. break;
  413. default:
  414. $this->error('请求错误');
  415. break;
  416. }
  417. $rows = $data_list;
  418. import('PHP_XLSXWriter-master.xlsxwriter', EXTEND_PATH,'.class.php');
  419. $writer = new \XLSXWriter();
  420. $writer->writeSheetHeader('Sheet1', $header);
  421. foreach($rows as $row){
  422. $row=array_values($row);
  423. $writer->writeSheetRow('Sheet1', $row);
  424. }
  425. $writer->writeToFile($file_dir.$file_name);
  426. //检查文件是否存在
  427. if (! file_exists ( $file_dir . $file_name )) {
  428. $this->error('文件未生成成功,请重试');
  429. } else {
  430. header('Location:'.config('mall.public_url').$file_dir.$file_name);
  431. die;
  432. }
  433. }
  434. public function trade($status='0'){
  435. $list_tab = [
  436. '0' => ['title' => '每月商城交易额', 'url' => url('trade', ['status' => '0'])],
  437. '1' => ['title' => '每月地区交易数据排行', 'url' => url('trade', ['status' => '1'])],
  438. ];
  439. $year=date('Y');
  440. $month=date('m');
  441. $st=strtotime($year.'-'.$month.'-01 00:00:00');
  442. if($month=='12'){
  443. $en_year=$year+1;
  444. $en_month=1;
  445. }else{
  446. $en_year=$year;
  447. $en_month=$month+1;
  448. }
  449. $en=strtotime($en_year.'-'.$en_month.'-01 00:00:00')-1;
  450. $platform_water_count=db('platform_waters')->where('created_at','between',$st.','.$en)->sum('amount');
  451. $tips="本月商城交易额:<b>{$platform_water_count}</b>元。";
  452. switch ($status) {
  453. case '0':
  454. $request_url=$_SERVER["REQUEST_URI"];
  455. $url_arr=parse_url($request_url);
  456. if(isset($url_arr['query'])){
  457. parse_str($url_arr['query'], $query_arr);
  458. if(isset($query_arr['status']) && $query_arr['status']==0){
  459. $pix=true;
  460. }else{
  461. $pix=false;
  462. }
  463. }else{
  464. $pix=false;
  465. }
  466. $map = $this->getMap();
  467. if (empty($map) || (!isset($map['year']) && !isset($map['month']))) {
  468. if($pix){
  469. $s_year=2018;
  470. $s_month=1;
  471. }else{
  472. $s_year=$year;
  473. $s_month=$month;
  474. }
  475. }elseif(!isset($map['year']) && isset($map['month'])){
  476. $s_year=2018;
  477. $s_month=$map['month'];
  478. }elseif(!isset($map['month']) && isset($map['year'])){
  479. $s_year=$map['year'];
  480. $s_month=1;
  481. }else{
  482. $s_year=$map['year'];
  483. $s_month=$map['month'];
  484. }
  485. if($s_month=='12'){
  486. $en_year=$s_year+1;
  487. $en_month=1;
  488. }else{
  489. $en_year=$s_year;
  490. $en_month=$s_month+1;
  491. }
  492. $st=strtotime($s_year.'-'.$s_month.'-01 00:00:00');
  493. $en=strtotime($en_year.'-'.$en_month.'-01 00:00:00')-1;
  494. $for=ceil(($en-$st)/(24*60*60));
  495. $data_list=[];
  496. for ($i=1; $i <= $for; $i++) {
  497. $st_d=strtotime($s_year.'-'.$s_month.'-'.$i.' 00:00:00');
  498. $en_d=strtotime($s_year.'-'.$s_month.'-'.$i.' 23:59:59');
  499. $data_list[]=[
  500. 'day'=>'第'.$i.'日',
  501. 'sum'=>db('platform_waters')->where('created_at','between',$st_d.','.$en_d)->sum('amount')
  502. ];
  503. }
  504. session('platform_water_excel_year',$s_year);
  505. session('platform_water_excel_month',$s_month);
  506. session('platform_water_excel_data',$data_list);
  507. $months=['2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'十一月','12'=>'十二月'];
  508. $years=[];
  509. for ($i=2019; $i <= 2118; $i++) {
  510. $years[$i]=$i.'年';
  511. }
  512. return ZBuilder::make('table')
  513. ->setPageTitle('') // 设置页面标题
  514. ->setPageTips($tips) // 设置页面提示信息
  515. ->setTabNav($list_tab, $status)//分组
  516. ->hideCheckbox() //隐藏第一列多选框
  517. ->addTopSelect('year', '2018年', $years, $year) //添加顶部下拉筛选
  518. ->addTopSelect('month', '一月', $months, $month) //添加顶部下拉筛选
  519. ->addColumns([
  520. ['day', '第几日'],
  521. ['sum', '交易额'],
  522. ]) //添加多列数据
  523. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('exceltrade',['status'=>0])])
  524. ->setRowList($data_list) // 设置表格数据
  525. ->fetch();
  526. break;
  527. case '1':
  528. $request_url=$_SERVER["REQUEST_URI"];
  529. $url_arr=parse_url($request_url);
  530. if(isset($url_arr['query'])){
  531. parse_str($url_arr['query'], $query_arr);
  532. if(isset($query_arr['status']) && $query_arr['status']==0){
  533. $pix=true;
  534. }else{
  535. $pix=false;
  536. }
  537. }else{
  538. $pix=false;
  539. }
  540. $map = $this->getMap();
  541. if (empty($map) || (!isset($map['year']) && !isset($map['month']))) {
  542. if($pix){
  543. $s_year=2018;
  544. $s_month=1;
  545. }else{
  546. $s_year=$year;
  547. $s_month=$month;
  548. }
  549. }elseif(!isset($map['year']) && isset($map['month'])){
  550. $s_year=2018;
  551. $s_month=$map['month'];
  552. }elseif(!isset($map['month']) && isset($map['year'])){
  553. $s_year=$map['year'];
  554. $s_month=1;
  555. }else{
  556. $s_year=$map['year'];
  557. $s_month=$map['month'];
  558. }
  559. if($s_month=='12'){
  560. $en_year=$s_year+1;
  561. $en_month=1;
  562. }else{
  563. $en_year=$s_year;
  564. $en_month=$s_month+1;
  565. }
  566. $st=strtotime($s_year.'-'.$s_month.'-01 00:00:00');
  567. $en=strtotime($en_year.'-'.$en_month.'-01 00:00:00')-1;
  568. $where=" WHERE a.created_at<=".$en." && a.created_at>=".$st." && a.state=1 ";
  569. $data=Db::query("SELECT b.area_id,sum(pay_amount) AS sums from ".config('database.prefix')."trades a LEFT JOIN ".config('database.prefix')."users b ON a.user_id=b.id {$where} GROUP BY b.area_id ORDER BY sums DESC LIMIT 100");
  570. $data_list=[];
  571. foreach ($data as $key => $value) {
  572. $area=db('regions')->where('id',$value['area_id'])->find();
  573. $city=db('regions')->where('id',$area['parent_id'])->find();
  574. $province=db('regions')->where('id',$city['parent_id'])->find();
  575. $region=$province['name'].' '.$city['name'].' '.$area['name'];
  576. if($key==0){
  577. $rank=$key+1;
  578. }else{
  579. if($value['sums']!=$data[$key-1]['sums']){
  580. $rank=$key+1;
  581. }
  582. }
  583. $count1=db('orders a')->join('users b','a.user_id=b.id','LEFT')->where('b.area_id',$value['area_id'])->where('a.user_id',$value['user_id'])->where('a.state','in','1,3,4,5,8')->where('a.refund_state','in','-1,0,1,2,3,6,9,10,11')->count('a.id');
  584. $count2=db('collage_orders a')->join('users b','a.user_id=b.id','LEFT')->where('b.area_id',$value['area_id'])->where('a.user_id',$value['user_id'])->where('a.state','in','1,4')->count('a.id');
  585. $order_counts=$count1+$count2;
  586. $data_list[]=['rank'=>$rank,'region'=>$region,'sums'=>$value['sums'],'order_counts'=>$order_counts];
  587. }
  588. session('trade_region_excel_year',$s_year);
  589. session('trade_region_excel_month',$s_month);
  590. session('trade_region_excel_data',$data_list);
  591. $months=['2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'十一月','12'=>'十二月'];
  592. $years=[];
  593. for ($i=2019; $i <= 2118; $i++) {
  594. $years[$i]=$i.'年';
  595. }
  596. return ZBuilder::make('table')
  597. ->setPageTitle('') // 设置页面标题
  598. ->setPageTips($tips) // 设置页面提示信息
  599. ->setTabNav($list_tab, $status)//分组
  600. ->hideCheckbox() //隐藏第一列多选框
  601. ->addTopSelect('year', '2018年', $years, $year) //添加顶部下拉筛选
  602. ->addTopSelect('month', '一月', $months, $month) //添加顶部下拉筛选
  603. ->addColumns([
  604. ['rank', '排名'],
  605. ['region', '地区'],
  606. ['sums', '交易额'],
  607. ['order_counts', '订单数'],
  608. ]) //添加多列数据
  609. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('exceltrade',['status'=>1])])
  610. ->setRowList($data_list) // 设置表格数据
  611. ->fetch();
  612. break;
  613. default:
  614. break;
  615. }
  616. }
  617. public function exceltrade($status){
  618. switch ($status) {
  619. case '0':
  620. $header = array(
  621. '第几日'=>'string',//text
  622. '交易额'=>'string',//text
  623. );
  624. $data_list = session('platform_water_excel_data');
  625. $year=session('platform_water_excel_year');
  626. $month=session('platform_water_excel_month');
  627. $file_name = $year.'年'.$month.'月商城交易额-'.mt_rand(1000,9999).'.xlsx'; //下载文件名
  628. $file_dir = "excels/trades/platforms/"; //下载文件存放目录
  629. do_rmdir($file_dir,false);//先清空文件夹
  630. break;
  631. case '1':
  632. $header = array(
  633. '排名'=>'string',//text
  634. '地区'=>'string',//text
  635. '交易额'=>'string',//text
  636. '订单数'=>'string',//text
  637. );
  638. $data_list = session('trade_region_excel_data');
  639. $year=session('trade_region_excel_year');
  640. $month=session('trade_region_excel_month');
  641. $file_name = $year.'年'.$month.'月地区交易数据排行-'.mt_rand(1000,9999).'.xlsx'; //下载文件名
  642. $file_dir = "excels/trades/regions/ranks/"; //下载文件存放目录
  643. do_rmdir($file_dir,false);//先清空文件夹
  644. break;
  645. default:
  646. $this->error('请求错误');
  647. break;
  648. }
  649. $rows = $data_list;
  650. import('PHP_XLSXWriter-master.xlsxwriter', EXTEND_PATH,'.class.php');
  651. $writer = new \XLSXWriter();
  652. $writer->writeSheetHeader('Sheet1', $header);
  653. foreach($rows as $row){
  654. $row=array_values($row);
  655. $writer->writeSheetRow('Sheet1', $row);
  656. }
  657. $writer->writeToFile($file_dir.$file_name);
  658. //检查文件是否存在
  659. if (! file_exists ( $file_dir . $file_name )) {
  660. $this->error('文件未生成成功,请重试');
  661. } else {
  662. header('Location:'.config('mall.public_url').$file_dir.$file_name);
  663. die;
  664. }
  665. }
  666. public function product(){
  667. $map = $this->getMap();
  668. session('supplier_product_rank_excel_map',$map);
  669. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  670. $where=" WHERE c.created_at<=".strtotime($map['created_at'][1][1])." && c.created_at>=".strtotime($map['created_at'][1][0])." && c.state in (1,3,4,5,8) && c.refund_state in (-1,0,1,2,3,6,9,10,11)";
  671. }else{
  672. $where=" WHERE c.state in (1,3,4,5,8) && c.refund_state in (-1,0,1,2,3,6,9,10,11)";
  673. }
  674. $data=Db::query("SELECT b.name,SUM(a.num) AS nums from ".config('database.prefix')."order_products a LEFT JOIN ".config('database.prefix')."products b ON a.product_id=b.id LEFT JOIN ".config('database.prefix')."orders c ON a.order_id=c.id{$where} GROUP BY a.product_id ORDER BY nums DESC LIMIT 100");
  675. $data_list=[];
  676. foreach ($data as $key => $value) {
  677. if($key==0){
  678. $rank=$key+1;
  679. }else{
  680. if($value['nums']!=$data[$key-1]['nums']){
  681. $rank=$key+1;
  682. }
  683. }
  684. $data_list[]=['rank'=>$rank,'name'=>$value['name'],'nums'=>$value['nums']];
  685. }
  686. session('supplier_product_rank_excel_data',$data_list);
  687. return ZBuilder::make('table')
  688. ->setPageTitle('商品交易数量排行') // 设置页面标题
  689. ->setPageTips('') // 设置页面提示信息
  690. ->hideCheckbox() //隐藏第一列多选框
  691. ->addTimeFilter('created_at') // 添加时间段筛选
  692. ->addColumns([
  693. ['rank', '排名'],
  694. ['name', '商品名称'],
  695. ['nums', '交易数量'],
  696. ]) //添加多列数据
  697. ->addTopButton('custom',['title'=>'导出excel文件','href'=>url('excelproduct')])
  698. ->setRowList($data_list) // 设置表格数据
  699. ->fetch();
  700. }
  701. public function excelproduct(){
  702. $header = array(
  703. '排名'=>'string',//text
  704. '商品名称'=>'string',//text
  705. '交易数量'=>'string',//text
  706. );
  707. $map = session('supplier_product_rank_excel_map');
  708. if(isset($map['created_at'][0]) && isset($map['created_at'][1]) && $map['created_at'][0]=='between time'){
  709. $date='('.explode(' ',$map['created_at'][1][0])[0].'至'.explode(' ',$map['created_at'][1][1])[0].')-';
  710. }else{
  711. $date='';
  712. }
  713. $data_list=session('supplier_product_rank_excel_data');
  714. $file_name = '商品交易数量排行-'.$date.mt_rand(1000,9999).'.xlsx'; //下载文件名
  715. $file_dir = "excels/products/ranks/"; //下载文件存放目录
  716. do_rmdir($file_dir,false);//先清空文件夹
  717. $rows = $data_list;
  718. import('PHP_XLSXWriter-master.xlsxwriter', EXTEND_PATH,'.class.php');
  719. $writer = new \XLSXWriter();
  720. $writer->writeSheetHeader('Sheet1', $header);
  721. foreach($rows as $row){
  722. $row=array_values($row);
  723. $writer->writeSheetRow('Sheet1', $row);
  724. }
  725. $writer->writeToFile($file_dir.$file_name);
  726. //检查文件是否存在
  727. if (! file_exists ( $file_dir . $file_name )) {
  728. $this->error('文件未生成成功,请重试');
  729. } else {
  730. header('Location:'.config('mall.public_url').$file_dir.$file_name);
  731. die;
  732. }
  733. }
  734. }