qianyuetongji-online.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. var self,
  2. initLevel,
  3. initArea,
  4. initTitle,
  5. level,
  6. area,
  7. title,
  8. startDate = '',
  9. endDate = '',
  10. lowLevel,
  11. lowCode = '',
  12. dateType = 1, //折线图坐标值1-日,2-周,3-月
  13. analysisType = "1"; // 筛选维度的id, 1-按任务,2-按人口,3-高血压,4-糖尿病,5-65岁以上人群
  14. var userRole;
  15. var reqParam = []; //请求参数
  16. var reqList = []; //请求的链接数据,根据这些信息后退的时候使用
  17. var initTabOffsetTop = 0; //初始化时,底部tab距离顶部的位置
  18. //定义年份
  19. var chooseYear;
  20. var now = new Date();
  21. if(now.getMonth() >= 6){
  22. chooseYear = now.getFullYear();
  23. }else{
  24. chooseYear = now.getFullYear() - 1;
  25. }
  26. mui.plusReady(function(){
  27. var self = plus.webview.currentWebview();
  28. level = initLevel = self.level;
  29. area = initArea = self.area;
  30. title = initTitle = self.title;
  31. chooseYear = self.chooseYear;
  32. lowCode = self.lowCode;
  33. analysisType = self.analysisType;
  34. startDate = getStartDate();
  35. endDate = getEndDate();
  36. //初始默认选中的时间和类型
  37. $(".choose-label").text(self.labelName);
  38. $("#areaTitle").text(title);
  39. //控制底部各区等tab的显示
  40. showTabs();
  41. initReqParams(); //现获得页面请求的接口参数
  42. //记录返回链接信息
  43. reqList.push({
  44. level: level,
  45. lowLevel: lowLevel,
  46. area: area,
  47. title: title,
  48. lowCode: lowCode,
  49. analysisType: analysisType,
  50. req: reqParam
  51. });
  52. loadData([0,1,2]); //现获得页面请求的接口参数
  53. initTabOffsetTop = $(".area-tab-panel").offset().top;
  54. initScroller();
  55. shaixuanInit(self);
  56. bindEvents();
  57. });
  58. //获得页面请求的接口参数
  59. function initReqParams(){
  60. var index = 72;
  61. if(lowCode){
  62. index = 73;
  63. }
  64. reqParam = [{
  65. url: "/statistics/sign_info_online",
  66. reqType: 'get',
  67. data: {level:level, area:area, lowCode:lowCode, year: chooseYear, endDate:endDate}
  68. },{
  69. url: "/statistics/interval_total",
  70. reqType: 'get',
  71. data: {level: level, area: area, startDate: startDate, endDate: endDate, interval: dateType, index: index, lowCode: lowCode}
  72. },{
  73. url: "/statistics/lowlevel_all",
  74. reqType: 'get',
  75. data: {sort: 1, date: endDate, level: level, index: index, area: area, lowCode: lowCode}
  76. }];
  77. if(lowLevel){
  78. reqParam[2].data.lowLevel = lowLevel;
  79. }
  80. }
  81. /*
  82. * 加载页面数据
  83. * @param loadArr array 记录需要请求的区域0-顶部,1-中间,2-底部
  84. */
  85. function loadData(loadArr){
  86. plus.nativeUI.showWaiting();
  87. getJieZhiTime();
  88. var reqPromise = [];
  89. for(var i=0; i<loadArr.length; i++){
  90. var j = loadArr[i];
  91. reqPromise.push(reqParam[j]);
  92. }
  93. getReqPromises(reqPromise, true).then(function(ress){
  94. var res1, res2, res3;
  95. for(var i=0; i<loadArr.length; i++){
  96. var j = loadArr[i] + 1;
  97. if(j == 1){
  98. res1 = ress[i];
  99. }
  100. if(j == 2){
  101. res2 = ress[i];
  102. }
  103. if(j == 3){
  104. res3 = ress[i];
  105. }
  106. }
  107. if(res1 && res1.status == 200){
  108. handleTopData(res1.data);
  109. }
  110. if(res2){
  111. if(res2.status == 200){
  112. handleSecondPanelData(res2.data);
  113. }else{
  114. handleSecondPanelData();
  115. }
  116. }
  117. if(res3){
  118. if(res3.status == 200){
  119. listHandle(res3.data);
  120. }else{
  121. $("#listTable").empty();
  122. mui.toast(res3.msg);
  123. }
  124. }
  125. plus.nativeUI.closeWaiting();
  126. });
  127. }
  128. /*
  129. * 加载数据截止时间
  130. */
  131. function getJieZhiTime(){
  132. sendPost("/statistics/time",null,function(res){
  133. },function(res){
  134. if(res.status=="200"){
  135. var date = (res.data && res.data.substring(11,16)) || "";
  136. $(".jiezhi-time").html("("+date+")");
  137. }
  138. });
  139. }
  140. /*
  141. * 处理顶部水球图数据
  142. */
  143. function handleTopData(res){
  144. //绘制水球图
  145. $('#qieyuelv').waterbubble({
  146. txt: parseFloat(res.signRate.rate).toFixed(2) + "%",
  147. data: parseFloat(res.signRate.rate)/100,
  148. waterColor: '#12B7F5',
  149. lineWidth:2,
  150. radius: 40,
  151. textColor: 'rgba(0, 0, 0, 1)',
  152. font: '14px arial'
  153. });
  154. $(".p-qianyuelv").html("<span class='c-12b7f5'>"+res.signRate.sign+"</span>/"+res.signRate.people);
  155. $('#dabiaolv').waterbubble({
  156. txt: parseFloat(res.signOnlineRate.rate).toFixed(2) + "%",
  157. data: parseFloat(res.signOnlineRate.rate)/100,
  158. waterColor: '#19d5c5',
  159. lineWidth:2,
  160. radius: 40,
  161. textColor: 'rgba(0, 0, 0, 1)',
  162. font: '14px arial'
  163. });
  164. $(".p-dachenglv").html("<span class='c-19d5c5'>"+res.signOnlineRate.signOnline+"</span>/"+res.signOnlineRate.sign);
  165. }
  166. /*
  167. * 处理中间折线图数据
  168. */
  169. function handleSecondPanelData(data){
  170. var lineCharts = echarts.init(document.getElementById('lineChart'),{
  171. noDataLoadingOption :{
  172. text: '暂无数据',
  173. effect:'bubble',
  174. // effectOption : {
  175. // effect: {
  176. // n: 0 //气泡个数为0
  177. // }
  178. // },
  179. textStyle: {
  180. fontSize: 32,
  181. fontWeight: 'bold'
  182. }
  183. }
  184. });
  185. if(!data){
  186. $("#startValue").text(startDate);
  187. $("#endValue").text(endDate);
  188. var xData =[];
  189. var yData = [];
  190. lineCharts.clear();
  191. var xAxis = {
  192. type: 'category',
  193. boundaryGap: false,
  194. data: xData
  195. };
  196. }else{
  197. for(var p in data){
  198. var xData = _.map(data[p].data, function(o){
  199. return o.range;
  200. });
  201. var yData = _.map(data[p].data, function(o){
  202. return o.amount;
  203. });
  204. }
  205. var lastIndex = yData.length % 10;
  206. if(yData.length >10 ){
  207. var dataZoom_end = 100-(9/yData.length)*100;
  208. }else{
  209. var dataZoom_end = 0;
  210. }
  211. //初始给定第一版页面中时间区间
  212. if(dateType == 3){
  213. var d1 = xData[yData.length - lastIndex],
  214. d2 = xData[yData.length -1];
  215. $("#startValue").text(d1.substr(0,4)+"年"+d1.substr(5,2)+"月");
  216. $("#endValue").text(d2.substr(0,4)+"年"+d2.substr(5,2)+"月");
  217. }else{
  218. $("#startValue").text(xData[yData.length - lastIndex]);
  219. $("#endValue").text(xData[yData.length -1]);
  220. }
  221. var xAxis = {
  222. type: 'category',
  223. boundaryGap: false,
  224. data: xData,
  225. axisLabel: {
  226. interval:0,//横轴信息全部显示
  227. formatter: function (value, index) {
  228. if(dateType == 1 || dateType == 2){
  229. if(index == 0){
  230. $("#startValue").text(value);
  231. return value.substr(5,2)+"月"+value.substr(8,2);
  232. }else{
  233. if(index == 10){
  234. $("#endValue").text(value);
  235. }
  236. return value.substr(8,2);
  237. }
  238. }else if(dateType == 3){
  239. var val = value.substr(5,2)+"月"
  240. if(index == 0){
  241. $("#startValue").text(value.substr(0,4)+"年"+val);
  242. }else{
  243. if(index == 9){
  244. $("#endValue").text(value.substr(0,4)+"年"+val);
  245. }
  246. }
  247. return val;
  248. }
  249. }
  250. }
  251. };
  252. }
  253. var options = {
  254. tooltip: {
  255. trigger: 'axis'
  256. },
  257. legend: {
  258. top: 'bottom',
  259. data:['线上签约量']
  260. },
  261. grid: {
  262. left: '10px',
  263. right: '10px',
  264. bottom: '30px',
  265. top: '10px',
  266. containLabel: true
  267. },
  268. xAxis: xAxis,
  269. yAxis: {
  270. type: 'value',
  271. axisPointer: {
  272. snap: true
  273. },
  274. scale: true,
  275. minInterval: 1,
  276. boundaryGap: ['10%', '30%']
  277. },
  278. dataZoom: [{//给x轴设置滚动条
  279. show: false,
  280. start: dataZoom_end,
  281. end: 100,
  282. type: 'slider',
  283. zoomLock: true,
  284. },{ //下面这个属性是内容区域配置
  285. start: dataZoom_end,
  286. end: 100,
  287. type: 'inside',
  288. zoomLock: true,
  289. }],
  290. series: [{
  291. name: '线上签约量',
  292. type: 'line',
  293. smooth: true,
  294. data: yData,
  295. lineStyle:{
  296. normal: {
  297. color: '#12b7f5'
  298. }
  299. },
  300. itemStyle:{
  301. normal: {
  302. color: '#12b7f5'
  303. }
  304. }
  305. }]
  306. };
  307. lineCharts.setOption(options);
  308. }
  309. /*
  310. * 处理底部区域数据
  311. */
  312. function listHandle(res){
  313. for(var k in res){
  314. var list = res[k];
  315. var topArr = soreRank(amountArr(list));
  316. list = _.map(list, function(o, index){
  317. o.top = topArr[index];
  318. o.rate = parseFloat(o.rate).toFixed(2);
  319. // o.targetRate = parseFloat(o.targetRate).toFixed(2);
  320. return o;
  321. })
  322. var html = template("data-list", {list: list, level: level, lowLevel: lowLevel, analysisType: analysisType});
  323. $("#listTable").empty().append(html);
  324. }
  325. }
  326. /*
  327. * 控制底部各区等tab的显示,根据level来控制
  328. */
  329. function showTabs(){
  330. $(".area-tab").removeClass("active");
  331. switch(level){
  332. case 4:
  333. $(".area-tab").show();
  334. $(".area-tab").eq(0).addClass("active");
  335. break;
  336. case 3:
  337. $(".area-tab").eq(0).hide();
  338. $(".area-tab").eq(1).show();
  339. $(".area-tab").eq(1).addClass("active")
  340. break;
  341. case 2:
  342. $(".area-tab").eq(0).hide();
  343. $(".area-tab").eq(1).hide();
  344. $(".area-tab").eq(2).addClass("active")
  345. break;
  346. }
  347. }
  348. /*
  349. * 初始化scroller
  350. */
  351. function initScroller(){
  352. //阻尼系数
  353. var deceleration = mui.os.ios?0.003:0.0009;
  354. mui('.mui-scroll-wrapper').scroll({
  355. bounce: false,
  356. indicators: true, //是否显示滚动条
  357. deceleration:deceleration
  358. });
  359. mui('.mui-scroll-wrapper').pullRefresh({
  360. down: {
  361. callback: function() {
  362. var self = this;
  363. setTimeout(function() {
  364. initReqParams();
  365. loadData([0,1,2]);
  366. self.endPulldownToRefresh();
  367. }, 1000);
  368. }
  369. }
  370. });
  371. }
  372. /**
  373. * 初始化筛选事件
  374. */
  375. function shaixuanInit(main){
  376. var shaixuan = plus.webview.getWebviewById('shaixuan2-1.html');
  377. if(!shaixuan){
  378. shaixuan = mui.createWindow({
  379. id: 'shaixuan2-1.html',
  380. url: 'shaixuan2.html',
  381. styles: {
  382. top: 0,
  383. bottom: 0,
  384. left: '20%',
  385. width: '80%',
  386. scorllIndicator: "none"
  387. },
  388. show:{
  389. aniShow: "slide-in-right",
  390. duration: "400"
  391. },
  392. extras:{
  393. showType: 1,
  394. noYear: '2016',
  395. chooseYear: chooseYear,
  396. selectedType: analysisType
  397. }
  398. });
  399. }
  400. window.addEventListener("hideShaiXuan",function(){
  401. console.log("hideShaiXuan");
  402. main.setStyle({mask:"none"});
  403. shaixuan.hide();
  404. }, false);
  405. window.addEventListener("showShaiXuan", function() {
  406. shaixuan.show();
  407. main.setStyle({mask:"rgba(0,0,0,0.5)"});
  408. main.addEventListener("maskClick",function(){
  409. main.setStyle({mask:"none"});
  410. shaixuan.hide();
  411. }, false);
  412. });
  413. }
  414. function bindEvents(){
  415. //说明信息相关事件
  416. $("#closeBtn").on("tap", function(){
  417. $(".information").hide();
  418. });
  419. $(".info-icon").on("tap", function(){
  420. $(".information").show();
  421. });
  422. //左滑筛选区域的数据
  423. $('.header-link').on("tap", function(){
  424. var self = plus.webview.currentWebview();
  425. mui.fire(self, "showShaiXuan");
  426. });
  427. //日、周、月按钮切换
  428. $(".date-tag").on("tap",function(){
  429. dateType = $(this).attr("data-type");
  430. $(".date-tag").removeClass("active");
  431. $(this).addClass("active");
  432. initReqParams();
  433. loadData([1]); //只加载中间区域的数据
  434. });
  435. //底部各区等区域的tab切换
  436. $(".area-tab").on('tap', function(){
  437. var $this = $(this),
  438. type = $this.attr("data-val"); //4 - 各区, 3 - 社区, 2 - 团队
  439. if($this.hasClass("active")){
  440. return false;
  441. }
  442. $(".area-tab").removeClass("active");
  443. $this.addClass("active");
  444. if(type == "4"){
  445. lowLevel = 0;
  446. }else if(type == "3"){
  447. lowLevel = 2;
  448. }else{
  449. lowLevel = 1;
  450. }
  451. initReqParams();
  452. loadData([2]);
  453. });
  454. //底部每条记录的点击事件
  455. $("#listTable").on('tap', ".data-row", function(){
  456. var $this = $(this),
  457. name = $this.attr("data-name"),
  458. code = $this.attr("data-code"),
  459. $selectTab = $(".area-tab.active");
  460. title = name;
  461. if($selectTab.attr("data-val") == "2"){ //获得团队信息,弹框显示数据
  462. showTeamInfo(code);
  463. return false;
  464. }
  465. area = code;
  466. var newlevel = level - 1;
  467. //如果是市级管理员,先点击“社区”tab后再往下看下一级的数据,需要将level再-1
  468. if(newlevel == 3 && lowLevel == 2){
  469. newlevel -- ;
  470. }
  471. lowLevel = '';
  472. level = newlevel;
  473. $("#areaTitle").text(title);
  474. //判断当前tab的位置
  475. var top = $(".area-tab-panel").offset().top;
  476. if(top < 0){
  477. mui(".mui-scroll-wrapper").scroll().scrollTo(0, -(parseInt(initTabOffsetTop)/2), 500);
  478. }
  479. showTabs();
  480. initReqParams();
  481. //记录返回链接信息
  482. reqList.push({
  483. level: level,
  484. lowLevel: lowLevel,
  485. area: area,
  486. title: title,
  487. lowCode: lowCode,
  488. analysisType: analysisType,
  489. req: reqParam
  490. });
  491. loadData([0,1,2]);
  492. });
  493. //弹出遮罩
  494. $(".icon-remark").on("click", function(e) {
  495. $(".modal-overlay").addClass("modal-overlay-visible");
  496. setTimeout(function(){
  497. $(".modal-content").show();
  498. },50)
  499. });
  500. $(".div-close,.modal-overlay").on("click",function(){
  501. $(".modal-overlay").removeClass("modal-overlay-visible");
  502. $(".modal-content").hide();
  503. });
  504. //添加页面监听
  505. window.addEventListener("refresh", function(e){
  506. var year = e.detail.year;
  507. var name = e.detail.name;
  508. lowCode = e.detail.lowCode || "";
  509. analysisType = e.detail.id || "1";
  510. //重置变量值
  511. chooseYear = year;
  512. level = initLevel;
  513. area = initArea;
  514. title = initTitle;
  515. lowLevel = "";
  516. startDate = getStartDate();
  517. endDate = getEndDate();
  518. $("#areaTitle").text(title);
  519. $(".choose-label").text(year+"年("+name+")");
  520. showTabs();
  521. initReqParams();
  522. //清空请求数组
  523. reqList.splice(0, reqList.length);
  524. //记录返回链接信息
  525. reqList.push({
  526. level: level,
  527. lowLevel: lowLevel,
  528. area: area,
  529. title: title,
  530. lowCode: lowCode,
  531. analysisType: analysisType,
  532. req: reqParam
  533. });
  534. loadData([0,1,2]);
  535. });
  536. }
  537. /*
  538. * 获得团队信息
  539. */
  540. function showTeamInfo(teamId){
  541. var url = "/doctor/admin-teams/teams/info",
  542. params = {
  543. teamId: teamId
  544. };
  545. plus.nativeUI.showWaiting();
  546. sendGet(url, params, null, function(res){
  547. if(res.status == 200){
  548. var data = res.data;
  549. data.memberLength = data.members.length;
  550. var html = template("teamInfo", data);
  551. $("#teamInfoBox").empty().append(html);
  552. $(".modal-overlay").addClass("modal-overlay-visible");
  553. setTimeout(function(){
  554. $(".modal-content").show();
  555. },50)
  556. }else{
  557. mui.toast(res.msg);
  558. }
  559. plus.nativeUI.closeWaiting();
  560. }, true);
  561. }
  562. function getStartDate(){
  563. return chooseYear+'-07-01';
  564. }
  565. //获取结束时间
  566. function getEndDate(){
  567. var nowdate = new Date();
  568. var year = nowdate.getFullYear();
  569. var month = nowdate.getMonth() + 1;
  570. var day = nowdate.getDate();
  571. var endDate = new Date((parseInt(chooseYear)+1) + '-06-30');
  572. var now = new Date();
  573. if(now <= endDate){
  574. return now.format("yyyy-MM-dd");
  575. }else{
  576. return (parseInt(chooseYear)+1) + '-06-30';
  577. }
  578. }
  579. //签约量数据集合
  580. function amountArr(list){
  581. var amountArr = [];
  582. for(var k in list){
  583. amountArr.push(list[k].signOnlineNum);
  584. }
  585. return amountArr;
  586. }
  587. //排名方法
  588. function soreRank(arr){
  589. var temp = [];
  590. var lis = [];
  591. for(var i=0;i<arr.length;i++){
  592. lis.push(arr[i]);
  593. }
  594. lis = _.uniq(lis);
  595. for(var i=0;i<arr.length;i++){
  596. temp[i] = lis.indexOf(arr[i])+1;
  597. }
  598. return temp;
  599. }
  600. //返回事件
  601. var old_back = mui.back;
  602. mui.back = function(){
  603. if(reqList.length == 1){
  604. old_back();
  605. }
  606. else{
  607. var preInfo = reqList[reqList.length - 1];
  608. if(preInfo.level == level && preInfo.lowLevel == lowLevel){
  609. reqList.pop();
  610. var info = reqList[reqList.length - 1];
  611. }else{
  612. info = preInfo;
  613. }
  614. level = info.level;
  615. area = info.area;
  616. title = info.title;
  617. lowLevel = info.lowLevel;
  618. sumType = info.sumType;
  619. tagCode = info.tagCode;
  620. analysisType = info.analysisType;
  621. $("#areaTitle").html(title);
  622. showTabs();
  623. initReqParams();
  624. loadData([0,1,2]);
  625. }
  626. }