compStats.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. var locat = (window.location+'').split('/');
  2. $(function(){if('fhsms'== locat[3]){locat = locat[0]+'//'+locat[2];}else{locat = locat[0]+'//'+locat[2]+'/'+locat[3];};});
  3. $(getTop(globalThis).hangge());
  4. var paramOption = {
  5. tabletype : '',
  6. category : '', //用title值
  7. scale : '', //用title值
  8. hasScale : 0, //0不根据规模分组 1根据
  9. datatype : 1, //1计划 2完成情况
  10. startYear : '',
  11. endYear : '',
  12. companys : ''
  13. };
  14. var titleOption = {
  15. //可重置
  16. tabletype : ['日常养护','预防养护','修复养护','专项养护','应急养护','试验检测项目','科研项目','设备大修','预备费'],
  17. category : ['路基','路面','桥梁','桥涵','涵洞通道','桥隧','隧道','交安设施','沿线设施','绿化','其他','清扫保洁','巡查检查','养护车辆设备','应急保通'],
  18. scale : ['大修','中修','小修'],
  19. //不可重置
  20. daily_category : ['路基','路面','桥梁','涵洞通道','隧道','交安设施','沿线设施','绿化','清扫保洁','巡查检查','养护车辆设备','应急保通'],
  21. prevention_category : ['路基','路面','桥涵','隧道'],
  22. repair_category : ['路基','路面','桥涵','隧道','交安设施','沿线设施','绿化','其他'],
  23. special_category : ['路基','路面','桥涵','隧道','交安设施','沿线设施','绿化','其他'],
  24. emergency_category : ['路基','路面','桥涵','隧道','交安设施','沿线设施','绿化','其他'],
  25. test_category : ['路基','路面','桥涵','隧道','交安设施','沿线设施','其他'],
  26. scientific_category : ['路基','路面','桥隧','其他'],
  27. equipment_category : [],
  28. reserve_category : []
  29. };
  30. var valueOption = {
  31. //可重置
  32. tabletype : ['daily','prevention','repair','special','emergency','test','scientific','equipment','reserve'],
  33. category : ['subgrade','pavement','bridge','bridgeAndCulvert','culvert','bridgeAndTunnel','tunnel','safe','line','green','other','clean','patrol','car','emergency'],
  34. scale : ['max','mid','min'],
  35. //不可重置
  36. daily_category : ['subgrade','pavement','bridge','culvert','tunnel','safe','line','green','clean','patrol','car','emergency'],
  37. prevention_category : ['subgrade','pavement','bridgeAndCulvert','tunnel'],
  38. repair_category : ['subgrade','pavement','bridgeAndCulvert','tunnel','safe','line','green','other'],
  39. special_category : ['subgrade','pavement','bridgeAndCulvert','tunnel','safe','line','green','other'],
  40. emergency_category : ['subgrade','pavement','bridgeAndCulvert','tunnel','safe','line','green','other'],
  41. test_category : ['subgrade','pavement','bridgeAndCulvert','tunnel','safe','line','other'],
  42. scientific_category : ['subgrade','pavement','bridgeAndTunnel','other'],
  43. //无类别
  44. equipment_category : ['noCategory'],
  45. reserve_category : ['noCategory']
  46. };
  47. var tableOption = {};
  48. //重置表格参数
  49. function resetTableOption(){
  50. tableOption = {
  51. title : [],
  52. colspan : [],
  53. value : ['index','company','road'],
  54. daily_category_title : [],
  55. prevention_category_title : [],
  56. repair_category_title : [],
  57. special_category_title : [],
  58. emergency_category_title : [],
  59. test_category_title : [],
  60. scientific_category_title : [],
  61. equipment_category_title : [],
  62. reserve_category_title : [],
  63. daily_category_val : [],
  64. prevention_category_val : [],
  65. repair_category_val : [],
  66. special_category_val : [],
  67. emergency_category_val : [],
  68. test_category_val : [],
  69. scientific_category_val : [],
  70. equipment_category_val : [],
  71. reserve_category_val : []
  72. };
  73. }
  74. //项目类型包含'预防养护','修复养护'以外的类型是,规模禁止选择
  75. function setScaleDisabledInit(){
  76. $('.tabletype[type="checkbox"]').change(function(){
  77. //tabletype titleOption
  78. valueOption.tabletype = [];
  79. $.each($('.tabletype[type="checkbox"]:checked'),function(){
  80. valueOption.tabletype.push($(this).val());
  81. });
  82. if(valueOption.tabletype.indexOf('daily')>-1 || valueOption.tabletype.indexOf('special')>-1
  83. || valueOption.tabletype.indexOf('emergency')>-1 || valueOption.tabletype.indexOf('test')>-1
  84. || valueOption.tabletype.indexOf('scientific')>-1 || valueOption.tabletype.indexOf('equipment')>-1
  85. || valueOption.tabletype.indexOf('reserve')>-1){
  86. $('.scale').prop('disabled',true);
  87. }else{
  88. $('.scale').prop('disabled',false);
  89. }
  90. })
  91. }
  92. //设置参数
  93. function setParam(){
  94. //tabletype titleOption
  95. //如果没选项目类型 默认全选
  96. valueOption.tabletype = [];
  97. titleOption.tabletype = [];
  98. if($('.tabletype[type="checkbox"]:checked').length > 0){
  99. $.each($('.tabletype[type="checkbox"]:checked'),function(){
  100. valueOption.tabletype.push($(this).val());
  101. titleOption.tabletype.push($(this).parent().text());
  102. });
  103. }else{
  104. $.each($('.tabletype[type="checkbox"]'),function(){
  105. valueOption.tabletype.push($(this).val());
  106. titleOption.tabletype.push($(this).parent().text());
  107. });
  108. }
  109. //category valueOption titleOption
  110. valueOption.category = [];
  111. titleOption.category = [];
  112. if($('.category[type="checkbox"]:checked').length > 0){
  113. $.each($('.category[type="checkbox"]:checked'),function(){
  114. valueOption.category.push($(this).val());
  115. titleOption.category.push($(this).parent().text());
  116. });
  117. }else{
  118. $.each($('.category[type="checkbox"]'),function(){
  119. valueOption.category.push($(this).val());
  120. titleOption.category.push($(this).parent().text());
  121. });
  122. }
  123. //scale valueOption titleOption
  124. valueOption.scale = [];
  125. titleOption.scale = [];
  126. if(!$('.scale').prop('disabled')){
  127. $.each($('.scale:checked'),function(){
  128. valueOption.scale.push($(this).val());
  129. titleOption.scale.push($(this).parent().text());
  130. });
  131. };
  132. //设置查询所需参数
  133. paramOption.tabletype = valueOption.tabletype?valueOption.tabletype.join(','):'';
  134. paramOption.category = titleOption.category?titleOption.category.join(','):'';
  135. paramOption.scale = titleOption.scale?titleOption.scale.join(','):'';
  136. if(paramOption.scale.length > 0) paramOption.hasScale = 1;
  137. else paramOption.hasScale = 0;
  138. paramOption.datatype = $('#datatype option:selected').val();
  139. paramOption.startYear = $('#startYear').val();
  140. paramOption.endYear = $('#endYear').val();
  141. paramOption.companys = $('#companys').val()?$('#companys').val().join(','):'';
  142. }
  143. //设置表格所需参数
  144. function setTableOption(d){
  145. var curr_tabletype,allCategory_val,allCategory_title;
  146. resetTableOption(); //重置表格参数
  147. tableOption.title = [];
  148. tableOption.colspan = [];
  149. tableOption.value = ['index','COMPANY','ROAD'];
  150. //各项目类型的类别不同,找出选中类别中,各项目类型中存在的类别
  151. for(var i=0; i<valueOption.tabletype.length; i++) {
  152. curr_tabletype = valueOption.tabletype[i]; //当前项目类型value值
  153. allCategory_val = valueOption[curr_tabletype+'_category']; //当前项目类型的所有类别value值
  154. allCategory_title = titleOption[curr_tabletype+'_category']; //当前项目类型的所有类别
  155. if(allCategory_val.indexOf('noCategory') > -1){
  156. //无类别项目直接加入'noCategory'值
  157. tableOption[curr_tabletype+'_category_val'].push('noCategory');
  158. }else{
  159. for(var j=0; j<allCategory_val.length; j++){
  160. if(valueOption.category.indexOf(allCategory_val[j]) > -1){
  161. tableOption[curr_tabletype+'_category_val'].push(allCategory_val[j]);
  162. tableOption[curr_tabletype+'_category_title'].push(allCategory_title[j]);
  163. }
  164. }
  165. }
  166. }
  167. //根据各项目类别设置th、td、colspan等相关参数
  168. var th1 = [],th2 = [],th3 = [],thcol1 = [],thcol2 = [];
  169. for(var i=0; i<valueOption.tabletype.length; i++){
  170. curr_tabletype = valueOption.tabletype[i]; //当前项目类型value值
  171. allCategory_val = tableOption[curr_tabletype+'_category_val']; //当前项目类型展示的类别value值
  172. allCategory_title = tableOption[curr_tabletype+'_category_title']; //当前项目类型展示的类别
  173. //如果当前项目类型有需要展示的类别
  174. if(allCategory_val.length > 0){
  175. //第一行加项目类型
  176. th1.push(titleOption.tabletype[i]);
  177. if(paramOption.hasScale == 0){
  178. //不需要根据规模统计,无第二行
  179. //项目类型colspan为 类别数
  180. thcol1.push(allCategory_val.length);
  181. //在第三行放入类别
  182. th3 = th3.concat(allCategory_title);
  183. //数据行 项目_类别
  184. for(var lb=0; lb<allCategory_val.length; lb++){
  185. tableOption.value.push(curr_tabletype + '_' + allCategory_val[lb]);
  186. }
  187. }else if(paramOption.hasScale == 1){
  188. //需要根据规模统计
  189. var scaleNum = titleOption.scale.length;
  190. //第二行放规模
  191. th2 = th2.concat(titleOption.scale);
  192. //项目类型colspan为 规模数*类别数
  193. thcol1.push(scaleNum*allCategory_val.length);
  194. /*
  195. * 规模colspan为类别个数,第二行放入colspan个数为规模个数
  196. * 根据规模个数在第三行放入类别
  197. */
  198. for(var num=0; num<scaleNum; num++){
  199. thcol2.push(allCategory_val.length);
  200. th3 = th3.concat(allCategory_title);
  201. }
  202. //数据行 项目_规模_类别
  203. for(var gm=0; gm<valueOption.scale.length; gm++){
  204. for(var lb=0; lb<allCategory_val.length; lb++){
  205. tableOption.value.push(curr_tabletype + '_' + valueOption.scale[gm] + '_' + allCategory_val[lb]);
  206. }
  207. }
  208. }
  209. }
  210. }
  211. //合计列
  212. //第一行加项目类型
  213. th1.push('合计');
  214. if(paramOption.hasScale == 0){
  215. //不需要根据规模统计,无第二行
  216. //项目类型colspan为 总类别数+1
  217. thcol1.push(titleOption.category.length + 1);
  218. //在第三行放入类别 + 小计
  219. th3 = th3.concat(titleOption.category);
  220. th3.push('小计');
  221. //数据行 类别 total
  222. for(var lb=0; lb<titleOption.category.length; lb++){
  223. //应急保通 与 应急 重命名 应急保通改为 emergencyC
  224. if(valueOption.category[lb] == 'emergency'){
  225. tableOption.value.push('emergencyC');
  226. }else{
  227. tableOption.value.push(valueOption.category[lb]);
  228. }
  229. }
  230. tableOption.value.push('total');
  231. }else if(paramOption.hasScale == 1){
  232. //需要根据规模统计
  233. var scaleNum = titleOption.scale.length;
  234. //第二行放规模 + 小计
  235. th2 = th2.concat(titleOption.scale);
  236. th2.push('小计');
  237. //项目类型colspan为 (规模数+1)*(总类别数+1)
  238. thcol1.push((scaleNum+1)*(titleOption.category.length+1));
  239. /*
  240. * 规模colspan为类别个数+1,第二行放入colspan个数为规模个数+1
  241. * 根据规模个数在第三行放入类别
  242. */
  243. for(var num=0; num<scaleNum+1; num++){
  244. thcol2.push(titleOption.category.length+1);
  245. th3 = th3.concat(titleOption.category);
  246. th3.push('小计');
  247. }
  248. //数据行 规模_类别 规模
  249. for(var gm=0; gm<valueOption.scale.length; gm++){
  250. for(var lb=0; lb<titleOption.category.length; lb++){
  251. tableOption.value.push(valueOption.scale[gm] + '_' + valueOption.category[lb]);
  252. }
  253. tableOption.value.push(valueOption.scale[gm]);
  254. }
  255. //数据行 合计列 类别 total
  256. for(var lb=0; lb<titleOption.category.length; lb++){
  257. //应急保通 与 应急 重命名 应急保通改为 emergencyC
  258. if(valueOption.category[lb] == 'emergency'){
  259. tableOption.value.push('emergencyC');
  260. }else{
  261. tableOption.value.push(valueOption.category[lb]);
  262. }
  263. }
  264. tableOption.value.push('total');
  265. }
  266. //设置表格title,colspan参数
  267. tableOption.title.push(th1);
  268. tableOption.title.push(th2);
  269. tableOption.title.push(th3);
  270. tableOption.colspan.push(thcol1);
  271. tableOption.colspan.push(thcol2);
  272. tableOption.colspan.push([]);
  273. //清空表
  274. $('#dataTable>thead').html('');
  275. $('#dataTable>tbody').html('');
  276. //根据表格参数出th行
  277. var thRowspan = 3;
  278. if(paramOption.hasScale == 0) thRowspan = 2;
  279. for(var i=0; i<tableOption.title.length;i++){
  280. if(tableOption.title[i].length > 0){
  281. var eachtr = '<tr>';
  282. if(i==0) eachtr = '<tr><th class="center" rowspan="'+thRowspan+'">序号</th>'
  283. + '<th class="center" colspan="2" rowspan="'+thRowspan+'">道路名称 </th>';
  284. for(var j=0; j<tableOption.title[i].length;j++){
  285. eachtr += '<th class="center"'
  286. if(tableOption.title[i][j] == '设备大修' || tableOption.title[i][j] == '预备费') eachtr += ' rowspan="2"';
  287. if(tableOption.colspan[i].length > 0) eachtr += ' colspan="'+ tableOption.colspan[i][j] +'"';
  288. eachtr += '>' + tableOption.title[i][j] + '</th>';
  289. }
  290. eachtr += '</tr>';
  291. $('#dataTable>thead').append(eachtr);
  292. }
  293. }
  294. //根据表格参数出td行
  295. /*******test*******/
  296. /*var eachtdtr = '<tr>';
  297. for(var j=0; j<tableOption.value.length;j++){
  298. eachtdtr += '<td class="center">' + tableOption.value[j] + '</td>';
  299. }
  300. eachtdtr += '</tr>';
  301. $('#dataTable>tbody').append(eachtdtr);*/
  302. /*******test*******/
  303. var data = d.data;
  304. var companyData = d.companyData;
  305. var totalData = d.totalData;
  306. var indexno = 1;
  307. var currowspan = 0; //相同公司记录数,index 有合计行的要加1
  308. var hasCompanySum = false;
  309. for(var i=0; i<data.length;i++){
  310. //判断是否有公司合计行
  311. if(data[i].num == 1 && data[i].flag == 1) hasCompanySum = false;
  312. else hasCompanySum = true;
  313. var eachtdtr = '<tr>';
  314. for(var j=0; j<tableOption.value.length;j++){
  315. if(tableOption.value[j] == 'index'){
  316. if(data[i].num == '1'){
  317. for(var x=0; x<data.length;x++){
  318. if(data[x].flag == 1 && data[x].COMPANY == data[i].COMPANY){
  319. currowspan = data[x].num;
  320. }
  321. }
  322. if(data[i].flag == 1) eachtdtr += '<td class="center" rowspan="'+ currowspan +'">';
  323. else eachtdtr += '<td class="center" rowspan="'+ (currowspan+1) +'">';
  324. eachtdtr += indexno;
  325. eachtdtr += '</td>';
  326. indexno++;
  327. }
  328. }else if(tableOption.value[j] == 'COMPANY'){
  329. if(data[i].num == '1'){
  330. if(data[i].flag == 1) eachtdtr += '<td class="center" rowspan="'+ currowspan +'">';
  331. else eachtdtr += '<td class="center" rowspan="'+ (currowspan+1) +'">';
  332. eachtdtr += data[i].COMPANY;
  333. eachtdtr += '</td>';
  334. }
  335. }else{
  336. eachtdtr += '<td class="center">';
  337. if(data[i][tableOption.value[j]]) eachtdtr += data[i][tableOption.value[j]];
  338. eachtdtr += '</td>';
  339. }
  340. }
  341. eachtdtr += '</tr>';
  342. $('#dataTable>tbody').append(eachtdtr);
  343. //公司合计行
  344. if(data[i].flag == 1 && hasCompanySum){
  345. var conpanySumTr = '<tr><td class="center">小计</td>';
  346. for(var j=3; j<tableOption.value.length;j++){
  347. conpanySumTr += '<td class="center">';
  348. if(companyData[indexno-2][tableOption.value[j]]) conpanySumTr += companyData[indexno-2][tableOption.value[j]];
  349. conpanySumTr += '</td>';
  350. }
  351. conpanySumTr += '</tr>';
  352. $('#dataTable>tbody').append(conpanySumTr);
  353. }
  354. }
  355. //总计行
  356. if(data.length > 0){
  357. var totalSumTr = '<tr><td class="center" colspan="3">累计</td>';
  358. for(var j=3; j<tableOption.value.length;j++){
  359. totalSumTr += '<td class="center">';
  360. if(totalData[0] && totalData[0][tableOption.value[j]]) totalSumTr += totalData[0][tableOption.value[j]];
  361. totalSumTr += '</td>';
  362. }
  363. totalSumTr += '</tr>';
  364. $('#dataTable>tbody').append(totalSumTr);
  365. }
  366. }
  367. function toSearch(){
  368. var tabletypeNum = $('.tabletype[type="checkbox"]:checked').length;
  369. var categoryNum = $('.category[type="checkbox"]:checked').length;
  370. if(tabletypeNum == 0){
  371. bootbox.dialog({
  372. message: "<span class='bigger-110'>请选择项目类型!</span>",
  373. buttons:
  374. {
  375. "button" :
  376. {
  377. "label" : "确定",
  378. "className" : "btn-sm btn-success"
  379. }
  380. }
  381. });
  382. }else if(categoryNum == 0){
  383. bootbox.dialog({
  384. message: "<span class='bigger-110'>请选择类别!</span>",
  385. buttons:
  386. {
  387. "button" :
  388. {
  389. "label" : "确定",
  390. "className" : "btn-sm btn-success"
  391. }
  392. }
  393. });
  394. }else{
  395. setParam();
  396. $('#dataTable').html('<thead></thead><tbody></tbody>');
  397. $.ajax({
  398. type : "get",
  399. url : locat + '/compStats/getData.do',
  400. data: paramOption,
  401. dataType : 'json',
  402. success : function(data){
  403. setTableOption(data);
  404. }
  405. });
  406. }
  407. }
  408. //时间控件初始化
  409. function datepickerInit(){
  410. $('.date-picker').datepicker({
  411. autoclose: true,
  412. format: 'yyyy',
  413. startView: 'years',
  414. maxViewMode:'years',
  415. minViewMode:'years'
  416. });
  417. $('#startYear').datepicker({
  418. endDate : new Date()
  419. }).on('changeDate',function(e){
  420. var startTime = e.date;
  421. $('#endYear').datepicker('setStartDate',startTime);
  422. });
  423. $('#endYear').datepicker({
  424. endDate : new Date()
  425. }).on('changeDate',function(e){
  426. var endTime = e.date;
  427. $('#startYear').datepicker('setEndDate',endTime);
  428. });
  429. }
  430. function selectAll(e){
  431. $('.'+e.classList[3]+'[type="checkbox"]').prop('checked',true);
  432. if(e.classList[3] == 'tabletype') $('.scale').prop('disabled',true);
  433. }
  434. function selectNone(e){
  435. $('.'+e.classList[3]+'[type="checkbox"]').prop('checked',false);
  436. if(e.classList[3] == 'tabletype') $('.scale').prop('disabled',true);
  437. }
  438. $(function() {
  439. $('#dataContainer').height($('html').height()-140);
  440. $('.tabletype[type="checkbox"]').prop('checked',true);
  441. $('.category[type="checkbox"]').prop('checked',true);
  442. $('.scale').prop('disabled',true);
  443. datepickerInit();
  444. setScaleDisabledInit();
  445. toSearch();
  446. })