ProbeController.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. <?php
  2. namespace app\modules\car\controllers;
  3. use app\common\controllers\BController;
  4. use app\modules\car\models\FCarInfo;
  5. use app\modules\car\models\FCarScrap;
  6. use app\modules\car\models\FInputPolicy;
  7. use app\modules\car\models\FOneCarOneTable;
  8. use app\modules\car\models\FSpcCar;
  9. use app\modules\car\models\FUnDispatchOrdersCrossBorder;
  10. use app\modules\car\models\FViolationDetails;
  11. use Yii;
  12. class ProbeController extends BController
  13. {
  14. public $layout = 'main';
  15. public function actionCost()
  16. {
  17. $type = Yii::$app->request->get('type', 1);
  18. $koujing = '这里是口径描述';
  19. $res = FSpcCar::find()->where(['is_spec'=>1])->asArray()->all();
  20. $spc_cars = [];
  21. foreach ($res as $v){
  22. $spc_cars[] = $v['card_num'];
  23. }
  24. $res = FCarScrap::find()->asArray()->all();
  25. //$spc_cars = [];
  26. foreach ($res as $v){
  27. $spc_cars[] = $v['card_num'];
  28. }
  29. //燃油费异常
  30. //按百公里燃油费用排名,前50名且百公里油耗>15升(120元)的车辆为异常。
  31. if ($type == 1) {
  32. if (Yii::$app->request->isAjax) {
  33. $params = Yii::$app->request->get();
  34. $where = $this->getCityWhere($params);
  35. $where['is_special_car'] = 0;
  36. $_query = FOneCarOneTable::find()->alias('one')->leftJoin('{{%f_car_info}} as ci', 'one.car_id = ci.car_id');
  37. $_query->where($where);
  38. //账期
  39. if(!empty($params['statistical_month'])){
  40. $statistical_month = explode('-',$params['statistical_month']);
  41. $_where['year_info'] = intval($statistical_month[0]);
  42. $_query->andWhere(['and',['=','year_info',intval($statistical_month[0])],['<=','month_info',intval($statistical_month[1])]]);
  43. $_where['month_info'] = intval($statistical_month[1]);
  44. }else{
  45. $res = FOneCarOneTable::find()->orderBy('year_info desc,month_info desc' )->asArray()->one();
  46. $_where['year_info'] = intval($res['year_info']);
  47. $_query->andWhere(['and',['=','year_info',intval($res['year_info'])],['<=','month_info',intval($res['month_info'])]]);
  48. $_where['month_info'] = intval($res['month_info']);
  49. }
  50. $_query->andWhere('(CASE WHEN ("car_new"=1 OR "car_move"=1) THEN (to_date(to_char(allocation_in_date,\'9999-99\'),\'yyyy-MM\')+INTERVAL\'3 month\')<=to_date(to_char("year_info"*100+"month_info",\'9999-99\'),\'yyyy-MM\') ELSE 1=1 END)');
  51. $_query->select(['c_card_num'=>'card_num', 'c_city'=>'city',
  52. 'car_id'=>'max("one"."car_id")',
  53. 'sum_oil'=>'cast(sum("oil_costs") as decimal(10,2))',
  54. 'sum_mileage'=>'cast(sum("sum_mileage") as decimal(10,2))',
  55. 'oil_per_km'=>'cast(coalesce((sum("oil_costs")/nullif(sum("sum_mileage"), 0)::float8*100),0) as decimal(10,2))',
  56. 'oil_avg_km'=>'cast(coalesce((sum("oil_costs")/nullif(sum("sum_mileage"), 0)::float8*100),0)/coalesce(nullif(avg("fuel_cost_per_l"), 0),8.7) as decimal(10,2))'
  57. ])->groupBy('card_num,city')->having('coalesce((sum("oil_costs")/nullif(sum("sum_mileage"), 0)::float8*100),0)>120');
  58. $sql = $_query->createCommand()->getRawSql();
  59. $_query = FCarInfo::find()->alias('car')->leftJoin("({$sql}) as os", 'car.car_id = os.car_id')->select(['os.*','rank'=>'rank() over(ORDER BY "oil_per_km" DESC)']);
  60. $_query->where(['car.is_special_car'=>0])->andWhere(['>','os.car_id',0]);
  61. if(!empty($spc_cars)) $_query->andWhere(['not in','car.card_num',$spc_cars]);
  62. $sql = $_query->createCommand()->getRawSql();
  63. $query = FCarInfo::find()->alias('c')->leftJoin("({$sql}) as cs", 'c.car_id = cs.car_id');
  64. //车牌
  65. if(!empty($params['card_num'])){
  66. $where['c.card_num'] = $params['card_num'];
  67. }
  68. if ($params['card_num']!=$params['card_num_text']){
  69. unset($where['c.card_num']);
  70. $query->where($where)->andWhere(['like','c.card_num',strtoupper($params['card_num_text'])]);
  71. }else{
  72. $query->where($where);
  73. }
  74. $query->andWhere(['and',['>','oil_per_km',120],['<=','rank',50]]);
  75. $countQuery = clone $query;
  76. $query->select(['c.card_num','c.city','c.dpt_sec','c.grid','c.self_rent','c.car_type','c.using_tag','cs.*']);
  77. //分页
  78. if (isset($_GET['limit'])) {
  79. $query->limit(intval($_GET['limit']));
  80. }
  81. if (isset($_GET['offset'])) {
  82. $query->offset(intval($_GET['offset']));
  83. }
  84. //排序
  85. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  86. $resultList = $query->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  87. } else {
  88. $resultList = $query->orderBy(['oil_per_km' => SORT_DESC])->asArray()->all();
  89. }
  90. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  91. echo_json($result);
  92. }
  93. $this->tableTitle = array(
  94. //array('field' => 'statistical_month', 'title' => '帐期', 'align' => 'center', 'sortable' => true),
  95. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  96. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  97. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  98. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  99. array('field' => 'self_rent', 'title' => '车辆来源', 'align' => 'center', 'sortable' => true),
  100. array('field' => 'car_type', 'title' => '车辆类型', 'align' => 'center', 'sortable' => true),
  101. array('field' => 'using_tag', 'title' => '车辆使用性质', 'align' => 'center', 'sortable' => true),
  102. array('field' => 'sum_oil', 'title' => '燃油', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  103. array('field' => 'sum_mileage', 'title' => '里程', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  104. array('field' => 'oil_per_km', 'title' => '百公里油费', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  105. array('field' => 'oil_avg_km', 'title' => '百公里油耗', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  106. array('field' => 'rank', 'title' => '排名', 'align' => 'right', 'sortable' => true, 'formatter'=>'numericFormatter'),
  107. );
  108. $this->tableConfig = array('table' => "fone_car_one_table", 'url' => $this->createRealUrl(['car/probe/cost', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => 'id', 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '燃油费异常', 'height' => 500);
  109. $koujing = '按百公里燃油费用排名,前50名且百公里油耗>15升(120元)的车辆为异常。';
  110. }
  111. //自有车辆维修费异常
  112. if ($type == 2) {
  113. if (Yii::$app->request->isAjax) {
  114. $params = Yii::$app->request->get();
  115. $where = $this->getCityWhere($params);
  116. //$where['is_special_car'] = 0;
  117. $where['self_rent'] = '自有车辆';
  118. $_query = FOneCarOneTable::find()->alias('one')->leftJoin('{{%f_car_info}} as ci', 'one.car_id = ci.car_id');
  119. $_query->where($where);
  120. //账期
  121. if(!empty($params['statistical_month'])){
  122. $statistical_month = explode('-',$params['statistical_month']);
  123. $_where['year_info'] = intval($statistical_month[0]);
  124. $_query->andWhere(['and',['=','year_info',intval($statistical_month[0])],['<=','month_info',intval($statistical_month[1])]]);
  125. $_where['month_info'] = intval($statistical_month[1]);
  126. }else{
  127. $res = FOneCarOneTable::find()->orderBy('year_info desc,month_info desc' )->asArray()->one();
  128. $_where['year_info'] = intval($res['year_info']);
  129. $_query->andWhere(['and',['=','year_info',intval($res['year_info'])],['<=','month_info',intval($res['month_info'])]]);
  130. $_where['month_info'] = intval($res['month_info']);
  131. }
  132. $_query->andWhere('(CASE WHEN ("car_new"=1 OR "car_move"=1) THEN (to_date(to_char(allocation_in_date,\'9999-99\'),\'yyyy-MM\')+INTERVAL\'3 month\')<=to_date(to_char("year_info"*100+"month_info",\'9999-99\'),\'yyyy-MM\') ELSE 1=1 END)');
  133. $_query->select(['c_card_num'=>'card_num', 'c_city'=>'city',
  134. 'car_id'=>'max("one"."car_id")',
  135. 'sum_repair'=>'cast(coalesce(sum("repair_costs"),0) as decimal(10,2))',
  136. ])->groupBy('card_num,city')->having('coalesce(sum("repair_costs"),0)>5000');
  137. $sql = $_query->createCommand()->getRawSql();
  138. $_query = FCarInfo::find()->alias('car')->leftJoin("({$sql}) as os", 'car.car_id = os.car_id')->select(['os.*','rank'=>'rank() over(ORDER BY "sum_repair" DESC)']);
  139. $_query->where(['car.is_special_car'=>0,'self_rent'=>'自有车辆'])->andWhere(['>','os.car_id',0]);
  140. if(!empty($spc_cars)) $_query->andWhere(['not in','car.card_num',$spc_cars]);
  141. $sql = $_query->createCommand()->getRawSql();
  142. $query = FCarInfo::find()->alias('c')->leftJoin("({$sql}) as cs", 'c.car_id = cs.car_id');
  143. //车牌
  144. if(!empty($params['card_num'])){
  145. $where['c.card_num'] = $params['card_num'];
  146. }
  147. if ($params['card_num']!=$params['card_num_text']){
  148. unset($where['c.card_num']);
  149. $query->where($where)->andWhere(['like','c.card_num',strtoupper($params['card_num_text'])]);
  150. }else{
  151. $query->where($where);
  152. }
  153. $query->andWhere(['and',['>','sum_repair',5000],['<=','rank',50]]);
  154. $countQuery = clone $query;
  155. $query->select(['c.card_num','c.city','c.dpt_sec','c.grid','c.self_rent','c.car_type','c.using_tag','c.enabled_date'
  156. ,'cs.*','car_age'=>'age(CURRENT_DATE, c.enabled_date::date)']);
  157. //分页
  158. if (isset($_GET['limit'])) {
  159. $query->limit(intval($_GET['limit']));
  160. }
  161. if (isset($_GET['offset'])) {
  162. $query->offset(intval($_GET['offset']));
  163. }
  164. //排序
  165. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  166. $resultList = $query->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  167. } else {
  168. $resultList = $query->orderBy(['sum_repair' => SORT_DESC])->asArray()->all();
  169. }
  170. foreach ($resultList as &$v){
  171. $v['car_age'] = str_replace(['years','mons','days','year','mon','day',' '],['年','月','天','年','月','天',''],$v['car_age']);
  172. }
  173. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  174. echo_json($result);
  175. }
  176. $this->tableTitle = array(
  177. //array('field' => 'statistical_month', 'title' => '帐期', 'align' => 'center', 'sortable' => true),
  178. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  179. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  180. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  181. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  182. array('field' => 'self_rent', 'title' => '车辆来源', 'align' => 'center', 'sortable' => true),
  183. array('field' => 'car_type', 'title' => '车辆类型', 'align' => 'center', 'sortable' => true),
  184. array('field' => 'using_tag', 'title' => '车辆使用性质', 'align' => 'center', 'sortable' => true),
  185. array('field' => 'car_age', 'title' => '车龄', 'align' => 'right', 'sortable' => true),
  186. array('field' => 'enabled_date', 'title' => '登记日期', 'align' => 'center', 'sortable' => true),
  187. array('field' => 'sum_repair', 'title' => '累计维修费(元)', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  188. array('field' => 'rank', 'title' => '排名', 'align' => 'right', 'sortable' => true, 'formatter'=>'numericFormatter'),
  189. );
  190. $this->tableConfig = array('table' => "fone_car_one_table", 'url' => $this->createRealUrl(['car/probe/cost', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => FOneCarOneTable::modelPrimaryKey(), 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '自有车辆维修费异常', 'height' => 500);
  191. $koujing = '按单车维修费排名,前50名且年累计维修费>5000元的车辆为异常。';
  192. }
  193. //租赁车辆维修费异常
  194. if ($type == 3) {
  195. if (Yii::$app->request->isAjax) {
  196. $params = Yii::$app->request->get();
  197. $where = $this->getCityWhere($params);
  198. //$where['is_special_car'] = 0;
  199. $where['self_rent'] = '租赁车辆';
  200. $_query = FOneCarOneTable::find()->alias('one')->leftJoin('{{%f_car_info}} as ci', 'one.car_id = ci.car_id');
  201. $_query->where($where);
  202. //账期
  203. if(!empty($params['statistical_month'])){
  204. $statistical_month = explode('-',$params['statistical_month']);
  205. $_where['year_info'] = intval($statistical_month[0]);
  206. $_query->andWhere(['and',['=','year_info',intval($statistical_month[0])],['<=','month_info',intval($statistical_month[1])]]);
  207. $_where['month_info'] = intval($statistical_month[1]);
  208. }else{
  209. $res = FOneCarOneTable::find()->orderBy('year_info desc,month_info desc' )->asArray()->one();
  210. $_where['year_info'] = intval($res['year_info']);
  211. $_query->andWhere(['and',['=','year_info',intval($res['year_info'])],['<=','month_info',intval($res['month_info'])]]);
  212. $_where['month_info'] = intval($res['month_info']);
  213. }
  214. $_query->andWhere('(CASE WHEN ("car_new"=1 OR "car_move"=1) THEN (to_date(to_char(allocation_in_date,\'9999-99\'),\'yyyy-MM\')+INTERVAL\'3 month\')<=to_date(to_char("year_info"*100+"month_info",\'9999-99\'),\'yyyy-MM\') ELSE 1=1 END)');
  215. $_query->select(['c_card_num'=>'card_num', 'c_city'=>'city',
  216. 'car_id'=>'max("one"."car_id")',
  217. 'sum_repair'=>'cast(coalesce(sum("repair_costs"),0) as decimal(10,2))',
  218. ])->groupBy('card_num,city')->having('coalesce(sum("repair_costs"),0)>2000');
  219. $sql = $_query->createCommand()->getRawSql();
  220. $_query = FCarInfo::find()->alias('car')->leftJoin("({$sql}) as os", 'car.car_id = os.car_id')->select(['os.*','rank'=>'rank() over(ORDER BY "sum_repair" DESC)']);
  221. $_query->where(['car.is_special_car'=>0,'self_rent'=>'租赁车辆'])->andWhere(['>','os.car_id',0]);
  222. if(!empty($spc_cars)) $_query->andWhere(['not in','car.card_num',$spc_cars]);
  223. $sql = $_query->createCommand()->getRawSql();
  224. $query = FCarInfo::find()->alias('c')->leftJoin("({$sql}) as cs", 'c.car_id = cs.car_id');
  225. //车牌
  226. if(!empty($params['card_num'])){
  227. $where['c.card_num'] = $params['card_num'];
  228. }
  229. if ($params['card_num']!=$params['card_num_text']){
  230. unset($where['c.card_num']);
  231. $query->where($where)->andWhere(['like','c.card_num',strtoupper($params['card_num_text'])]);
  232. }else{
  233. $query->where($where);
  234. }
  235. $query->andWhere(['and',['>','sum_repair',2000]]);
  236. $countQuery = clone $query;
  237. $query->select(['c.card_num','c.city','c.dpt_sec','c.grid','c.self_rent','c.car_type','c.using_tag','c.enabled_date'
  238. ,'cs.*','car_age'=>'age(CURRENT_DATE, c.enabled_date::date)']);
  239. //分页
  240. if (isset($_GET['limit'])) {
  241. $query->limit(intval($_GET['limit']));
  242. }
  243. if (isset($_GET['offset'])) {
  244. $query->offset(intval($_GET['offset']));
  245. }
  246. //排序
  247. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  248. $resultList = $query->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  249. } else {
  250. $resultList = $query->orderBy(['sum_repair' => SORT_DESC])->asArray()->all();
  251. }
  252. foreach ($resultList as &$v){
  253. $v['car_age'] = str_replace(['years','mons','days','year','mon','day',' '],['年','月','天','年','月','天',''],$v['car_age']);
  254. }
  255. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  256. echo_json($result);
  257. }
  258. $this->tableTitle = array(
  259. //array('field' => 'statistical_month', 'title' => '帐期', 'align' => 'center', 'sortable' => true),
  260. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  261. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  262. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  263. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  264. array('field' => 'self_rent', 'title' => '车辆来源', 'align' => 'center', 'sortable' => true),
  265. array('field' => 'car_type', 'title' => '车辆类型', 'align' => 'center', 'sortable' => true),
  266. array('field' => 'using_tag', 'title' => '车辆使用性质', 'align' => 'center', 'sortable' => true),
  267. array('field' => 'car_age', 'title' => '车龄', 'align' => 'right', 'sortable' => true),
  268. array('field' => 'enabled_date', 'title' => '登记日期', 'align' => 'center', 'sortable' => true),
  269. array('field' => 'sum_repair', 'title' => '累计维修费(元)', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  270. array('field' => 'rank', 'title' => '排名', 'align' => 'right', 'sortable' => true, 'formatter'=>'numericFormatter'),
  271. );
  272. $this->tableConfig = array('table' => "fone_car_one_table", 'url' => $this->createRealUrl(['car/probe/cost', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => FOneCarOneTable::modelPrimaryKey(), 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '租赁车辆维修费异常', 'height' => 500);
  273. $koujing = '租赁车辆年累计维修费超过2000元为异常。根据车辆租赁合同,租赁车辆正常的维修、保养由供方负责,人为造成的非正常损失由使用方负责,主要是轮胎非正常损坏。对租赁车辆产生维修费的情况进行监控,防止套取维修费。';
  274. }
  275. return $this->render('cost', array('type' => $type, 'koujing' => $koujing));
  276. }
  277. public function actionEfficiency()
  278. {
  279. $type = Yii::$app->request->get('type', 1);
  280. if ($type == 1) {
  281. if (Yii::$app->request->isAjax) {
  282. $res = FSpcCar::find()->where(['is_spec'=>1])->asArray()->all();
  283. $spc_cars = [];
  284. foreach ($res as $v){
  285. $spc_cars[] = $v['card_num'];
  286. }
  287. $res = FCarScrap::find()->asArray()->all();
  288. //$spc_cars = [];
  289. foreach ($res as $v){
  290. $spc_cars[] = $v['card_num'];
  291. }
  292. $policy = FInputPolicy::find()->where(['is_active'=>1])->asArray()->one();
  293. if(empty($policy)){
  294. $policy = ['thd_km_per_day'=>20,'thd_att'=>50];
  295. }
  296. $params = Yii::$app->request->get();
  297. $where = $this->getCityWhere($params);
  298. //$where['is_special_car'] = 0;
  299. $_query = FOneCarOneTable::find()->alias('one')->leftJoin('{{%f_car_info}} as ci', 'one.car_id = ci.car_id');
  300. $_query->where($where);
  301. //账期
  302. if(!empty($params['statistical_month'])){
  303. $statistical_month = explode('-',$params['statistical_month']);
  304. $_where['year_info'] = intval($statistical_month[0]);
  305. $_query->andWhere(['and',['=','year_info',intval($statistical_month[0])],['<=','month_info',intval($statistical_month[1])]]);
  306. $_where['month_info'] = intval($statistical_month[1]);
  307. }else{
  308. $res = FOneCarOneTable::find()->orderBy('year_info desc,month_info desc' )->asArray()->one();
  309. $_where['year_info'] = intval($res['year_info']);
  310. $_query->andWhere(['and',['=','year_info',intval($res['year_info'])],['<=','month_info',intval($res['month_info'])]]);
  311. $_where['month_info'] = intval($res['month_info']);
  312. }
  313. $res = FCarInfo::find()->where(['car_move'=>1])->andWhere('(to_date(to_char(allocation_in_date,\'9999-99\'),\'yyyy\'))=to_date(to_char('.(intval($_where['year_info'])*100).',\'9999-99\'),\'yyyy\')')->asArray()->all();
  314. $car_ids = [];
  315. foreach ($res as $v){
  316. $_res = FCarInfo::find()->where(['and',['=','card_num',$v['card_num']],['<','car_id',$v['car_id']],['<>','city',$v['city']]])->asArray()->all();
  317. foreach ($_res as $_v){
  318. $car_ids[] = $_v['car_id'];
  319. }
  320. }
  321. $_query->andWhere('(CASE WHEN ("car_new"=1 OR "car_move"=1) THEN (to_date(to_char(allocation_in_date,\'9999-99\'),\'yyyy-MM\')+INTERVAL\'3 month\')<=to_date(to_char("year_info"*100+"month_info",\'9999-99\'),\'yyyy-MM\') ELSE 1=1 END)');
  322. $_query->select(['c_card_num'=>'card_num', 'c_city'=>'city',
  323. 'car_id'=>'max("one"."car_id")',
  324. 'sum_attend_days'=>'cast(sum("attend_days") as decimal(10,2))',
  325. 'sum_work_days'=>'cast(sum("work_days") as decimal(10,2))',
  326. 'sum_mileage'=>'cast(sum("sum_mileage") as decimal(10,2))',
  327. 'avg_mileage'=>'cast(coalesce((sum("sum_mileage")/nullif(sum("work_days"), 0)::float8),0) as decimal(10,2))',
  328. 'attendance'=>'cast(coalesce((sum("attend_days")/nullif(sum("work_days"), 0)::float8*100),0) as decimal(10,2))'
  329. ])->groupBy('card_num,city')
  330. ->having('coalesce((sum("sum_mileage")/nullif(sum("work_days"), 0)::float8),0)<'.$policy['thd_km_per_day'].' AND coalesce((sum("attend_days")/nullif(sum("work_days"), 0)::float8*100),0)<'.$policy['thd_att']);
  331. $sql = $_query->createCommand()->getRawSql();
  332. $_query = FCarInfo::find()->alias('car')->leftJoin("({$sql}) as os", 'car.car_id = os.car_id')->select(['os.*','rank'=>'rank() over(ORDER BY "avg_mileage", "attendance")']);
  333. $_query->where(['car.is_special_car'=>0])->andWhere(['>','os.car_id',0]);
  334. if(!empty($spc_cars)){
  335. $_query->andWhere(['not in','car.card_num',$spc_cars]);
  336. }
  337. if(!empty($car_ids)){
  338. $_query->andWhere(['not in','car.car_id',$car_ids]);
  339. }
  340. $sql = $_query->createCommand()->getRawSql();
  341. $query = FCarInfo::find()->alias('c')->leftJoin("({$sql}) as cs", 'c.car_id = cs.car_id');
  342. //车牌
  343. if(!empty($params['card_num'])){
  344. $where['c.card_num'] = $params['card_num'];
  345. }
  346. if ($params['card_num']!=$params['card_num_text']){
  347. unset($where['c.card_num']);
  348. $query->where($where)->andWhere(['like','c.card_num',strtoupper($params['card_num_text'])]);
  349. }else{
  350. $query->where($where);
  351. }
  352. $query->andWhere(['and',['<','avg_mileage',$policy['thd_km_per_day']],['<','attendance',$policy['thd_att']]]);
  353. $countQuery = clone $query;
  354. $query->select(['c.card_num','c.city','c.dpt_sec','c.grid','c.self_rent','c.car_type','c.using_tag','cs.*']);
  355. //分页
  356. if (isset($_GET['limit'])) {
  357. $query->limit(intval($_GET['limit']));
  358. }
  359. if (isset($_GET['offset'])) {
  360. $query->offset(intval($_GET['offset']));
  361. }
  362. //排序
  363. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  364. $resultList = $query->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  365. } else {
  366. $resultList = $query->orderBy(["avg_mileage" => SORT_ASC, "attendance" => SORT_ASC])->asArray()->all();
  367. }
  368. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  369. echo_json($result);
  370. }
  371. $this->tableTitle = array(
  372. //array('field' => 'statistical_month', 'title' => '帐期', 'align' => 'center', 'sortable' => true),
  373. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  374. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  375. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  376. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  377. array('field' => 'self_rent', 'title' => '车辆来源', 'align' => 'center', 'sortable' => true),
  378. array('field' => 'car_type', 'title' => '车辆类型', 'align' => 'center', 'sortable' => true),
  379. array('field' => 'using_tag', 'title' => '车辆使用性质', 'align' => 'center', 'sortable' => true),
  380. array('field' => 'avg_mileage', 'title' => '日均里程(公里)', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  381. array('field' => 'attendance', 'title' => '出勤率(%)', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  382. array('field' => 'sum_mileage', 'title' => '总里程(公里)', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  383. array('field' => 'sum_attend_days', 'title' => '行驶天数', 'align' => 'right', 'sortable' => true, 'formatter'=>'numericFormatter'),
  384. array('field' => 'sum_work_days', 'title' => '工作日天数', 'align' => 'right', 'sortable' => true, 'formatter'=>'numericFormatter'),
  385. );
  386. $this->tableConfig = array('table' => "fone_car_one_table", 'url' => $this->createRealUrl(['car/probe/efficiency', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => 'statistical_month', 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '车辆效能探针', 'height' => 500);
  387. }
  388. $koujing = '低效车辆指,以年累计里程、年出勤天数计算,日均行驶里程<20公里且出勤率<50%的车辆。出现低效车辆,发管理工单,预警到县分领导。市分低效车辆占比超过5%,发管理工单,预警到市分办公室主任,超过10%,预警升级,预警到市分主管领导。';
  389. return $this->render('efficiency', array('type' => $type, 'koujing' => $koujing));
  390. }
  391. public function actionDriving()
  392. {
  393. $type = Yii::$app->request->get('type', 1);
  394. $koujing = '';
  395. if ($type == 1) {
  396. if (Yii::$app->request->isAjax) {
  397. $query = FUnDispatchOrdersCrossBorder::find();
  398. $params = Yii::$app->request->get();
  399. $where = $this->getCityWhere($params);
  400. //账期
  401. if(!empty($params['statistical_month'])){
  402. $where['statistical_month'] = str_replace('-','',$params['statistical_month']);
  403. }
  404. //车牌
  405. if(!empty($params['card_num'])){
  406. $where['card_num'] = $params['card_num'];
  407. }
  408. if ($params['card_num']!=$params['card_num_text']){
  409. unset($where['card_num']);
  410. $query->where($where)->andWhere(['like','card_num',strtoupper($params['card_num_text'])]);
  411. }else{
  412. $query->where($where);
  413. }
  414. $countQuery = clone $query;
  415. //分页
  416. if (isset($_GET['limit'])) {
  417. $query->limit(intval($_GET['limit']));
  418. }
  419. if (isset($_GET['offset'])) {
  420. $query->offset(intval($_GET['offset']));
  421. }
  422. $field = ['*'];
  423. //排序
  424. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  425. $resultList = $query->select($field)->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  426. } else {
  427. $resultList = $query->select($field)->orderBy(['statistical_month' => SORT_DESC])->asArray()->all();
  428. }
  429. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  430. echo_json($result);
  431. }
  432. $this->tableTitle = array(
  433. array('field' => 'statistical_month', 'title' => '帐期', 'align' => 'center', 'sortable' => true),
  434. array('field' => 'cross_border_t', 'title' => '越界时间', 'align' => 'center', 'sortable' => true),
  435. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  436. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  437. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  438. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  439. array('field' => 'alarm_area_des', 'title' => '报警区域描述', 'align' => 'center', 'sortable' => true),
  440. array('field' => 'alarm_rule_des', 'title' => '报警规则描述', 'align' => 'center', 'sortable' => true),
  441. array('field' => 'is_working', 'title' => '是否执行中越界', 'align' => 'center', 'sortable' => true),
  442. array('field' => 'car_type', 'title' => '车辆类型', 'align' => 'center', 'sortable' => true),
  443. array('field' => 'using_tag', 'title' => '车辆使用性质', 'align' => 'center', 'sortable' => true),
  444. );
  445. $this->tableConfig = array('table' => FUnDispatchOrdersCrossBorder::shortTableName(), 'url' => $this->createRealUrl(['car/probe/driving', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => FUnDispatchOrdersCrossBorder::modelPrimaryKey(), 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '无派单越界', 'height' => 500);
  446. $koujing = "1、评价规则:
  447. 我公司车辆依托“睿行”平台管理,省、市、县3级车辆分别设置电子围栏,在电子围栏外行驶且未在“睿行”平台派单的车辆为违规车辆。
  448. 2、工单配置:
  449. 策略推送频率为月度,向车辆所属市分公司办公室主任发送管理工单,根据“睿行”平台实施细则,所属市分公司要在本地网内以正式文件通报,累计3次,扣罚司机绩效。
  450. ‘ 0’表示取到数字,值为0,‘-’表示从数据库没有取到数字,‘空’表示没有去数据库取数字";
  451. }
  452. if ($type == 2) {
  453. if (Yii::$app->request->isAjax) {
  454. $query = FViolationDetails::find();
  455. $params = Yii::$app->request->get();
  456. $where = $this->getCityWhere($params);
  457. //账期
  458. if(!empty($params['statistical_month'])){
  459. $where['statistical_month'] = str_replace('-','',$params['statistical_month']);
  460. }else{
  461. $res = FViolationDetails::find()->orderBy(['statistical_month' => SORT_DESC])->asArray()->one();
  462. $where['statistical_month'] = $res['statistical_month'];
  463. }
  464. //车牌
  465. if(!empty($params['card_num'])){
  466. $where['card_num'] = $params['card_num'];
  467. }
  468. if ($params['card_num']!=$params['card_num_text']){
  469. unset($where['card_num']);
  470. $query->where($where)->andWhere(['like','card_num',strtoupper($params['card_num_text'])]);
  471. }else{
  472. $query->where($where);
  473. }
  474. $query->where($where)->andWhere(['and',['like','offline_actual_processing_status','未处理'],['>','unprocessed_duration_of_violation',180]]);
  475. $countQuery = clone $query;
  476. $query->select(['statistical_month','card_num','city','dpt_sec','grid','violation_time'=>'"violation_time"::timestamp','unprocessed_duration_of_violation',
  477. 'violation_location','violation_details','deduction_points','fine','offline_actual_processing_status','row_num'=>'ROW_NUMBER() OVER()']);
  478. //分页
  479. if (isset($_GET['limit'])) {
  480. $query->limit(intval($_GET['limit']));
  481. }
  482. if (isset($_GET['offset'])) {
  483. $query->offset(intval($_GET['offset']));
  484. }
  485. //排序
  486. if (isset($_GET['sort']) && isset($_GET['sortOrder'])) {
  487. $resultList = $query->orderBy([$_GET['sort'] => ($_GET['sortOrder'] == 'asc' ? SORT_ASC : SORT_DESC)])->asArray()->all();
  488. } else {
  489. $resultList = $query->orderBy(['statistical_month' => SORT_DESC])->asArray()->all();
  490. }
  491. $result = ["total" => $countQuery->count(), "totalNotFiltered" => $countQuery->count(), "rows" => $resultList];
  492. echo_json($result);
  493. }
  494. $this->tableTitle = array(
  495. array('field' => 'row_num', 'title' => '序号', 'align' => 'center', 'sortable' => true),
  496. array('field' => 'statistical_month', 'title' => '账期', 'align' => 'center', 'sortable' => true),
  497. array('field' => 'card_num', 'title' => '车牌号', 'align' => 'center', 'sortable' => true),
  498. array('field' => 'city', 'title' => '单位', 'align' => 'center', 'sortable' => true),
  499. array('field' => 'dpt_sec', 'title' => '二级单位', 'align' => 'center', 'sortable' => true),
  500. array('field' => 'grid', 'title' => '三级单位', 'align' => 'center', 'sortable' => true),
  501. array('field' => 'violation_time', 'title' => '违章时间', 'align' => 'center', 'sortable' => true),
  502. array('field' => 'unprocessed_duration_of_violation', 'title' => '违章未处理时长(天)', 'align' => 'center', 'sortable' => true, 'formatter'=>'numericFormatter'),
  503. array('field' => 'violation_location', 'title' => '违章地点', 'align' => 'center', 'sortable' => true),
  504. array('field' => 'violation_details', 'title' => '违章详情', 'align' => 'center', 'sortable' => true, 'width' => '200px'),
  505. array('field' => 'deduction_points', 'title' => '扣分', 'align' => 'center', 'sortable' => true, 'formatter'=>'numericFormatter'),
  506. array('field' => 'fine', 'title' => '罚款', 'align' => 'right', 'sortable' => true, 'formatter'=>'numeric1Formatter'),
  507. array('field' => 'offline_actual_processing_status', 'title' => '三方处理状态', 'align' => 'center', 'sortable' => true),
  508. );
  509. $this->tableConfig = array('table' => FViolationDetails::shortTableName(), 'url' => $this->createRealUrl(['car/probe/driving', 'type' => $type]), 'setFieldUrl' => $this->createRealUrl(['car/probe/setfield']), 'idField' => 'car_id', 'checkbox' => 0, 'dropmenu' => 1, 'pagination' => true, 'pagesize' => 20, 'refresh' => true, 'exportFileName' => '违章长期未处理', 'height' => 500);
  510. $koujing = '存在交通违章,6个月以上未处理的车辆为异常。(加强处理后,时间会调整,如5个月。)';
  511. }
  512. return $this->render('driving', array('type' => $type, 'koujing' => $koujing));
  513. }
  514. }