WaveController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. <?php
  2. namespace app\modules\car\controllers;
  3. use AlibabaCloud\SDK\Dingtalk\Vindustry_1_0\Models\QueryAllGroupResponseBody\content;
  4. use app\common\controllers\BController;
  5. use app\models\Linkmenu;
  6. use app\modules\car\models\FCarInfo;
  7. use app\modules\car\models\FFlucCostHkm;
  8. use Yii;
  9. use yii\web\Link;
  10. class WaveController extends BController
  11. {
  12. public $layout = 'maininner';
  13. public function actionIndex()
  14. {
  15. $get = Yii::$app->request->get();
  16. $type = $get['type'];
  17. $start_month = 1;
  18. $end_month = $get['end_month']?$get['end_month']:12;
  19. //下面三个参数为查询提交
  20. $datatype = $get['datatype'];
  21. $year = $get['year'];
  22. $lastyear = $year-1;
  23. $city = $get['city'];
  24. if($city)
  25. {
  26. $cityInfo = Linkmenu::getMenuNameRs($city);
  27. $cityName = $cityInfo[0];
  28. }
  29. if(!empty($type))
  30. {
  31. //百公里费用波动(万元)
  32. $func = 'avg';
  33. if($type==1)
  34. {
  35. $tableName = 'wz_f_cost_fluctuation';
  36. $fieldName = 'all_costs_per_100_km';
  37. $unit = '元';
  38. }
  39. //百公里油耗波动(升)
  40. if($type==2)
  41. {
  42. $tableName = 'wz_f_cost_fluctuation';
  43. $fieldName = 'fuel_consumption_per_100_km';
  44. $unit = '升';
  45. }
  46. //单车费用波动(元)
  47. if($type==3)
  48. {
  49. $tableName = 'wz_f_cost_fluctuation';
  50. $fieldName = 'all_costs_sum';
  51. $unit = '元';
  52. $func = 'sum';
  53. }
  54. //运行成本波动(元)
  55. if($type==4)
  56. {
  57. $tableName = 'wz_f_cost_fluctuation';
  58. $fieldName = 'operating_cost_sum';
  59. $unit = '元';
  60. $func = 'sum';
  61. }
  62. //低效车辆波动
  63. if($type==5)
  64. {
  65. $tableName = 'wz_f_efficiency_fluctuation';
  66. $fieldName = 'inefficiency_count';
  67. $unit = '辆';
  68. $func = 'sum';
  69. }
  70. //行驶里程波动
  71. if($type==6)
  72. {
  73. $tableName = 'wz_f_efficiency_fluctuation';
  74. $fieldName = 'mileage_avg';
  75. $unit = '公里';
  76. $func = 'avg';
  77. }
  78. //出勤率波动
  79. if($type==7)
  80. {
  81. $tableName = 'wz_f_efficiency_fluctuation';
  82. $fieldName = 'attendance_rate_avg';
  83. $unit = '%';
  84. $func = 'avg';
  85. }
  86. //违规用车波动
  87. if($type==8)
  88. {
  89. $tableName = 'wz_f_illegal_vehicle_fluctuation';
  90. $fieldName = 'total';
  91. $unit = '辆';
  92. $func = 'sum';
  93. }
  94. //租赁车辆非正常费用波动
  95. if($type==9)
  96. {
  97. $tableName = 'wz_f_rental_vehicle_abnormal_charges_fluctuation';
  98. $fieldName = 'total_sum';
  99. $unit = '元';
  100. $func = 'sum';
  101. }
  102. //AJAX读取数据
  103. if (Yii::$app->request->isAjax || $_GET['docache']==1) {
  104. if(empty($cityName))
  105. {
  106. $cacheFlag = 'wave_'.$type.'_'.$start_month.'_'.$end_month.'_'.$datatype.'_'.$year;
  107. $cacheData = json_decode(Yii::$app->cache->get($cacheFlag),true);
  108. if($_GET['docache']==1)$cacheData = null;
  109. }
  110. $cacheData = null;
  111. //月度
  112. if($datatype==1)
  113. {
  114. if(empty($cacheData))
  115. {
  116. $dpts = Yii::$app->db->createCommand("select distinct(dpt_sec),city from $tableName where dpt_sec!=''")->queryAll();
  117. $sql = "select $func($fieldName) as finalresult,dpt_sec,month from $tableName where year=$year and dpt_sec!='' group by dpt_sec,month";
  118. $dptsRsults = Yii::$app->db->createCommand($sql)->queryAll();
  119. if(is_array($dptsRsults))foreach($dptsRsults as $dptsRsult)
  120. {
  121. $dptsInfos[$dptsRsult['dpt_sec'].'_'.$dptsRsult['month']] = $dptsRsult['finalresult'];
  122. }
  123. //当年
  124. $line1 = [];
  125. for($i=1;$i<=$end_month;$i++)
  126. {
  127. if(empty($cityName))
  128. {
  129. $sql = "select $func($fieldName) from $tableName where year=$year and month=$i";
  130. }
  131. else
  132. {
  133. $sql = "select $func($fieldName) from $tableName where city = '".$cityName."' and year=$year and month=$i";
  134. }
  135. $line1[] = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  136. }
  137. //上一年
  138. $line2 = [];
  139. for($i=1;$i<=$end_month;$i++)
  140. {
  141. if(empty($cityName))
  142. {
  143. $sql = "select $func($fieldName) from $tableName where year=$lastyear and month=$i";
  144. }
  145. else
  146. {
  147. $sql = "select $func($fieldName) from $tableName where city = '".$cityName."' and year=$lastyear and month=$i";
  148. }
  149. $line2[] = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  150. }
  151. //表格
  152. $table = '';
  153. $table .= "<table id='table' class='admin-table table dt-responsive nowrap dataTable no-footer dtr-inline table-bordered table-hover'>";
  154. $table .= "<thead><tr>";
  155. $table .= "<td style='text-align: center;font-weight:bold;'>地市</td>";
  156. $table .= "<td style='text-align: center;font-weight:bold;'>二级单位</td>";
  157. for($i=1;$i<=$end_month;$i++)
  158. {
  159. $table .= "<td style='text-align: center;font-weight:bold;'>".$i."月</td>";
  160. }
  161. $table .= "</tr></thead></table>";
  162. $table .= "<div style='height: 250px;overflow-y:scroll;padding:0;'><table class='admin-table table dt-responsive nowrap dataTable no-footer dtr-inline table-bordered table-hover' style='margin:0 !important;'><tr class='treegrid-".md5('全省')." treegrid-expanded' data-id='".md5('全省')."'>";
  163. $table .= "<td style='text-align: left;'><span class='treegrid-expander treegrid-expander-expanded'></span>全省</td>";
  164. $table .= "<td style='text-align: center;'></td>";
  165. for($i=1;$i<=$end_month;$i++)
  166. {
  167. $sql1 = "select count(*) from $tableName where year=$year and month=$i";
  168. $recordnum = Yii::$app->db->createCommand($sql1)->queryScalar();
  169. if($recordnum==0)
  170. {
  171. $table .= "<td style='text-align: center;'>--</td>";
  172. }
  173. else
  174. {
  175. $sql = "select $func($fieldName) from $tableName where year=$year and month=$i";
  176. $table .= "<td style='text-align: center;'>".round(Yii::$app->db->createCommand($sql)->queryScalar(),2)."</td>";
  177. }
  178. }
  179. $table .= "</tr>";
  180. foreach($this->cityOptions as $ucity)
  181. {
  182. if(!empty($cityName)&&$ucity!=$cityName)continue;
  183. $table .= "<tr class='treegrid-".md5($ucity)." treegrid-parent-".md5('全省')." treegrid-collapsed' data-id='".md5($ucity)."'>";
  184. $table .= "<td style='text-align: left;' ><span class='treegrid-expander treegrid-expander-collapsed'></span>&nbsp;&nbsp;".$ucity."</td>";
  185. $table .= "<td></td>";
  186. for($i=1;$i<=$end_month;$i++)
  187. {
  188. $sql1 = "select count(*) from $tableName where city='".$ucity."' and year=$year and month=$i";
  189. $recordnum = Yii::$app->db->createCommand($sql1)->queryScalar();
  190. if($recordnum==0)
  191. {
  192. $table .= "<td style='text-align: center;'>--</td>";
  193. }
  194. else
  195. {
  196. $sql = "select $func($fieldName) from $tableName where city='".$ucity."' and year=$year and month=$i";
  197. $table .= "<td style='text-align: center;'>".round(Yii::$app->db->createCommand($sql)->queryScalar(),2)."</td>";
  198. }
  199. }
  200. $table .= "</tr>";
  201. //二级单位数据
  202. if(!empty($dpts))
  203. {
  204. foreach($dpts as $udpt)
  205. {
  206. if($udpt['city']!=$ucity)continue;
  207. $dpt = $udpt['dpt_sec'];
  208. $table .= "<tr class='treegrid-".md5($dpt)." treegrid-parent-".md5($ucity)." treegrid-collapsed' data-id='".md5($dpt)."' style='display:none;'>";
  209. $table .= "<td style='text-align: left;' ></td>";
  210. $table .= "<td>".$dpt."</td>";
  211. for($i=1;$i<=$end_month;$i++)
  212. {
  213. if(empty($dptsInfos[$dpt.'_'.$i]))
  214. {
  215. $table .= "<td style='text-align: center;'>--</td>";
  216. }
  217. else
  218. {
  219. $table .= "<td style='text-align: center;'>".round($dptsInfos[$dpt.'_'.$i],2)."</td>";
  220. }
  221. }
  222. $table .= "</tr>";
  223. }
  224. }
  225. }
  226. $table .= "</div></table>";
  227. $result = array(
  228. 'error'=>'0',
  229. 'msg'=>'获取成功',
  230. 'year'=>$year,
  231. 'lastyear'=>$lastyear,
  232. 'line1'=>$line1,
  233. 'line2'=>$line2,
  234. 'table'=>$table,
  235. 'unit'=>$unit,
  236. 'dpts'=>$dpts,
  237. 'dptsInfos'=>$dptsInfos,
  238. );
  239. //生成缓存
  240. if($_GET['docache']==1)
  241. {
  242. Yii::$app->cache->set($cacheFlag, json_encode($result),0);
  243. }
  244. echo_json($result);
  245. }
  246. else
  247. {
  248. echo_json($cacheData);
  249. }
  250. }
  251. //累计
  252. if($datatype==2)
  253. {
  254. if(empty($cacheData))
  255. {
  256. $dpts = Yii::$app->db->createCommand("select distinct(dpt_sec),city from $tableName where dpt_sec!=''")->queryAll();
  257. $sql = "select $func($fieldName) as finalresult ,dpt_sec from $tableName where year=$year and dpt_sec!='' group by dpt_sec";
  258. $dptsRsults = Yii::$app->db->createCommand($sql)->queryAll();
  259. if(is_array($dptsRsults))foreach($dptsRsults as $dptsRsult)
  260. {
  261. $dptsInfos[$dptsRsult['dpt_sec']] = $dptsRsult['finalresult'];
  262. }
  263. $sql = "select $func($fieldName) as finalresult ,dpt_sec from $tableName where year=$lastyear and dpt_sec!='' group by dpt_sec";
  264. $dptsRsults = Yii::$app->db->createCommand($sql)->queryAll();
  265. if(is_array($dptsRsults))foreach($dptsRsults as $dptsRsult)
  266. {
  267. $dptsInfosLast[$dptsRsult['dpt_sec']] = $dptsRsult['finalresult'];
  268. }
  269. //本年柱状
  270. foreach($this->cityOptions as $ucity)
  271. {
  272. $sql = "select $func($fieldName) from $tableName where year=$year and city='".$ucity."'";
  273. $line1[] = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  274. }
  275. //上一年柱状
  276. foreach($this->cityOptions as $ucity)
  277. {
  278. $sql = "select $func($fieldName) from $tableName where year=$lastyear and city='".$ucity."'";
  279. $line2[] = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  280. }
  281. //对比
  282. foreach($line1 as $k=>$v)
  283. {
  284. if($line1[$k]>0)
  285. {
  286. $duibi = $line1[$k]>$line2[$k]?'+'.round(abs($line1[$k] - $line2[$k])/$line1[$k],2)*100:0-round(abs($line1[$k] - $line2[$k])/$line1[$k],2);
  287. $line3[] = $duibi;
  288. }
  289. else
  290. {
  291. $line3[] = 0;
  292. }
  293. }
  294. //表格
  295. $table = '';
  296. $table .= "<table id='table' class='admin-table table dt-responsive nowrap dataTable no-footer dtr-inline table-bordered table-hover'>";
  297. $table .= "<thead><tr>";
  298. $table .= "<td style='text-align: center;font-weight:bold;'>地市</td>";
  299. $table .= "<td style='text-align: center;font-weight:bold;'>二级单位</td>";
  300. $table .= "<td style='text-align: center;font-weight:bold;'>累计</td>";
  301. $table .= "<td style='text-align: center;font-weight:bold;'>去年同期</td>";
  302. $table .= "<td style='text-align: center;font-weight:bold;'>同比变动</td>";
  303. $table .= "<td style='text-align: center;font-weight:bold;'>同比增幅</td>";
  304. $table .= "</tr></thead></table>";
  305. $table .= "<div style='height: 250px;overflow-y:scroll;padding:0;'><table class='admin-table table dt-responsive nowrap dataTable no-footer dtr-inline table-bordered table-hover' style='margin:0 !important;'><tr class='treegrid-".md5('全省')." treegrid-expanded' data-id='".md5('全省')."'>";
  306. $table .= "<td style='text-align: center;'><span class='treegrid-expander treegrid-expander-expanded'></span>全省</td>";
  307. $table .= "<td></td>";
  308. $sql = "select $func($fieldName) from $tableName where year=$year";
  309. $total1 = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  310. $table .= "<td style='text-align: center;'>".$total1."</td>";
  311. $sql = "select $func($fieldName) from $tableName where year=$lastyear";
  312. $total2 = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  313. $table .= "<td style='text-align: center;'>".round($total2,2)."</td>";
  314. $table .= "<td style='text-align: center;'>".round($total1-$total2,2)."</td>";
  315. $percent = !empty($total1)?round(round($total1-$total2,2)/$total1*100,2).'%':'';
  316. $table .= "<td style='text-align: center;'>".$percent."</td>";
  317. $table .= "</tr>";
  318. foreach($this->cityOptions as $ucity)
  319. {
  320. if(!empty($cityName)&&$ucity!=$cityName)continue;
  321. $table .= "<tr class='treegrid-".md5($ucity)." treegrid-parent-".md5('全省')." treegrid-collapsed' data-id='".md5($ucity)."'>";
  322. $table .= "<td style='text-align: center;'><span class='treegrid-expander treegrid-expander-collapsed'></span>".$ucity."</td>";
  323. $table .= "<td></td>";
  324. $sql = "select $func($fieldName) from $tableName where year=$year and city='".$ucity."'";
  325. $total1 = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  326. $table .= "<td style='text-align: center;'>".$total1."</td>";
  327. $sql = "select $func($fieldName) from $tableName where year=$lastyear and city='".$ucity."'";
  328. $total2 = round(Yii::$app->db->createCommand($sql)->queryScalar(),2);
  329. $table .= "<td style='text-align: center;'>".round($total2,2)."</td>";
  330. $table .= "<td style='text-align: center;'>".round($total1-$total2,2)."</td>";
  331. $percent = !empty($total1)?round(round($total1-$total2,2)/$total1*100,2).'%':'';
  332. $table .= "<td style='text-align: center;'>".$percent."</td>";
  333. $table .= "</tr>";
  334. //二级单位数据
  335. if(!empty($dpts))
  336. {
  337. foreach($dpts as $udpt)
  338. {
  339. if($udpt['city']!=$ucity)continue;
  340. $dpt = $udpt['dpt_sec'];
  341. $table .= "<tr class='treegrid-".md5($dpt)." treegrid-parent-".md5($ucity)." treegrid-collapsed' data-id='".md5($dpt)."' style='display:none;'>";
  342. $table .= "<td style='text-align: left;' ></td>";
  343. $table .= "<td>".$dpt."</td>";
  344. $total1 = round($dptsInfos[$dpt],2);
  345. $table .= "<td style='text-align: center;'>".$total1."</td>";
  346. $sql = "select $func($fieldName) from $tableName where year=$lastyear and city='".$ucity."'";
  347. $total2 = round($dptsInfosLast[$dpt],2);
  348. $table .= "<td style='text-align: center;'>".round($total2,2)."</td>";
  349. $table .= "<td style='text-align: center;'>".round($total1-$total2,2)."</td>";
  350. $percent = !empty($total1)?round(round($total1-$total2,2)/$total1*100,2).'%':'';
  351. $table .= "<td style='text-align: center;'>".$percent."</td>";
  352. $table .= "</tr>";
  353. }
  354. }
  355. }
  356. $table .= "</table></div>";
  357. $result = array(
  358. 'error'=>'0',
  359. 'msg'=>'获取成功',
  360. 'year'=>$year,
  361. 'lastyear'=>$lastyear,
  362. 'line1'=>$line1,
  363. 'line2'=>$line2,
  364. 'line3'=>$line3,
  365. 'table'=>$table,
  366. 'cityOptions'=>$this->cityOptions,
  367. 'unit' => $unit,
  368. 'dpts'=>$dpts,
  369. 'dptsInfos'=>$dptsInfos,
  370. 'dptsInfosLast'=>$dptsInfosLast
  371. );
  372. //生成缓存
  373. if($_GET['docache']==1)
  374. {
  375. Yii::$app->cache->set($cacheFlag, json_encode($result),0);
  376. }
  377. echo_json($result);
  378. }
  379. else
  380. {
  381. echo_json($cacheData);
  382. }
  383. }
  384. }
  385. $koujing = '这里是口径描述';
  386. $fileNames = [
  387. '百公里费用波动',
  388. '百公里油耗波动',
  389. '单车费用波动',
  390. '运行成本波动',
  391. '低效车辆波动',
  392. '行驶里程波动',
  393. '出勤率波动',
  394. '违规用车波动',
  395. '租赁车辆非正常费用波动',
  396. ];
  397. //渲染视图
  398. return $this->render('wave',array('type'=>$type,'koujing'=>$koujing,'fileName'=>$fileNames[$type-1]));
  399. }
  400. else
  401. {
  402. $this->layout = 'main';
  403. return $this->render('index');
  404. }
  405. }
  406. }