瀏覽代碼

Merge branch 'master' of http://192.168.1.220:10080/raolu/PC-application

Xiao_yanpeng 7 年之前
父節點
當前提交
0f16d399c1
共有 68 個文件被更改,包括 2856 次插入1869 次删除
  1. 187 59
      api/http-request.js
  2. 9 0
      api/statistics-api.js
  3. 6 47
      app/home/index.html
  4. 85 0
      app/home/menu.html
  5. 3 3
      login/css/login.css
  6. 80 0
      app/login/login.html
  7. 123 0
      app/login/login.js
  8. 24 30
      app/statistics/change-back.html
  9. 3 1
      app/statistics/comprehensive-analysis.html
  10. 3 1
      app/statistics/consulting-analysis.html
  11. 88 2
      app/statistics/css/common.css
  12. 62 6
      app/statistics/estimate-analysis.html
  13. 44 4
      app/statistics/home.html
  14. 331 0
      app/statistics/js/change-back.js
  15. 20 1
      app/statistics/js/common.js
  16. 81 6
      app/statistics/js/comprehensive-analysis.js
  17. 27 2
      app/statistics/js/consulting-analysis.js
  18. 314 0
      app/statistics/js/estimate-analysis.js
  19. 101 26
      app/statistics/js/home.js
  20. 87 11
      app/statistics/js/prescription-analysis.js
  21. 39 19
      app/statistics/js/renew-progress.js
  22. 51 24
      app/statistics/js/resident-analysis-charts.js
  23. 1 1
      app/statistics/js/resident-analysis.js
  24. 125 94
      app/statistics/js/sign-progress.js
  25. 296 0
      app/statistics/js/two-rate-analysis.js
  26. 3 1
      app/statistics/prescription-analysis.html
  27. 1 1
      app/statistics/renew-progress.html
  28. 2 2
      app/statistics/sign-progress.html
  29. 41 30
      app/statistics/two-rate-analysis.html
  30. 28 2
      component/statistics/area-data-panel.js
  31. 83 0
      component/statistics/area-data-panel2.js
  32. 7 3
      component/statistics/bar-chart.js
  33. 4 0
      component/statistics/line-chart.js
  34. 85 0
      component/statistics/prescription-filter.js
  35. 22 4
      component/statistics/resident-analysis-filter.js
  36. 161 99
      component/statistics/resident-analysis.js
  37. 1 1
      component/statistics/sign-progress-filter.js
  38. 58 0
      component/statistics/year-filter.js
  39. 1 0
      css/style.min.css
  40. 0 0
      images/BG.jpg
  41. 二進制
      images/gaoweirenqun.png
  42. 0 0
      images/icon_chahua.png
  43. 二進制
      images/snashi_icon.png
  44. 0 0
      js/security.js
  45. 1 1
      js/util.js
  46. 0 0
      js/validate/jquery.validate.min.js
  47. 0 0
      js/validate/messages_zh.min.js
  48. 168 0
      js/waterbubble.js
  49. 0 249
      login/common_http.js
  50. 0 12
      login/css/animate.min.css
  51. 0 6
      login/css/bootstrap.min14ed.css
  52. 0 4
      login/css/font-awesome.min93e3.css
  53. 0 1
      login/css/style.min862f.css
  54. 二進制
      login/fonts/fontawesome-webfont93e3.eot
  55. 0 640
      login/fonts/fontawesome-webfont93e3.svg
  56. 二進制
      login/fonts/fontawesome-webfont93e3.ttf
  57. 二進制
      login/fonts/fontawesome-webfont93e3.woff
  58. 二進制
      login/fonts/fontawesome-webfont93e3.woff2
  59. 二進制
      login/fonts/fontawesome-webfontd41d.eot
  60. 二進制
      login/fonts/glyphicons-halflings-regular.eot
  61. 0 288
      login/fonts/glyphicons-halflings-regular.svg
  62. 二進制
      login/fonts/glyphicons-halflings-regular.ttf
  63. 二進制
      login/fonts/glyphicons-halflings-regular.woff
  64. 二進制
      login/fonts/glyphicons-halflings-regular.woff2
  65. 二進制
      login/fonts/glyphicons-halflings-regulard41d.eot
  66. 0 7
      login/js/bootstrap.min.js
  67. 0 4
      login/js/jquery.min.js
  68. 0 177
      login/js/login.js

+ 187 - 59
api/http-request.js

@ -1,23 +1,60 @@
(function(exports) {
    var publish_version = false,
	server,
	imgUrlDomain,
//	agentName = "wlyyAgentForDoc",
    agentName = "useragent", //先设置与医生端一致,暂借用app端的userAgent值
	userInfo = "userInfoForPay",
	userAgent = '';
(function($) {
    var publish_version = false;
    var isInner = false; //发布线上后有内外网的配置
    var agentName = "wlyyAgentForDoc";
    var server, userAgent, loginUrl, imserver, socketUrl, imgServer;
    var IMEI = localStorage.getItem('WLYY_IMEI') || uuid(16, 16)
    localStorage.setItem('WLYY_IMEI', IMEI)
    $.support.cors = true;
    if(publish_version) { // 生产环境配置
        server = ""
        
        server = "http://www.xmtyw.cn/wlyy/"
        imserver = "http://27.155.101.77:3000/api/v2";
        socketUrl = "http://27.155.101.77:3000";
        loginUrl = "../login/login.html";
        imgServer = "http://www.xmtyw.cn/";
        if(isInner){
            server = "http://10.95.22.10:8011/wlyy/"
            imserver = "http://10.95.22.138:3000/api/v2";
            socketUrl = "http://10.95.22.138:3000";
            loginUrl = "../login/login.html";
            imgServer = "http://10.95.22.10:8011/";
        }
    } else { // 测试环境配置
        server = "http://172.19.103.88:9092/wlyy/";
        server = "http://172.19.103.88:9092/wlyy/"
        imserver = "http://172.19.103.88:3000/api/v2";
        imgUrlDomain = "http://172.19.103.54/";
        socketUrl = "http://172.19.103.88:3000";
        
//      server = "http://192.168.131.133:8080/";
//      server = "http://192.168.131.127:8060/"; //逸祥
//      server = "http://192.168.131.24:8080/"; //仕杰
//      imserver = "http://192.168.131.24:3000/api/v2"
//      socketUrl = "http://192.168.131.24:3000";
        loginUrl = "../login/login.html";
//      loginUrl = "/PC-prescription/login.html"; //自己本地测试时的路径
        imgServer = "http://172.19.103.54/";
    }
    userAgent = localStorage.getItem(agentName)
    if(userAgent) {
        try {
            userAgent = JSON.parse(userAgent)
        } catch(e) {
            toastr && toastr.warning("登录失效,请重新登录")
            toLoginPage()
        }
    } else {
        toLoginPage()
    }
    var isRelogined = sessionStorage.getItem('wlyy_relogin')
    if(isRelogined && location.href.indexOf("login.html") < 0){
        sessionStorage.removeItem('wlyy_relogin')
    }
    
    //测试使用,写死userAgent。如果要切换账号,自己再其他端登录后将userAgent的值拷贝过来即可
    var userAgent = {"id":4835,"uid":"rll201703150222","imei":"860573010176837","token":"c0cdef2e1238d89eb4397e1349b56416","platform":2,"hospital":"3502050100","appVersion":"1.4.3"};
    window.localStorage.setItem(agentName, JSON.stringify(userAgent));
    function httpGet(url, options) {
        //发送ajax请求
@ -27,13 +64,17 @@
                    type: 'GET',
                    dataType: 'JSON',
                    beforeSend: function(request) {
                    	var userAgent = window.localStorage.getItem(agentName);
                    	request.setRequestHeader(agentName, userAgent);
                        var agent = userAgent || {
                            imei: localStorage.getItem('WLYY_IMEI'),
                            platform: 4
                        }
                        request.setRequestHeader("userAgent", JSON.stringify(agent));
                    },
                    error: function(res) {
                        reject(res)
                    },
                    success: function(res) {
                        failCodeHandle(res)
                        resolve(res)
                    }
                }, options));
@ -48,19 +89,22 @@
                    type: 'POST',
                    dataType: 'JSON',
                    beforeSend: function(request) {
                    	var userAgent = window.localStorage.getItem(agentName);
                    	request.setRequestHeader(agentName, userAgent);
                        var agent = userAgent || {
                            imei: localStorage.getItem('WLYY_IMEI')
                        }
                        request.setRequestHeader("userAgent", JSON.stringify(agent));
                    },
                    error: function(res) {
                        reject(res)
                    },
                    success: function(res) {
                        failCodeHandle(res)
                        resolve(res)
                    }
                }, options));
        })
    }
    
    function imHttpGet(url, options) {
        //发送ajax请求
        return new Promise(function(resolve, reject) {
@ -69,58 +113,142 @@
                    type: 'GET',
                    dataType: 'JSON',
                    beforeSend: function(request) {
                        request.setRequestHeader("userAgent", JSON.stringify(sendHead));
                        request.setRequestHeader("userAgent", JSON.stringify(userAgent));
                    },
                    error: function(res) {
                        reject(res)
                    },
                    success: function(res) {
                        failCodeHandle(res)
                        resolve(res)
                    }
                }, options));
        })
    }
    function imHttpPost(url, options) {
        //发送ajax请求
        return new Promise(function(resolve, reject) {
            $.ajax(imserver + url,
                $.extend({}, {
                    type: 'POST',
                    dataType: 'JSON',
                    beforeSend: function(request) {
                        request.setRequestHeader("userAgent", JSON.stringify(userAgent));
                    },
                    error: function(res) {
                        reject(res)
                    },
                    success: function(res) {
                        failCodeHandle(res)
                        resolve(res)
                    }
                }, options));
        })
    }
    
    function toLoginPage() {
        if(location.href.indexOf('login.html') > -1) {
            return;
        }
        setTimeout(function() {
            sessionStorage.setItem("wlyy_relogin", 1)
//          var path = top.location.pathname,
//              rootPath = path.split("/")[1];
            top.location.replace(loginUrl + '?redirect_url=' + encodeURIComponent(top.location.href))
        }, 2000)
    }
    var count = 0;
    function failCodeHandle(res) {
        var tip = "";
        if(res.status == 999) {
            tip = "此账号已在别处登录,请重新登录";
        } else if(res.status == 998) {
            tip = "登录超时,请重新登录";
        } else if(res.status == 997) {
            tip = "此账号未登录,请先登录"
        }
        if(tip) {
            count ++;
            if(count == 1){
//              toastr && toastr.warning(tip)
                toLoginPage()
            }
        }
    }
    function uuid(len, radix) {
        var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
        var uuid = [],
            i;
        radix = radix || chars.length;
        if(len) {
            // Compact form  
            for(i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
        } else {
            // rfc4122, version 4 form  
            var r;
            // rfc4122 requires these characters  
            uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
            uuid[14] = '4';
            // Fill in random data.  At i==19 set the high bits of clock sequence as  
            // per rfc4122, sec. 4.1.5  
            for(i = 0; i < 36; i++) {
                if(!uuid[i]) {
                    r = 0 | Math.random() * 16;
                    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
                }
            }
        }
        return uuid.join('');
    }
    /*
	 * 获取图片路径
	 */
	function getImgUrl(str){
		if(typeof str != 'string'){
		    return "";
		}
		if(str.length == 0){
	        return "";
	    }else{
	        if(str.indexOf("../")>-1){
	            //访问本地路径
	            return str;
	        }else if((str.indexOf("http://")>-1) || (str.indexOf("https://")>-1)){
	            return str;
	        }else{
	            //服务器上的图片路径
	            return imgUrlDomain + str;
	        }
	    }
	}
     * 获取图片路径方法修改
     */
    function getImgUrl(str) {
        if(typeof str != 'string') {
            return "";
        }
        if(str.length == 0) {
            return "";
        } else {
            if(str.indexOf("../") > -1) {
                //访问本地路径
                return str;
            } else if((str.indexOf("http://") > -1) || (str.indexOf("https://") > -1)) {
                return str;
            } else {
                //服务器上的图片路径
                return imgServer + str;
            }
        }
    }
    httpRequest = {
    	server: server,
    	userInfo: userInfo,
    	agentName: agentName,
    	userAgent:userAgent,
        get: function(url, options) {
        	return httpGet(url, options)
        },
        post: function(url, options) {
        	return httpPost(url, options)
        },
        getImgUrl:function(url){
        	return getImgUrl(url)
        agentName: agentName,
        server: server,
        imserver: imserver,
        socketUrl: socketUrl,
        userAgent: userAgent,
        get: httpGet,
        post: httpPost,
        imHttpGet: imHttpGet,
        imHttpPost: imHttpPost,
        getImgUrl: getImgUrl,
        failCodeHandle: failCodeHandle,
        loginIm: function(data){
            return imHttpPost('/users/login', data);
        },
        imGet:function(url, options) {
        	return imHttpGet(url, options)
        getDoctorInfo: function() {
            return httpGet('doctor/baseinfo');
        }
    }
    exports.httpRequest = httpRequest;
})(window)
    window.httpRequest = httpRequest;
})(jQuery)

+ 9 - 0
api/statistics-api.js

@ -1,5 +1,9 @@
(function(exports) {
    var statisticAPI = {
        /*************首页*******************/
        getSignInfo: function(data){
            return httpRequest.get("/statistics/sign_info", {data: data});
        },
        /*************总体分析页面接口列表**************/
        //1、顶部各个tab的值
        statisticTotal: function(data){
@ -53,6 +57,11 @@
        //长处方分析接口
        getPrescriptionTotalHistogram: function(data){
            return httpRequest.get("statistics/getPrescriptionTotalHistogram", {data: data})
        },
        //评价分析
        //按月份获得个月的评价平均分
        getAVGSocreByMonth: function(data){
            return httpRequest.get("/statistics/getAVGSocreByMonth", {data: data});
        }
    }

+ 6 - 47
app/home/index.html

@ -6,54 +6,13 @@
        <meta name="renderer" content="webkit">
        <meta http-equiv="Cache-Control" content="no-siteapp">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <title>基本公共卫生服务平台</title>
        <title>PC IM 应用中心</title>
        <meta name="keywords" content="">
        <meta name="description" content="">
        <link rel="shortcut icon" href="../../favicon.ico"/>
        <link rel="stylesheet" type="text/css" href="../../css/bootstrap.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <!--<link rel="stylesheet" type="text/css" href="../../css/animate.min.css"/>-->
        <link rel="stylesheet" type="text/css" href="../../plugins/artDialog/6.0.5/css/ui-dialog.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="index.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
    </head>
    <body class="fixed-sidebar full-height-layout gray-bg" style="overflow:hidden">
        <div id="wrapper">
            <!-- 顶部区域内容 -->
            <top></top>
            <!--左侧导航开始-->
            <nav-menu></nav-menu>
            <!--左侧导航结束-->
            <!--右侧部分开始-->
            <div id="page-wrapper" class="gray-bg dashbard-1">
                <content-tabs></content-tabs>
                <div class="row J_mainContent plr20 pt20" id="content-main">
                    <iframe class="J_iframe" name="iframe0" width="100%" height="100%" src="" frameborder="0" data-id="" seamless>
                    	
                    </iframe>
                </div>
            </div>
        </div>
        <script src="../../js/jquery-2.2.4.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/metisMenu/jquery.metisMenu.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/slimscroll/jquery.slimscroll.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/layer/layer.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/artDialog/6.0.5/js/dialog-plus.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/toastr/toastr.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/pace/pace.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/hplus.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/contabs.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../apis/http-request.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../apis/home-api.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/common/event-bus.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/home/top.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/home/nav-menu.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/home/nav-menu-item.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/home/content-tabs.js" type="text/javascript" charset="utf-8"></script>
        <script src="index.js" type="text/javascript" charset="utf-8"></script>
    </body>
    <frameset cols="300, *" frameborder="NO" border="0" framespacing="0">
        <frame src="menu.html" noresize="noresize" id="tab">
        <frame src="href:aboutblank;" name="view_frame" id="main" class="p10" noresize="noresize">
    </frameset>
</html>

+ 85 - 0
app/home/menu.html

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>应用菜单</title>
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/bootstrap.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../plugins/artDialog/6.0.5/api/css/ui-dialog.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
        <style>
            body{
                border-right: 1px solid #e1e1e1;
            }
            .row{
                border-bottom: 1px solid #e1e1e1;
                border-right: 1px solid #e1e1e1;
            }
            .col-xs-6{
                border-left: 1px solid #e1e1e1;
                border-top: 1px solid #e1e1e1;
                padding: 15px 0;
                text-align: center;
            }
            .col-xs-6.disabled{
                background-color: #f2f4f6;
            }
            .col-xs-6.active>a{
                color: #12b7f5;
            }
        </style>
    </head>
    <body>
        <div id="main" class="container">
            <div class="row">
                <div class="col-xs-6" :class="{'active': selectedTab == 1, 'disabled': disableTabs.indexOf(1)>-1}">
                    <a href="" target="view_frame" @click="chooseTab(1)">
                        <img :src="selectedTab==3?'../../images/xufangguanli02_icon.png':'../../images/xufangguanli_icon.png'">
                        <div class="mt10 c-f16">续方管理</div>
                    </a>
                    
                </div>
                <div class="col-xs-6" :class="{'active': selectedTab==2, 'disabled': disableTabs.indexOf(2)>-1}">
                    <a href="" target="view_frame">
                        <img :src="selectedTab==3?'../../images/jiankangjiaoyu02_icon.png':'../../images/jiankangjiaoyu_icon.png'">
                        <div class="mt10 c-f16">健康教育</div>
                    </a>
                </div>
                <div class="col-xs-6" :class="{'active': selectedTab == 3, 'disabled': disableTabs.indexOf(3)>-1}">
                    <a href="" target="view_frame" @click="chooseTab(3)">
                        <img :src="selectedTab==3?'../../images/suifangjihua02_icon.png':'../../images/suifangjihua_icon.png'">
                        <div class="mt10 c-f16">随访计划</div>
                    </a>
                </div>
                <div class="col-xs-6" :class="{'active': selectedTab == 4, 'disabled': disableTabs.indexOf(4)>-1}">
                    <a href="../statistics/home.html" target="view_frame" @click="chooseTab(4)">
                        <img :src="selectedTab == 4?'../../images/tongjifenxi02_icon.png' : '../../images/tongjifenxi_icon.png'">
                        <div class="mt10 c-f16">统计分析</div>
                    </a>
                </div>
            </div>
        </div>
        <script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/jquery-2.2.4.js"></script>
        <script src="../../js/bootstrap.min.js"></script>
        <script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/util.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            new Vue({
                el: "#main",
                data: {
                    selectedTab: 0,
                    disableTabs: [2]
                },
                methods: {
                    chooseTab: function(val){
                        this.selectedTab = val;
                    }
                }
            })
        </script>
    </body>
</html>

+ 3 - 3
login/css/login.css

@ -1,7 +1,7 @@
body {
	width: 100%;
	height: 100%;
	background: url(../image/BG.jpg);
	background: url(../../images/BG.jpg);
	font-size: 14px;
}
#main {
@ -52,13 +52,13 @@ button[type="submit"] {
	cursor: pointer;
}
#getCaptcha {
.getCaptcha {
	position: absolute;
	top: 8px;
	right: 10px;
}
#getCaptcha.disabled{
.getCaptcha.disabled{
	cursor: not-allowed;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;

+ 80 - 0
app/login/login.html

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="renderer" content="webkit">
    <meta http-equiv="Cache-Control" content="no-siteapp" />
    <meta name="keywords" content="登录">
    <meta name="description" content="登录">
    <link rel="shortcut icon" href="../../favicon.ico">
    <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
    <link rel="stylesheet" type="text/css" href="../../css/bootstrap.min.css"/>
    <link rel="stylesheet" type="text/css" href="../../plugins/artDialog/6.0.5/api/css/ui-dialog.css"/>
    <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
    <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
    <link rel="stylesheet" type="text/css" href="login.css"/>
</head>
<body>
    <div id="main">
        <div class="row">
            <div class="col-sm-8 left-img">
                <img src="../../images/icon_chahua.png" />
            </div>
            <div id="loginForm" class="col-sm-4">
                <div class="tabs-container">
                    <ul class="nav nav-tabs">
                        <li :class="{'active': type==1}" @click="changeType(1)"><a>手机号登录</a>
                        </li>
                        <li :class="{'active': type==2}" @click="changeType(2)"><a>验证码登录</a>
                        </li>
                    </ul>
                    <div class="tab-content">
                        <div class="tab-pane" :class="{'active': type==1}">
                            <div class="panel-body">
                                <form id="form1" class="m-t" role="form" onsubmit="return false;">
                                    <div class="form-group">
                                        <input class="form-control" type="text" maxlength="11" v-model="mobile" placeholder="请输入手机号码">
                                    </div>
                                    <div class="form-group">
                                        <input class="form-control" :type="eyeIsOpen?'text':'password'" v-model="password" placeholder="初始密码为手机号码后六位">
                                        <i class="fa" :class="eyeIsOpen? 'fa-eye': 'fa-eye-slash'"></i>
                                    </div>
                                    <button type="submit" class="btn btn-success block full-width m-b" @click="login">登 录</button>                 
                                </form>
                            </div>
                        </div>
                        <div class="tab-pane" :class="{'active': type==2}">
                            <div class="panel-body">
                                <form id="form2" class="m-t" role="form" onsubmit="return false;">
                                    <div class="form-group">
                                        <input class="form-control" type="text" maxlength="11" v-model="mobile" placeholder="请输入手机号码">
                                    </div>
                                    <div class="form-group">
                                        <input class="form-control" type="text" v-model="captcha" placeholder="请输入短信验证码">
                                        <a class="getCaptcha" :class="{'disabled': countdown}" @click="getCaptcha">{{infoText}}</a>
                                    </div>
                                    <button type="submit" class="btn btn-success block full-width m-b" @click="login">登 录</button>
                                </form>    
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../js/jquery-2.2.4.js"></script>
    <script src="../../js/bootstrap.min.js"></script>
    <script src="../../js/validate/jquery.validate.min.js"></script>
    <script src="../../js/validate/messages_zh.min.js"></script>
    <script src="../../js/security.js"></script>
    <script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../js/util.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../api/http-request.js" type="text/javascript" charset="utf-8"></script>
    <script src="../../plugins/artDialog/6.0.5/api/js/dialog-plus.js" type="text/javascript" charset="utf-8"></script>
    <script src="login.js"></script>
</body>
</html>

+ 123 - 0
app/login/login.js

@ -0,0 +1,123 @@
new Vue({
    el: "#main",
    data: {
        type: 1, //记录选择的登录方式,1-手机号登录,2-验证码登录
        mobile: '',
        password: '',
        captcha: '',
        eyeIsOpen: false,
        infoText: '获取验证码',
        countdown: false //是否在倒计时
    },
    methods: {
        changeType: function(val){
            this.type = val;
        },
        getCaptcha: function(){
            //先校验手机号码是否正确
            var isMobile = isMobilePhone(this.mobile);
            if(!isMobile){
                tip('请输入正确的手机号码!');
                return false;
            }
            setTimer(this);
            //发送请求
            sendToGetCaptcha(this);
        },
        login: function(){
            if(this.type == 1){
                var validation = $("#form1").valid();
                if(validation){
                    getPublicKey(this);
                }
            }else{
                var validation = $("#form2").valid();
                if(validation){
                    login({
                        mobile: this.mobile,
                        captcha: this.captcha,
                        platform: 4
                    })
                }
            }
        },
    }
});
//验证码定时
function setTimer(vm) {
    var seconds = 59;
    vm.countdown = true;
    timer = setInterval(function() {
        if(seconds == 0) {
            clearInterval(timer);
            timer = null;
            seconds = 59;
            vm.infoText = "获取验证码";
            vm.countdown = false;
            return ;
        }
        seconds --;
        vm.infoText = seconds+"s后重新获取";
    }, 1000)
}
function sendToGetCaptcha(vm){
    var url = "common/captcha",
        params = {
            mobile: vm.mobile,
            type: 5,
            captchaToken: 5
        };
    httpRequest.post(url, {data: params}).then(function(res){
        if(res.status == 200){
            tip('发送成功','add');
        }else{
            tip('获取验证码失败');
        }
    });
}
function getPublicKey(vm){
    var url = "login/public_key";
    httpRequest.post(url).then(function(res){
        if(res.status){
            var mod = res.data.modulus;
            var exp = res.data.exponent;
            key = RSAUtils.getKeyPair(exp, "", mod);
            if (key) {
                encryedPwd = RSAUtils.encryStr(key, vm.password);
                login({
                    mobile: vm.mobile,
                    password: encryedPwd,
                    platform: 4
                })
            }else {
               tip("获取数据失败")
               $submit.removeAttr('disabled')
            }
        }else{
            tip(res.msg);
        }
    })
}
function login(data) {
    httpRequest.post('login/doctor', {data: data}).then(function(res){
        if(res.status == 200){
            var docInfo = res.data;
            localStorage.setItem(httpRequest.agentName,JSON.stringify({
                id: docInfo.id,
                uid: docInfo.uid,
                token: docInfo.token,
                imei: localStorage.getItem('WLYY_IMEI'),
                platform: 4
            }));
            //将用户的角色信息单独存储在localstorage中
            localStorage.setItem("userRole", JSON.stringify(docInfo.userRole));
            window.location.href = "../home/index.html";
        }else{
            tip(res.msg);
        }
    });
}

+ 24 - 30
app/statistics/change-back.html

@ -16,36 +16,31 @@
	</head>
	<body style="margin: 0;">
		<div id="main">
		<div id="main" class="c-hide">
			<header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen"></header-tab>
			<header-prompt></header-prompt>
			<!-- 饼图 -->
			<div class="mt10 mb30">
				<div class="c-row">
					<div class="c-50 c-t-center c-position-r">
						<div class="div-radius-panel">
							<div class="c-f16 c-12b7f5 mt15">{{signRateData.signRateText}}</div>
							<div class="c-f14 c-666">签约率</div>
						</div>
						<div id="signMain" class="c-100 height-120"></div>
						<div class="c-f12 c-999 div-data-value">
							<span class="c-f12 c-12b7f5 qianyuelv">{{signRateData.signAmount}}</span>/
							<span class="c-f12 c-333 qianyuezong">{{signRateData.signRateAll}}</span>
						</div>
					</div>
					<div class="c-50 c-t-center c-position-r">
						<div class="div-radius-panel">
							<div class="c-f16 c-12b7f5 mt15">{{signRateData.completeRateText}}</div>
							<div class="c-f14 c-666">完成率</div>
						</div>
						<div id="completeMain" class="c-100" style="height: 120px;"></div>
						<div class="c-f12 c-999 div-data-value">
							<span class="c-f12 c-12b7f5">{{signRateData.completeAmount}}</span>/
							<span class="c-f12 c-333">{{signRateData.completeRateAll}}</span>
						</div>
					</div>
				</div>
			</div>
			  <div class="clearfix ">
                <ul class="l-banner">
                    <li class="active" >
                        <div class="tag" :class="{'active': index==9}" @click="changeTag(9)">
                            <div id="index_9" class="c-f18">{{topDatas['index_9']}}</div>
                            <div class="mt5 c-f14 l-name">待审核数</div>
                        </div>
                    </li>
                    <li>
                        <div class="tag" :class="{'active': index==10}" @click="changeTag(10)">
                            <div id="index_10" class="c-f18">{{topDatas['index_10']}}</div>
                            <div class="mt5 c-f14 l-name">改签人数</div>
                        </div>
                    </li>
                    <li>
                        <div class="tag" :class="{'active': index==2}" @click="changeTag(2)">
                            <div id="index_2" class="c-f18">{{topDatas['index_2']}}</div>
                            <div class="mt5 c-f14 l-name">退签人数</div>
                        </div>
                    </li>
                </ul>
            </div>
			<!-- 折线图 -->
			<line-chart v-on:getlinedata="getNewLineData" class="mlr8"></line-chart>
			<!-- 底部区域图 -->
@ -70,9 +65,8 @@
		<script src="../../component/statistics/line-chart.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/team-info.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/sign-progress-filter.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/common.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/sign-progress.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/change-back.js" type="text/javascript" charset="utf-8"></script>
	</body>
</html>

+ 3 - 1
app/statistics/comprehensive-analysis.html

@ -8,13 +8,14 @@
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
        <link rel="stylesheet" type="text/css" href="css/common.css"/>
    </head>
    <body>
        <div id="main">
        <div id="main" class="c-hide">
            <header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen" ></header-tab>
            <header-prompt></header-prompt>
            <div class="clearfix ">
@ -118,6 +119,7 @@
        <script src="../../component/common/vuedals.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-tab.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-prompt.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/year-filter.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/line-chart.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/team-info.js" type="text/javascript" charset="utf-8"></script>

+ 3 - 1
app/statistics/consulting-analysis.html

@ -8,13 +8,14 @@
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
        <link rel="stylesheet" type="text/css" href="css/common.css"/>
    </head>
    <body>
        <div id="main">
        <div id="main" class="c-hide">
            <header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen" ></header-tab>
            <header-prompt></header-prompt>
            <div class="clearfix ">
@ -68,6 +69,7 @@
        <script src="../../component/common/vuedals.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-tab.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-prompt.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/year-filter.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/team-info.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/common.js" type="text/javascript" charset="utf-8"></script>

+ 88 - 2
app/statistics/css/common.css

@ -235,7 +235,7 @@ ul {
@media only screen and (min-width: 414px) and (max-width: 640px) {
	.bottom-list-table tbody tr td.area-name {
		max-width: 200px;
		/*max-width: 200px;*/
	}
}
@ -604,7 +604,7 @@ ul {
	font-size: 12px;
	line-height: 24px;
	/*background: #EEEEEE;*/
	border: 1px solid #eee;
	border: 1px solid #e1e1e1;
	border-radius: 5px;
	white-space: nowrap;
	overflow: hidden;
@ -678,4 +678,90 @@ a {
	font-size: 16px !important;
	font-weight: bold !important;
	color: #333 !important;
}
.mod {
	background-color: #fff;
}
.mod .mod-hd {
	height: 33px;
	line-height: 33px;
	border-bottom: .05rem solid #e1e1e1;
	padding-left: .5rem;
	color: #323232;
}
.mod .mod-hd .title {
	font-size: .75rem;
}
.icon-cyc.sszql {
	background-image: url(../../../images/snashi_icon.png);
}
.icon-cyc {
	display: inline-block;
	vertical-align: middle;
	width: 22px;
	height: 22px;
	background: center no-repeat;
	background-size: auto 100%;
}
.icon-cyc.gwrq {
	background-image: url(../../../images/gaoweirenqun.png);
}
.div-ssqql canvas {
	width: 150px;
	height: 150px;
	margin-top: 20px;
}
.div-ssqql {
	height: 195px;
	position: relative;
	text-align: center;
	margin: 0 auto;
}
.p-sanshilv {
	position: absolute;
	top: 20px;
	left: 50%;
	font-size: 33px;
	color: #323232;
	width: 106px;
	margin-left: -53px;
}
.p-sanshicount {
	position: absolute;
	top: 90px;
	left: 50%;
	font-size: 15px;
	color: #323232;
	width: 116px;
	margin-left: -58px;
}
.p-gaoweilv {
	position: absolute;
	top: 20px;
	left: 50%;
	font-size: 33px;
	color: #323232;
	width: 106px;
	margin-left: -53px;
}
.p-gaoweicount {
	position: absolute;
	top: 90px;
	left: 50%;
	font-size: 15px;
	color: #323232;
	width: 116px;
	margin-left: -58px;
}

+ 62 - 6
app/statistics/estimate-analysis.html

@ -1,9 +1,65 @@
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>评价分析</title>
	</head>
	<body>
	</body>
    <head>
        <meta charset="UTF-8">
        <title>评价分析</title>
        <meta name="author" content="yihu.com" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
        <link rel="stylesheet" type="text/css" href="css/common.css"/>
        <style>
            .tag{
                width: 40%;
                margin: 0 auto;
                border: 1px solid #e1e1e1;
                padding: 15px 0;
                border-radius: 8px;
            }
        </style>
    </head>
    <body>
        <div id="main" class="c-hide">
            <header-tab :appname="appname" :isback="true" :isrefresh="true" :isfilter="false" :isopen="true" ></header-tab>
            <header-prompt></header-prompt>
            <div class="c-t-center mt20">
                <div class="tag">
                    <div class="c-f16 c-bold c-333">{{avg || '暂无评分'}}</div>
                    <div class="c-f14 c-666 mt5">平均评分</div>
                </div>
            </div>
            <div class="mt20 c-border">
                <div class="plr10 ptb10 c-border-b">
                    <span class="c-f14 c-333 ml5">平均评分</span>
                </div>
                <div id="lineChart" style="height: 200px; width: 100%;"></div>
            </div>
            <!-- 底部区域图 -->
            <area-data-panel class="mt20" v-on:getnewdata="getAreaData"></area-data-panel>
            <!--模态框组件-->
            <vuedals></vuedals>
        </div>
        
        <script src="../../js/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/jquery-2.2.4.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/util.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/echarts/3.8.5/echarts.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../api/http-request.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../api/statistics-api.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/common/event-bus.js"></script>
        <script src="../../component/common/vuedals.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-tab.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-prompt.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/team-info.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/common.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/estimate-analysis.js" type="text/javascript" charset="utf-8"></script>
    </body>
</html>

+ 44 - 4
app/statistics/home.html

@ -8,14 +8,16 @@
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="stylesheet" type="text/css" href="../../fonts/font-awesome/css/font-awesome.min.css"/>
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/bootstrap.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../plugins/artDialog/6.0.5/api/css/ui-dialog.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
        <link rel="stylesheet" type="text/css" href="css/common.css"/>
    </head>
    <body>
        <div id="main">
        <div id="main" class="c-hide">
            <div class="div-header">
                <div class="fl">
                    <div class="application-name">统计分析</div>
@ -30,8 +32,44 @@
                    <img v-show="isopen" @click="open" src="../../images/zhankai_icon.png" width="18" height="18" />
                </div>
            </div>
            <!-- -->
            
            <!-- 饼图 -->
            <div class="mt10 mb30">
                <div class="c-row">
                    <div class="c-33 c-t-center c-position-r" @click="goToPage(1)">
                        <div class="div-radius-panel">
                            <div class="c-f16 c-12b7f5 mt15">{{signRateData.sign.text}}</div>
                            <div class="c-f14 c-666">签约率</div>
                        </div>
                        <div id="signMain" class="c-100 height-120"></div>
                        <div class="c-f12 c-999 div-data-value">
                            <span class="c-f12 c-12b7f5 qianyuelv">{{signRateData.sign.sign}}</span>/
                            <span class="c-f12 c-333 qianyuezong">{{signRateData.sign.people}}</span>
                        </div>
                    </div>
                    <div class="c-33 c-t-center c-position-r" @click="goToPage(1)">
                        <div class="div-radius-panel">
                            <div class="c-f16 c-12b7f5 mt15">{{signRateData.signTask.text}}</div>
                            <div class="c-f14 c-666">完成率</div>
                        </div>
                        <div id="completeMain" class="c-100" style="height: 120px;"></div>
                        <div class="c-f12 c-999 div-data-value">
                            <span class="c-f12 c-12b7f5">{{signRateData.signTask.sign}}</span>/
                            <span class="c-f12 c-333">{{signRateData.signTask.people}}</span>
                        </div>
                    </div>
                    <div class="c-33 c-t-center c-position-r" @click="goToPage(2)">
                        <div class="div-radius-panel">
                            <div class="c-f16 c-12b7f5 mt15">{{signRateData.renew.text}}</div>
                            <div class="c-f14 c-666">续签率</div>
                        </div>
                        <div id="renewMain" class="c-100" style="height: 120px;"></div>
                        <div class="c-f12 c-999 div-data-value">
                            <span class="c-f12 c-12b7f5">{{signRateData.renew.sign}}</span>/
                            <span class="c-f12 c-333">{{signRateData.renew.people}}</span>
                        </div>
                    </div>
                </div>
            </div>
            <!--签约分析-->
            <div class="mt10">
                <div class="section-header plr10">
@ -67,6 +105,8 @@
        <script src="../../js/jquery-2.2.4.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../js/util.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/artDialog/6.0.5/api/js/dialog-plus.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../plugins/echarts/3.8.5/echarts.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../api/http-request.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../api/statistics-api.js" type="text/javascript" charset="utf-8"></script>

+ 331 - 0
app/statistics/js/change-back.js

@ -0,0 +1,331 @@
var reqList = []; //记录请求的参数和url,用于后退时使用
Vue.use(Vuedals.default);
new Vue({
	el: "#main",
	data: {
		appname: "退改签",
		isback: true,
		isrefresh: true,
		isfilter: false,
		isopen: false,
		//请求页面所需参数
		level: '',
		area: '',
		areaTitle: '',
		index: '9',
		selectedDateType: 1, //折线图坐标值1-日,2-周,3-月
		endDate: '',
		startDate: '',
		lowLevel: '',
		chooseYear: '',
		userRole: '',
		//数据结果
		topDatas: {
			index_2: 0,
			index_9: 0,
			index_10: 0
		}
	},
	components: {
		vuedals: Vuedals.Component
	},
	methods: {
		changeTag: function(val) {
			this.index = val;
			loadData([1, 2], this);
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				date:this.endDate,
				endDate: this.endDate,
				startDate: this.startDate,
				lowLevel: this.lowLevel
			})
		},
		getNewLineData: function(arg) {
			this.selectedDateType = arg.dateType;
			loadData([1], this);
		},
		getAreaData: function(arg) {
			//如果level改变,则需要重新加载整个页面的数据,否则只需加载底部区域数据
			if(arg.level == this.level) {
				this.lowLevel = arg.lowLevel;
				loadData([2], this);
			} else {
				this.level = arg.level;
				this.lowLevel = arg.lowLevel;
				this.area = arg.area;
				loadData([0, 1, 2], this);
			}
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				endDate: this.endDate,
				startDate: this.startDate,
				lowLevel: this.lowLevel,
			})
		}
	},
	mounted: function() {
		//初始化数据
		initData(this);
		//获得顶部各tab的值
		loadData([0, 1, 2], this); //参数组数表示请求的区域为上中下
		//存储请求所带的参数
		reqList.push({
			level: this.level,
			area: this.area,
			areaTitle: this.areaTitle,
			index: this.index,
			endDate: this.endDate,
			startDate: this.startDate,
			lowLevel: this.lowLevel
		});
		//设置监听器, 监听折线图日期变化
		var vm = this;
		//监听后退按钮的操作
		EventBus.$on("back-click", function(arg) {
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			if(reqList.length == 1) {
				history.go(-1);
			} else {
				var preInfo = reqList.pop();
				var info = reqList[reqList.length - 1];
				vm.level = info.level;
				vm.area = info.area;
				vm.areaTitle = info.areaTitle;
				vm.lowLevel = info.lowLevel;
				vm.index = info.index;
				loadData([0, 1, 2], vm);
			}
		});
		//监听页面刷新
		EventBus.$on("refresh-click", function(arg) {
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			loadData([0, 1, 2], vm);
		});
		$("#main").removeClass("c-hide");
	}
})
function initData(vm) {
	//获得缓存中缓存的角色权限
	var userRole = window.localStorage.getItem("selectedRole");
	if(!userRole) {
		return false;
	}
	vm.userRole = JSON.parse(userRole);
	vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
	vm.area = vm.userRole.code;
	vm.areaTitle = vm.userRole.name;
	var now = new Date();
	if(now.getMonth() >= 6) {
		vm.chooseYear = now.getFullYear();
	} else {
		vm.chooseYear = now.getFullYear() - 1;
	}
	vm.startDate = getStartDate(vm.chooseYear);
	vm.endDate = getEndDate(vm.chooseYear);
	//更新头部信息
	EventBus.$emit('update-all-prompt-info', {
		areaName: vm.areaTitle,
		selectDate: "",
		dimensionVal: vm.analysisName
	});
}
function getTopReqParams(index1, vm) {
	var url = "/statistics/index_all",
		data = {
			index: index1,
			level: vm.level,
			area: vm.area,
			startDate: vm.startDate,
			endDate: vm.endDate
		};
	return {
		url: url,
		data: data
	};
}
function getTopTagDatas(vm) {
	var reqs = [],
		indexs = ['2', '9', '10'];
	for(i = 0; i < indexs.length; i++) {
		var item = getTopReqParams(indexs[i], vm);
		reqs.push(httpRequest.get(item.url, {
			data: item.data
		}));
	}
	Promise.all(reqs).then(function(ress) {
		for(i = 0; i < ress.length; i++) {
			var res = ress[i];
			if(res.status == 200) {
				for(key in res.data) {
					vm.topDatas[key] = res.data[key];
				}
			} else {
				console.log(res.msg);
			}
		}
	})
}
function initReqParams(vm) {
	reqParam = [{
		url: "/statistics/interval_total",
		reqType: 'get',
		data: {
			index: vm.index,
			level: vm.level,
			area: vm.area,
			startDate: vm.startDate,
			endDate: vm.endDate,
			interval: vm.selectedDateType
		}
	}, {
		url: "/statistics/lowlevel_all",
		reqType: 'get',
		data: {
			sort: 1,
			date: vm.endDate,
			level: vm.level,
			index: vm.index,
			area: vm.area
		}
	}];
	if(vm.lowLevel) {
		reqParam[1].data.lowLevel = vm.lowLevel;
	}
	return reqParam;
}
function loadData(loadArr, vm) {
	if(loadArr.indexOf(0) > -1) {
		getTopTagDatas(vm);
	}
	//获取其他请求的参数
	var reqParams = initReqParams(vm),
		reqPromise = [],
		newArr = []; //记录非顶部请求的请求数组
	for(i = 0; i < loadArr.length; i++) {
		if(loadArr[i] == 0) {
			// do nothing
		} else {
			var j = loadArr[i] - 1;
			var param = reqParams[j];
			reqPromise.push(httpRequest.get(param.url, {
				data: param.data
			}));
			newArr.push(loadArr[i]);
		}
	}
	if(reqPromise.length > 0) {
		Promise.all(reqPromise).then(function(ress) {
			var res1 = [],
			res2 = [];
			if(ress.length==2){
				res1 = ress[0] || [],
				res2 = ress[1] || [];
			}
			if(loadArr[0]==1){//点击日周月
				res1 = ress[0] || [];
			}
			if(loadArr[0]==2){//点击区、社区
				res2 = ress[0] || [];
			}
			if(res1 && res1.status == 200) {
				handleSecondPanelData(res1.data, vm);
			}
			if(res2) {
				if(res2.status == 200) {
					listHandle(res2.data, vm);
				} else {
					console.log(res2.msg);
				}
			}
		})
	}
}
function handleSecondPanelData(data, vm) {
	var xDatas = [],
		yDatas = [],
		names = [],
		colors = ['#12b7f5'],
		labels = {
			'2': '退签人数新增趋势',
			'9': '待审核数新增趋势',
			'10': '改签人数新增趋势'
		},
		index_names = {
			'index_2': '退签人数',
			'index_9': '待审核数',
			'index_10': '改签人数'
		};
	for(var p in data) {
		names.push(index_names[p]);
		var xData = _.map(data[p].data, function(o) {
			return o.range;
		});
		var yData = _.map(data[p].data, function(o) {
			return o.amount;
		});
		xDatas.push(xData);
		yDatas.push(yData);
	}
	EventBus.$emit("draw-line-chart", {
		panelName: labels[vm.index],
		quotaNames: names,
		xData: xDatas[0],
		yDatas: yDatas,
		colors: colors
	});
}
function listHandle(data, vm) {
	for(i in data) {
		var list = data[i];
		var topArr = [];
		topArr = soreRank(getKeyValueArr(list, 'amount'));
		var arr = _.map(list, function(o, index) {
			var cols = [o.name];
			cols.push(o.amount);
			return {
				rank: topArr[index],
				code: o.code,
				name: o.name,
				cols: cols
			}
		});
		var headers = {
			'2': ["排名", "退签人数"],
			'9': ["排名", "待审核数"],
			'10': ["排名", "改签人数"]
		};
		EventBus.$emit("render-area-data", {
			level: vm.level,
			area: vm.area,
			lowLevel: vm.lowLevel,
			headers: headers[vm.index],
			rows: arr
		});
	}
}

+ 20 - 1
app/statistics/js/common.js

@ -18,6 +18,21 @@ function getEndDate(chooseYear){
    }
}
/**
 * 获取多少天前的日期
 */
function getDateBefore(days) {
	var now = new Date();
	var date = new Date(now.getTime() - days * 24 * 3600 * 1000);
	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var day = date.getDate();
	var hour = date.getHours();
	var minute = date.getMinutes();
	var second = date.getSeconds();
	return year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
}
/*
 * 获取用来排序的字段值,返回数组
 * 参数: list - 列表, key - 字段的名称 
@ -52,8 +67,9 @@ function soreRank(arr){
 * 绘制饼图
 * arry [{name: '', value: ''}]
 * color ['#ffc800', '#17b3ec']
 * silent 图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件
 */
function drawPieChart(elId, arry, color){
function drawPieChart(elId, arry, color, silent){
    var myChart = echarts.init(document.getElementById(elId));
    var option = {
        tooltip: {
@ -70,6 +86,7 @@ function drawPieChart(elId, arry, color){
            legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
            silent: silent,
            label: {
                normal: {
                    show: false,
@ -88,6 +105,7 @@ function drawPieChart(elId, arry, color){
    };
    $("#"+elId).removeAttr("_echarts_instance_");
    myChart.setOption(option);
    return myChart;
}
/**
@ -148,4 +166,5 @@ function drawBarChart(el, xData, yData, color, name){
    
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
    return myChart;
}

+ 81 - 6
app/statistics/js/comprehensive-analysis.js

@ -1,4 +1,6 @@
var reqList = []; //记录请求的参数和url,用于后退时使用
var pieChart1,
    pieChart2; //全局设置饼图的对象,window.resize时,触发chart的resize方法
Vue.use(Vuedals.default);
new Vue({
    el: "#main",
@ -80,7 +82,8 @@ new Vue({
                index: this.index,
                endDate: this.endDate,
                startDate: this.startDate,
                lowLevel: this.lowLevel
                lowLevel: this.lowLevel,
                selectedDateType: this.selectedDateType
            })
        }
    },
@ -99,7 +102,8 @@ new Vue({
            index: this.index,
            endDate: this.endDate,
            startDate: this.startDate,
            lowLevel: this.lowLevel
            lowLevel: this.lowLevel,
            selectedDateType: this.selectedDateType
        });
        
        //设置监听器, 监听折线图日期变化
@ -119,12 +123,66 @@ new Vue({
                vm.index = info.index;
                
                loadData([0,1,2], vm);
                EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
            }
        });
        //监听页面刷新
        EventBus.$on("refresh-click", function(arg){
            loadData([0,1,2], vm);
        });
        //弹出筛选框
        EventBus.$on('filter-click', function(arg) {
            //弹框显示筛选条件
            Vuedals.Bus.$emit('new', {
                title: '条件筛选',
                onClose:function(data){
                    vm.chooseYear = data.chooseYear;
                    vm.startDate = getStartDate(vm.chooseYear);
                    vm.endDate = getEndDate(vm.chooseYear);
                    
                    //请求参数重置,页面类型重新开始
                    vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
                    vm.area = vm.userRole.code;
                    vm.areaTitle = vm.userRole.name;
                    EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
                    vm.selectedDateType = 1;
                    
                    //然后清空请求列表数组
                    reqList.splice(0, reqList.length);
                    
                    loadData([0, 1, 2], vm);//刷新数据
                    
                    //存储请求所带的参数
                    reqList.push({
                        level: vm.level,
                        area: vm.area,
                        areaTitle: vm.areaTitle,
                        index: vm.index,
                        endDate: vm.endDate,
                        startDate: vm.startDate,
                        lowLevel: vm.lowLevel,
                        selectedDateType: vm.selectedDateType
                    });
                    
                    EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});//更新年份
                    EventBus.$emit('update-statistics-time', {});//更新统计时间
                },
                component: 'year-filter',
                props: {
                    selectedYear: vm.chooseYear
                }
            });
        });
        $("#main").removeClass("c-hide");
        window.onresize = function() {
            if(pieChart1){
                pieChart1.resize();
            }
            if(pieChart2){
                pieChart2.resize();
            }
            window.lineCharts.resize(); //日周月折线图
        }
    }
})
@ -149,6 +207,7 @@ function initData(vm){
    
    vm.startDate = getStartDate(vm.chooseYear);
    vm.endDate = getEndDate(vm.chooseYear);
    EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});
}
function initReqParams(vm){
@ -298,8 +357,7 @@ function loadData(loadArr, vm){
                            name: '健康指导',
                            value: vm.topDatas.index_5
                        }];
                        debugger
                        drawPieChart('pieChart', arr, ['#ffc800', '#17b3ec']);
                        pieChart2 = drawPieChart('pieChart', arr, ['#ffc800', '#17b3ec']);
                    }
                }else{
                   console.log(res2.msg);
@ -357,7 +415,8 @@ function handleSecondPanelData(data, vm){
        quotaNames : names,
        xData : xDatas[0],
        yDatas : yDatas,
        colors : colors
        colors : colors,
        selectedDateType: vm.selectedDateType
    });
}
@ -367,6 +426,8 @@ function listHandle(data, vm){
        var topArr = [];
        if(vm.index == "21"){
            topArr = soreRank(getKeyValueArr(list, 'bindRate'));
        }else if(vm.index == '3'){
            topArr = soreRank(getKeyValueArr2(list, 'amount'));
        }else{
            topArr = soreRank(getKeyValueArr(list, 'amount'));
        }
@ -435,5 +496,19 @@ function handleWXBindData(data, vm){
        name: '未缴费人数',
        value: data.weChatAmount0
    }];
    drawPieChart('pieChart2', arr, ['#17b3ec', '#909090']);
    pieChart1 = drawPieChart('pieChart2', arr, ['#17b3ec', '#909090']);
}
/*
 * 获取用来排序的字段值,返回数组
 * 参数: list - 列表, key - 字段的名称 
 */
function getKeyValueArr2(list, key){
    var arr = [];
    for(var k in list){
        var item = list[k][key].split(",");
        arr.push(item[0]);
    }
    
    return arr;
}

+ 27 - 2
app/statistics/js/consulting-analysis.js

@ -83,12 +83,34 @@ new Vue({
                vm.index = info.index;
                
                loadData([0,1,2], vm);
                EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
            }
        });
        //监听页面刷新
        EventBus.$on("refresh-click", function(arg){
            loadData([0,1,2], vm);
        });
        //弹出筛选框
        EventBus.$on('filter-click', function(arg) {
            //弹框显示筛选条件
            Vuedals.Bus.$emit('new', {
                title: '条件筛选',
                onClose:function(data){
                    console.log(data);
                    vm.chooseYear = data.chooseYear;
                    vm.endDate = getEndDate(vm.chooseYear);
                    
                    loadData([0, 1, 2], vm);//刷新数据
                    EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});//更新年份
                    EventBus.$emit('update-statistics-time', {});//更新统计时间
                },
                component: 'year-filter',
                props: {
                    selectedYear: vm.chooseYear
                }
            });
        });
        $("#main").removeClass("c-hide");
    }
});
@ -111,6 +133,7 @@ function initData(vm){
        vm.chooseYear = now.getFullYear() - 1;
    }
    vm.endDate = getEndDate(vm.chooseYear);
    EventBus.$emit('update-statistics-year', {selectDate: vm.chooseYear + "年"});
}
function initReqParams(vm){
@ -183,7 +206,6 @@ function loadData(loadArr, vm){
function handleTopPanelData(data, vm){
    var obj = data.result[0];
    console.log(obj);
    vm.topDatas = {
        total: obj.total,
        noRelyCount: obj.noRelyCount,
@ -206,7 +228,7 @@ function handleSecondPanelData(data, vm){
function listHandle(data, vm){
    var list = data.resultList;
    var topArr = soreRank(getKeyValueArr(list, 'relyDoubleRate'));
    var topArr = soreRank(getKeyValueArr(list, 'noRelyDoubleRate'));
    var arr = _.map(list, function(o, index){
        var cols = [o.name, o.total, o.noRelyCount, o.noRelyRate];
        return {
@ -308,4 +330,7 @@ function drawBarChart(xData, yData) {
    };
    myChart.clear();
    myChart.setOption(options);
    window.onresize = function() {
        myChart.resize();
    }
}

+ 314 - 0
app/statistics/js/estimate-analysis.js

@ -0,0 +1,314 @@
var reqList = [];
new Vue({
    el: "#main",
    data: {
        appname: "评价分析",
         //页面请求参数
        index: 28,
        level: '',
        area: '',
        startDate: '',
        endDate: '',
        avg: 0
    },
    components: {
        vuedals: Vuedals.Component
    },
    methods: {
        getAreaData: function(arg){
            //如果level改变,则需要重新加载整个页面的数据,否则只需加载底部区域数据
            if(arg.level == this.level){
                this.lowLevel = arg.lowLevel;
                loadData([2], this);
            }else{
                this.level = arg.level;
                this.lowLevel = arg.lowLevel;
                this.area = arg.area;
                this.areaTitle = arg.areaTitle;
                loadData([0,1,2], this);
            }
            EventBus.$emit('update-area-name', {areaName: this.areaTitle});
            //存储请求所带的参数
            reqList.push({
                level: this.level,
                area: this.area,
                areaTitle: this.areaTitle,
                index: this.index,
                endDate: this.endDate,
                startDate: this.startDate,
                lowLevel: this.lowLevel
            })
        }
    },
    mounted: function(){
        //初始化数据
        initData(this);
        
        //获得顶部各tab的值
        loadData([0,1,2], this); //参数组数表示请求的区域为上中下
        
        //存储请求所带的参数
        reqList.push({
            level: this.level,
            area: this.area,
            areaTitle: this.areaTitle,
            index: this.index,
            endDate: this.endDate,
            startDate: this.startDate,
            lowLevel: this.lowLevel
        });
        
        //设置监听器, 监听折线图日期变化
        var vm = this;
        //监听后退按钮的操作
        EventBus.$on("back-click", function(arg){
            if(reqList.length == 1){
                history.go(-1);
            } 
            else{
                var preInfo = reqList.pop();
                var info = reqList[reqList.length - 1];
                vm.level = info.level;
                vm.area = info.area;
                vm.areaTitle = info.areaTitle;
                vm.lowLevel = info.lowLevel;
                vm.index = info.index;
                
                loadData([0,1,2], vm);
                EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
            }
        });
        //监听页面刷新
        EventBus.$on("refresh-click", function(arg){
            loadData([0,1,2], vm);
        });
        $("#main").removeClass("c-hide")
    }
});
function initData(vm){
    //获得缓存中缓存的角色权限
    var userRole = window.localStorage.getItem("selectedRole");
    if(!userRole){
        return false;
    }
    vm.userRole = JSON.parse(userRole);
    vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
    vm.area = vm.userRole.code;
    vm.areaTitle = vm.userRole.name;
    EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
    
    var now = new Date();
   
    vm.endDate = now.format("yyyy-M-dd");
    vm.startDate = "2017-01-01"; //评价功能是2017年才上线的
}
function initReqParams(vm){
    var param = [{
        url: "/statistics/getAVGSocre",
        data: {level: vm.level, area: vm.area}
    },{
        url: "/statistics/getAVGSocreByMonth",
        data: {level: vm.level, area: vm.area, statDate: vm.startDate, endDate: vm.endDate}
    },{
        url: "/statistics/lowlevel_all",
        data: {level: vm.level, area: vm.area, index: vm.index, sort: 1, date: vm.endDate, lowLevel: vm.lowLevel}
    }];
    
    return param;
}
function loadData(loadArr, vm){
    //获取其他请求的参数
    var reqParams = initReqParams(vm),
        reqPromise = [],
        sendPanelReq = [];
    
    for(i=0; i< loadArr.length; i++){
        var j = loadArr[i];
        var param = reqParams[j];
        if(j == 1){
            sendPanelReq.push(param);
        }else{
            reqPromise.push(httpRequest.get(param.url, {data: param.data}));
        }
    }
    
    //因为中间区域的请求时间较长,所以另外放出来处理
    if(sendPanelReq.length > 0){
        //删除loadArr里的1
        var index = loadArr.indexOf(1);
        loadArr.splice(index, 1);
        statisticAPI.getAVGSocreByMonth(sendPanelReq[0].data).then(function(res){
            if(res.status == 200){
                handleSecondPanelData(res.data, vm);
            }else{
                console.log(res.msg);
            }
        });
    }
    if(reqPromise.length > 0){
        Promise.all(reqPromise).then(function(ress){
            var res1, res2, res3;
            for(var i=0; i<loadArr.length; i++){
                var j = loadArr[i] + 1;
                if(j == 1){
                    res1 = ress[i];
                }
                
                if(j == 3){
                    res3 = ress[i];
                }
                
            }
            if(res1){
                if(res1.status == 200){
                    vm.avg = res1.data.rs.avgCount;
                }else{
                    console.log(res1.msg);
                }
            }
//          if(res2){
//              if(res2.status == 200){
//                  handleSecondPanelData(res2.data, vm);
//              }else{
//                 console.log(res2.msg);
//              }
//              
//          }
            if(res3){
                if(res3.status == 200){
                    listHandle(res3.data, vm);
                }else{
                    console.log(res3.msg);
                }
            }
        })
    }
}
function handleSecondPanelData(data, vm){
    var xData = [],
        yData = [];
    for(i=0; i<data.length; i++){
        var item = data[i];
        xData.push(item.month);
        yData.push(item.socre);
    }
    drawLine(xData, yData, '平均评分', '#12b7f5');
}
function listHandle(data, vm){
    for(i in data){
        var data2 = JSON.parse(data[i]);
        var list = data2.data;
        var topArr = soreRank(getKeyValueArr(list, 'avgCount'));
        var arr = _.map(list, function(o, index){
            var cols = [o.name, o.avgCount || '暂无评分'];
            return {
                rank: topArr[index],
                code: o.code,
                name: o.name,
                cols: cols
            }
        });
        
        EventBus.$emit("render-area-data",{
            level: vm.level,
            area: vm.area,
            lowLevel: vm.lowLevel,
            headers: ["排名", "平均评分"],
            rows: arr,
            cityLevelNoShowTeamTab: true,
            districtLevelNoShowTeamTab: true
        });
    }
}
function drawLine(xData, yData, name, color){
    var lineCharts = echarts.init(document.getElementById('lineChart'));
    
    //处理数据, 数据按照10条数一屏展示
    var lastIndex = xData.length % 10;
    if(xData.length >10 ){  
        dataZoom_end = 100-(9/xData.length)*100;  
    }else{  
        dataZoom_end = 0;
    }
    
    var options = {
        tooltip: {
            trigger: 'axis'
        },
        legend: {
            top: '0px',
            data: [name],
            borderColor: "#f1f1f1"
        },
        grid: {
            show: false,
            left: '10px',
            right: '30px',
            bottom: '40px',
            top: '20px',
            containLabel: true
        },
        xAxis: {
            type: 'category',
            boundaryGap: false,
            data: xData,
            axisLabel: {
                interval:0,//横轴信息全部显示  
                formatter: function (value, index) {
                    return value+"月";
                }
            }
        },
        yAxis: {
            type: 'value',
            axisPointer: {
                snap: true
            },
            scale: true,
            minInterval: 1,
            boundaryGap: ['10%', '30%'],
            splitLine: {show:false}
        },
        dataZoom: [{//给x轴设置滚动条  
            start: dataZoom_end,
            end: 100,
            type: 'slider',
            zoomLock: true,
            showDetail: false
        },{ //下面这个属性是内容区域配置
            start: dataZoom_end,
            end: 100,
            type: 'inside',
            zoomLock: true,
        }],
        series: [{
            name: name,
            type: 'line',
            smooth: true,
            data: yData,
//          color: color,
            lineStyle:{
                normal:{
                    color: color
                }
            },
            itemStyle: {
                normal: {
                    color: color
                }
            }
        }]
    };
    
    $("#lineChart").removeAttr('_echarts_instance_')
    lineCharts.setOption(options);
    window.onresize = function(){
        lineCharts.resize();
    }
}

+ 101 - 26
app/statistics/js/home.js

@ -1,28 +1,7 @@
new Vue({
	el: '#main',
	data: {
		roles: [{
			"code": "350205",
			"level": "3",
			"name": "海沧区",
			"isManage": "1",
			"authOperate": "1",
			"areas": "350205"
		}, {
			"code": "350200",
			"level": "2",
			"name": "厦门市卫生与计划生育委员会",
			"isManage": "1",
			"authOperate": "1",
			"areas": "350200"
		}, {
			"code": "3502050100",
			"level": "4",
			"name": "海沧区嵩屿街道社区卫生服务中心",
			"isManage": "1",
			"authOperate": "1",
			"areas": "3502050100"
		}],
		roles: [],
		selectedRole: "",
		isopen: true,
		signAnalysis: [{
@ -57,12 +36,32 @@ new Vue({
		}, {
			photo: '../../images/pijianfenxi_icon.png',
			label: '评价分析',
			url: 'resident-analysis.html'
			url: 'estimate-analysis.html'
		}, {
			photo: '../../images/changcufangfenxi_icon.png',
			label: '长处方分析',
			url: 'prescription-analysis.html'
		}]
		}],
		signRateData: {
		    signTask: {
		        text: '',
		        rate: '0.00',
		        sign: 0,
		        people: 0
		    },
		    sign: {
		        text: '',
		        rate: '0.00',
		        sign: 0,
		        people: 0
		    },
		    renew: {
		        text: '',
		        rate: '0.00',
		        sign: 0,
		        people: 0
		    }
		}
	},
	methods: {
		open: function() {
@ -70,17 +69,28 @@ new Vue({
		},
		showDetail: function(url) {
			window.location.href = url;
		},
		goToPage: function(val){
		    var url = "sign-progress.html";
		    if(val == 2){
		        url = "renew-progress.html";
		    }
		    window.location.href = url;
		}
	},
	mounted: function() {
	    //获取缓存里面的userRole
	    var roles = window.localStorage.getItem("userRole");
	    this.roles = JSON.parse(roles);
		var selected = window.localStorage.getItem("selectedRole");
		if(selected) {
		if(selected && selected!= "undefined") {
			this.selectedRole = JSON.parse(selected).code;
		} else {
			this.selectedRole = this.roles[0].code;
			var selected = this.roles[0];
			window.localStorage.setItem("selectedRole", JSON.stringify(selected));
		}
		$("#main").removeClass("c-hide")
	},
	watch: {
		selectedRole: function(val) {
@ -88,6 +98,71 @@ new Vue({
				code: val
			});
			window.localStorage.setItem("selectedRole", JSON.stringify(selected));
		    getSignData(this);
		}
	}
})
})
function getSignData(vm){
    var code = vm.selectedRole,
        now = new Date(),
        params = {
            area: code,
            level: code == '350200' ? 4 : code.length == 6 ? 3 : 2,
            endDate: now.format("yyyy-MM-dd")
        };
    statisticAPI.getSignInfo(params).then(function(res){
        if(res.status == 200){
            var data = res.data;
            vm.signRateData = {
                signTask: {
                    text: formatRate(data.signTaskRate.rate),
                    rate: '0.00',
                    sign: data.signTaskRate.sign,
                    people: data.signTaskRate.people
                },
                sign: {
                    text: formatRate(data.signRate.rate),
                    rate: '0.00',
                    sign: data.signRate.sign,
                    people: data.signRate.people
                },
                renew: {
                    text: data.renewRange,
                    rate: '0.00',
                    sign: data.renew.split("/")[0],
                    people: data.renew.split("/")[1]
                }
            }
            var signArr = [
                    {name: "签约数", value: data.signRate.sign},
                    {name: "未签约数", value: data.signRate.people - data.signRate.sign},
                ],
                signTaskArr = [
                    {name: "签约数", value: data.signTaskRate.sign},
                    {name: "未达标数", value: data.signTaskRate.people - data.signTaskRate.sign}
                ],
                val = data.renew.split("/")[1] - data.renew.split("/")[0],
                renewArr = [
                    {name: "续签数", value: data.renew.split("/")[0]},
                    {name: "未达标数", value: val<0 ? 0 : val}
                ],
                color = ['#12b7f5', '#EBEBF5'];
            var signChart = drawPieChart("signMain", signArr, color, true);
            var completeChart = drawPieChart("completeMain", signTaskArr, color, true);
            var renewChart = drawPieChart("renewMain", renewArr, color, true);
            window.onresize = function() {
                signChart.resize();
                completeChart.resize();
                renewChart.resize();
            }
        }else{
            console.log(res.msg);
        }
    })
}
function formatRate(str){
    var val = parseFloat(str);
    return val.toFixed(2)+"%";
}

+ 87 - 11
app/statistics/js/prescription-analysis.js

@ -1,9 +1,11 @@
var reqList = [];
var agePie,
    ageBar;
Vue.use(Vuedals.default);
new Vue({
    el: "#main",
    data: {
        appname: "长处分分析",
        appname: "长处方分析",
        isback: true,
        isrefresh: true,
        isfilter: true,
@ -18,8 +20,10 @@ new Vue({
        startDate: "",
        endDate: "",
        tagCode: 1, //顶部各个tag标签对应的值
        sumType: 4, //记录从筛选页面选择的统计维度 1-订单统计,2-费用统计,3-配送统计,4-年龄统计
        sumType: 1, //记录从筛选页面选择的统计维度 1-订单统计,2-费用统计,3-配送统计,4-年龄统计
        sumTypeName: "订单统计",
        disease: "", //疾病类型
        diseaseName: "全部",
        orderTagDatas: {
            total: 0,
            finishCount: 0,
@ -65,7 +69,8 @@ new Vue({
            lowLevel: this.lowLevel,
            tagCode: this.tagCode,
            sumType: this.sumType,
            disease: this.disease
            disease: this.disease,
            dateType: this.dateType
        });
        
        //设置监听器, 监听折线图日期变化
@ -85,14 +90,79 @@ new Vue({
                vm.tagCode = info.tagCode;
                vm.sumType = info.sumType;
                vm.disease = info.disease;
                vm.dateType = info.dateType;
                
                loadData([0,1,2], vm);
                EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
            }
        });
        //监听页面刷新
        EventBus.$on("refresh-click", function(arg){
            loadData([0,1,2], vm);
        });
        //弹出筛选框
        EventBus.$on('filter-click', function(arg) {
            //弹框显示筛选条件
            Vuedals.Bus.$emit('new', {
                title: '条件筛选',
                onClose:function(data){
                    vm.sumType = data.sumType;
                    vm.sumTypeName = data.sumTypeName;
                    vm.disease = data.disease;
                    vm.diseaseName = data.diseaseName;
                    
                    //将参数职位初始值
                    vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
                    vm.lowLevel = vm.level - 1;
                    vm.area = vm.userRole.code;
                    vm.areaTitle = vm.userRole.name;
                    vm.dateType = 1;
                    vm.tagCode = 1;
                    EventBus.$emit('update-area-name', {areaName: vm.areaTitle});
                    
                    //然后清空请求列表数组
                    reqList.splice(0, reqList.length);
                    
                    loadData([0, 1, 2], vm);//刷新数据
                    //存储请求所带的参数
                    reqList.push({
                        level: vm.level,
                        area: vm.area,
                        areaTitle: vm.areaTitle,
                        endDate: vm.endDate,
                        startDate: vm.startDate,
                        lowLevel: vm.lowLevel,
                        tagCode: vm.tagCode,
                        sumType: vm.sumType,
                        disease: vm.disease,
                        dateType: vm.dateType
                    });
                    EventBus.$emit('update-statistics-year',{selectDate: vm.sumTypeName} );//显示统计维度的名称
                    EventBus.$emit('update-dimension-name', {dimensionVal: vm.diseaseName});//显示疾病类型的名称
                    EventBus.$emit('update-statistics-time', {});//更新统计时间
                },
                component: 'prescription-filter',
                props: {
                    sumType: vm.sumType,
                    disease: vm.disease
                }
            });
        });
        $("#main").removeClass("c-hide");
        window.onresize = function() {
            if(agePie){
                agePie.resize();
            }
            if(ageBar){
                ageBar.resize();
            }
            if(window.lineCharts){
                window.lineCharts.resize(); //日周月折线图
            }
            if(window.barCharts){
                window.barCharts.resize(); //日周月折线图
            }
        }
    },
    methods: {
        changeTagCode: function(val){
@ -114,6 +184,7 @@ new Vue({
                tagCode: this.tagCode,
                sumType: this.sumType,
                disease: this.disease,
                dateType: this.dateType
            })
        },
        getBarData: function(arg){
@ -169,6 +240,9 @@ function initData(vm){
    
    var now = new Date();
    vm.endDate = now.format("yyyy-MM-dd");
    
    EventBus.$emit('update-statistics-year',{selectDate: vm.sumTypeName} );//显示统计维度的名称
    EventBus.$emit('update-dimension-name', {dimensionVal: vm.diseaseName});//显示疾病类型的名称
}
function initReqParams(vm){
@ -310,8 +384,8 @@ function handleTopPanelData(data, vm){
        case 3:
            vm.expressData = {
                self: data.seltTotal,
                doctor: data.deliveryTotal,
                delivery: data.doctorTotal
                doctor: data.doctorTotal,
                delivery: data.deliveryTotal
            }
            break;
        case 4:
@ -323,7 +397,7 @@ function handleTopPanelData(data, vm){
                vm.ageDatas[i].value = data[objName[i]];
            }
            //绘制饼图
            drawPieChart("agePie", vm.ageDatas, color);
            agePie = drawPieChart("agePie", vm.ageDatas, color);
    }
}
@ -351,7 +425,8 @@ function handleSecondPanelData(data, vm){
                yData: seriesData,
                quotaName: names[vm.tagCode - 1],
                color: color,
                unit: "笔"
                unit: "笔",
                selectedDateType: vm.dateType
            });
            break;
        case 2:
@ -372,7 +447,8 @@ function handleSecondPanelData(data, vm){
                xData : xData,
                yDatas : yDatas,
                colors : colors,
                unit: "元"
                unit: "元",
                selectedDateType: vm.dateType
            });
            break;
        case 4: 
@ -381,10 +457,10 @@ function handleSecondPanelData(data, vm){
                fieldName = ['0ageRate', '7ageRate', '19ageRate', '31ageRate', '51ageRate', '65ageRate']
                seriesData = [];
            for(i=0; i<6; i++){
                seriesData.push(parseInt(data[fieldName[i]]));
                seriesData.push(data[fieldName[i]]);
            }
            
            drawBarChart("ageBar", xAxisData, seriesData, color, "人均使用次数");
            ageBar = drawBarChart("ageBar", xAxisData, seriesData, color, "人均使用次数");
            break;
    }
}
@ -405,7 +481,7 @@ function listHandle(data, vm){
        '1': ["排名", "续方总量", "已完成", "居民取消", "审核未通过", "进行中", "其他原因取消"],
        '2': ["排名", "费用总计", "人均费用"],
        '3': ["排名", "居民自取", "物流配送", "健管师配送"],
        '4': ["排名", "绑定设备"],
        '4': ["排名", "总人数"]
    };
    EventBus.$emit("render-area-data",{
        level: vm.level,

+ 39 - 19
app/statistics/js/renew-progress.js

@ -39,21 +39,6 @@ new Vue({
		vuedals: Vuedals.Component
	},
	methods: {
		changeTag: function(val) {
			this.index = val;
			loadData([1, 2], this);
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				endDate: this.endDate,
				startDate: this.startDate,
				lowLevel: this.lowLevel,
				lowCode: this.lowCode
			})
		},
		getNewLineData: function(arg) {
			this.selectedDateType = arg.dateType;
			loadData([1], this);
@ -67,8 +52,12 @@ new Vue({
				this.level = arg.level;
				this.lowLevel = arg.lowLevel;
				this.area = arg.area;
				this.areaTitle = arg.areaTitle;
				loadData([0, 1, 2], this);
			}
			EventBus.$emit('update-area-name', {
				areaName: this.areaTitle
			});
			//存储请求所带的参数
			reqList.push({
				level: this.level,
@ -135,14 +124,39 @@ new Vue({
				onClose: function(data) {
					vm.lowCode = data.lowCode;
					vm.contentHtml = data.contentHtml;
					vm.startDate = getStartDate(vm.chooseYear);
					vm.endDate = getEndDate(vm.chooseYear);
					//请求参数重置,页面类型重新开始
					vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
					vm.area = vm.userRole.code;
					vm.areaTitle = vm.userRole.name;
					EventBus.$emit('update-area-name', {
						areaName: vm.areaTitle
					});
					vm.selectedDateType = 1;
					//然后清空请求列表数组
					reqList.splice(0, reqList.length);
					loadData([0, 1, 2], vm); //刷新数据
					//存储请求所带的参数
					reqList.push({
						level: vm.level,
						area: vm.area,
						areaTitle: vm.areaTitle,
						index: vm.index,
						endDate: vm.endDate,
						startDate: vm.startDate,
						lowLevel: vm.lowLevel,
						lowCode: vm.lowCode,
						analysisType: vm.analysisType
					});
					EventBus.$emit('update-dimension-name', {
						dimensionVal: data.name
					}); //更新维度名称
					EventBus.$emit('update-statistics-time', {}); //更新统计时间
					
				},
				component: 'renew-progress-filter',
				props: {
@ -150,6 +164,7 @@ new Vue({
				}
			});
		});
		$("#main").removeClass("c-hide");
	}
})
@ -272,8 +287,13 @@ function getTopTagDatas(data, vm) {
		name: '转签总量',
		value: vm.switchRange.switchRateAll
	}];
	drawPieChart('renewMain', renewArr, ['#12b7f5', '#ebebf5']); //续签率
	drawPieChart('switchMain', switchArr, ['#12b7f5', '#ebebf5']); //转签率
	var renewChart = drawPieChart('renewMain', renewArr, ['#12b7f5', '#ebebf5']); //续签率
	var switchChart = drawPieChart('switchMain', switchArr, ['#12b7f5', '#ebebf5']); //转签率
	window.onresize = function() {
		renewChart.resize();
		switchChart.resize();
		window.lineCharts.resize(); //日周月折线图
	}
}
function loadData(loadArr, vm) {

+ 51 - 24
app/statistics/js/resident-analysis-charts.js

@ -22,8 +22,8 @@ function jiaoFeiData(yiJiaoFeiData, weiJiaoFeiData) {
		series: [{
			type: 'pie',
			legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
			hoverAnimation: false,
			avoidLabelOverlap: false,
			radius: ['50%', '70%'],
			center: ['50%', '50%'], //饼图的位置 
			data: [{
@ -75,8 +75,8 @@ function healthData(jkrqdata, hbrqdata, gwrqdata, hfqrqdata, wbzdata) {
		series: [{
			type: 'pie',
			legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
			hoverAnimation: false,
			avoidLabelOverlap: false,
			radius: ['50%', '70%'],
			center: ['25%', '50%'], //饼图的位置 
			data: [{
@ -126,10 +126,10 @@ function healthData(jkrqdata, hbrqdata, gwrqdata, hfqrqdata, wbzdata) {
}
//服务分布
function serviceData(arr) {
function serviceData(nameArr, rateArr, colorList, year) {
	serviceChart = echarts.init(document.getElementById('serviceChart'));
	var serviceOptions = option = {
		calculable: true,
	var serviceOptions = {
		//		calculable: true,
		grid: {
			y: 25,
			y2: 30,
@ -151,7 +151,18 @@ function serviceData(arr) {
			},
			axisLabel: {
				show: true,
				color: '#666'
				interval: 0,
				textStyle: {
					color: '#333',
					fontSize: 14,
				},
				formatter: function(val) {
					if(val.length > 4) {
						return val.substring(0, 4) + '…'
					} else {
						return val
					}
				},
			},
			splitArea: {
				show: false
@ -159,10 +170,11 @@ function serviceData(arr) {
			splitLine: {
				show: false
			},
			data: ['普通人群', '老年人', '高血压', '糖尿病']
			data: nameArr
		}],
		yAxis: [{
			type: 'value',
			show: false,
			axisLine: {
				show: true,
				lineStyle: {
@ -187,29 +199,44 @@ function serviceData(arr) {
			}
		}],
		series: [{
			name: '服务分布比例',
			name: '',
			type: 'bar',
			barWidth: 20,
			barMinHeight: 1,
			label: {
				normal: {
					show: true,
					position: 'top',
					formatter: '{c}%',
					textStyle: {
						color: '#333',
						fontSize: 14,
					},
				}
			},
			itemStyle: {
				normal: {
					color: function(params) {
						var colorList = ['#12B7F5', '#61eb41', '#CD67FD', '#fb5dab'];
						return colorList[params.dataIndex]
						return colorList[params.dataIndex];
					},
					label: {
						show: true,
						position: 'top',
						color: '#666',
						formatter: function(params) {
							return params.value + '%';
						}
					},
					barBorderRadius: 0
				}
			},
			data: arr
			data: rateArr
		}]
	};
	if(year != "2016") {
		serviceOptions.dataZoom = [{
			type: 'inside',
			orient: 'horizontal',
			filterMode: 'none',
			zoomLock: true,
			zoomOnMouseWheel: false,
			preventDefaultMouseMove: false,
			xAxisIndex: 0,
			start: 0,
			end: 40
		}]
	}
	serviceChart.clear();
	serviceChart.setOption(serviceOptions);
}
@ -222,8 +249,8 @@ function sexData(femaleData, maleData) {
		series: [{
			type: 'pie',
			legendHoverLink: false,
            hoverAnimation: false,
            avoidLabelOverlap: false,
			hoverAnimation: false,
			avoidLabelOverlap: false,
			radius: ['50%', '70%'],
			center: ['50%', '50%'], //饼图的位置 
			data: [{

+ 1 - 1
app/statistics/js/resident-analysis.js

@ -3,7 +3,7 @@ new Vue({
	el: '#main',
	data: {
		appname: "居民分析",
		isback: false,
		isback: true,
		isrefresh: true,
		isfilter: true,
		isopen: false

+ 125 - 94
app/statistics/js/sign-progress.js

@ -21,39 +21,24 @@ new Vue({
		chooseYear: '',
		userRole: '',
		analysisType: "1", // 筛选维度的id, 1-按任务,2-按人口,3-高血压,4-糖尿病,5-65岁以上人群
		analysisName:"按任务",
		signRateData:{
			signRateText:"",
			signRate:"",
			signAmount:"",
			signRateAll:"",
			completeRateText:"",
			completeRate:"",
			completeAmount:"",
			completeRateAll:""
		analysisName: "按任务",
		signRateData: {
			signRateText: "",
			signRate: "",
			signAmount: "",
			signRateAll: "",
			completeRateText: "",
			completeRate: "",
			completeAmount: "",
			completeRateAll: ""
		},
		yearHtml:"",
		contentHtml:""
		yearHtml: "",
		contentHtml: ""
	},
	components: {
		vuedals: Vuedals.Component
	},
	methods: {
		changeTag: function(val) {
			this.index = val;
			loadData([1, 2], this);
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				endDate: this.endDate,
				startDate: this.startDate,
				lowLevel: this.lowLevel,
				lowCode:this.lowCode
			})
		},
		getNewLineData: function(arg) {
			this.selectedDateType = arg.dateType;
			loadData([1], this);
@ -67,8 +52,12 @@ new Vue({
				this.level = arg.level;
				this.lowLevel = arg.lowLevel;
				this.area = arg.area;
				this.areaTitle = arg.areaTitle;
				loadData([0, 1, 2], this);
			}
			EventBus.$emit('update-area-name', {
				areaName: this.areaTitle
			});
			//存储请求所带的参数
			reqList.push({
				level: this.level,
@ -78,7 +67,7 @@ new Vue({
				endDate: this.endDate,
				startDate: this.startDate,
				lowLevel: this.lowLevel,
				lowCode:this.lowCode,
				lowCode: this.lowCode,
				analysisType: this.analysisType,
			})
		}
@ -99,7 +88,7 @@ new Vue({
			endDate: this.endDate,
			startDate: this.startDate,
			lowLevel: this.lowLevel,
			lowCode:this.lowCode,
			lowCode: this.lowCode,
			analysisType: this.analysisType
		});
@ -107,7 +96,7 @@ new Vue({
		var vm = this;
		//监听后退按钮的操作
		EventBus.$on("back-click", function(arg) {
			EventBus.$emit('update-statistics-time', {});//更新统计时间
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			if(reqList.length == 1) {
				history.go(-1);
			} else {
@ -125,36 +114,66 @@ new Vue({
		});
		//监听页面刷新
		EventBus.$on("refresh-click", function(arg) {
			EventBus.$emit('update-statistics-time', {});//更新统计时间
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			loadData([0, 1, 2], vm);
		});
		
		//弹出筛选框
		EventBus.$on('filter-click', function(arg) {
			//弹框显示筛选条件
            Vuedals.Bus.$emit('new', {
                title: '条件筛选',
                onClose:function(data){
					vm.analysisType = data.id;
			Vuedals.Bus.$emit('new', {
				title: '条件筛选',
				onClose: function(data) {
					vm.chooseYear = data.chooseYear;
					vm.startDate = getStartDate(vm.chooseYear);
					vm.endDate = getEndDate(vm.chooseYear);
					vm.lowCode = data.lowCode;
					vm.yearHtml = data.yearHtml;
					vm.contentHtml = data.contentHtml;
					vm.chooseYear = data.year;
					vm.startDate = getStartDate(vm.chooseYear);
					vm.endDate = getEndDate(vm.chooseYear);
					
					loadData([0, 1, 2], vm);//刷新数据
					EventBus.$emit('update-statistics-year', {selectDate:data.year + "年"});//更新年份
					EventBus.$emit('update-dimension-name', {dimensionVal:data.name});//更新维度名称
					EventBus.$emit('update-statistics-time', {});//更新统计时间
                },
                component: 'sign-progress-filter',
                props: {
                    yearHtml:vm.yearHtml,
                    contentHtml:vm.contentHtml
                }
            });
					//请求参数重置,页面类型重新开始
					vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
					vm.area = vm.userRole.code;
					vm.areaTitle = vm.userRole.name;
					EventBus.$emit('update-area-name', {
						areaName: vm.areaTitle
					});
					vm.selectedDateType = 1;
					//然后清空请求列表数组
					reqList.splice(0, reqList.length);
					loadData([0, 1, 2], vm); //刷新数据
					//存储请求所带的参数
					reqList.push({
						level: vm.level,
						area: vm.area,
						areaTitle: vm.areaTitle,
						index: vm.index,
						endDate: vm.endDate,
						startDate: vm.startDate,
						lowLevel: vm.lowLevel,
						lowCode: vm.lowCode,
						analysisType: vm.analysisType
					});
					EventBus.$emit('update-statistics-year', {
						selectDate: vm.chooseYear + "年"
					}); //更新年份
					EventBus.$emit('update-statistics-time', {}); //更新统计时间
					EventBus.$emit('update-dimension-name', {
						dimensionVal: data.name
					}); //更新维度名称
				},
				component: 'sign-progress-filter',
				props: {
					yearHtml: vm.yearHtml,
					contentHtml: vm.contentHtml
				}
			});
		});
		$("#main").removeClass("c-hide");
	}
})
@ -177,7 +196,11 @@ function initData(vm) {
	vm.startDate = getStartDate(vm.chooseYear);
	vm.endDate = getEndDate(vm.chooseYear);
	//更新头部信息
	EventBus.$emit('update-all-prompt-info', {areaName:vm.areaTitle,selectDate:vm.chooseYear+"年",dimensionVal:vm.analysisName});
	EventBus.$emit('update-all-prompt-info', {
		areaName: vm.areaTitle,
		selectDate: vm.chooseYear + "年",
		dimensionVal: vm.analysisName
	});
}
function initReqParams(vm) {
@ -185,7 +208,7 @@ function initReqParams(vm) {
	if(vm.lowCode) {
		vm.index = 17;
	}
	
	reqParam = [{
		url: "/statistics/sign_info",
		reqType: 'get',
@ -227,33 +250,38 @@ function initReqParams(vm) {
	return reqParam;
}
function getTopTagDatas(data,vm) {
	vm.signRateData.signRateText = data.signRate.rate.substring(0,data.signRate.rate.length-2) + "%"
	vm.signRateData.signRate = parseFloat(data.signRate.rate)/100;
function getTopTagDatas(data, vm) {
	vm.signRateData.signRateText = data.signRate.rate.substring(0, data.signRate.rate.length - 2) + "%"
	vm.signRateData.signRate = parseFloat(data.signRate.rate) / 100;
	vm.signRateData.signAmount = data.signRate.sign;
	vm.signRateData.signRateAll = data.signRate.people;
	
	vm.signRateData.completeRateText = data.signTaskRate.rate.substring(0,data.signTaskRate.rate.length-2) + "%"
	vm.signRateData.completeRate = parseFloat(data.signTaskRate.rate)/100;
	vm.signRateData.completeRateText = data.signTaskRate.rate.substring(0, data.signTaskRate.rate.length - 2) + "%"
	vm.signRateData.completeRate = parseFloat(data.signTaskRate.rate) / 100;
	vm.signRateData.completeAmount = data.signTaskRate.sign;
	vm.signRateData.completeRateAll = data.signTaskRate.people;
	 var signArr = [{
            name: '签约量',
            value: vm.signRateData.signAmount
        },{
            name: '签约总量',
            value: vm.signRateData.signRateAll
        }];
        
        var completeArr = [{
            name: '完成量',
            value: vm.signRateData.completeAmount
        },{
            name: '完成总量',
            value: vm.signRateData.completeRateAll
        }];
	 drawPieChart('signMain', signArr, ['#12b7f5', '#ebebf5']);//签约率
	 drawPieChart('completeMain', completeArr, ['#12b7f5', '#ebebf5']);//完成率
	var signArr = [{
		name: '签约量',
		value: vm.signRateData.signAmount
	}, {
		name: '人口数',
		value: vm.signRateData.signRateAll
	}];
	var completeArr = [{
		name: '完成量',
		value: vm.signRateData.completeAmount
	}, {
		name: '目标量',
		value: vm.signRateData.completeRateAll
	}];
	var signChart = drawPieChart('signMain', signArr, ['#12b7f5', '#ebebf5']); //签约率
	var completeChart = drawPieChart('completeMain', completeArr, ['#12b7f5', '#ebebf5']); //完成率
	window.onresize = function() {
		signChart.resize();
		completeChart.resize();
		window.lineCharts.resize(); //日周月折线图
	}
}
function loadData(loadArr, vm) {
@ -286,7 +314,7 @@ function loadData(loadArr, vm) {
			}
			if(res1 && res1.status == 200) {
				getTopTagDatas(res1.data,vm);
				getTopTagDatas(res1.data, vm);
			}
			if(res2 && res2.status == 200) {
				handleSecondPanelData(res2.data, vm);
@ -307,7 +335,7 @@ function handleSecondPanelData(data, vm) {
	var xDatas = [],
		yDatas = [],
		names = [],
		taskNum = data.index_1.taskNum,
		taskNum = vm.lowCode ? data.index_17.taskNum : data.index_1.taskNum,
		colors = ['#12b7f5'],
		index_names = {
			'index_1': '总签约人数'
@ -320,7 +348,7 @@ function handleSecondPanelData(data, vm) {
		var yData = _.map(data[p].data, function(o) {
			return o.amount;
		});
		 
		xDatas.push(xData);
		yDatas.push(yData);
	}
@ -330,8 +358,8 @@ function handleSecondPanelData(data, vm) {
		xData: xDatas[0],
		yDatas: yDatas,
		colors: colors,
		markLineValue:taskNum,
		markLineName:"目标量"
		markLineValue: taskNum,
		markLineName: "目标量"
	});
}
@ -342,18 +370,18 @@ function listHandle(data, vm) {
		topArr = soreRank(getKeyValueArr(list, 'amount'));
		var arr = _.map(list, function(o, index) {
			var cols = [o.name];
			if(vm.analysisType=="2" && vm.level>2 && vm.lowLevel!=1){//按人口
			if(vm.analysisType == "2" && vm.level > 2 && vm.lowLevel != 1) { //按人口
				cols.push(o.num);
			}else{
			} else {
				cols.push(o.amount);
			}
            if(vm.level>2 && vm.lowLevel!=1){
	          	cols.push(o.signTaskNum);
	          	cols.push(parseFloat(o.rate).toFixed(2)+"%");
	        }else if(vm.chooseYear!="2016"){
	          cols.push(o.signRegulationNum);
	        }
			
			if(vm.level > 2 && vm.lowLevel != 1) {
				cols.push(o.signTaskNum);
				cols.push(parseFloat(o.rate).toFixed(2) + "%");
			} else if(vm.chooseYear != "2016") {
				cols.push(o.signRegulationNum);
			}
			return {
				rank: topArr[index],
				code: o.code,
@ -361,10 +389,13 @@ function listHandle(data, vm) {
				cols: cols
			}
		});
		
		var headers = ["排名", (vm.analysisType=="2"?"人口数":"签约量"), "目标率","当前签约率"];//analysisType=2 为按人口
		if(vm.lowLevel==1 || vm.level==2){//团队
			headers = ["排名", (vm.analysisType=="2"?"人口数":"签约量"), "调控量"];
		var headers = ["排名", (vm.analysisType == "2" ? "人口数" : "签约量"), "目标率", "当前签约率"]; //analysisType=2 为按人口
		if(vm.lowLevel == 1 || vm.level == 2) { //团队
			if(vm.chooseYear =="2016"){
				headers = ["排名", (vm.analysisType == "2" ? "人口数" : "签约量")];
			}else{
				headers = ["排名", (vm.analysisType == "2" ? "人口数" : "签约量"), "调控量"];
			}
		}
		EventBus.$emit("render-area-data", {

+ 296 - 0
app/statistics/js/two-rate-analysis.js

@ -0,0 +1,296 @@
var reqList = []; //记录请求的参数和url,用于后退时使用
Vue.use(Vuedals.default);
new Vue({
	el: "#main",
	data: {
		appname: "两率分析",
		isback: true,
		isrefresh: true,
		isfilter: false,
		isopen: false,
		//请求页面所需参数
		level: '',
		area: '',
		areaTitle: '',
		index: '18',
		endDate: '',
		lowLevel: '',
		userRole: '',
		//数据结果
		topDatas: {
			sanShiData: 0,
			sanShiRate: '0.00%',
			gaoWeiData: 0,
			gaoWeiRate: '0.00%'
		}
	},
	components: {
		vuedals: Vuedals.Component
	},
	methods: {
		changeTag: function(val) {
			this.index = val;
			loadData([1], this);
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				date: this.endDate,
				endDate: this.endDate,
				lowLevel: this.lowLevel
			})
		},
		getAreaData: function(arg) {
			//如果level改变,则需要重新加载整个页面的数据,否则只需加载底部区域数据
			if(arg.level == this.level) {
				this.lowLevel = arg.lowLevel;
				loadData([1], this);
			} else {
				this.level = arg.level;
				this.lowLevel = arg.lowLevel;
				this.area = arg.area;
				this.areaTitle = arg.areaTitle;
				loadData([0, 1], this);
			}
			EventBus.$emit('update-area-name', {
				areaName: this.areaTitle
			});
			//存储请求所带的参数
			reqList.push({
				level: this.level,
				area: this.area,
				areaTitle: this.areaTitle,
				index: this.index,
				endDate: this.endDate,
				lowLevel: this.lowLevel,
			})
		}
	},
	mounted: function() {
		//初始化数据
		initData(this);
		//获得顶部各tab的值
		loadData([0, 1], this); //参数组数表示请求的区域为上中下
		//存储请求所带的参数
		reqList.push({
			level: this.level,
			area: this.area,
			areaTitle: this.areaTitle,
			index: this.index,
			endDate: this.endDate,
			lowLevel: this.lowLevel
		});
		//设置监听器, 监听折线图日期变化
		var vm = this;
		//监听后退按钮的操作
		EventBus.$on("back-click", function(arg) {
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			if(reqList.length == 1) {
				history.go(-1);
			} else {
				var preInfo = reqList.pop();
				var info = reqList[reqList.length - 1];
				vm.level = info.level;
				vm.area = info.area;
				vm.areaTitle = info.areaTitle;
				vm.lowLevel = info.lowLevel;
				vm.index = info.index;
				loadData([0, 1], vm);
			}
		});
		//监听页面刷新
		EventBus.$on("refresh-click", function(arg) {
			EventBus.$emit('update-statistics-time', {}); //更新统计时间
			loadData([0, 1], vm);
		});
		$("#main").removeClass("c-hide");
	}
})
function initData(vm) {
	//获得缓存中缓存的角色权限
	var userRole = window.localStorage.getItem("selectedRole");
	if(!userRole) {
		return false;
	}
	vm.userRole = JSON.parse(userRole);
	vm.level = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
	vm.area = vm.userRole.code;
	vm.areaTitle = vm.userRole.name;
	vm.endDate = getDateBefore(1);
	//更新头部信息
	EventBus.$emit('update-all-prompt-info', {
		areaName: vm.areaTitle,
		selectDate: "",
		dimensionVal: ""
	});
}
function getTopTagDatas(vm) {
	var reqs = [],
		url = "/statistics/sszq_qwrq_info",
		data = {
			level: vm.level,
			area: vm.area,
			endDate: vm.endDate
		};
	reqs.push(httpRequest.get(url, {
		data: data
	}));
	Promise.all(reqs).then(function(ress) {
		for(i = 0; i < ress.length; i++) {
			var res = ress[i];
			if(res.status == 200) {
				var sszq = res.data.sszq;
				var gwrq = res.data.gwrq;
				vm.topDatas.sanShiData = sszq.amount + "/" + sszq.num;
				vm.topDatas.sanShiRate = sszq.rate == 0 ? '0.00%' : sszq.rate.toString().substring(0, sszq.rate.length - 2) + "%";
				vm.topDatas.gaoWeiData = gwrq.amount + "/" + gwrq.num;
				vm.topDatas.gaoWeiRate = gwrq.rate == 0 ? '0.00%' : gwrq.rate.toString().substring(0, gwrq.rate.length - 2) + "%";
				
				$('#sszql_canvas').waterbubble({
					//txt: res.signRate.rate.substring(0,res.signRate.rate.length-2) + "%",res.signRate.rate/100
					data: sszq.rate / 100,
					waterColor: '#12b7f5',
					lineWidth: 0,
					textColor: 'rgba(0, 0, 0, 0.8)',
					font: 'bold 25px arial'
				});
				
				$('#gaowei_canvas').waterbubble({
					//txt: res.signRate.rate.substring(0,res.signRate.rate.length-2) + "%",res.signRate.rate/100
					data: gwrq.rate / 100,
					waterColor: '#12b7f5',
					lineWidth: 0,
					radius: 75,
					textColor: 'rgba(0, 0, 0, 0.8)',
					font: 'bold 25px arial'
				});
			} else {
				console.log(res.msg);
			}
		}
	})
}
function initReqParams(vm) {
	reqParam = [{
		url: "/statistics/lowlevel_all",
		reqType: 'get',
		data: {
			sort: 1,
			date: vm.endDate,
			level: vm.level,
			index: vm.index,
			area: vm.area
		}
	}];
	if(vm.lowLevel) {
		reqParam[0].data.lowLevel = vm.lowLevel;
	}
	return reqParam;
}
function loadData(loadArr, vm) {
	if(loadArr.indexOf(0) > -1) {
		getTopTagDatas(vm);
	}
	if(vm.level == 2) { //社区管理员不显示团队信息
		$(".area-panel").hide();
		return false;
	}
	//获取其他请求的参数
	var reqParams = initReqParams(vm),
		reqPromise = [],
		newArr = []; //记录非顶部请求的请求数组
	for(i = 0; i < loadArr.length; i++) {
		if(loadArr[i] == 0) {
			// do nothing
		} else {
			var j = loadArr[i] - 1;
			var param = reqParams[j];
			reqPromise.push(httpRequest.get(param.url, {
				data: param.data
			}));
			newArr.push(loadArr[i]);
		}
	}
	if(reqPromise.length > 0) {
		Promise.all(reqPromise).then(function(ress) {
			var res = ress[0] || [];
			if(res && res.status == 200) {
				listHandle(res.data, vm);
			}
		})
	}
}
function listHandle(data, vm) {
	for(i in data) {
		var list = data[i];
		var topArr = [];
		var resultData = soreQLY(list);
		topArr = soreRank(getKeyValueArr(resultData, 'rate'));
		var arr = _.map(resultData, function(o, index) {
			var cols = [o.name];
			var rate = o.rate ? parseFloat(o.rate).toFixed(2) + "%" : '0.00%';
			cols.push(rate);
			return {
				rank: topArr[index],
				code: o.code,
				name: o.name,
				cols: cols
			}
		});
		var headers = {
			'18': ["排名", "三师转签率"],
			'19': ["排名", "高危人数签约率"]
		};
		EventBus.$emit("render-area-data", {
			level: vm.level,
			area: vm.area,
			lowLevel: vm.lowLevel,
			headers: headers[vm.index],
			rows: arr
		});
	}
}
//签约率排序
function soreQLY(arr) {
	var resArr = [];
	for(var i=0;i<arr.length;i++){
		var item = arr[i];
		item.rate = parseFloat(item.rate);
		resArr.push(item)
	}
	 var eventData = _.chain(resArr)
        // 根据date日期字段排序
        .sortBy("rate").reverse()
        // 对集合中每一对象进行处理,返回新的集合
       .map(function (item) {
            
            return {
                amount: item.amount,
                code: item.code,
                rate: item.rate,
                name: item.name,
                num: item.num
            }
        }).value();
	return eventData;
	
}

+ 3 - 1
app/statistics/prescription-analysis.html

@ -8,6 +8,7 @@
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="shortcut icon" href="../../favicon.ico">
        <link rel="stylesheet" type="text/css" href="../../css/font-awesome.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/style.min.css"/>
        <link rel="stylesheet" type="text/css" href="../../css/cross.css"/>
@ -17,7 +18,7 @@
        </style>
    </head>
    <body>
        <div id="main">
        <div id="main" class="c-hide">
            <header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen" ></header-tab>
            <header-prompt></header-prompt>
            <div v-show="sumType==1" class="order-tag-panel">
@ -146,6 +147,7 @@
        <script src="../../component/common/vuedals.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-tab.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/header-prompt.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/prescription-filter.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/line-chart.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/bar-chart.js" type="text/javascript" charset="utf-8"></script>
        <script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>

+ 1 - 1
app/statistics/renew-progress.html

@ -16,7 +16,7 @@
	</head>
	<body style="margin: 0;">
		<div id="main">
		<div id="main" class="c-hide">
			<header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen"></header-tab>
			<header-prompt></header-prompt>
			<!-- 饼图 -->

+ 2 - 2
app/statistics/sign-progress.html

@ -16,7 +16,7 @@
	</head>
	<body style="margin: 0;">
		<div id="main">
		<div id="main" class="c-hide">
			<header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen"></header-tab>
			<header-prompt></header-prompt>
			<!-- 饼图 -->
@ -27,7 +27,7 @@
							<div class="c-f16 c-12b7f5 mt15">{{signRateData.signRateText}}</div>
							<div class="c-f14 c-666">签约率</div>
						</div>
						<div id="signMain" class="c-100 height-120"></div>
						<div id="signMain" class="c-100 height-120 c-t-center"></div>
						<div class="c-f12 c-999 div-data-value">
							<span class="c-f12 c-12b7f5 qianyuelv">{{signRateData.signAmount}}</span>/
							<span class="c-f12 c-333 qianyuezong">{{signRateData.signRateAll}}</span>

+ 41 - 30
app/statistics/two-rate-analysis.html

@ -3,7 +3,7 @@
	<head>
		<meta charset="UTF-8">
		<title>签约进展</title>
		<title>两率分析</title>
		<meta name="author" content="yihu.com" />
		<meta name="format-detection" content="telephone=no" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" />
@ -16,38 +16,51 @@
	</head>
	<body style="margin: 0;">
		<div id="main">
		<div id="main" class="c-hide">
			<header-tab :appname="appname" :isback="isback" :isrefresh="isrefresh" :isfilter="isfilter" :isopen="isopen"></header-tab>
			<header-prompt></header-prompt>
			<!-- 饼图 -->
			<div class="mt10 mb30">
				<div class="c-row">
					<div class="c-50 c-t-center c-position-r">
						<div class="div-radius-panel">
							<div class="c-f16 c-12b7f5 mt15">{{signRateData.signRateText}}</div>
							<div class="c-f14 c-666">签约率</div>
			<!--市管、区管-->
			<div class="clearfix" v-show="level>2">
				<ul class="l-banner">
					<li class="active" style="width: calc(100% / 2);">
						<div class="tag" :class="{'active': index==18}" @click="changeTag(18)">
							<div id="index_18" class="c-f18">{{topDatas.sanShiRate}}</div>
							<div class="c-f18 mt5">{{topDatas.sanShiData}}</div>
							<div class="mt5 c-f14 l-name">三师转签率</div>
						</div>
						<div id="signMain" class="c-100 height-120"></div>
						<div class="c-f12 c-999 div-data-value">
							<span class="c-f12 c-12b7f5 qianyuelv">{{signRateData.signAmount}}</span>/
							<span class="c-f12 c-333 qianyuezong">{{signRateData.signRateAll}}</span>
					</li>
					<li style="width: calc(100% / 2);">
						<div class="tag" :class="{'active': index==19}" @click="changeTag(19)">
							<div id="index_19" class="c-f18">{{topDatas.gaoWeiRate}}</div>
							<div class="c-f18 mt5">{{topDatas.gaoWeiData}}</div>
							<div class="mt5 c-f14 l-name">高危人数签约率</div>
						</div>
					</li>
				</ul>
			</div>
			<!--社区管-->
			<div class="clearfix" style="background: #F3F3F3;" v-show="level==2">
				<div class="mod mod-fuwu mb30 c-border-b">
					<div class="mod-hd c-border-t">
						<i class="icon-cyc sszql"></i>&emsp;三师转签率
					</div>
					<div class="c-50 c-t-center c-position-r">
						<div class="div-radius-panel">
							<div class="c-f16 c-12b7f5 mt15">{{signRateData.completeRateText}}</div>
							<div class="c-f14 c-666">完成率</div>
						</div>
						<div id="completeMain" class="c-100" style="height: 120px;"></div>
						<div class="c-f12 c-999 div-data-value">
							<span class="c-f12 c-12b7f5">{{signRateData.completeAmount}}</span>/
							<span class="c-f12 c-333">{{signRateData.completeRateAll}}</span>
						</div>
					<div class="div-ssqql">
						<p class="f-fs12 p-sanshilv">{{topDatas.sanShiRate}}</p>
						<p class="p-sanshicount f-fs12">{{topDatas.sanShiData}}</p>
						<canvas id="sszql_canvas"></canvas>
					</div>
				</div>
				<div class="mod mod-fuwu c-border-b">
					<div class="mod-hd c-border-t" style="border-bottom: 0;">
						<i class="icon-cyc gwrq"></i>&emsp;高危人群签约率
					</div>
					<div class="div-ssqql c-border-t">
						<p class="f-fs12 p-gaoweilv">{{topDatas.gaoWeiRate}}</p>
						<p class="p-gaoweicount f-fs12">{{topDatas.gaoWeiData}}</p>
						<canvas id="gaowei_canvas"></canvas>
					</div>
				</div>
			</div>
			<!-- 折线图 -->
			<line-chart v-on:getlinedata="getNewLineData" class="mlr8"></line-chart>
			<!-- 底部区域图 -->
			<area-data-panel class="mt20 mlr8" v-on:getnewdata="getAreaData"></area-data-panel>
			<!--模态框组件-->
@ -59,8 +72,6 @@
		<script src="../../js/es6-promise.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../js/underscore.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../js/util.js" type="text/javascript" charset="utf-8"></script>
		<!--<script src="../../plugins/echarts/3.8.5/echarts.min.js" type="text/javascript" charset="utf-8"></script>-->
		<script src="js/echarts.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../api/http-request.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../api/statistics-api.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/common/event-bus.js"></script>
@ -68,11 +79,11 @@
		<script src="../../component/statistics/header-tab.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/header-prompt.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/line-chart.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/area-data-panel.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/area-data-panel2.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/team-info.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../component/statistics/sign-progress-filter.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/common.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/sign-progress.js" type="text/javascript" charset="utf-8"></script>
		<script src="../../js/waterbubble.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/two-rate-analysis.js" type="text/javascript" charset="utf-8"></script>
	</body>
</html>

+ 28 - 2
component/statistics/area-data-panel.js

@ -4,7 +4,7 @@
                <div class="area-tab-panel">\
                    <div v-show="level==4" class="area-tab" :class="{\'active\': level==4 && (!lowLevel || lowLevel==3)}" @click="getLowCodeData(3)"><span>各区</span></div>\
                    <div v-show="level >= 3" class="area-tab" :class="{\'active\': (level==3 && lowLevel!=1) || lowLevel==2}" @click="getLowCodeData(2)"><span>社区</span></div>\
                    <div class="area-tab" :class="{\'active\': level==2 || lowLevel==1}" @click="getLowCodeData(1)"><span>团队</span></div>\
                    <div v-show="showTeamTab" class="area-tab" :class="{\'active\': level==2 || lowLevel==1}" @click="getLowCodeData(1)"><span>团队</span></div>\
                </div>\
                <table class="bottom-list-table mb20" id="listTable">\
                    <thead><tr>\
@ -30,7 +30,9 @@
                lowLevel: '',
                area: '',
                headers: [],
                rows: []
                rows: [],
                cityLevelNoShowTeamTab: false,
                districtLevelNoShowTeamTab: false
            }
        },
        mounted: function(){
@ -41,8 +43,31 @@
                vm.area = arg.area;
                vm.headers = arg.headers;
                vm.rows = arg.rows;
                vm.cityLevelNoShowTeamTab = arg.cityLevelNoShowTeamTab;
                vm.districtLevelNoShowTeamTab = arg.districtLevelNoShowTeamTab;
            })
        },
        computed: {
            showTeamTab: function(){
                if(this.cityLevelNoShowTeamTab){
                    if(this.level == 4){
                        return false;
                    }else{
                        if(this.districtLevelNoShowTeamTab){
                            if(this.level == 3){
                                return false;
                            }else{
                                return true;
                            }
                        }else{
                            return true;
                        }
                    }
                }else{
                    return true;
                }
            }
        },
        methods: {
            getLowLeverData: function(row){
                if(this.level > 2 && this.lowLevel != 1){
@ -53,6 +78,7 @@
                        this.lowLevel --;
                    }else{
                        this.level --;
                        this.lowLevel = '';
                    }
                    this.area = row.code;
                    this.areaTitle = row.name;

+ 83 - 0
component/statistics/area-data-panel2.js

@ -0,0 +1,83 @@
(function(){
    Vue.component('area-data-panel',{
        template: '<div class="area-panel">\
                <div class="area-tab-panel">\
                    <div v-show="level==4" class="area-tab" :class="{\'active\': level==4 && (!lowLevel || lowLevel==3)}" @click="getLowCodeData(3)"><span>各区</span></div>\
                    <div v-show="level >= 3" class="area-tab" :class="{\'active\': (level==3 && lowLevel!=1) || lowLevel==2}" @click="getLowCodeData(2)"><span>社区</span></div>\
                </div>\
                <table class="bottom-list-table mb20" id="listTable">\
                    <thead><tr>\
                        <th v-for="th in headers">{{th}}</th>\
                        <th v-show="level>2 && lowLevel != 1" width="20"></th>\
                    </tr></thead>\
                    <tbody>\
                        <tr v-for="row in rows" class="data-row" @click="getLowLeverData(row)">\
                            <td v-for="(col, index) in row.cols" :class="{\'area-name\': index == 0}">\
                                <div v-if="index==0" class="ranking" :class="{\'ranking1\': row.rank==1, \'ranking2\': row.rank==2, \'ranking3\': row.rank==3}">{{row.rank}}</div>\
                                <div v-if="index==0" class="ui-col-1 c-nowrap-multi">{{col}}</div>\
                                <span v-else>{{col}}</span>\
                            </td>\
                            <td v-show="level>3"><i class="fa fa-angle-right"></i></td>\
                        </tr>\
                    </tbody>\
                </table>\
            </div>',
        props:[],
        data: function(){
            return {
                level: '',
                lowLevel: '',
                area: '',
                headers: [],
                rows: []
            }
        },
        mounted: function(){
            var vm = this;
            EventBus.$on("render-area-data", function(arg){
                vm.level = arg.level;
                vm.lowLevel = arg.lowLevel;
                vm.area = arg.area;
                vm.headers = arg.headers;
                vm.rows = arg.rows;
            })
        },
        methods: {
            getLowLeverData: function(row){
                if(this.level > 3 && this.lowLevel != 1){
                    //跳转去下一级数据
                    if(this.lowLevel && (this.level - this.lowLevel) >= 2){
                        //从次级tab的内容查看再下一级的数据
                        this.level = this.level - 2;
                        this.lowLevel --;
                    }else{
                        this.level --;
                    }
                    this.area = row.code;
                    this.areaTitle = row.name;
                    //触发组件监听事件,去父页面请求新的数据
                    this.$emit("getnewdata", {
                        level: this.level,
                        area: this.area,
                        areaTitle: this.areaTitle,
                        lowLevel: this.lowLevel,
                    });
                }
            },
            getLowCodeData: function(code){
                if(code == 3){
                    this.lowLevel = '';
                }else{
                    this.lowLevel = code;
                }
                
                //触发组件监听事件,去父页面请求新的数据
                this.$emit("getnewdata", {
                    level: this.level,
                    area: this.area,
                    lowLevel: this.lowLevel
                });
            }
        }
    });
})()

+ 7 - 3
component/statistics/bar-chart.js

@ -6,9 +6,9 @@
                    <span class="c-333 c-bold c-f14">{{panelName}}</span>\
                </div>\
                <div class="ui-col-1 c-t-right ptb5">\
                    <span class="date-tag" :class="{active: selectedDateType == 1}" data-type="1" @click="changeType(1)">日</span><!--\
                    --><span class="date-tag" :class="{active: selectedDateType == 2}" data-type="2" @click="changeType(2)">周</span><!--\
                    --><span class="date-tag" :class="{active: selectedDateType == 3}" data-type="3" @click="changeType(3)">月</span>\
                    <span class="date-tag" :class="{active: selectedDateType == 1}" @click="changeType(1)">日</span><!--\
                    --><span class="date-tag" :class="{active: selectedDateType == 2}" @click="changeType(2)">周</span><!--\
                    --><span class="date-tag" :class="{active: selectedDateType == 3}" @click="changeType(3)">月</span>\
                </div>\
            </div>\
            <div class="clearfix mt5 plr10">\
@ -38,6 +38,9 @@
            var vm = this;
            EventBus.$on("draw-bar-chart", function(arg){
                vm.panelName = arg.panelName;
                if(arg.selectedDateType){
                    vm.selectedDateType = arg.selectedDateType;
                }
                if(arg.unit){
                    vm.unit = arg.unit;
                }
@ -158,5 +161,6 @@
        
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
        window.barCharts = myChart;
    }
})()

+ 4 - 0
component/statistics/line-chart.js

@ -38,6 +38,9 @@
            var vm = this;
            EventBus.$on("draw-line-chart", function(arg){
                vm.panelName = arg.panelName;
                if(arg.selectedDateType){
                    vm.selectedDateType = arg.selectedDateType;
                }
                if(arg.unit){
                    vm.unit = arg.unit;
                }
@ -192,5 +195,6 @@
//          console.log(JSON.stringify(options));
        $("#lineChart").removeAttr('_echarts_instance_')
        lineCharts.setOption(options);
        window.lineCharts = lineCharts;
    }
})()

+ 85 - 0
component/statistics/prescription-filter.js

@ -0,0 +1,85 @@
(function(){
    Vue.component('prescription-filter', {
        template: '<div style="height: 400px;overflow: auto;">\
            <div class="mt10 ml10 filter-title">统计维度</div>\
            <div class="c-row mt10 plr20">\
                <div v-for="type in types" class="c-33 mt10" :class="{\'active\': sumType==type.value}" @click="selectType(type.value)"><a>{{type.name}}</a></div>\
            </div>\
            <div class="mt10 ml10 filter-title">慢病类型</div>\
            <div class="c-row mt20 plr20">\
                <div v-for="dis in diseases" class="c-33 mt10" :class="{\'active\': disease==dis.code}" @click="selectDisease(dis.code)"><a>{{dis.name}}</a></div>\
            </div>\
            <div id="footer">\
                <div class="c-row btn-wrap c-border-top fr">\
                    <div class="div-foot-btn mr20" @click="resetClick">\
                        <a href="#" class="c-666 f-fs16">重置</a>\
                    </div>\
                    <div class="div-foot-btn active" @click="confirmClick">\
                        <a href="#" class="c-666 f-fs16">确定</a>\
                    </div>\
                </div>\
            </div>\
        </div>',
        props:['sumType', 'disease'],
        data: function(){
            return {
                types: [{
                    value: 1,
                    name: "订单统计"
                },{
                    value: 2,
                    name: "费用统计"
                },{
                    value: 3,
                    name: "配送统计"
                },{
                    value: 4,
                    name: "年龄统计"
                }],
                diseases: [{
                    code: "",
                    name: "全部"
                },{
                    code: "HP0093",
                    name: "高血压"
                },{
                    code: "HP0047",
                    name: "糖尿病"
                }]
            }
        },
        methods: {
            selectType: function(val){
                this.sumType = val;
            },
            selectDisease: function(val){
                this.disease = val;
            },
            resetClick:function(){
                this.sumType = this.types[0].value;
                this.disease = this.diseases[0].code;
            },
            confirmClick:function(){
                //触发刷新
                var vm = this;
                var type = _.findWhere(vm.types, {value: vm.sumType}),
                    dis = _.findWhere(vm.diseases, {code: vm.disease});
                Vuedals.Bus.$emit('close', {
                    sumType: vm.sumType,
                    sumTypeName: type.name,
                    disease: vm.disease,
                    diseaseName: dis.name
                });
            }
        },
        mounted: function(){
            //如果前一个页面返回的选中的年份
            if(!this.sumType){
                this.sumType = this.types[0].value;
            }
            if(!this.disease){
                this.disease = this.diseases[0].code;
            }
        }
    })
})()

+ 22 - 4
component/statistics/resident-analysis-filter.js

@ -115,6 +115,7 @@
			vm.selectLevel = vm.roleLevel;
			var userRole = JSON.parse(window.localStorage.getItem("selectedRole"));
			vm.curName = vm.selectLevel==4?userRole.name.substring(0,3):userRole.name;
			vm.curCode = userRole.code;
			$("#signYear").find(".c-33").removeClass("active");
			$("#signYear").find(".c-33").eq(0).addClass("active");
			$(".div-content .div-item").find(".div-btn").removeClass("active");
@ -124,11 +125,24 @@
         },
         confirmClick:function(){
         	var vm = this;
         	console.log("area:"+vm.resultCode)
         	console.log("name:"+vm.curName)
         	console.log("level:"+vm.selectLevel)
         	console.log("year:"+$("#signYear .c-33.active").attr("data-val"))
			//触发刷新
			var lastItem = $(".div-content .div-item .div-btn.active").last().find("a").html();
			if(lastItem=="全区"){
				if(vm.roleLevel==3){//区管理员
					var userRole = JSON.parse(window.localStorage.getItem("selectedRole"));
					vm.resultCode = vm.curCode || userRole.code;
				}else{
					vm.resultCode = $($(".div-content .div-item .div-btn.active").eq(0)).attr("data-id");
				}
				vm.selectLevel = 3;
			}
			if(lastItem=="全社区"){
				if($(".div-content .div-item .div-btn.active").length==3){
					vm.resultCode = $($(".div-content .div-item .div-btn.active").eq(1)).attr("data-id");
				}
				vm.resultCode = $($(".div-content .div-item .div-btn.active").eq(0)).attr("data-id");
				vm.selectLevel = 2;
			}
			this.$emit('vuedals:close', {
				areaCode: vm.resultCode,
				name: vm.curName,
@ -137,6 +151,10 @@
				filterHtml:$(".div-content").html(),
				yearHtml:$("#signYear").html()
			});
//			console.log("area:"+vm.resultCode)
//       	console.log("name:"+vm.curName)
//       	console.log("level:"+vm.selectLevel)
//       	console.log("year:"+$("#signYear .c-33.active").attr("data-val"))
         },
         pingData:function(list){
          		var vm = this;

+ 161 - 99
component/statistics/resident-analysis.js

@ -89,107 +89,149 @@ Vue.component('resident-analysis', {
	props: [],
	data: function() {
		return {
			yiJiaoFeiData:"",
			yiJiaoFeiPer:"",
			weiJiaoFeiData:"",
			weiJiaoFeiPer:"",
			jianKangRQPer:"",
			huanBingRQPer:"",
			gaoWeiRQPer:"",
			huiFuQiRQPer:"",
			weiBiaoZRQPer:"",
			maleData:"",
			malePer:"",
			femaleData:"",
			femalePer:"",
			chooseYear:"",//选择年份值
			curLevel:null,//当前level值
			curCode:null,//当前选中区域的code值
			curName:null,//当前选中区域名称值
			endDate:null,
			userRole:null,
			roleLevel:null,
			filterHtml:null,
			yearHtml:null
			yiJiaoFeiData: "",
			yiJiaoFeiPer: "",
			weiJiaoFeiData: "",
			weiJiaoFeiPer: "",
			jianKangRQPer: "",
			huanBingRQPer: "",
			gaoWeiRQPer: "",
			huiFuQiRQPer: "",
			weiBiaoZRQPer: "",
			maleData: "",
			malePer: "",
			femaleData: "",
			femalePer: "",
			chooseYear: "", //选择年份值
			curLevel: null, //当前level值
			curCode: null, //当前选中区域的code值
			curName: null, //当前选中区域名称值
			endDate: null,
			userRole: null,
			roleLevel: null,
			filterHtml: null,
			yearHtml: null
		}
	},
	mounted: function() {
		var vm = this;
	    var now = new Date();
	    if(now.getMonth() >= 6){
	        vm.chooseYear = now.getFullYear();
	    }else{
	        vm.chooseYear = now.getFullYear() - 1;
	    }
	    vm.userRole = JSON.parse(window.localStorage.getItem("selectedRole"));
		vm.roleLevel = vm.userRole.code == '350200'  ? 4 : vm.userRole.code.length==6 ? 3 : 2;
	    vm.endDate = getEndDate(vm.chooseYear);
		var now = new Date();
		if(now.getMonth() >= 6) {
			vm.chooseYear = now.getFullYear();
		} else {
			vm.chooseYear = now.getFullYear() - 1;
		}
		vm.userRole = JSON.parse(window.localStorage.getItem("selectedRole"));
		vm.roleLevel = vm.userRole.code == '350200' ? 4 : vm.userRole.code.length == 6 ? 3 : 2;
		vm.endDate = getEndDate(vm.chooseYear);
		vm.curLevel = vm.roleLevel;
		vm.curCode = vm.userRole.code;
		vm.curName = vm.userRole.name;
		
    	
    	//初始化数据
		//初始化数据
		initData(vm);
		
		//监听后退按钮的操作
		EventBus.$on("back-click", function(arg) {
			history.go(-1);
		});
		//刷新数据
		EventBus.$on('refresh-click', function(arg) {
			initData(vm);
		});
		
		//弹出筛选框
		EventBus.$on('filter-click', function(arg) {
			//弹框显示筛选条件
            Vuedals.Bus.$emit('new', {
                title: '条件筛选',
                onClose:function(data){
                    vm.chooseYear = data.year;
                    vm.curName = data.name;
                    vm.curCode = data.areaCode;
                    vm.curLevel = data.level;
                    vm.endDate = getEndDate(vm.chooseYear);
                    vm.yearHtml = data.yearHtml;
                     vm.filterHtml = data.filterHtml;
                    initData(vm);//刷新数据
                },
                component: 'resident-analysis-filter',
                props: {
                    curLevel: vm.roleLevel,
                    curCode: vm.userRole.code,
                    curName: vm.userRole.name,
                    yearHtml:vm.yearHtml,
                    filterHtml:vm.filterHtml
                }
            });
			Vuedals.Bus.$emit('new', {
				title: '条件筛选',
				onClose: function(data) {
					vm.chooseYear = data.year;
					vm.curName = data.name;
					vm.curCode = data.areaCode;
					vm.curLevel = data.level;
					vm.endDate = getEndDate(vm.chooseYear);
					vm.yearHtml = data.yearHtml;
					vm.filterHtml = data.filterHtml;
					initData(vm); //刷新数据
				},
				component: 'resident-analysis-filter',
				props: {
					curLevel: vm.roleLevel,
					curCode: vm.userRole.code,
					curName: vm.userRole.name,
					yearHtml: vm.yearHtml,
					filterHtml: vm.filterHtml
				}
			});
		});
		
		
	},
	methods: {
		
	}
})
//请求接口数据
function initData(vm) {
	EventBus.$emit('update-area-name', {areaName:vm.curName});//更新区域名称
	EventBus.$emit('update-statistics-time', {});//更新统计时间
	EventBus.$emit('update-statistics-year', {selectDate:vm.chooseYear+"年"});//更新统计年份
	var url = "/statistics/leveltwo_increment",reqPromise = [];
	
	reqPromise.push(httpRequest.get(url, {data: {endDate:vm.endDate,area:vm.curCode,level:vm.curLevel,index:16}}));
	reqPromise.push(httpRequest.get(url, {data: {endDate:vm.endDate,area:vm.curCode,level:vm.curLevel,index:15}}));
	reqPromise.push(httpRequest.get(url, {data: {endDate:vm.endDate,area:vm.curCode,level:vm.curLevel,index:vm.chooseYear==2016?7:36}}));
	reqPromise.push(httpRequest.get(url, {data: {endDate:vm.endDate,area:vm.curCode,level:vm.curLevel,index:6}}));
	reqPromise.push(httpRequest.get(url, {data: {endDate:vm.endDate,area:vm.curCode,level:vm.curLevel,index:8}}));
	EventBus.$emit('update-area-name', {
		areaName: vm.curName
	}); //更新区域名称
	EventBus.$emit('update-statistics-time', {}); //更新统计时间
	EventBus.$emit('update-statistics-year', {
		selectDate: vm.chooseYear + "年"
	}); //更新统计年份
	var url = "/statistics/leveltwo_increment",
		reqPromise = [];
	reqPromise.push(httpRequest.get(url, {
		data: {
			endDate: vm.endDate,
			area: vm.curCode,
			level: vm.curLevel,
			index: 16
		}
	}));
	reqPromise.push(httpRequest.get(url, {
		data: {
			endDate: vm.endDate,
			area: vm.curCode,
			level: vm.curLevel,
			index: 15
		}
	}));
	reqPromise.push(httpRequest.get(url, {
		data: {
			endDate: vm.endDate,
			area: vm.curCode,
			level: vm.curLevel,
			index: vm.chooseYear == "2016" ? 7 : 36
		}
	}));
	reqPromise.push(httpRequest.get(url, {
		data: {
			endDate: vm.endDate,
			area: vm.curCode,
			level: vm.curLevel,
			index: 6
		}
	}));
	reqPromise.push(httpRequest.get(url, {
		data: {
			endDate: vm.endDate,
			area: vm.curCode,
			level: vm.curLevel,
			index: 8
		}
	}));
	Promise.all(reqPromise).then(function(datas) {
		var jiaoFeiArr = datas[0],
		healthArr = datas[1],
		serviceArr = datas[2],
		sexArr = datas[3],
		ageArr = datas[4];
		
			healthArr = datas[1],
			serviceArr = datas[2],
			sexArr = datas[3],
			ageArr = datas[4];
		//缴费情况处理
		if(jiaoFeiArr.status == "200") {
			var data = jiaoFeiArr.data.index_16;
@ -214,9 +256,9 @@ function initData(vm) {
					}
				}
			})
			jiaoFeiData(yiJiaoFeiData,weiJiaoFeiData);
			jiaoFeiData(yiJiaoFeiData, weiJiaoFeiData);
		}
		
		//健康分布处理
		if(healthArr.status == "200") {
			var data = healthArr.data.index_15;
@ -230,42 +272,62 @@ function initData(vm) {
			vm.huanBingRQPer = parseFloat(data[2].rate).toFixed(2);
			vm.gaoWeiRQPer = parseFloat(data[3].rate).toFixed(2);
			vm.huiFuQiRQPer = parseFloat(data[4].rate).toFixed(2);
			healthData(jkrqdata,hbrqdata,gwrqdata,hfqrqdata,wbzdata);
			healthData(jkrqdata, hbrqdata, gwrqdata, hfqrqdata, wbzdata);
		}
		
		//服务分布处理
		if(serviceArr.status=="200"){
			var data=serviceArr.data["index_"+(vm.chooseYear==2016?7:36)];
			var amountArr = [];
			$.each(data, function(i, v) {
				amountArr.push(v.amount);
			})
			serviceData(amountArr);			
		if(serviceArr.status == "200") {
			var data = serviceArr.data["index_" + (vm.chooseYear == "2016" ? 7 : 36)];
			var colors = "#42C7FF,#FFC84C,#FB5DAB,#CD67FD,#795548,#607d8b,#ff5722,#cddc39,#9e9e9e,#3f51b5,#f44336,#9c27b0".split(',');
			var nameArr=[];
			var rateArr =[];
			if(vm.chooseYear == "2016") {
				$.each(data, function(i, v) {
					if(v.code == 1 || v.code == 2 || v.code == 3 || v.code == 7) {
						v.rate = parseFloat(v.rate).toFixed(2);
						nameArr.push(v.name);
						rateArr.push(v.rate);
					}
				})
				serviceData(nameArr,rateArr,colors.slice(0, nameArr.length),vm.chooseYear);
			}else{
				arry = _.chain(data).filter(function(v) {
									return !_.contains(["0","2","13"],v.code)
								}).map(function(v) {
									v.rate = parseFloat(v.rate).toFixed(2);
									return {"value":v.rate, "name":v.name}
								}).value();
				$.map(arry,function(item,index){
					nameArr.push(item.name)
					rateArr.push(item.value)
				})
				serviceData(nameArr,rateArr,colors.slice(0, nameArr.length),vm.chooseYear);
			}
		}
		
		//性别情况处理
		if(sexArr.status=="200"){
		if(sexArr.status == "200") {
			var data = sexArr.data.index_6;
			var femaleData,maleData;
			var femaleData, maleData;
			$.each(data, function(i, v) {
				if(v.code=="1"){//女
				if(v.code == "1") { //女
					femaleData = v.amount;
					vm.femaleData = v.amount;
					vm.femalePer = parseFloat(v.rate).toFixed(2)+"%";
				}else{//男
					vm.femalePer = parseFloat(v.rate).toFixed(2) + "%";
				} else { //男
					maleData = v.amount;
					vm.maleData = v.amount;
					vm.malePer = parseFloat(v.rate).toFixed(2)+"%";
					vm.malePer = parseFloat(v.rate).toFixed(2) + "%";
				}
			})
			sexData(femaleData,maleData);			
			sexData(femaleData, maleData);
		}
		
		
		//年龄分布处理
		if(ageArr.status=="200"){
			 var data=ageArr.data.index_8;
			 var amountArr = [];
		if(ageArr.status == "200") {
			var data = ageArr.data.index_8;
			var amountArr = [];
			$.each(data, function(i, v) {
				amountArr.push(v.amount);
			})

+ 1 - 1
component/statistics/sign-progress-filter.js

@ -70,7 +70,7 @@
	         	console.log("name:"+name)
				//触发刷新
				this.$emit('vuedals:close', {
					year: year,
					chooseYear: year,
					id: typeCode,
					lowCode: lowCode,
					name: name,

+ 58 - 0
component/statistics/year-filter.js

@ -0,0 +1,58 @@
(function(){
    Vue.component('year-filter', {
        template: '<div style="height: 400px;overflow: auto;">\
            <div class="mt10 ml10 filter-title">统计年份</div>\
            <div class="c-row mt20 ml40">\
                <div v-for="year in years" class="c-33" :class="{\'active\': year==selectedYear}" @click="chooseYear(year)"><a>{{year}}</a></div>\
            </div>\
            <div id="footer">\
                <div class="c-row btn-wrap c-border-top fr">\
                    <div class="div-foot-btn mr20" @click="resetClick">\
                        <a href="#" class="c-666 f-fs16">重置</a>\
                    </div>\
                    <div class="div-foot-btn active" @click="confirmClick">\
                        <a href="#" class="c-666 f-fs16">确定</a>\
                    </div>\
                </div>\
            </div>\
        </div>',
        props:['selectedYear'],
        data: function(){
            return {
                years: []
            }
        },
        methods: {
            chooseYear:function(year){
                this.selectedYear = year;
            },
            resetClick:function(){
                this.selectedYear = this.years[0];
            },
            confirmClick:function(){
                //触发刷新
                var vm = this;
                Vuedals.Bus.$emit('close', {
                    chooseYear: vm.selectedYear,
                });
            }
        },
        mounted: function(){
            //显示年份最低是2016年
            var now = new Date(),
                year = now.getFullYear();
            
            if(now.getMonth() >= 6){
                this.years.push(year);
            }
            for(i=year-1; i>=2016; i--){
                this.years.push(i);
            }
            
            //如果前一个页面返回的选中的年份
            if(!this.selectedYear){
                this.selectedYear = this.years[i];
            }
        }
    })
})()

+ 1 - 0
css/style.min.css

@ -7463,3 +7463,4 @@ select {
    font-size: 16px;
    margin: 0;
}
.ui-dialog{border-color: #fff;}

login/image/BG.jpg → images/BG.jpg


二進制
images/gaoweirenqun.png


login/image/icon_chahua.png → images/icon_chahua.png


二進制
images/snashi_icon.png


login/js/security.js → js/security.js


+ 1 - 1
js/util.js

@ -26,7 +26,7 @@ Date.prototype.format = function(formatStr)
} 
function isMobilePhone(n) {
	var reg = /^1[34578]\d{9}$/
	var reg = /^1[3|4|5|6|7|8|9][0-9]{9}$/;
	return reg.test(n)
}

login/js/validate/jquery.validate.min.js → js/validate/jquery.validate.min.js


login/js/validate/messages_zh.min.js → js/validate/messages_zh.min.js


+ 168 - 0
js/waterbubble.js

@ -0,0 +1,168 @@
/**
* 水球图 wataerbubble
* @author fiona23 (fiona_fanmy@163.com)
*/
(function($) {
    $.fn.waterbubble = function(options) {
            var config = $.extend({
                radius: 100,
                lineWidth: undefined,
                data: 0.5,
                waterColor: 'rgba(25, 139, 201, 1)',
                textColor: 'rgba(06, 85, 128, 0.8)',
                font: '',
                wave: true,
                txt: undefined,
                animation: true
            }, options);
            var canvas = this[0];
//          config.lineWidth = config.lineWidth ? config.lineWidth : config.radius/24;
			config.lineWidth = options.lineWidth;
            var waterbubble = new Waterbubble(canvas, config);
            return this;
        }
        
        function Waterbubble (canvas, config) {
            this.refresh(canvas, config);
        }
        Waterbubble.prototype = {
            refresh: function (canvas, config) {
                canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height)
                this._init(canvas, config)
            },
            _init: function (canvas, config){
                var radius = config.radius;
                var lineWidth = config.lineWidth;
                canvas.width = radius*2 + lineWidth;
                canvas.height = radius*2 + lineWidth;
                this._buildShape(canvas, config);
            },
            _buildShape: function (canvas, config) {
                var ctx = canvas.getContext('2d');
                var gap = config.lineWidth*2;
                //raidus of water
                var r = config.radius - gap;
                var data = config.data;
                var lineWidth = config.lineWidth
                var waterColor = config.waterColor;
                var textColor = config.textColor;
                var font = config.font;
                var wave = config.wave
                // //the center of circle
                var x = config.radius + lineWidth/2;
                var y = config.radius + lineWidth/2;
                ctx.beginPath();
                
                ctx.arc(x, y, config.radius, 0, Math.PI*2);
                ctx.lineWidth = lineWidth;
                ctx.strokeStyle = waterColor;
                ctx.stroke();
                //if config animation true
                if (config.animation) {
                    this._animate(ctx, r, data, lineWidth, waterColor, x, y, wave)
                } else {
                    this._fillWater(ctx, r, data, lineWidth, waterColor, x, y, wave);
                }
                
                if (typeof config.txt == 'string'){
                    this._drawText(ctx, textColor, font, config.radius, data, x, y, config.txt);
                }
                return;
            },
            _fillWater: function (ctx, r, data, lineWidth, waterColor, x, y, wave) {
                ctx.beginPath();
                ctx.globalCompositeOperation = 'destination-over';
                //start co-ordinates
                var sy = r*2*(1 - data) + (y - r);
                var sx = x - Math.sqrt((r)*(r) - (y - sy)*(y - sy));
                //middle co-ordinates
                var mx = x;
                var my = sy;
                //end co-ordinates
                var ex = 2*mx - sx;
                var ey = sy;
                var extent; //extent
                if (data > 0.9 || data < 0.1 || !wave) {
                    extent = sy
                } else{
                    extent = sy - (mx -sx)/4
                }
                ctx.beginPath();
                
                ctx.moveTo(sx, sy)
                ctx.quadraticCurveTo((sx + mx)/2, extent, mx, my);
                ctx.quadraticCurveTo((mx + ex)/2, 2*sy - extent, ex, ey);
                var startAngle = -Math.asin((x - sy)/r)
                var endAngle = Math.PI - startAngle;
                ctx.arc(x, y, r, startAngle, endAngle, false)
                ctx.fillStyle = waterColor;
                ctx.fill()
            },
            _drawText: function (ctx, textColor, font, radius, data, x, y, txt) {
                ctx.globalCompositeOperation = 'source-over';
                var size = font ? font.replace( /\D+/g, '') : 0.4*radius;
                ctx.font = font ? font : 'bold ' + size + 'px Microsoft Yahei';
                txt = txt.length ? txt : data*100 + '%'
                var sy = y + size/2;
                var sx = x - ctx.measureText(txt).width/2
                ctx.fillStyle = textColor;
                ctx.fillText(txt, sx, sy)
            },
            _animate: function (ctx, r, data, lineWidth, waterColor, x, y, wave) {
                var datanow = {
                    value: 0
                };
                var requestAnimationFrame = window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (func) {
                    setTimeout(func, 16);
                };
                var self = this;
                var update = function () {
                    if (datanow.value < data - 0.01) {
                        datanow.value += (data - datanow.value)/15
                        self._runing = true;
                    } else {
                        self._runing = false;
                    }
                }
                var step = function () {
                    self._fillWater(ctx, r, datanow.value, lineWidth, waterColor, x, y, wave);
                    update();
                    if (self._runing) {
                        requestAnimationFrame(step);
                    }
                }
                step(ctx, r, datanow, lineWidth, waterColor, x, y, wave)
            }
        }
}(jQuery));

+ 0 - 249
login/common_http.js

@ -1,249 +0,0 @@
//切换发布版本 true:正式版,连接生产环境;false:测试版,连接测试环境。
var isInner = false; //发布线上后有内外网的配置
//var publish_version = true;
   var publish_version = false;
//接口服务器
var server;
var isLoginOut;//退出
var agentName = 'wlyyAgent';
if(publish_version == true) {
	//接口服务器
	server = "http://www.xmtyw.cn/wlyytest/";
	//图片文件的服务器路径
    var imgUrlDomain = "http://www.xmtyw.cn/";
    
    if(isInner){
		server = "http://10.95.22.10:8011/wlyy/"
		imgUrlDomain = "http://10.95.22.10:8011/";
	}
}else {
	//接口服务器
	server = "http://172.19.103.88:9092/wlyy/";	 
//	server = "http://192.168.131.24:8080/";//仕杰
//	server = "http://192.168.131.113:8080/";//俊杰
//	server = "http://192.168.131.102:8080/";//伟达
//	server = "http://192.168.131.133:8080/";//文杰
//	server = "http://192.168.131.131:8080/";//文彬
//	server = "http://192.168.131.127:8060/";//逸祥
    //图片文件的服务器路径
    var imgUrlDomain = "http://172.19.103.54/";
}
//弹出框通用
function ask(message,ok,cancel) {
	if(!ok){ok = function(){return;}}
	art.dialog({lock: true,artIcon: 'ask',opacity: 0.4,width: 250,title: '提示',content: message,ok:ok,cancel:cancel})
}
function loading(message){
	if(!message){message="数据加载中,请稍候..."}
	return art.dialog({lock: true,show:true,content: '<img src="../widget/artDialog/4.1.7/images/loading.gif" class="mr10"/>'+message , tips:true})
}
function tip(message,icon) {
	if(!icon){icon='error'}
	art.dialog({lock: true,artIcon: icon,title: '提示',opacity: 0.4,width: 250,content: message,time:2})
}
//newWay 新的处理错误请求的标识
function sendGet(url, params, custError, custSuccess,newWay,timeOut){
	sendPost(url, params, custError, custSuccess, "GET", timeOut, newWay);
}
//设备号
var IMEI = localStorage.getItem('WLYY_IMEI') || uuid(16, 16)
localStorage.setItem('WLYY_IMEI', IMEI)
//请求头去除中文信息
var userAgent = window.localStorage.getItem(agentName)
var sendHead = null
if(userAgent){
	var agentObj = JSON.parse(userAgent)
	agentObj.imei = localStorage.getItem('WLYY_IMEI')
	agentObj.platform = 4
	delete agentObj.name;
	delete agentObj.hospitalName;
	delete agentObj.currentUserRole.name;
	$.each(agentObj.userRole,function(i,o){
		delete o.name
	})
	sendHead = agentObj
}
/**
 * 统一请求ajax发送方法
 * url 请求地址:例如:patient/health_index/add
 * params 请求参数
 * dataType 数据类型:json等
 * reqType 请求方式:get 或 post
 * error 请求失败处理方法
 * success 请求成功处理方法
 * newWay 新的处理错误请求的标识
 */
function sendPost(url, params, custError, custSuccess,dataType, timeOut, newWay) {
	if(dataType==undefined){
		dataType="POST"
	}
	if(isLoginOut) {
		return
	}
	//发送ajax请求
	console.log(server+url);
	// 增加绝对URL(含有http://及https://)的判断,以满足跨域请求(yzh)
	var reqUrl = server + url;
	if(url&&(url.indexOf("http://")>-1 || url.indexOf("https://")>-1)) {
		reqUrl = url;
	}
	$.ajax(reqUrl,$.extend({},{
		data:params || {},
		dataType: 'json',
		type: dataType,
		beforeSend: function(request) {
			var agent = sendHead || {
                imei: localStorage.getItem('WLYY_IMEI'),
                platform: 4
            }
			request.setRequestHeader("userAgent", JSON.stringify(agent));
		},
		timeout: timeOut || 60000, 
		error: function(xht, type, throwErr) {
			console.log(type + " : " + throwErr);
			if(type=="timeout"){
				if(custError){
					custError(type);
					return ;
				}
			}
			if(custError && $.isFunction(custError)) {
				var flag = custError(xht, type, throwErr);
				if(!flag) {
					return ;
				}
			}
			if(newWay == undefined){ //旧的处理逻辑
				if(type == "timeout" || type == "abort") {				
//					alert("程序开了点小差, 请稍后重试!")
				} else if(type == "error" || type == "parsererror" || type == "null") {
//					setTimeout(function() {
//						alert("程序开了点小差, 请稍后重试!")
//					},0);
				}
			}else if(newWay){
			    alert("数据加载失败,请检查网络无误后下拉刷新。");
			}
		},
		success: function(res) {
			var tip = "";
			if(res.status == 999) {
				tip = "此账号已在别处登录,请重新登录";
				goToLogin(tip)
				return;
			} else if(res.status == 998) {
				tip = "登录超时,请重新登录";
				goToLogin(tip)
				return;
			} else if(res.status == 997) {
				tip = "此账号未登录,请先登录";
				goToLogin(tip)
				return;
			}else{
				custSuccess(res);
			}
		}
	}))
}
//跳转登录页
function goToLogin(message){
//	window.localStorage.removeItem(agentName)
	top.ask(message,function(){
		top.location.href='/health-education/login.html'
	})
}
function uuid(len, radix) {
    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
    var uuid = [],
        i;
    radix = radix || chars.length;
    if(len) {
        for(i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
    } else {
        var r;
        uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
        uuid[14] = '4';
        for(i = 0; i < 36; i++) {
            if(!uuid[i]) {
                r = 0 | Math.random() * 16;
                uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
            }
        }
    }
    return uuid.join('');
}
function getSysDate(plus) {
	var d = new Date();
	var year = d.getFullYear();
	var month = d.getMonth() + 1;
	var day = d.getDate();
	var h = d.getHours();
	var mins = d.getMinutes();
	var s = d.getSeconds();
	if(month < 10) month = "0" + month;
	if(day < 10) month = "0" + day;
	if(h < 10) h = "0" + h;
	if(mins < 10) mins = "0" + mins;
	if(s < 10) s = "0" + s;
	if(!plus) {
		return year + "-" + month + "-" + day + "" + h + ":" + mins + ":" + s;
	} else {
		return(year + 1) + "-" + month + "-" + day + "" + h + ":" + mins + ":" + s;
	}
}
function getSysDatePlus(plus) {
	var now = new Date();
	var d = new Date(now.getTime() + plus * 24 * 3600 * 1000);
	var year = d.getFullYear();
	var month = d.getMonth() + 1;
	var day = d.getDate();
	if(month < 10) month = "0" + month;
	if(day < 10) day = "0" + day;
	return year + "-" + month + "-" + day
}
//获取链接上的参数
function GetRequest() {  
   var url = location.search; //获取url中"?"符后的字串
   var theRequest = new Object();
   if (url.indexOf("?") != -1) {
      var str = url.substr(1);
      strs = str.split("&");
      for(var i = 0; i < strs.length; i ++) {
         theRequest[strs[i].split("=")[0]]=(strs[i].split("=")[1]);
      }
   }
   return theRequest;
}
var Request = GetRequest();
/*
 * 获取图片路径
 */
function getImgUrl(str){
	if(typeof str != 'string'){
	    return "";
	}
	if(str.length == 0){
        return "";
    }else{
        if(str.indexOf("../../../")>-1){
            //访问本地路径
            return str.replace('../../.','');
        }else if((str.indexOf("http://")>-1) || (str.indexOf("https://")>-1)){
            return str;
        }else{
            //服务器上的图片路径
            return imgUrlDomain + str
        }
    }
}

文件差異過大導致無法顯示
+ 0 - 12
login/css/animate.min.css


文件差異過大導致無法顯示
+ 0 - 6
login/css/bootstrap.min14ed.css


文件差異過大導致無法顯示
+ 0 - 4
login/css/font-awesome.min93e3.css


文件差異過大導致無法顯示
+ 0 - 1
login/css/style.min862f.css


二進制
login/fonts/fontawesome-webfont93e3.eot


文件差異過大導致無法顯示
+ 0 - 640
login/fonts/fontawesome-webfont93e3.svg


二進制
login/fonts/fontawesome-webfont93e3.ttf


二進制
login/fonts/fontawesome-webfont93e3.woff


二進制
login/fonts/fontawesome-webfont93e3.woff2


二進制
login/fonts/fontawesome-webfontd41d.eot


二進制
login/fonts/glyphicons-halflings-regular.eot


文件差異過大導致無法顯示
+ 0 - 288
login/fonts/glyphicons-halflings-regular.svg


二進制
login/fonts/glyphicons-halflings-regular.ttf


二進制
login/fonts/glyphicons-halflings-regular.woff


二進制
login/fonts/glyphicons-halflings-regular.woff2


二進制
login/fonts/glyphicons-halflings-regulard41d.eot


文件差異過大導致無法顯示
+ 0 - 7
login/js/bootstrap.min.js


文件差異過大導致無法顯示
+ 0 - 4
login/js/jquery.min.js


+ 0 - 177
login/js/login.js

@ -1,177 +0,0 @@
var userAgent = window.localStorage.getItem('wlyyAgentForDoc')
var $eyeIcon = $('.psw-eye'),
	$mobile1 = $('#mobile1'),
	$password = $('#password'),
	$mobile2 = $('#mobile2'),
	$captcha = $('#captcha'),
	$mobile = $('input[mobile]'),
	$tabs = $('.nav-tabs'),
	$getCaptcha = $('#getCaptcha'),
	$submit = $('button[type="submit"]');
var timer = null;
$(function() {
		bindEvent()	
	function bindEvent(){
		//密码隐藏
		$eyeIcon.click(function() {
			$el = $(this);
			if($el.hasClass('fa-eye')) {
				$el.removeClass('fa-eye').addClass('fa-eye-slash');
				$password.attr('type','password')
			} else {
				$el.removeClass('fa-eye-slash').addClass('fa-eye');
				$password.attr('type','text')
			}
		})
		//验证码定时
		function setTimer() {
			$getCaptcha.addClass('disabled');
			var seconds = 59;
			timer = setInterval(function() {
				if(seconds == 0) {
					clearInterval(timer);
					timer = null;
					seconds = 59;
					$getCaptcha.text("获取验证码");
					$getCaptcha.removeClass('disabled');
					return ;
				}
				$getCaptcha.text((seconds--)+"s后重新获取");
			}, 1000)
		}
		//表单验证
		var validator1 = $("#form1").validate({
			onsubmit: false,
			onfocusout: function(ele) {
				validator1.element(ele)
			},
		    rules: {
		        mobile1: {
					required: true,
					mobile: true,
				},
			   password: "required",
			}
		});			
		var validator2 = $("#form2").validate({
			onsubmit: false,
			onfocusout: function(ele) {
				validator2.element(ele)
			},
		    rules: {
		        mobile2: {
					required: true,
					mobile: true,
				},
			   captcha: "required",
			}
		});
		jQuery.validator.addMethod("mobile", function(value, element, param) {
			var reg=/^[1][3,4,5,7,8][0-9]{9}$/;  
		  return reg.test(value);  
		}, "手机号码有误");
		//切换tab
		$tabs.on('click','li',function() {
			var idx = $(this).index(),
				mob = '';
				
			if(idx == 1) { // 点击验证码登录选项卡
				mob = $mobile1.val();
				if(mob) {
					$mobile.val(mob);
					validator2.element($mobile2)
				}
			} else { // 点击手机登陆选项卡
				mob = $mobile2.val();
				if(mob) {
					$mobile.val(mob);
					validator1.element($mobile1)
				}
			}
		})
		//发送短信
		$getCaptcha.click(function() {
			if($getCaptcha.hasClass('disabled')) {
				return ;
			}
			if(validator2.element($mobile2)) {
				setTimer();
				sendPost('common/captcha',{mobile: $mobile2.val(),type: 5,captchaToken: 5},function(){
					ask('请求失败')
				},function(res){
					if(res.status == 200){
						tip('发送成功','add')
					}else{
						tip('获取验证码失败')
					}
				})
			}
		})
		//提交
		$submit.click(function() {
			var index = $('.nav-tabs>li.active').index();
			var mobile = '',
				password = '',
				captcha = '';
			if(index == 0) { // 点击手机登陆选项卡
				if($("#form1").valid()){
					$(this).attr('disabled','disabled')
					mobile = $mobile1.val();
					password = $password.val();
					sendPost('login/public_key',{},function(){
						tip('请求失败')
						$submit.removeAttr('disabled')
					},function(res){
						if (res.status == 200) {
							var mod = res.data.modulus;
							var exp = res.data.exponent;
							key = RSAUtils.getKeyPair(exp, "", mod);
							if (key) {
								encryedPwd = RSAUtils.encryStr(key, password);
								login({
									mobile: mobile,
									password: encryedPwd,
									platform: 4
								})
							}else {
							   tip("获取数据失败")
							   $submit.removeAttr('disabled')
							}
						}
					})
				}
			}else{ // 点击验证码登录选项卡
				if($("#form2").valid()) {
					$(this).attr('disabled','disabled')
					mobile = $mobile2.val();
					captcha = $captcha.val();
					login({
						mobile: mobile,
						captcha: captcha,
						platform: 4
					})
				}
			}
		})
		
	}
})
//登录
function login(data) {
	sendPost('login/doctor',data,function(){
		$submit.removeAttr('disabled')
		tip('请求失败')
	},function(res){
		$submit.removeAttr('disabled')
		if(res.status == 200) {
			var data = res.data;
			//添加医生到userRole
			localStorage.setItem('wlyyAgentForDoc',JSON.stringify(data))
		   	alert("登录成功")
		   	location.href = "app/record/html/record.html"
		}else{
			tip(res.msg)			
		}
	})
}