<style lang="less" > @import url('../../../styles/common.less'); #healthCardStatisticsChart{ background: #f6f5f9; height:100%; display: flex; flex-direction: column; .TITLE{ display:flex; align-items: center; padding:10px 15px; h1{ font-size:20px; font-weight: bold; } h3{ width:auto; font-size:12px; text-align: center; border:1px solid #ccc; border-radius: 6px; padding:2px 4px; } } .CONTENT{ flex-grow: 1; height:1px; display: flex; flex-direction: column; .activeTab1{ flex-grow: 1; height:1px; background: white; overflow: auto; -webkit-overflow-scrolling: touch; >div{ padding:10px; h3{ font-weight: bold; } } } .activeTab2{ flex-grow: 1; height:1px; background: white; overflow: auto; -webkit-overflow-scrolling: touch; .items{ display: flex; height:60px; align-items: center; margin:10px; .avatar{ height:50px; width:50px; border-radius: 50%; background: #3a8af7; display: flex; justify-content: center; align-items: center; color:white; font-size:22px; margin-right:10px; } .item{ flex:1; height:60px; border-bottom:1px solid #f6f6f6; box-sizing: border-box; display: flex; align-items: center; .name{ font-size:14px; } .time{ font-size:14px; color:#8a8a8a; text-align: right; padding-right:10px; } >div{ flex:1; } >i{ font-size: 12px; } } } } } .DESC{ padding:0 15px; font-size:14px; color:#8a8a8a; } .Card{ margin:10px 15px; font-size:12px; overflow:hidden; background:#fff; border-radius:5px; box-shadow:0 1px 3px #bababa; width:auto; display: flex; justify-content: center; align-items: center; padding:10px 0; margin-bottom: 30px; .left,.center{ border-right:1px solid #f1f1f1; } .left,.right,.center{ display: flex; flex-wrap: wrap; justify-content: center; align-items: center; flex:1; .n{ width:100%; color:#6a6a6a; font-weight: bold; font-size:20px; text-align: center; } .t{ width:100%; font-size:14px; text-align: center; color:#8a8a8a; } } } .img{ width:100%; display: flex; justify-content: center; img{ width:100%; height:300px; } } } </style> <template> <div id="healthCardStatisticsChart"> <div class="HEADER"> <div class="TITLE"> <h1>每日健康打卡({{hdr.sMonth}}{{Number(hdr.iDay) >= 10 ? hdr.iDay : '0' + hdr.iDay}}日)</h1> <!-- <h3>已结束</h3> --> </div> <div class="Card"> <div class="left"> <div class="n">{{hdr.iAll}}</div> <div class="t">应参与人员</div> </div> <div class="center" @click="routerToList(0)"> <div class="n">{{hdr.iAllJoin}}</div> <div class="t">已参与人员</div> </div> <div class="right" @click="routerToList(1)"> <div class="n">{{hdr.iAllNotJoin}}</div> <div class="t">未参与人员</div> </div> </div> </div> <div class="CONTENT"> <tab v-model="activeTab" prevent-default @on-before-index-change="switchTabItem" bar-active-color="#4572d7" active-color="#4572d7" default-color="#8a8a8a"> <tab-item :selected="activeTab == 0">数据统计</tab-item> <tab-item :selected="activeTab == 1">详细数据</tab-item> </tab> <div v-show="activeTab == 0" class="activeTab1"> <div> <h3>1.目前健康状况</h3> <div ref="chart1" v-show="set1.length > 0"> <canvas id="myChart1" width="400" height="300" style="width:100%;height:300px;"></canvas> </div> <div class="img" v-if="set1.length <= 0"> <img src="@/assets/noData.jpg" class="_img" alt=""> </div> </div> <div> <h3>2.自2020年1月1日起,是否在湖北停留或路过,或解除过来自湖北的人员饼状图</h3> <div ref="chart2" v-show="set2.length > 0"> <canvas id="myChart2" width="400" height="300" style="width:100%;height:300px;"></canvas> </div> <div class="img" v-if="set2.length <= 0"> <img src="@/assets/noData.jpg" class="_img" alt=""> </div> </div> <div> <h3>3.是否接触过疑似或确诊的新型肺炎患者</h3> <div ref="chart3" v-show="set3.length > 0"> <canvas id="myChart3" width="400" height="300" style="width:100%;height:300px;"></canvas> </div> <div class="img" v-if="set3.length <= 0"> <img src="@/assets/noData.jpg" class="_img" alt=""> </div> </div> </div> <div v-show="activeTab == 1" class="activeTab2" ref="scrollDom" @scroll="scrollToBottom"> <div class="items" v-for="(item,index) in list" :key="index" @click="routerToPunchClockDetail(item)"> <div class="avatar"> <img src="" alt=""> <span>{{item.sEmploeeName[0]}}</span> </div> <div class="item"> <div class="name">{{item.sEmploeeName}}</div> <div class="time">{{item.dCheckDate}}</div> <i class="iconfont icon-youjiantou"></i> </div> </div> <div class="img" v-if="list.length <= 0"> <img src="@/assets/noData.jpg" class="_img" alt=""> </div> </div> </div> </div> </template> <script> import Util from '@/libs/util.js'; import {mapState} from 'vuex'; import { Tab, TabItem } from 'vux' const F2 = require('@antv/f2/lib/index') const PieLabel = require('@antv/f2/lib/plugin/pie-label'); // 引入 PieLabel 模块 const Legend = require('@antv/f2/lib/plugin/legend'); F2.Chart.plugins.register(Legend); // 方式一:全局注册 F2.Chart.plugins.register(PieLabel); export default { name: 'healthCardStatisticsChart', data () { return { activeTab:0, myChart1:null, myChart2:null, myChart3:null, set1:[], set2:[], set3:[], list:[], page:1, per_page:20, y:0 } }, components:{ Tab, TabItem }, computed:{ ...mapState({ hdr:state => state.healthStatistics.hdr, openId:state => state.healthStatistics.openId }) }, async mounted(){ }, async activated(){ window.d = this; if(this.activeTab == 0){ await this.getData(); }else{ this.page = 1; this.per_page = 20; this.list = []; await this.getList(); } window.addEventListener("resize",()=>{ setTimeout(()=>{ this.myChart1.changeSize(this.$refs['chart1'].offsetWidth); // 清除 this.myChart1.destroy(); this.myChart2.changeSize(this.$refs['chart2'].offsetWidth); // 清除 this.myChart2.destroy(); this.myChart3.changeSize(this.$refs['chart3'].offsetWidth); // 清除 this.myChart3.destroy(); this.renderChart1(); this.renderChart2(); this.renderChart3(); }) }); this.$nextTick(async ()=>{ await this.renderChart1(); await this.renderChart2(); await this.renderChart3(); }) }, methods:{ switchTabItem(index){ this.activeTab = index; if(this.activeTab == 0){ this.getData(); }else{ this.getList(); } }, renderChart1 () { this.myChart1 = new F2.Chart({ id: 'myChart1', pixelRatio: window.devicePixelRatio, plugins: [PieLabel,Legend] }); this.myChart1.source(this.set1); this.myChart1.coord('polar', { transposed: true, radius: 0.9, }); this.myChart1.axis(false); this.myChart1.tooltip(false); this.myChart1.legend('title', { position: 'bottom' }) this.myChart1.guide() .html({ position: [ '50%', '50%' ], html: '<div style="text-align: center;width:150px;height: 50px;">\n <p style="font-size: 12px;color: #999;margin: 0" id="title"></p>\n <p style="font-size: 18px;color: #343434;margin: 0;font-weight: bold;" id="money"></p>\n </div>' }); this.myChart1.pieLabel({ sidePadding: 30, activeShape: true, label1: function label1(data) { return { text: data.value, fill: '#343434', fontWeight: 'bold' }; }, label2: function label2(data) { return { text: data.title, fill: '#999' }; }, onClick: function onClick(ev) { const data = ev.data; if (data) { } } }); this.myChart1.interval() .position('const*value') .color('title', [ '#ff9900', '#19be6b', '#2d8cf0' ]) .adjust('stack') this.myChart1.render(); }, renderChart2 () { this.myChart2 = new F2.Chart({ id: 'myChart2', pixelRatio: window.devicePixelRatio, plugins: [PieLabel,Legend] }); this.myChart2.source(this.set2); this.myChart2.coord('polar', { transposed: true, radius: 0.9, }); this.myChart2.axis(false); this.myChart2.tooltip(false); this.myChart2.legend('title', { position: 'bottom' }) this.myChart2.guide() .html({ position: [ '50%', '50%' ], html: '<div style="text-align: center;width:150px;height: 50px;">\n <p style="font-size: 12px;color: #999;margin: 0" id="title"></p>\n <p style="font-size: 18px;color: #343434;margin: 0;font-weight: bold;" id="money"></p>\n </div>' }); this.myChart2.pieLabel({ sidePadding: 30, activeShape: true, label1: function label1(data) { return { text: data.value, fill: '#343434', fontWeight: 'bold' }; }, label2: function label2(data) { return { text: data.title, fill: '#999' }; }, onClick: function onClick(ev) { const data = ev.data; if (data) { } } }); this.myChart2.interval() .position('const*value') .color('title', [ '#ff9900', '#19be6b' ]) .adjust('stack') this.myChart2.render(); }, renderChart3 () { this.myChart3 = new F2.Chart({ id: 'myChart3', pixelRatio: window.devicePixelRatio, plugins: [PieLabel,Legend] }); this.myChart3.source(this.set3); this.myChart3.coord('polar', { transposed: true, radius: 0.9, }); this.myChart3.axis(false); this.myChart3.tooltip(false); this.myChart3.legend('title', { position: 'bottom' }) this.myChart3.guide() .html({ position: [ '50%', '50%' ], html: '<div style="text-align: center;width:150px;height: 50px;">\n <p style="font-size: 12px;color: #999;margin: 0" id="title"></p>\n <p style="font-size: 18px;color: #343434;margin: 0;font-weight: bold;" id="money"></p>\n </div>' }); this.myChart3.pieLabel({ sidePadding: 30, activeShape: true, label1: function label1(data) { return { text: data.value, fill: '#343434', fontWeight: 'bold' }; }, label2: function label2(data) { return { text: data.title, fill: '#999' }; }, onClick: function onClick(ev) { const data = ev.data; if (data) { } } }); this.myChart3.interval() .position('const*value') .color('title', [ '#ff9900', '#19be6b' ]) .adjust('stack') this.myChart3.render(); }, async getData(){ let res = await this.request('getStatisticalDetails',{ data:[ {key:'url',value:'statistical_details_data'}, {key:'dDate',value: this.hdr.dDate}, {key:'iCompanyId',value: this.hdr.iCompanyId} ], params:{}, },'加载中',{}); if(Util.getType(res) == 'object') { this.set1 = [ { title:'感染', value:res.set1[0].iFever, const: 'const' }, { title:'健康', value:res.set1[0].iHealthy, const: 'const' }, { title:'其他', value:res.set1[0].iOther, const: 'const' } ]; this.set2 = [ { title:'接触', value:res.set2[0].bHaveBeenTrue, const: 'const' }, { title:'未接触', value:res.set2[0].bHaveBeenFalse, const: 'const' } ]; this.set3 = [ { title:'停留', value:res.set3[0].bTouchTrue, const: 'const' }, { title:'未停留', value:res.set3[0].bTouchFalse, const: 'const' } ]; this.set1 = this.set1.filter(x=>x.value > 0); this.set2 = this.set2.filter(x=>x.value > 0); this.set3 = this.set3.filter(x=>x.value > 0); } }, async getList(){ if(this.per_page < 20){ this.$vux.toast.text('已加载全部数据!', 'middle') return false; } let res = await this.request('getStatisticalDetails',{ data:[ {key:'url',value:'HealthLog'}, {key:'dDate',value: this.hdr.dDate}, {key:'iCompanyId',value: this.hdr.iCompanyId}, {key:'iType',value:'1'} ], params:{ page:this.page, per_page:this.per_page }, },'加载中',{}); if(res && res.length > 0){ this.list = this.list.concat(res); this.page++; this.per_page = res.length; } }, scrollToBottom(){ let scrollDom = this.$refs['scrollDom']; if(Util.scrollToBottom(scrollDom)){ this.getList(); } }, routerToList(type){ this.$router.push({name:'healthCardStatisticsList',params:{type:type}}); }, routerToPunchClockDetail(item){ this.$router.push({name:'punchClockDetail',params:{id:'1',address:'1',openId:item.sCreateAppid},query:{readOnly:'2',dDate:new Date(Util.dateFormat(this.hdr.dDate,'yyyy-MM-dd')).getTime()}}) } } } </script>