xuqiantongji-new.js 20 KB

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