activity-statistic.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. mui.init();
  2. var userRole,
  3. initLevel,
  4. initAreaCode,
  5. initTitle,
  6. level,
  7. areaCode,
  8. areaTitle,
  9. lowLevel = '',
  10. dateType = 1, //折线图中选择的时间类型。 1-日,2-周, 3-月
  11. endDate,
  12. startDate,
  13. activityPicker, //活动下拉框
  14. activityId, //标记活动Id
  15. myScroller;
  16. var initTabOffsetTop = 0; //初始化时,底部tab距离顶部的位置
  17. var reqParam = []; //请求参数
  18. var reqList = []; //请求的链接数据,根据这些信息后退的时候使用
  19. //定义年份
  20. var chooseYear;
  21. var now = new Date();
  22. if(now.getMonth() >= 6){
  23. chooseYear = now.getFullYear();
  24. }else{
  25. chooseYear = now.getFullYear() - 1;
  26. }
  27. mui.plusReady(function(){
  28. var selfwv = plus.webview.currentWebview();
  29. userRole = JSON.parse(plus.storage.getItem("selectedRole"));
  30. initLevel = level = userRole.code == CITY_CODE ? 4 : userRole.code.length==6 ? 3 : 2;
  31. initAreaCode = areaCode = userRole.code;
  32. initTitle = areaTitle = userRole.name;
  33. lowLevel = level - 1;
  34. var now = new Date();
  35. $("#endTime").text("截至"+now.format("yyyy-MM-dd"));
  36. activityPicker = new mui.PopPicker();
  37. //控制底部各区等tab的显示
  38. showTabs();
  39. initReqParams();
  40. loadData(true);
  41. //记录返回链接信息
  42. reqList.push({
  43. level: level,
  44. lowLevel: lowLevel,
  45. areaCode: areaCode,
  46. areaTitle: areaTitle,
  47. req: reqParam,
  48. activityId: activityId
  49. });
  50. initTabOffsetTop = $(".area-tab-panel").offset().top;
  51. bindEvents();
  52. initScroller();
  53. })
  54. function initReqParams(){
  55. if(!activityId){
  56. startDate = getStartDate();
  57. endDate = getEndDate();
  58. }
  59. reqParam = [{
  60. url: "/statistics/getAllAtivity",
  61. reqType: 'get',
  62. data: {area: initAreaCode, level: initLevel}
  63. },{
  64. url: "/statistics/lowlevel_activity",
  65. reqType: 'get',
  66. data: {
  67. area: areaCode,
  68. level: level,
  69. sort: 1,
  70. year: chooseYear
  71. }
  72. },{
  73. //折线图接口信息
  74. url: "/statistics/active_apply_statistics",
  75. reqType: 'get',
  76. data: {
  77. startDate: startDate,
  78. endDate: endDate,
  79. interval: dateType,
  80. area: areaCode,
  81. level: level
  82. }
  83. }];
  84. if(activityId){
  85. reqParam[0].data.id = activityId;
  86. reqParam[1].data.activityCode = activityId;
  87. reqParam[2].data.activityCode = activityId;
  88. }
  89. if(lowLevel){
  90. reqParam[1].data.lowLevel = lowLevel;
  91. }
  92. }
  93. function loadData(getTopData){
  94. plus.nativeUI.showWaiting();
  95. if(getTopData){
  96. var params = reqParam[0];
  97. getReqPromise(params.url, params.data, 'GET', true).then(function(res){
  98. if(res.status == 200){
  99. handleTopPanelData(res.data);
  100. initReqParams();
  101. loadData2();
  102. }else{
  103. mui.toast(res.msg);
  104. plus.nativeUI.closeWaiting();
  105. }
  106. })
  107. }else{
  108. loadData2()
  109. }
  110. }
  111. function loadData2(){
  112. var reqs = [reqParam[1], reqParam[2]];
  113. getReqPromises(reqs, true).then(function(ress){
  114. var res1, res2, res3;
  115. res1 = ress[0];
  116. res2 = ress[1];
  117. if(res1){
  118. if(res1.status == 200){
  119. handleSecondPanelData(res1.data);
  120. }else{
  121. mui.toast(res1.msg);
  122. }
  123. }
  124. if(res2){
  125. if(res2.status == 200){
  126. handleAreaPanel(res2.data); // 处理折线图
  127. }else{
  128. mui.toast(res2.msg);
  129. }
  130. }
  131. plus.nativeUI.closeWaiting();
  132. })
  133. }
  134. function loadLineData(){
  135. var params = reqParam[2];
  136. getReqPromise(params.url, params.data, params.reqType, true).then(function(res){
  137. if(res.status == 200){
  138. handleAreaPanel(res.data);
  139. }else{
  140. mui.toast(res.msg);
  141. }
  142. });
  143. }
  144. function handleTopPanelData(data){
  145. if(!activityId){
  146. $("#totalPanel").show();
  147. $("#activityPanel").hide();
  148. var list = [{
  149. value: '',
  150. text: "总积分排行榜"
  151. }];
  152. for(i=0; i<data.length; i++){
  153. var item = data[i];
  154. list.push({
  155. value: item.id,
  156. text: item.title
  157. });
  158. }
  159. activityPicker.setData(list);
  160. }else{
  161. $("#totalPanel").hide();
  162. var html = template("activity-tmp", data[0]);
  163. $("#activityInfo").empty().append(html);
  164. $("#activityPanel").show();
  165. areaCode = data[0].area;
  166. level = areaCode == CITY_CODE ? 4 : areaCode.length==6 ? 3 : 2;
  167. lowLevel = level - 1;
  168. startDate = data[0].start_time.substr(0,10);
  169. endDate = data[0].end_time.substr(0,10);
  170. showTabs();
  171. }
  172. }
  173. function handleSecondPanelData(data){
  174. if(!activityId){
  175. $("#activityCount").text(data.activityCount);
  176. $("#patientCount").text(data.applyCount);
  177. }else{
  178. $("#signNum").text(data.applyCount);
  179. $("#joinNum").text(data.participantCount);
  180. }
  181. var seriesData = [{
  182. name: "已参与",
  183. value: parseFloat(data.participantRange)
  184. },{
  185. name: "已获得积分",
  186. value: parseFloat(data.creditsRange)
  187. },{
  188. name: "已兑奖",
  189. value: parseFloat(data.expiryRange)
  190. }];
  191. drawFunnelChart(seriesData);
  192. //填充底部区域数据
  193. var list = data.list,
  194. topArr = soreRank(amountArr(data.list, 'rate'));
  195. for(var j in list){
  196. list[j].top = topArr[j];
  197. }
  198. var html = template("data-list", {
  199. list: list,
  200. level: level,
  201. lowLevel: lowLevel
  202. });
  203. $("#listTable").empty().append(html);
  204. }
  205. //折线图数据处理
  206. function handleAreaPanel(data){
  207. var dataZoom_end,
  208. xDatas = [],
  209. yDatas = [],
  210. names = [],
  211. colors = ['#17b3ec', '#22bd4c'],
  212. indexName = {'index_91': '报名量', 'index_90': '活跃量'};
  213. for(p in data){
  214. names.push(indexName[p]);
  215. var xData = _.map(data[p].data, function(o){
  216. return o.range;
  217. });
  218. var yData = _.map(data[p].data, function(o){
  219. return o.amount;
  220. });
  221. xDatas.push(xData);
  222. yDatas.push(yData);
  223. var lastIndex = yData.length % 10;
  224. if(yData.length >10 ){
  225. dataZoom_end = 100-(9/yData.length)*100;
  226. }else{
  227. dataZoom_end = 0;
  228. }
  229. $("#startValue").text(xData[yData.length - lastIndex]);
  230. $("#endValue").text(xData[yData.length -1]);
  231. }
  232. drawLine(names, dataZoom_end, xDatas[0], yDatas, colors);
  233. }
  234. /*
  235. * 获得团队信息
  236. */
  237. function showTeamInfo(teamId){
  238. var url = "/doctor/admin-teams/teams/info",
  239. params = {
  240. teamId: teamId
  241. };
  242. plus.nativeUI.showWaiting();
  243. sendGet(url, params, null, function(res){
  244. if(res.status == 200){
  245. var data = res.data;
  246. data.memberLength = data.members.length;
  247. var html = template("teamInfo", data);
  248. $("#teamInfoBox").empty().append(html);
  249. $(".modal-overlay").addClass("modal-overlay-visible");
  250. setTimeout(function(){
  251. $(".modal-content").show();
  252. },50)
  253. }else{
  254. mui.toast(res.msg);
  255. }
  256. plus.nativeUI.closeWaiting();
  257. }, true);
  258. }
  259. function bindEvents(){
  260. $("#chooseActivity").on('tap', function(){
  261. activityPicker.show(function(items) {
  262. var item = items[0];
  263. activityId = item.value;
  264. $("#activityTitle").text(item.text);
  265. initReqParams();
  266. //清空请求数组
  267. reqList.splice(0, reqList.length);
  268. reqList.push({
  269. level: level,
  270. lowLevel: lowLevel,
  271. areaCode: areaCode,
  272. areaTitle: areaTitle,
  273. req: reqParam,
  274. activityId: activityId
  275. });
  276. mui(".mui-scroll-wrapper").scroll().scrollTo(0, 0, 500);
  277. loadData(true);
  278. });
  279. });
  280. $("#pop1").on('tap', function(){
  281. var popup1 = dialog({
  282. content: '漏斗图显示活动中居民报名、参与、兑奖三个环节数据对比',
  283. quickClose: true// 点击空白处快速关闭
  284. });
  285. popup1.show(document.getElementById("pop1"));
  286. });
  287. $("#pop2").on('tap', function(){
  288. var popup2 = dialog({
  289. content: '曲线代表活动中居民报名量与参与活动量按时间分布对比情况',
  290. quickClose: true// 点击空白处快速关闭
  291. });
  292. popup2.show(document.getElementById("pop2"));
  293. });
  294. $(".date-tag").on('tap', function(){
  295. var $this = $(this),
  296. val = $this.attr("data-type");
  297. if($this.hasClass("active")){
  298. return false;
  299. }
  300. $(".date-tag").removeClass("active");
  301. $this.addClass("active");
  302. dateType = val;
  303. initReqParams();
  304. loadLineData();
  305. });
  306. //底部各区,社区,团队tab切换
  307. $(".area-tab").on('tap', function(){
  308. var $this = $(this),
  309. type = $this.attr("data-val"); //4 - 各区, 3 - 社区, 2 - 团队
  310. if($this.hasClass("active")){
  311. return false;
  312. }
  313. $(".area-tab").removeClass("active");
  314. $this.addClass("active");
  315. if(type == "4"){
  316. lowLevel = '';
  317. }else if(type == "3"){
  318. lowLevel = 2;
  319. }else{
  320. lowLevel = 1;
  321. }
  322. initReqParams();
  323. loadData();
  324. });
  325. //点击列表查看下一级数据
  326. $("#listTable").on('tap', '.data-row', function(){
  327. var $this = $(this),
  328. code = $this.attr("data-code"),
  329. name = $this.attr("data-name");
  330. if($this.find(".fa-angle-right").length == 0){
  331. //团队内容
  332. showTeamInfo(code);
  333. return false;
  334. }
  335. areaTitle = name;
  336. areaCode = code;
  337. var newlevel = level - 1;
  338. //如果是市级管理员,先点击“社区”tab后再往下看下一级的数据,需要将level再-1
  339. if(newlevel == 3 && lowLevel == 2){
  340. newlevel -- ;
  341. }
  342. lowLevel = '';
  343. level = newlevel;
  344. // $("#areaTitle").text(areaTitle);
  345. //判断当前tab的位置
  346. var top = $(".area-tab-panel").offset().top;
  347. if(top < 0){
  348. var height = -(parseInt(initTabOffsetTop)/2);
  349. mui(".mui-scroll-wrapper").scroll().scrollTo(0, height, 500);
  350. }
  351. showTabs();
  352. initReqParams();
  353. loadData();
  354. //记录返回链接信息
  355. reqList.push({
  356. level: level,
  357. lowLevel: lowLevel,
  358. areaCode: areaCode,
  359. areaTitle: areaTitle,
  360. req: reqParam,
  361. activityId: activityId
  362. });
  363. });
  364. //弹出遮罩
  365. $(".icon-remark").on("click", function(e) {
  366. $(".modal-overlay").addClass("modal-overlay-visible");
  367. setTimeout(function(){
  368. $(".modal-content").show();
  369. },50)
  370. });
  371. $(".div-close,.modal-overlay").on("click",function(){
  372. $(".modal-overlay").removeClass("modal-overlay-visible");
  373. $(".modal-content").hide();
  374. });
  375. }
  376. /*
  377. * 控制底部各区等tab的显示,根据level来控制
  378. */
  379. function showTabs(){
  380. $(".area-tab").removeClass("active");
  381. switch(level){
  382. case 4:
  383. $(".area-tab").show();
  384. $(".area-tab").eq(0).addClass("active");
  385. break;
  386. case 3:
  387. $(".area-tab").eq(0).hide();
  388. $(".area-tab").eq(1).show();
  389. $(".area-tab").eq(1).addClass("active")
  390. break;
  391. case 2:
  392. $(".area-tab").eq(0).hide();
  393. $(".area-tab").eq(1).hide();
  394. $(".area-tab").eq(2).addClass("active")
  395. break;
  396. }
  397. }
  398. function drawLine(name, dataZoom_end, xData, yDatas, colors){
  399. var lineChart = echarts.init(document.getElementById('lineChart'));
  400. var option = {
  401. tooltip: {
  402. trigger: 'axis'
  403. },
  404. color: colors,
  405. legend: {
  406. bottom: '0px',
  407. data: name,
  408. borderColor: "#f1f1f1"
  409. },
  410. grid: {
  411. show: false,
  412. left: '30px',
  413. right: '20px',
  414. bottom: '30px',
  415. top: '10px',
  416. containLabel: true
  417. },
  418. xAxis: {
  419. type: 'category',
  420. boundaryGap: false,
  421. data: xData,
  422. axisLabel: {
  423. interval:0,//横轴信息全部显示
  424. formatter: function (value, index) {
  425. if(index == 0){
  426. $("#startValue").text(value);
  427. // if(dateType == 1){
  428. return value.substr(5,2)+"月"+value.substr(8,2);
  429. // }
  430. // return value.substr(5,5);
  431. }else{
  432. if(index == 9){
  433. $("#endValue").text(value);
  434. }
  435. // return value.substr(5,5);
  436. return value.substr(8,2);
  437. }
  438. }
  439. }
  440. },
  441. yAxis: {
  442. type: 'value',
  443. axisPointer: {
  444. snap: true
  445. },
  446. scale: true,
  447. minInterval: 1,
  448. boundaryGap: ['0%', '30%']
  449. },
  450. dataZoom: [{//给x轴设置滚动条
  451. show: false,
  452. start: dataZoom_end,
  453. end: 100,
  454. type: 'slider',
  455. zoomLock: true,
  456. },{ //下面这个属性是内容区域配置
  457. start: dataZoom_end,
  458. end: 100,
  459. type: 'inside',
  460. zoomLock: true,
  461. }]
  462. };
  463. var series = [],
  464. legend = [];
  465. for(var i=0; i<yDatas.length; i++){
  466. var obj = {
  467. name: name[i],
  468. type: 'line',
  469. smooth: true,
  470. data: yDatas[i],
  471. lineStyle:{
  472. normal:{
  473. color: colors[i]
  474. }
  475. },
  476. areaStyle: {normal: {}, opacity: 0.5},
  477. };
  478. series.push(obj);
  479. }
  480. option.series = series;
  481. // console.log(JSON.stringify(option));
  482. $("#lineChart").removeAttr('_echarts_instance_')
  483. lineChart.setOption(option);
  484. }
  485. //绘制漏斗图
  486. function drawFunnelChart(seriesData){
  487. var myChart = echarts.init(document.getElementById('funnelChart'));
  488. var option = {
  489. color: ["#17b3ec", "#4dcd70", "#ff9526"],
  490. legend: {
  491. right: 20,
  492. top: 60,
  493. orient: 'vertical',
  494. data: [{name:'已参与', icon: 'circle',},
  495. {name:'已获得积分', icon: 'circle',},
  496. {name:'已兑奖', icon: 'circle',}]
  497. },
  498. calculable: true,
  499. series: [
  500. {
  501. type:'funnel',
  502. left: 0,
  503. top: 15,
  504. right: '30%',
  505. bottom: 15,
  506. width: '70%',
  507. min: 0,
  508. max: 100,
  509. minSize: '0%',
  510. maxSize: '100%',
  511. sort: 'descending',
  512. gap: 5,
  513. label: {
  514. normal: {
  515. show: true,
  516. position: 'inside',
  517. formatter: '{c}%'
  518. }
  519. },
  520. labelLine: {
  521. normal: {
  522. length: 10,
  523. lineStyle: {
  524. width: 1,
  525. type: 'solid'
  526. }
  527. }
  528. },
  529. itemStyle: {
  530. normal: {
  531. borderColor: "#d7ecf4",
  532. borderWidth: 1
  533. }
  534. },
  535. data: seriesData
  536. }]
  537. };
  538. console.log(JSON.stringify(option));
  539. $("#funnelChart").removeAttr('_echarts_instance_')
  540. myChart.setOption(option);
  541. }
  542. function getStartDate(){
  543. return chooseYear+'-07-01';
  544. }
  545. //获取结束时间
  546. function getEndDate(){
  547. var nowdate = new Date();
  548. var year = nowdate.getFullYear();
  549. var month = nowdate.getMonth() + 1;
  550. var day = nowdate.getDate();
  551. var endDate = new Date((parseInt(chooseYear)+1) + '-06-30');
  552. var now = new Date();
  553. if(now <= endDate){
  554. return now.format("yyyy-MM-dd");
  555. }else{
  556. return (parseInt(chooseYear)+1) + '-06-30';
  557. }
  558. }
  559. /*
  560. * 获取用来排序的字段值,返回数组
  561. * 参数: list - 列表, key - 字段的名称
  562. */
  563. function amountArr(list, key){
  564. var amountArr = [];
  565. for(var k in list){
  566. amountArr.push(list[k][key]);
  567. }
  568. return amountArr;
  569. }
  570. /*
  571. * 排名
  572. */
  573. function soreRank(arr){
  574. var temp = [];
  575. var lis = [];
  576. for(var i=0;i<arr.length;i++){
  577. lis.push(arr[i]);
  578. }
  579. lis = _.uniq(lis);
  580. for(var i=0;i<arr.length;i++){
  581. temp[i] = lis.indexOf(arr[i])+1;
  582. }
  583. return temp;
  584. }
  585. /*
  586. * 初始化scroller
  587. */
  588. function initScroller(){
  589. //阻尼系数
  590. var deceleration = mui.os.ios?0.003:0.0009;
  591. mui('.mui-scroll-wrapper').scroll({
  592. bounce: false,
  593. indicators: true, //是否显示滚动条
  594. deceleration:deceleration
  595. });
  596. myScroller = mui('.mui-scroll-wrapper').pullRefresh({
  597. down: {
  598. callback: function() {
  599. var self = this;
  600. setTimeout(function() {
  601. initReqParams();
  602. loadData(true);
  603. self.endPulldownToRefresh();
  604. }, 1000);
  605. }
  606. }
  607. });
  608. }
  609. //返回事件
  610. var old_back = mui.back;
  611. mui.back = function(){
  612. if(reqList.length == 1){
  613. old_back();
  614. }
  615. else{
  616. var preInfo = reqList.pop();
  617. var info = reqList[reqList.length - 1];
  618. level = info.level;
  619. areaCode = info.areaCode;
  620. areaTitle = info.areaTitle;
  621. lowLevel = info.lowLevel;
  622. activityId = info.activityId;
  623. // $("#areaTitle").html(areaTitle);
  624. showTabs();
  625. initReqParams();
  626. loadData(true);
  627. }
  628. }