xuqiantongji-online.js 18 KB

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