comprehensive-analysis.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. var reqList = []; //记录请求的参数和url,用于后退时使用
  2. var pieChart1,
  3. pieChart2; //全局设置饼图的对象,window.resize时,触发chart的resize方法
  4. Vue.use(Vuedals.default);
  5. new Vue({
  6. el: "#main",
  7. data: {
  8. appname: "总体分析",
  9. isback: true,
  10. isrefresh: true,
  11. isfilter: true,
  12. isopen: true,
  13. //请求页面所需参数
  14. level: '',
  15. area: '',
  16. areaTitle: '',
  17. index: '3',
  18. selectedDateType: 1,
  19. endDate: '',
  20. startDate: '',
  21. lowLevel: '',
  22. chooseYear: '',
  23. userRole: '',
  24. //数据结果
  25. topDatas: {
  26. index_3: 0,
  27. index_4: 0,
  28. index_5: 0,
  29. index_83: 0,
  30. index_103:0,
  31. index_106:0,
  32. index_20: 0,
  33. index_21: 0,
  34. index_27: 0,
  35. index_86: 0
  36. },
  37. //微信绑定统计数据
  38. wxTotal:{
  39. label: '',
  40. amount1: '', //已缴费人数
  41. amount2: '', //未缴费人数
  42. rate: ''//绑定率
  43. }
  44. },
  45. components: {
  46. vuedals: Vuedals.Component
  47. },
  48. methods: {
  49. changeTag: function(val){
  50. this.index = val;
  51. loadData([1,2], this);
  52. //存储请求所带的参数
  53. reqList.push({
  54. level: this.level,
  55. area: this.area,
  56. areaTitle: this.areaTitle,
  57. index: this.index,
  58. endDate: this.endDate,
  59. startDate: this.startDate,
  60. lowLevel: this.lowLevel
  61. })
  62. },
  63. getNewLineData: function(arg){
  64. this.selectedDateType = arg.dateType;
  65. loadData([1], this);
  66. },
  67. jumpTip:function(tab){
  68. console.log("mouseenter");
  69. $('#shadow'+tab).attr("style","visibility:visible")
  70. },
  71. leaveTip:function(tab){
  72. $('#shadow'+tab).attr("style","visibility:hidden")
  73. },
  74. getAreaData: function(arg){
  75. //如果level改变,则需要重新加载整个页面的数据,否则只需加载底部区域数据
  76. if(arg.level == this.level){
  77. this.lowLevel = arg.lowLevel;
  78. loadData([2], this);
  79. }else{
  80. this.level = arg.level;
  81. this.lowLevel = arg.lowLevel;
  82. this.area = arg.area;
  83. this.areaTitle = arg.areaTitle;
  84. loadData([0,1,2], this);
  85. }
  86. EventBus.$emit('update-area-name', {areaName: this.areaTitle});
  87. //存储请求所带的参数
  88. reqList.push({
  89. level: this.level,
  90. area: this.area,
  91. areaTitle: this.areaTitle,
  92. index: this.index,
  93. endDate: this.endDate,
  94. startDate: this.startDate,
  95. lowLevel: this.lowLevel,
  96. selectedDateType: this.selectedDateType
  97. })
  98. }
  99. },
  100. mounted: function(){
  101. $(".tip").on('mouseenter', function(){
  102. console.log("mouse enter");
  103. var val = $(this).attr("data-val");
  104. $('#shadow'+val).attr("style","visibility:visible")
  105. })
  106. $(".tip").on('mouseleave', function(){
  107. console.log("mouse leave");
  108. var val = $(this).attr("data-val");
  109. $('#shadow'+val).attr("style","visibility:hidden")
  110. })
  111. //初始化数据
  112. initData(this);
  113. //获得顶部各tab的值
  114. loadData([0,1,2], this); //参数组数表示请求的区域为上中下
  115. //存储请求所带的参数
  116. reqList.push({
  117. level: this.level,
  118. area: this.area,
  119. areaTitle: this.areaTitle,
  120. index: this.index,
  121. endDate: this.endDate,
  122. startDate: this.startDate,
  123. lowLevel: this.lowLevel,
  124. selectedDateType: this.selectedDateType
  125. });
  126. //设置监听器, 监听折线图日期变化
  127. var vm = this;
  128. //监听后退按钮的操作
  129. EventBus.$on("back-click", function(arg){
  130. EventBus.$emit('update-statistics-time', {}); //更新统计时间
  131. if(reqList.length == 1){
  132. history.go(-1);
  133. }
  134. else{
  135. var preInfo = reqList.pop();
  136. var info = reqList[reqList.length - 1];
  137. vm.level = info.level;
  138. vm.area = info.area;
  139. vm.areaTitle = info.areaTitle;
  140. vm.lowLevel = info.lowLevel;
  141. vm.index = info.index;
  142. loadData([0,1,2], vm);
  143. EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
  144. }
  145. });
  146. //监听页面刷新
  147. EventBus.$on("refresh-click", function(arg){
  148. loadData([0,1,2], vm);
  149. });
  150. //弹出筛选框
  151. EventBus.$on('filter-click', function(arg) {
  152. //弹框显示筛选条件
  153. Vuedals.Bus.$emit('new', {
  154. title: '条件筛选',
  155. onClose:function(data){
  156. vm.chooseYear = data.chooseYear;
  157. vm.startDate = getStartDate(vm.chooseYear);
  158. vm.endDate = getEndDate(vm.chooseYear);
  159. //请求参数重置,页面类型重新开始
  160. vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
  161. vm.area = vm.userRole.code;
  162. vm.areaTitle = vm.userRole.name;
  163. EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
  164. vm.selectedDateType = 1;
  165. //然后清空请求列表数组
  166. reqList.splice(0, reqList.length);
  167. loadData([0, 1, 2], vm);//刷新数据
  168. //存储请求所带的参数
  169. reqList.push({
  170. level: vm.level,
  171. area: vm.area,
  172. areaTitle: vm.areaTitle,
  173. index: vm.index,
  174. endDate: vm.endDate,
  175. startDate: vm.startDate,
  176. lowLevel: vm.lowLevel,
  177. selectedDateType: vm.selectedDateType
  178. });
  179. EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});//更新年份
  180. EventBus.$emit('update-statistics-time', {});//更新统计时间
  181. },
  182. component: 'year-filter',
  183. props: {
  184. selectedYear: vm.chooseYear
  185. }
  186. });
  187. });
  188. $("#main").removeClass("c-hide");
  189. window.onresize = function() {
  190. if(pieChart1){
  191. pieChart1.resize();
  192. }
  193. if(pieChart2){
  194. pieChart2.resize();
  195. }
  196. window.lineCharts.resize(); //日周月折线图
  197. }
  198. }
  199. })
  200. function initData(vm){
  201. //获得缓存中缓存的角色权限
  202. var userRole = window.sessionStorage.getItem("selectedRole");
  203. if(!userRole){
  204. return false;
  205. }
  206. vm.userRole = JSON.parse(userRole);
  207. vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
  208. vm.area = vm.userRole.code;
  209. vm.areaTitle = vm.userRole.name;
  210. EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
  211. var now = new Date();
  212. if(now.getMonth() >= 6){
  213. vm.chooseYear = now.getFullYear();
  214. }else{
  215. vm.chooseYear = now.getFullYear() - 1;
  216. }
  217. vm.startDate = getStartDate(vm.chooseYear);
  218. vm.endDate = getEndDate(vm.chooseYear);
  219. EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});
  220. }
  221. function initReqParams(vm){
  222. //增量(咨询量3、随访量4、健康教育5、代预约量27),到达量(绑定微信21、绑定设备20)
  223. var url2 = "statistics/interval",
  224. url3 = "statistics/lowlevel_total";
  225. if(vm.index == '20' || vm.index == '21'){
  226. url2 = "statistics/interval_total";
  227. url3 = "statistics/lowlevel_all";
  228. }else if(vm.index == '3'){
  229. url3 = "statistics/lowlevel_total_mesh";
  230. }else if(vm.index == '5'){
  231. url3 = '/statistics/article_lowlevel_total';
  232. }
  233. reqParam = [{
  234. url: url2,
  235. data:{
  236. index: vm.index == '5' ? '5,83' : vm.index,
  237. level: vm.level,
  238. area: vm.area,
  239. startDate: vm.startDate,
  240. endDate: vm.endDate,
  241. interval: vm.selectedDateType
  242. }
  243. },{
  244. url: url3,
  245. data: {
  246. index: (vm.index == '3') ? "3,22" : vm.index,
  247. level: vm.level,
  248. area: vm.area,
  249. sort: 1,
  250. year: vm.chooseYear
  251. }
  252. },{
  253. //如果是微信绑定,则增加置顶展示当面层级的总绑定率及已缴费 未缴费居民数.只针对微信绑定时使用
  254. url: '/statistics/getLevelTotalSingle',
  255. data: {
  256. date: vm.endDate,
  257. level: vm.level,
  258. area: vm.area
  259. }
  260. }];
  261. if(vm.index == '20' || vm.index == '21'){
  262. reqParam[1].data.date = vm.endDate;
  263. }else{
  264. reqParam[1].data.endDate = vm.endDate;
  265. }
  266. if(vm.lowLevel){
  267. reqParam[1].data.lowLevel = vm.lowLevel;
  268. }
  269. return reqParam;
  270. }
  271. function getTopReqParams(index1, vm){
  272. var url = "statistics/total",
  273. data = {
  274. index: index1 == '5' ? '5,83,103,106' : index1,
  275. level: vm.level,
  276. area: vm.area,
  277. year: vm.chooseYear,
  278. endDate: vm.endDate,
  279. startDate: vm.startDate
  280. };
  281. if(index1 == '20' || index1 == '21'){
  282. url = "statistics/index_all";
  283. }
  284. if(index1 == '5'){
  285. url = "/statistics/article_total";
  286. }
  287. return {
  288. url: url,
  289. data: data
  290. };
  291. }
  292. function getTopTagDatas(vm){
  293. var reqs = [],
  294. indexs = ['3', '4', '5', '27', '21', '20'];
  295. for(i=0; i<indexs.length; i++){
  296. var item = getTopReqParams(indexs[i], vm);
  297. reqs.push(httpRequest.get(item.url, {data: item.data}));
  298. }
  299. Promise.all(reqs).then(function(ress){
  300. for(i=0; i<ress.length; i++){
  301. var res = ress[i];
  302. if(res.status == 200){
  303. for(key in res.data){
  304. vm.topDatas[key] = res.data[key];
  305. }
  306. }else{
  307. console.log(res.msg);
  308. }
  309. }
  310. })
  311. }
  312. function loadData(loadArr, vm){
  313. if(loadArr.indexOf(0) > -1){
  314. getTopTagDatas(vm);
  315. }
  316. //获取其他请求的参数
  317. var reqParams = initReqParams(vm),
  318. reqPromise = [],
  319. newArr = []; //记录非顶部请求的请求数组
  320. for(i=0; i<loadArr.length; i++){
  321. if(loadArr[i] == 0){
  322. // do nothing
  323. }else{
  324. var j = loadArr[i] - 1;
  325. var param = reqParams[j];
  326. reqPromise.push(httpRequest.get(param.url, {data: param.data}));
  327. newArr.push(loadArr[i]);
  328. }
  329. }
  330. if(vm.index == 21){ //微信绑定的数据需要再请求一个数据
  331. reqPromise.push(httpRequest.get(reqParams[2].url, {data: reqParams[2].data}))
  332. newArr.push(3);
  333. }
  334. if(reqPromise.length > 0){
  335. Promise.all(reqPromise).then(function(ress){
  336. var res2, res3, res4;
  337. for(var i=0; i<newArr.length; i++){
  338. var j = newArr[i] + 1;
  339. if(j == 2){
  340. res2 = ress[i];
  341. }
  342. if(j == 3){
  343. res3 = ress[i];
  344. }
  345. //微信绑定时,多获取一个请求数据
  346. if(j == 4){
  347. res4 = ress[i];
  348. }
  349. }
  350. if(res2){
  351. if(res2.status == 200){
  352. handleSecondPanelData(res2.data, vm);
  353. if(vm.index == '5'){
  354. var arr = [{
  355. name: '健康文章',
  356. value: vm.topDatas.index_83
  357. },{
  358. name: '健康指导',
  359. value: vm.topDatas.index_5
  360. }];
  361. pieChart2 = drawPieChart('pieChart', arr, ['#ffc800', '#17b3ec']);
  362. }
  363. }else{
  364. console.log(res2.msg);
  365. }
  366. }
  367. if(res3){
  368. if(res3.status == 200){
  369. listHandle(res3.data, vm);
  370. }else{
  371. console.log(res3.msg);
  372. }
  373. }
  374. if(res4){
  375. if(res4.status == 200){
  376. handleWXBindData(res4.data, vm);
  377. }else{
  378. console.log(res4.msg);
  379. }
  380. }
  381. })
  382. }
  383. }
  384. function handleSecondPanelData(data, vm){
  385. var xDatas = [],
  386. yDatas = [],
  387. names = [],
  388. colors = ['#12b7f5', '#cd67fd'],
  389. labels = {'3': '咨询量新增趋势', '4': '随访量新增趋势', '5': '触达人数新增趋势', '20': '绑定设备新增趋势', '21': '绑定微信新增趋势', '27': '代预约量新增趋势'}
  390. index_names = {'index_3': '咨询量', 'index_4': '随访量', 'index_5': '健康指导','index_27':'代预约量','index_21': '绑定微信','index_20': '绑定设备', 'index_83': "健康文章"};
  391. for(var p in data){
  392. names.push(index_names[p]);
  393. if(p == 'index_21' || p == 'index_20' || p == "index_86"){
  394. var xData = _.map(data[p].data, function(o){
  395. return o.range;
  396. });
  397. var yData = _.map(data[p].data, function(o){
  398. return o.amount;
  399. });
  400. }else{
  401. var xData = _.map(data[p], function(o){
  402. return o.range;
  403. });
  404. var yData = _.map(data[p], function(o){
  405. return o.amount;
  406. });
  407. }
  408. console.log(xData);
  409. xDatas.push(xData);
  410. yDatas.push(yData);
  411. }
  412. EventBus.$emit("draw-line-chart", {
  413. panelName : labels[vm.index],
  414. quotaNames : names,
  415. xData : xDatas[0],
  416. yDatas : yDatas,
  417. colors : colors,
  418. selectedDateType: vm.selectedDateType
  419. });
  420. }
  421. function listHandle(data, vm){
  422. for(i in data){
  423. var list = data[i];
  424. var topArr = [];
  425. if(vm.index == "21"){
  426. topArr = soreRank(getKeyValueArr(list, 'bindRate'));
  427. }else if(vm.index == '3'){
  428. topArr = soreRank(getKeyValueArr2(list, 'amount'));
  429. }else{
  430. topArr = soreRank(getKeyValueArr(list, 'amount'));
  431. }
  432. var arr = _.map(list, function(o, index){
  433. var cols = [o.name];
  434. if(vm.index == '3'){
  435. var amount = o.amount.split(","); // 咨询量, 未回复咨询量
  436. cols.push(amount[0]);
  437. cols.push(amount[1]);
  438. }else if(vm.index == '21'){
  439. cols.push(o.bindRate + '%');
  440. cols.push(o.weChatAmount1);
  441. cols.push(o.weChatAmount0);
  442. }else{
  443. cols.push(o.amount);
  444. if(vm.index == '5'){
  445. cols.push(o.readNum);
  446. cols.push(o.readRate);
  447. }
  448. }
  449. return {
  450. rank: topArr[index],
  451. code: o.code,
  452. name: o.name,
  453. cols: cols
  454. }
  455. });
  456. var headers = {
  457. '3': ["排名", "咨询量", "未回复"],
  458. '4': ["排名", "随访量"],
  459. '5': ["排名", "总触达人数", "阅读量", "阅读率"],
  460. '20': ["排名", "绑定设备"],
  461. '21': ["排名", "绑定率", "已缴费", "未缴费"],
  462. "27": ["排名", "代预约量"]
  463. };
  464. EventBus.$emit("render-area-data",{
  465. level: vm.level,
  466. area: vm.area,
  467. lowLevel: vm.lowLevel,
  468. headers: headers[vm.index],
  469. rows: arr
  470. });
  471. }
  472. }
  473. function handleWXBindData(data, vm){
  474. switch(vm.level){
  475. case 4:
  476. vm.wxTotal.label = "全市概况";
  477. break;
  478. case 3:
  479. vm.wxTotal.label = "全区概况";
  480. break;
  481. case 2:
  482. vm.wxTotal.label = "全社区概况";
  483. break;
  484. }
  485. vm.wxTotal.rate = (data.bindRate || 0) + "%";
  486. vm.wxTotal.amount1 = data.weChatAmount1;
  487. vm.wxTotal.amount2 = data.weChatAmount0;
  488. var arr = [{
  489. name: '已缴费人数',
  490. value: data.weChatAmount1
  491. },{
  492. name: '未缴费人数',
  493. value: data.weChatAmount0
  494. }];
  495. pieChart1 = drawPieChart('pieChart2', arr, ['#17b3ec', '#909090']);
  496. }
  497. /*
  498. * 获取用来排序的字段值,返回数组
  499. * 参数: list - 列表, key - 字段的名称
  500. */
  501. function getKeyValueArr2(list, key){
  502. var arr = [];
  503. for(var k in list){
  504. var item = list[k][key].split(",");
  505. arr.push(item[0]);
  506. }
  507. return arr;
  508. }