Browse Source

底部区域数据组件

raolu 7 years ago
parent
commit
d6c720d18e

+ 7 - 0
api/statistics-api.js

@ -35,6 +35,13 @@
        },
        articleLowlevelTotal: function(data){
            return httpRequest.get("/statistics/article_lowlevel_total", {data: data});
        },
        lowlevelData: function(url, data){
            return httpRequest.get(url, {data: data});
        },
        //获得团队的详情
        getTeamInfo: function(data){
            return httpRequest.get("doctor/admin-teams/teams/info", {data: data});
        }
    }

+ 115 - 0
app/statistics/area-data-panel.html

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
    <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="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">
            <area-data-panel v-on:getnewdata="getAreaData" :headers="headers" :rows="rows"></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="../../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/team-info.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="js/common.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            (function(){
                Vue.use(Vuedals.default);
                new Vue({
                    el: "#main",
                    data: {
                        headers: [],
                        rows: [],
                        level: 4,
                        lowLevel: '',
                        index: '3,22',
                        area: '350200',
                        sort: 1,
                        year: 2017,
                        endDate: '2018-03-12',
                        reqUrl: 'statistics/lowlevel_total_mesh'
                    },
                    components: {
                        vuedals: Vuedals.Component
                    },
                    methods: {
                        changeLevel: function(arg){
                            var level = arg.level;
                            if(this.level > 2 && this.lowLevel != 1){
                                console.log("next");
                                //跳转去下一级数据
                                this.level = level --;
                            }
                        },
                        changeLowlevel: function(arg){
                            //点击tab时,获取下一级的数据
                            this.lowLevel = arg.lowLevel;
                        },
                        getAreaData: function(arg){
                            this.level = arg.level;
                            this.lowLevel = arg.lowLevel;
                            this.area = arg.area;
                            getAreaData(this);
                        }
                    },
                    mounted: function(){
                        var vm = this;
                        getAreaData(vm);
                    }
                })
                
                function getAreaData(vm){
                    var params = {
                        index: vm.index,
                        level: vm.level,
                        area: vm.area,
                        sort: vm.sort,
                        year: vm.year,
                        endDate: vm.endDate,
                        lowLevel: vm.lowLevel
                    };
                    statisticAPI.lowlevelData(vm.reqUrl, params).then(function(res){
                        if(res.status == 200){
                            for(i in res.data){
                                var list = res.data[i];
                                var topArr = soreRank(getKeyValueArr(list, 'amount'));
                                var arr = _.map(list, function(o, index){
                                    var amount = o.amount.split(","); // 咨询量, 未回复咨询量
                                    return {
                                        rank: topArr[index],
                                        code: o.code,
                                        name: o.name,
                                        cols: [o.name, amount[0], amount[1]]
                                    }
                                });
                                vm.headers = ["排名", "咨询量", "未回复"];
                                vm.rows = arr;
                            }
                        }else{
                            console.log(res.msg);
                        }
                    })
                }
            })()
        </script>
    </body>
</html>

+ 27 - 6
app/statistics/css/common.css

@ -84,7 +84,7 @@
    display: -webkit-box;
    height: 45px;
    line-height: 45px;
    margin: 0 10px;
    margin: 0 50px;
    background-color: #fff;
    border: 1px solid #e1e1e1;
    border-bottom: 0;
@ -97,6 +97,19 @@
    text-align: center;
    position: relative;
}
.area-tab:after{
    content: '';
    position: absolute;
    width: 1px;
    height: 20px;
    right: 0;
    top: 50%;
    margin-top: -10px;
    background-color: #e1e1e1;
}
.area-tab:last-child:after{
    width: 0;
}
.area-tab .border-line-right{
    display: inline-block;
    position: absolute;
@ -121,10 +134,13 @@
}
.bottom-list-table{
    border-top: 1px solid #e1e1e1;
    border-left: 1px solid #e1e1e1;
    border-right: 1px solid #e1e1e1;
    background-color: #fff;
    width: 100%;
    text-align: center;
    font-size: 14px;
    border-spacing: 0;
}
.bottom-list-table thead{
    height: 40px;
@ -142,10 +158,14 @@
}
.bottom-list-table td{
    padding: 10px 0;
    border-bottom: 1px solid #e1e1e1;
}
.bottom-list-table tbody>tr{
    border-bottom: 1px solid #e1e1e1;
}
.bottom-list-table tbody>tr:hover{
    background-color: #f2f4f6;
}
/*.bottom-list-table tbody>tr:first-child{
    border-top: 0;
}*/
@ -178,24 +198,25 @@
    color: #909090;
}
.ranking{
    background-image: url(../images/paiming_4_icon.png);
    background-image: url(../../../images/paiming_4_icon.png);
    background-size: 18px 24px;
    width: 18px;
    height: 24px;
    font-size: 12px;
    line-height: 20px;
    color: #fff;
    text-align: center;
    margin-right: 5px;
    margin-right: 10px;
    -webkit-box-flex: 0;
}
.ranking1{
    background-image: url(../images/paiming_1_icon.png);
    background-image: url(../../../images/paiming_1_icon.png);
}
.ranking2{
    background-image: url(../images/paiming_2_icon.png);
    background-image: url(../../../images/paiming_2_icon.png);
}
.ranking3{
    background-image: url(../images/paiming_3_icon.png);
    background-image: url(../../../images/paiming_3_icon.png);
}
.modal-overlay{
    position: absolute;

+ 49 - 0
app/statistics/js/common.js

@ -0,0 +1,49 @@
function getStartDate(chooseYear){
    // 按年度来计算的时候,开始时间是该年度7月1号还是到下一个年的6月30号结束
    if(chooseYear == 2016){
        return chooseYear + "-08-01";
    }else{
        return chooseYear+'-07-01';
    }
}
//获取结束时间
function getEndDate(chooseYear){
    chooseYear = parseInt(chooseYear);
    var endDate = new Date((chooseYear+1) + '-06-30'),
        now = new Date();
    if(now <= endDate){
        return now.format("yyyy-MM-dd");
    }else{
        return (chooseYear+1) + '-06-30';
    }
}
/*
 * 获取用来排序的字段值,返回数组
 * 参数: list - 列表, key - 字段的名称 
 */
function getKeyValueArr(list, key){
    var arr = [];
    for(var k in list){
        arr.push(list[k][key]);
    }
    
    return arr;
}
/*
 * 排名
 */
function soreRank(arr){
    var temp = [];
    var lis = [];
    for(var i=0;i<arr.length;i++){
        lis.push(arr[i]);
    }
    lis = _.uniq(lis);
    for(var i=0;i<arr.length;i++){
        temp[i] = lis.indexOf(arr[i])+1;
    }
    
    return temp;
}

File diff suppressed because it is too large
+ 265 - 0
component/common/vuedals.js


+ 77 - 0
component/statistics/area-data-panel.js

@ -0,0 +1,77 @@
(function(){
//  Vue.component('vuedals', Vuedals.Component);
    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}" @click="getLowCodeData(3)"><span>各区</span></div>\
                    <div v-show="level >= 3" class="area-tab" :class="{\'active\': level==3 || 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>\
                <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>2 && lowLevel != 1"><i class="fa fa-angle-right"></i></td>\
                        </tr>\
                    </tbody>\
                </table>\
            </div>',
        props:['headers','rows'],
        data: function(){
            return {
//              headers: ["排名", "咨询量", "未回复"],
//              rows: [{rank: 1, cols: ["思明区", "100", "2"]}, 
//                  {rank: 2, cols: ["海沧区", "98", "1"]}],
                level: 4,
                lowLevel: '',
                area: '350200'
            }
        },
        methods: {
            getLowLeverData: function(row){
                if(this.level > 2 && this.lowLevel != 1){
                    //跳转去下一级数据
                    this.level --;
                    this.area = row.code;
                    //触发组件监听事件,去父页面请求新的数据
                    this.$emit("getnewdata", {
                        level: this.level,
                        area: this.area,
                        lowLevel: this.lowLevel
                    });
                }else{
                    //弹框显示团队信息
                    Vuedals.Bus.$emit('new', {
                        title: '团队信息',
                        component: 'team-info',
                        props: {
                            teamId: 644
                        }
                    });
                }
            },
            getLowCodeData: function(code){
                if(code == 3){
                    this.lowLevel = '';
                }else{
                    this.lowLevel = code;
                }
                
                //触发组件监听事件,去父页面请求新的数据
                this.$emit("getnewdata", {
                    level: this.level,
                    area: this.area,
                    lowLevel: this.lowLevel
                });
            }
        }
    });
})()

+ 53 - 0
component/statistics/team-info.js

@ -0,0 +1,53 @@
(function(){
    Vue.component('team-info',{
        template: '<div>\
            <div class="pt15" id="teamInfoBox">\
                <div class="plr15 pb20">\
                <span class="c-f14 c-bold c-333">团队名称:</span>\
                <span class="c-f14 c-333">{{team.name}}</span>\
            </div>\
            <div class="plr15 pb20">\
                <span class="c-f14 c-bold c-333">所在社区:</span>\
                <span class="c-f14 c-333">{{team.hospitalName}}</span>\
            </div>\
            <div class="plr15 pb20">\
                <span class="c-f14 c-bold c-333">团队长:</span>\
                <span class="c-f14 c-333">{{team.leaderName}}</span>\
            </div>\
            <div class="plr15 pb20">\
                <span class="c-f14 c-bold c-333">团队成员(<span class="span-team-count">{{memberLength}}</span>人):</span>\
                <p class="c-f14 c-333 mt10">\
                    <span v-for="member in members">{{member.name}}</span>\
                </p>\
            </div>\
        </div>',
        props:['teamId'],
        data: function(){
            return {
                team: {},
                members: [],
                memberLength: 0
            }
        },
        mounted: function(){
            console.log(this.teamId);
            var vm = this;
            getTeamInfo(vm);
        }
    });
    
    function getTeamInfo(vm){
        var params = {
            teamId: vm.teamId
        };
        statisticAPI.getTeamInfo(params).then(function(res){
            if(res.status == 200){
                vm.team = res.data.team;
                vm.members = res.data.members;
                vm.memberLength = res.data.members.length;
            }else{
                console.log(res.msg);
            }
        })
    }
})()