|
@@ -0,0 +1,1295 @@
|
|
|
+<template>
|
|
|
+ <div style="height: 100%;width: 100%;">
|
|
|
+
|
|
|
+ <div class="screenBox back" v-if="isPCa">
|
|
|
+ <el-alert v-if="isShowError" :title="errorMsg" type="error"></el-alert>
|
|
|
+ <div v-if="result.company" style="height: 100%;">
|
|
|
+ <header>
|
|
|
+ <div style="height: 3rem;padding: 0 2rem;font-size: 20px;" class="zhuColor flex-box-ce">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <img :src="result.company.logo" class="logo" />
|
|
|
+ <div>{{ result.company.name }}</div>
|
|
|
+ </div>
|
|
|
+ <div style="width: 400px;"></div>
|
|
|
+ <div class="flex-1 flex-box-end flex-box-ce">
|
|
|
+ <div>{{ nowTime }}</div>
|
|
|
+ <el-tooltip class="item" effect="dark" content="切换大屏" placement="bottom">
|
|
|
+ <i class="el-icon-sort" style="margin:0 10px;cursor: pointer;transform: rotate(90deg);" @click="isShowlists"></i>
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip class="item" effect="dark" content="全屏" placement="bottom">
|
|
|
+ <img src="./assets/image/qp.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="fullScreen"/>
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip class="item" effect="dark" content="退出" placement="bottom">
|
|
|
+ <img src="./assets/image/quit.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="quit"/>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="zhuColor title" style="width: 400px;margin: 0 auto;height: 20px;text-align: center;">
|
|
|
+ <span>{{ result.title }}</span>
|
|
|
+ </div>
|
|
|
+ </header>
|
|
|
+ <div style="height: 10px;"></div>
|
|
|
+ <div class="flex-box" style="height: calc(100% - 128px);padding: 16px;padding-bottom: 0;">
|
|
|
+ <div class="flex-2 box" id="left">
|
|
|
+ <div class="boxTitle">
|
|
|
+ <span v-if="result.config.ranking_type">
|
|
|
+ {{result.config.ranking_type=='ranking'? result.config.ranking.name:result.config.ranking_total.name }}
|
|
|
+ </span>
|
|
|
+ <span v-else>
|
|
|
+ {{result.config.ranking.name}}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div class="ranking" style="border-radius: 8px;margin: 16px;margin-top: 0px;">
|
|
|
+ <template v-if="rankingList.length>0">
|
|
|
+ <template v-if="rankingList.length==4">
|
|
|
+ <div style="margin-bottom: 8px;border-radius: 8px;box-shadow: 0 8px 8px #191E48;margin-top: 16px;">
|
|
|
+ <div v-for="(item, index) in result.ranking.list" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <template v-if="item.rank < 4">
|
|
|
+ <div v-if="item.rank == 1" class="index"><img src="./assets/image/1.png" /></div>
|
|
|
+ <div v-if="item.rank == 2" class="index"><img src="./assets/image/2.png" /></div>
|
|
|
+ <div v-if="item.rank == 3" class="index"><img src="./assets/image/3.png" /></div>
|
|
|
+ </template>
|
|
|
+ <div style="font-size: 20px;width: 36px;text-align: center;" v-else>{{ item.rank }}</div>
|
|
|
+ <userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 20px;margin-bottom: 5px;">{{ item.employee.name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 14px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num">{{ item.s_point }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div style="margin-bottom: 8px;border-radius: 8px;box-shadow: 0 8px 8px #191E48;margin-top: 16px;">
|
|
|
+ <div v-for="(item, index) in ranking(rankingList, 1)" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <template v-if="item.rank < 4">
|
|
|
+ <div v-if="item.rank == 1" class="index"><img src="./assets/image/1.png" /></div>
|
|
|
+ <div v-if="item.rank == 2" class="index"><img src="./assets/image/2.png" /></div>
|
|
|
+ <div v-if="item.rank == 3" class="index"><img src="./assets/image/3.png" /></div>
|
|
|
+ </template>
|
|
|
+ <userImage :user_name="item.employee_name" :img_url="item.employee_img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 20px;margin-bottom: 5px;">{{ item.employee_name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 14px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num">{{ item.point }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <vue-seamless-scroll :data="rankingList" class="seamless-warp" :style="{height:h1+'px'}" :class-option="classOption">
|
|
|
+ <div v-for="(item, index) in ranking(rankingList,2)" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <div style="font-size: 20px;width: 36px;text-align: center;">{{ item.rank }}</div>
|
|
|
+ <userImage :user_name="item.employee_name" :img_url="item.employee_img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 20px;margin-bottom: 5px;">{{ item.employee_name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 14px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}}<span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num">{{ item.point }}</div>
|
|
|
+ </div>
|
|
|
+ </vue-seamless-scroll>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">暂无数据</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-3" style="margin: 0 16px;height: 100%;">
|
|
|
+ <div class="flex-box-ce numBox" style="margin-bottom: 16px;">
|
|
|
+ <div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;margin-right: 16px;background-image: linear-gradient(to top, #2537F7 0%, #258CF6 100%);" @click="endVal = 5123">
|
|
|
+ <div style="font-size: 2rem;margin-bottom: 1rem;">今日奖分</div>
|
|
|
+ <div style="font-size: 4.2rem;font-weight: 600;letter-spacing:8px;position: relative;">
|
|
|
+ <countTo :startVal="startVal" separator="" :endVal="result.center.all_add_point" :duration="3000"></countTo>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;background-image: linear-gradient(to top, #6342E9 0%, #8468F3 100%);">
|
|
|
+ <div style="font-size: 2rem;margin-bottom: 1rem;">今日人次</div>
|
|
|
+ <div style="font-size: 4.2rem;font-weight: 600;letter-spacing:8px">
|
|
|
+ <countTo :startVal="startVal" separator="" :endVal="result.center.count" :duration="3000"></countTo>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="background-color: rgba(23, 30, 72, 0.3); border-radius: 8px;position: relative;">
|
|
|
+ <div class="boxTitle" style="margin-bottom: 30px;">积分制运用活跃度</div>
|
|
|
+ <div class="flex-box-ce" style="position: absolute;color:#fff;font-size:16px;right: 20px;top:108px">
|
|
|
+ <span style="height: 2px;width: 30px;background-color: #E6A23C;"></span>
|
|
|
+ 基准标尺</div>
|
|
|
+ <div ref="ManagerSAwardChart" class="chart" :style="{height:h2+'px'}"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-2 box">
|
|
|
+ <div class="boxTitle">{{ result.event.name }}</div>
|
|
|
+ <div class="ranking">
|
|
|
+ <template v-if="result.event.list.length">
|
|
|
+ <vue-seamless-scroll :data="returnEvent(result.event.list)" class="seamless-warp" style="margin: 16px;" :style="{height:h3+'px'}" :class-option="classOption">
|
|
|
+ <div v-for="(item, index) in returnEvent(result.event.list)" :key="item.id" class="flex-box rankingItem" style="margin-bottom: 10px;background-color: #1B3A70">
|
|
|
+ <div class="main-right flex-1">
|
|
|
+ <div class="context">{{ $moment.unix(item.event_time).format('YYYY-MM-DD') }}-{{ item.remark.customize ? item.remark.customize : item.remark.rule }}</div>
|
|
|
+ <div class="flex-box flex-v-ce">
|
|
|
+ <div class="name flex-1">{{ item.employee_name}}</div>
|
|
|
+ <div class="da" v-if="item.point > 0">+{{ item.point }} <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
|
|
|
+ <div class="red da" v-else>{{ item.point }} <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </vue-seamless-scroll>
|
|
|
+ </template>
|
|
|
+ <div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">暂无数据</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="text-align: center;padding: 6px 0;font-size: 16px;color: #ccc;">@功道云积分制-提供技术支持</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-all" v-else style="height: 100%;">
|
|
|
+ <i class="el-icon-loading" style="margin-top: 15%;width: 150px;margin-bottom: 10px;color: #fff;font-size: 64px;"></i>
|
|
|
+ <div style="color: #fff;">管理执行难,就用功道云</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-else style="height: 100%;" class="back">
|
|
|
+ <el-alert v-if="isShowError" :title="errorMsg" type="error"></el-alert>
|
|
|
+ <div v-if="result.company" style="height: 100%;">
|
|
|
+ <header>
|
|
|
+ <div style="height: 2.4rem;padding: 0 1rem;font-size: 14px;" class="zhuColor flex-box-ce">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <img :src="result.company.logo" class="logo" style="width: 1.4rem;height: 1.4rem;" />
|
|
|
+ <div>{{ result.company.name }}</div>
|
|
|
+ </div>
|
|
|
+ <div style="width: 260px;"></div>
|
|
|
+ <div class="flex-1 flex-box-end flex-box-ce">
|
|
|
+ <div>{{ nowTime }}</div>
|
|
|
+ <el-tooltip class="item" effect="dark" content="切换大屏" placement="bottom">
|
|
|
+ <i class="el-icon-sort" style="margin:0 10px;cursor: pointer;transform: rotate(90deg);" @click="isShowlists"></i>
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip class="item" effect="dark" content="全屏" placement="bottom">
|
|
|
+ <img src="./assets/image/qp.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="fullScreen"/>
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip class="item" effect="dark" content="退出" placement="bottom">
|
|
|
+ <img src="./assets/image/quit.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="quit"/>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="zhuColor title2" style="width: 260px;margin: 0 auto;height: 14px;text-align: center;">
|
|
|
+ <span style="font-size: 20px;top: -1rem;">{{ result.title }}</span>
|
|
|
+ </div>
|
|
|
+ </header>
|
|
|
+ <div style="height: 10px;"></div>
|
|
|
+ <div class="flex-box" style="height: calc(100% - 92px);padding: 0 10px;">
|
|
|
+ <div class="flex-2 box" id="left">
|
|
|
+ <div class="boxTitle2">
|
|
|
+ <span v-if="result.config.ranking_type">
|
|
|
+ {{result.config.ranking_type=='ranking'? result.config.ranking.name:result.config.ranking_total.name }}
|
|
|
+ </span>
|
|
|
+ <span v-else>
|
|
|
+ {{result.config.ranking.name}}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div class="ranking" style="border-radius: 8px;margin: 10px;">
|
|
|
+ <template v-if="rankingList.length>0">
|
|
|
+ <template v-if="rankingList.length==4">
|
|
|
+ <div style="box-shadow: 0 5px 5px #1d2242;margin-bottom: 5px;border-radius: 8px;">
|
|
|
+ <div v-for="(item, index) in rankingList" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <template v-if="item.rank < 4">
|
|
|
+ <div v-if="item.rank == 1" class="index2"><img src="./assets/image/1.png" /></div>
|
|
|
+ <div v-if="item.rank == 2" class="index2"><img src="./assets/image/2.png" /></div>
|
|
|
+ <div v-if="item.rank == 3" class="index2"><img src="./assets/image/3.png" /></div>
|
|
|
+ </template>
|
|
|
+ <div v-else style="font-size: 14px;width: 1.4rem;text-align: center;">{{ item.rank }}</div>
|
|
|
+ <userImage :user_name="item.employee_name" :img_url="item.employee_img_url" width="30px" height="30px" style="margin: 0 6px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 14px;">{{ item.employee_name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 12px;margin-top: 5px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num" style="font-size: 14px;">{{ item.s_point }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div style="box-shadow: 0 5px 5px #1d2242;margin-bottom: 5px;border-radius: 8px;">
|
|
|
+ <div v-for="(item, index) in ranking(rankingList, 1)" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <template v-if="item.rank < 4">
|
|
|
+ <div v-if="item.rank == 1" class="index2"><img src="./assets/image/1.png" /></div>
|
|
|
+ <div v-if="item.rank == 2" class="index2"><img src="./assets/image/2.png" /></div>
|
|
|
+ <div v-if="item.rank == 3" class="index2"><img src="./assets/image/3.png" /></div>
|
|
|
+ </template>
|
|
|
+ <userImage :user_name="item.employee_name" :img_url="item.employee_img_url" width="30px" height="30px" style="margin: 0 6px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 14px;">{{ item.employee_name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 12px;margin-top: 5px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num" style="font-size: 14px;">{{ item.point }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <vue-seamless-scroll :data="rankingList" class="seamless-warp" :style="{height:h4+'px'}" :class-option="classOption">
|
|
|
+ <div v-for="(item, index) in ranking(rankingList, 2)" :key="index" class="flex-box-ce rankingItem">
|
|
|
+ <div class="flex-1 flex-box-ce">
|
|
|
+ <div style="font-size: 14px;width: 1.4rem;text-align: center;">{{ item.rank }}</div>
|
|
|
+ <userImage :user_name="item.employee_name" :img_url="item.employee_img_url" width="30px" height="30px" style="margin: 0 6px;"></userImage>
|
|
|
+ <div>
|
|
|
+ <div style="font-size: 14px;">{{ item.employee_name }}</div>
|
|
|
+ <div class="fontColorD" style="font-size: 12px;margin-top: 5px;" v-if="item.dept_list.length>0">
|
|
|
+ {{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="num" style="font-size: 14px;">{{ item.point }}</div>
|
|
|
+ </div>
|
|
|
+ </vue-seamless-scroll>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">
|
|
|
+ 暂无数据
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-3" style="margin: 0 10px;height: 100%;">
|
|
|
+ <div class="flex-box-ce numBox" style="margin-bottom: 10px">
|
|
|
+ <div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;margin-right: 16px;background-image: linear-gradient(to top, #2537F7 0%, #258CF6 100%);height: 5rem;" @click="endVal = 5123">
|
|
|
+ <div style="font-size: 0.9rem;margin-bottom: 0.4rem;">今日奖分</div>
|
|
|
+ <div style="font-size: 2rem;font-weight: 600;letter-spacing:8px;position: relative;">
|
|
|
+ <countTo :startVal="startVal" separator="" :endVal="result.center.all_add_point" :duration="3000"></countTo>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;background-image: linear-gradient(to top, #6342E9 0%, #8468F3 100%);height: 5rem;">
|
|
|
+ <div style="font-size: 0.9rem;margin-bottom: 0.4rem;">今日人次</div>
|
|
|
+ <div style="font-size: 2rem;font-weight: 600;letter-spacing:8px">
|
|
|
+ <countTo :startVal="startVal" separator="" :endVal="result.center.count" :duration="3000"></countTo>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="background-color: rgba(23, 30, 72, 0.3); border-radius: 8px;position: relative;">
|
|
|
+ <div class="boxTitle2" >积分制运用活跃度</div>
|
|
|
+ <div class="flex-box-ce" style="position: absolute;color:#fff;font-size:12px;right: 10px;top:72px">
|
|
|
+ <span style="height: 2px;width: 20px;background-color: #E6A23C;"></span>
|
|
|
+ 基准标尺</div>
|
|
|
+ <div ref="ManagerSAwardChart" class="chart" style="position: relative;top: 20px;" :style="{height:h5+'px'}"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-2 box">
|
|
|
+ <div class="boxTitle2">{{ result.event.name }}</div>
|
|
|
+ <div class="ranking">
|
|
|
+ <template v-if="result.event.list.length">
|
|
|
+ <vue-seamless-scroll :data="returnEvent(result.event.list)" style="margin: 10px;" class="seamless-warp" :style="{height:h6+'px'}" :class-option="classOption">
|
|
|
+ <div v-for="(item, index) in returnEvent(result.event.list)" :key="item.id" class="flex-box rankingItem" style="margin-bottom: 10px;background-color: #1B3A70">
|
|
|
+ <div class="main-right2 flex-1">
|
|
|
+ <div class="context">{{ $moment.unix(item.event_time).format('YYYY-MM-DD') }}-{{ item.remark.customize ? item.remark.customize : item.remark.rule }}</div>
|
|
|
+ <div class="flex-box flex-v-ce">
|
|
|
+ <div class="name flex-1">{{ item.employee_name }}</div>
|
|
|
+ <div style="font-size: 16px;" v-if="item.point > 0">+{{ item.point }} <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
|
|
|
+ <div style="font-size: 16px;" class="red " v-else>{{ item.point }} <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </vue-seamless-scroll>
|
|
|
+ </template>
|
|
|
+ <div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">暂无数据</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style="text-align: center;padding: 6px 0;font-size: 8px;color:#C0C4CC;">@功道云积分制-提供技术支持</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-all" v-else style="height: 100%;">
|
|
|
+ <i class="el-icon-loading" style="margin-top: 15%;width: 150px;margin-bottom: 10px;color: #fff;font-size: 64px;"></i>
|
|
|
+ <div style="color: #fff;">管理执行难,就用功道云</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-dialog title="扫码登录" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false" :visible.sync="innerVisible" width="444px">
|
|
|
+ <div style="border-radius: 15px;border: 1px solid #f1f1f1;padding: 10px; width: 346px;box-sizing: border-box;margin: 0 auto;">
|
|
|
+ <div id="qrcode" ref="qrcode"></div>
|
|
|
+ </div>
|
|
|
+ <div style="margin-top: 10px;text-align: center;color: #666;">请使用钉钉APP扫描二维码,如刷新二维码请重新扫码</div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 弹窗 -->
|
|
|
+ <el-dialog title="选择需要展示的数据大屏" top="10vh" :visible.sync="isShowList" width="700px" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false">
|
|
|
+ <div>
|
|
|
+ <div class="flex-box-ce" style="color: #909399;font-weight: 600;padding: 12px 0;border-bottom: 1px solid #EBEEF5;">
|
|
|
+ <div style="width: 40px"></div>
|
|
|
+ <div class="flex-2">大屏名称</div>
|
|
|
+ <div class="flex-3">备注</div>
|
|
|
+ </div>
|
|
|
+ <div style="height: 430px;overflow-y: scroll;" class="scroll-bar">
|
|
|
+ <div class="flex-box-ce list-item" :class="item.code==selectCode? 'bjs':''" @click="handleSelectionChange(item)" v-for="(item,index) in screenList" :key="index">
|
|
|
+ <div style="width: 40px;text-align: center;position: relative;">
|
|
|
+ <el-checkbox :key="item.id" v-model="item.code==selectCode"></el-checkbox>
|
|
|
+ <div style="width: 40px;height: 40px;position: absolute;top: -10px;z-index: 999;"></div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-2">{{item.name}}</div>
|
|
|
+ <div class="flex-3">{{item.remark}}</div>
|
|
|
+ </div>
|
|
|
+ <noData v-if="screenList.length==0"></noData>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="flex-box-end" style="margin-top: 20px;position: sticky; bottom: 0; z-index: 9999;background-color: #fff;">
|
|
|
+ <!-- <el-button @click="isShowList = false" v-if="isShowBtn">取消</el-button> -->
|
|
|
+ <el-button type="primary" :disabled="isShowlog" :loading="isShowlog" @click="opneWebSocket()">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import vueSeamlessScroll from 'vue-seamless-scroll';
|
|
|
+import ScaleBox from '@/components/ScaleBox.vue';
|
|
|
+import countTo from 'vue-count-to';
|
|
|
+import moment from 'moment' // 时间库
|
|
|
+import {setToken,generateUUID} from '@/api/auth';
|
|
|
+import QRCode from 'qrcodejs2';
|
|
|
+export default {
|
|
|
+ name: 'screen',
|
|
|
+ components: { vueSeamlessScroll, ScaleBox, countTo },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ startVal: 0,
|
|
|
+ endVal: 321,
|
|
|
+ nowTime: '',
|
|
|
+
|
|
|
+ // 长连接结果
|
|
|
+ result: {}, //提交的返回结果集合
|
|
|
+ code: '',
|
|
|
+ isDp:false,
|
|
|
+ isShowlog:false,
|
|
|
+
|
|
|
+ h1:'',
|
|
|
+ h2:'',
|
|
|
+ h3:'',
|
|
|
+ errorMsg:'',
|
|
|
+ isShowError:false,
|
|
|
+ isPCa:true,
|
|
|
+ h4:'',
|
|
|
+ h5:'',
|
|
|
+ h6:'',
|
|
|
+ preview:false,
|
|
|
+
|
|
|
+ isSetInterval:'',
|
|
|
+ rankingList:[],
|
|
|
+
|
|
|
+ innerVisible:false,
|
|
|
+ generateId:'',//唯一标识
|
|
|
+ corpId:'',//企业ID
|
|
|
+ screenList:[],//
|
|
|
+ isShowList:false,
|
|
|
+ isShowBtn:false,
|
|
|
+ selectCode:'',
|
|
|
+ };
|
|
|
+ },
|
|
|
+ watch:{
|
|
|
+ innerVisible(val){
|
|
|
+ if(!val){
|
|
|
+ this.closeCode();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ classOption() {
|
|
|
+ return {
|
|
|
+ step: 0.5, // 数值越大速度滚动越快
|
|
|
+ limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
|
|
|
+ hoverStop: true, // 是否开启鼠标悬停stop
|
|
|
+ direction: 1, // 0向下 1向上 2向左 3向右
|
|
|
+ openWatch: true, // 开启数据实时监控刷新dom
|
|
|
+ singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
|
|
|
+ singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
|
|
|
+ waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
|
|
|
+ };
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.isPCa=this.IsPC()
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ if(this.$route.query.corpId){ //扫码登录
|
|
|
+ this.corpId=window.atob(this.$route.query.corpId);
|
|
|
+ if(this.$getCache('codeSan')){
|
|
|
+ this.code=this.$getCache('codeSan')
|
|
|
+ this.selectCode=this.$getCache('codeSan')
|
|
|
+ this.getScreenList(true);
|
|
|
+ this.opneWebSocket();
|
|
|
+ }else{
|
|
|
+ this.ruleQRcode();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.timeFormate();
|
|
|
+ window.addEventListener('resize', this.selfAdaption);
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ isShowlists(){
|
|
|
+ this.isShowBtn=true;
|
|
|
+ this.selectCode=this.code
|
|
|
+ this.isShowList=true;
|
|
|
+ },
|
|
|
+ handleSelectionChange(item) {
|
|
|
+ this.selectCode=item.code
|
|
|
+ },
|
|
|
+ getInfo(){
|
|
|
+ let setLT=setInterval(()=>{
|
|
|
+ this.$axios('get', '/api/auth/qr',{code:this.generateId}).then(res => {
|
|
|
+ let info=res.data.data.info
|
|
|
+ if(info&&info.token){
|
|
|
+ this.$message.success('登录成功');
|
|
|
+ this.innerVisible = false;
|
|
|
+ setToken(info.token)
|
|
|
+ this.getScreenList(false);
|
|
|
+ clearInterval(setLT)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },5000)
|
|
|
+ },
|
|
|
+ getScreenList(is) {
|
|
|
+ this.$axios('get', '/api/integral/site/screen').then(res => {
|
|
|
+ let list=res.data.data.list;
|
|
|
+ this.screenList = res.data.data.list;
|
|
|
+ if(!is){
|
|
|
+ if(this.screenList.length==1){
|
|
|
+ this.selectCode=this.screenList[0].code
|
|
|
+ this.opneWebSocket();
|
|
|
+ }else{
|
|
|
+ this.isShowList=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 关闭弹框,清除已经生成的二维码
|
|
|
+ closeCode() {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.$refs.qrcode.innerHTML = '';
|
|
|
+ }, 150);
|
|
|
+ },
|
|
|
+ ruleQRcode() {
|
|
|
+ this.innerVisible = true;
|
|
|
+ this.generateId=generateUUID()
|
|
|
+ // 使用$nextTick确保数据渲染
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.getInfo();
|
|
|
+ this.payOrder();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ payOrder () {// 展示二维码
|
|
|
+ let url = 'dingtalk://dingtalkclient/action/open_micro_app'
|
|
|
+ let appid = '?appId='+this.$appId
|
|
|
+ let corpId = '&corpId='+this.corpId
|
|
|
+ let page = '&page='+encodeURIComponent(`pages/arLogin/arLogin?code=${encodeURIComponent(this.generateId)}`)//encodeURIComponent('小米')
|
|
|
+ let urls = url+appid+corpId+page
|
|
|
+ var qrcode = new QRCode('qrcode', {
|
|
|
+ text: urls, // 二维码内容
|
|
|
+ width: 325,
|
|
|
+ height: 325,
|
|
|
+ render: 'table', // 设置渲染方式(有两种方式 table和canvas,默认是canvas)
|
|
|
+ colorDark: '#34373e', // 二维码色
|
|
|
+ colorLight: '#ffffff', // 背景色
|
|
|
+ correctLevel: QRCode.CorrectLevel.H // 容错等级,H是heigh,最高,所以二维码看起来很密
|
|
|
+ })
|
|
|
+ },
|
|
|
+ IsPC() {
|
|
|
+ var userAgentInfo = navigator.userAgent;
|
|
|
+ var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];
|
|
|
+ var flag = true;
|
|
|
+ for (var v = 0; v < Agents.length; v++) {
|
|
|
+ if (userAgentInfo.indexOf(Agents[v]) > 0) {
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ },
|
|
|
+ quit(){
|
|
|
+ this.result={};
|
|
|
+ this.code='';
|
|
|
+ this.selectCode='';
|
|
|
+ this.isShowBtn=false;
|
|
|
+ this.$removeCache('A-Token');
|
|
|
+ this.$removeCache('codeSan');
|
|
|
+ this.$socketApiTow.closewebsocket()
|
|
|
+ this.ruleQRcode();
|
|
|
+ },
|
|
|
+ opneWebSocket() {
|
|
|
+ this.isShowlog=true;
|
|
|
+ this.code=this.selectCode
|
|
|
+ this.$socketApiTow.closewebsocket()
|
|
|
+ if (!this.code) {
|
|
|
+ this.$message.error('请选择需要展示的大屏');
|
|
|
+ this.isShowlog=false;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ this.$setCache('codeSan', this.code);
|
|
|
+ this.$socketApiTow.sendData({ type: 'screen', code: this.code }, this.onmessageWS);
|
|
|
+ },
|
|
|
+ onmessageWS(e) {
|
|
|
+ this.isShowlog=false;
|
|
|
+ if (e.type == 'screen') {
|
|
|
+ if (e.code != 1) {
|
|
|
+ this.result={};
|
|
|
+ if(e.code=='-2'||e.code=='-3'){
|
|
|
+ this.isShowList=false;
|
|
|
+ this.$alert('大屏配置已被修改或过期,请重新扫码登录', '扫码登录', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ callback: action => {
|
|
|
+ this.quit();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if(e.code=='-4'){
|
|
|
+ this.$message.warning('窗口链接数量超过限制,请选择其他大屏');
|
|
|
+ this.isShowList=true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ this.result = e.result;
|
|
|
+ if(!this.result.config.ranking_type||this.result.config.ranking_type=='ranking'){
|
|
|
+ this.getList();
|
|
|
+ }else{
|
|
|
+ this.getListTotal();
|
|
|
+ }
|
|
|
+ this.isShowList=false;
|
|
|
+ this.isShowError=false;
|
|
|
+ this.$nextTick(()=>{
|
|
|
+ this.isPCa? this.ManagerSAwardCharts2():this.ManagerSAwardCharts()
|
|
|
+ this.selfAdaption();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 中途断开
|
|
|
+ if (e.type == 'break') {
|
|
|
+ this.isShowError=true;
|
|
|
+ this.errorMsg='网络连接失败,正在尝试重连...';
|
|
|
+ let setT=setTimeout(()=>{
|
|
|
+ this.opneWebSocket()
|
|
|
+ clearTimeout(setT)
|
|
|
+ },120000)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 阶段排名
|
|
|
+ getList() {
|
|
|
+ let item=this.result.config.ranking.condition
|
|
|
+ let data={
|
|
|
+ code:this.code,
|
|
|
+ page: 1,
|
|
|
+ page_size: 10000,
|
|
|
+ dept_id: item.dept.toString(),
|
|
|
+ sort:'DESC',
|
|
|
+ pt_id:item.point_id,
|
|
|
+ exclusion: item.exclusion.toString(),
|
|
|
+ position: item.position,
|
|
|
+ };
|
|
|
+ if(item.date==-1){
|
|
|
+ data.start_date=this.$moment().format('YYYY-MM-DD')
|
|
|
+ data.end_date=this.$moment().format('YYYY-MM-DD')
|
|
|
+ }else if(item.date==-2){
|
|
|
+ let weekOfDay = parseInt(moment().format('E'));//计算今天是这周第几天
|
|
|
+ data.start_date = moment().startOf('day').subtract(weekOfDay - 1, 'days').format('YYYY-MM-DD');//周一日期
|
|
|
+ data.end_date= moment().startOf('day').subtract(weekOfDay - 7, 'days').format('YYYY-MM-DD');//周日日期
|
|
|
+ }else if(item.date==-3){
|
|
|
+ data.month=moment().format('YYYY-MM')
|
|
|
+ }else if(item.date==-4){
|
|
|
+ data.quarter=moment().format('YYYY')+moment().quarter();
|
|
|
+ }else if(item.date==-5){
|
|
|
+ data.year=moment().format('YYYY')
|
|
|
+ }else if(item.date==1){
|
|
|
+ data.start_date= moment(item.time[0]).format('YYYY-MM-DD')
|
|
|
+ data.end_date=moment(item.time[1]).format('YYYY-MM-DD')
|
|
|
+ }
|
|
|
+ this.$axios('get', '/api/screen/ranking', data).then(res => {
|
|
|
+ this.rankingList =this.$returnDeptName(res.data.data.list);
|
|
|
+ })
|
|
|
+ },
|
|
|
+ // 累计排名
|
|
|
+ getListTotal() {
|
|
|
+ let item=this.result.config.ranking_total.condition
|
|
|
+ let data={
|
|
|
+ code:this.code,
|
|
|
+ page: 1,
|
|
|
+ page_size: 10000,
|
|
|
+ dept_id: item.dept.toString(),
|
|
|
+ sort:'DESC',
|
|
|
+ pt_id:3,
|
|
|
+ type: 'all',
|
|
|
+ };
|
|
|
+ this.$axios('get','/api/screen/ranking',data).then(res => {
|
|
|
+ this.rankingList =this.$returnDeptName(res.data.data.list);
|
|
|
+ })
|
|
|
+ },
|
|
|
+ //管理者奖扣统计
|
|
|
+ ManagerSAwardCharts() {
|
|
|
+ //管理着奖扣统计表
|
|
|
+ const chart = this.$refs.ManagerSAwardChart;
|
|
|
+ let ratio_date=this.result.active.list.ratio_date;
|
|
|
+ let ratio_get=this.result.active.list.ratio_get;
|
|
|
+ let ratio_set=this.result.active.list.ratio_set;
|
|
|
+ if (chart) {
|
|
|
+ const myChart = this.$echarts.init(chart);
|
|
|
+ let option = {
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'shadow'
|
|
|
+ },
|
|
|
+ formatter: function(a) {
|
|
|
+ let list = [];
|
|
|
+ let listItem = '';
|
|
|
+ for (var i = 0; i < a.length; i++) {
|
|
|
+ list.push(
|
|
|
+ '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
|
|
|
+ a[i].color +
|
|
|
+ ';margin-right: 5px;border-radius: 50%;}"></i><span style=" display:inline-block;">' +
|
|
|
+ a[i].seriesName +
|
|
|
+ '</span> :' +
|
|
|
+ a[i].value+'%'
|
|
|
+ );
|
|
|
+ }
|
|
|
+ listItem = list.join('<br>');
|
|
|
+ return '<div class="showBox"><div>' + a[0].name + '</div>' + listItem + '</div>';
|
|
|
+ }
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff',
|
|
|
+ fontSize: '12',
|
|
|
+
|
|
|
+ },
|
|
|
+ left: '0%',
|
|
|
+ // data:['上上周','上周','本周'],
|
|
|
+ data: ratio_date
|
|
|
+ },
|
|
|
+ color: [
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#F8E908' },{ offset: 1, color: '#19286D' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#00F8FF' }, { offset: 1, color: '#19286D' }]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#B117F1' }, { offset: 1, color: '#19286D' }]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff',
|
|
|
+ fontSize: '12'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data: ['获得积分的人员占比', '执行奖扣的管理者占比']
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ max: 100, //取100为最大刻度
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ formatter: '{value}%',
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: ratio_date[0],
|
|
|
+ stack: 'Total',
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ color:'#fff',
|
|
|
+ formatter: '{c}%',
|
|
|
+ fontSize: '12'
|
|
|
+ },
|
|
|
+ data: [ratio_get[0], ratio_set[0]]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ color:'#fff',
|
|
|
+ formatter: '{c}%',
|
|
|
+ fontSize: '12'
|
|
|
+ },
|
|
|
+ name: ratio_date[1],
|
|
|
+ data: [ratio_get[1], ratio_set[1]]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ color:'#fff',
|
|
|
+ formatter: '{c}%',
|
|
|
+ fontSize: '12'
|
|
|
+ },
|
|
|
+ name: ratio_date[2],
|
|
|
+ data: [ratio_get[2], ratio_set[2]],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: '大啊',
|
|
|
+ data: [],
|
|
|
+ markLine: {
|
|
|
+ silent: true,
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ silent: false, //鼠标悬停事件 true没有,false有
|
|
|
+ lineStyle: {
|
|
|
+ //警戒线的样式 ,虚实 颜色
|
|
|
+ type: 'solid',
|
|
|
+ color: '#E6A23C'
|
|
|
+ },
|
|
|
+ label: {
|
|
|
+ position: 'end',
|
|
|
+ formatter: '标尺',
|
|
|
+ fontSize: '10'
|
|
|
+ },
|
|
|
+ // yAxis: 80
|
|
|
+ yAxis: this.result.active.base_ratio // 警戒线的标注值,可以有多个yAxis,多条警示线 或者采用 {type : 'average', name: '平均值'},type值有 max min average,分为最大,最小,平均值
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ myChart.setOption(option);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //管理者奖扣统计
|
|
|
+ ManagerSAwardCharts2() {
|
|
|
+ //管理着奖扣统计表
|
|
|
+ const chart = this.$refs.ManagerSAwardChart;
|
|
|
+ let ratio_date=this.result.active.list.ratio_date;
|
|
|
+ let ratio_get=this.result.active.list.ratio_get;
|
|
|
+ let ratio_set=this.result.active.list.ratio_set;
|
|
|
+ if (chart) {
|
|
|
+ const myChart = this.$echarts.init(chart);
|
|
|
+ let option = {
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ axisPointer: {
|
|
|
+ type: 'shadow'
|
|
|
+ },
|
|
|
+ formatter: function(a) {
|
|
|
+ let list = [];
|
|
|
+ let listItem = '';
|
|
|
+ for (var i = 0; i < a.length; i++) {
|
|
|
+ list.push(
|
|
|
+ '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
|
|
|
+ a[i].color +
|
|
|
+ ';margin-right: 5px;border-radius: 50%;}"></i><span style=" display:inline-block;">' +
|
|
|
+ a[i].seriesName +
|
|
|
+ '</span> :' +
|
|
|
+ a[i].value+'%'
|
|
|
+ );
|
|
|
+ }
|
|
|
+ listItem = list.join('<br>');
|
|
|
+ return '<div class="showBox"><div>' + a[0].name + '</div>' + listItem + '</div>';
|
|
|
+ }
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff',
|
|
|
+ fontSize: '16',
|
|
|
+ },
|
|
|
+ left: '3%',
|
|
|
+ // data:['上上周','上周','本周'],
|
|
|
+ data: ratio_date
|
|
|
+ },
|
|
|
+ color: [
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#F8E908' },{ offset: 1, color: '#19286D' }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#00F8FF' }, { offset: 1, color: '#19286D' }]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'linear',
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ x2: 0,
|
|
|
+ y2: 1,
|
|
|
+ colorStops: [{ offset: 0, color: '#B117F1' }, { offset: 1, color: '#19286D' }]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff',
|
|
|
+ fontSize: '16'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data: ['获得积分的人员占比', '执行奖扣的管理者占比']
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ max: 100, //取100为最大刻度
|
|
|
+ axisLabel: {
|
|
|
+ show: true,
|
|
|
+ formatter: '{value}%',
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: ratio_date[0],
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: '{c}%',
|
|
|
+ color:'#fff',
|
|
|
+ fontSize: '14'
|
|
|
+ },
|
|
|
+ data: [ratio_get[0], ratio_set[0]]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: ratio_date[1],
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: '{c}%',
|
|
|
+ color:'#fff',
|
|
|
+ fontSize: '14'
|
|
|
+ },
|
|
|
+ data: [ratio_get[1], ratio_set[1]]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: ratio_date[2],
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: '{c}%',
|
|
|
+ color:'#fff',
|
|
|
+ fontSize: '14'
|
|
|
+ },
|
|
|
+ data: [ratio_get[2], ratio_set[2]],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'bar',
|
|
|
+ name: '大啊',
|
|
|
+ data: [],
|
|
|
+ markLine: {
|
|
|
+ silent: true,
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ silent: false, //鼠标悬停事件 true没有,false有
|
|
|
+ lineStyle: {
|
|
|
+ //警戒线的样式 ,虚实 颜色
|
|
|
+ type: 'solid',
|
|
|
+ color: '#E6A23C'
|
|
|
+ },
|
|
|
+ label: {
|
|
|
+ position: 'end',
|
|
|
+ formatter: '标尺',
|
|
|
+ fontSize: '14'
|
|
|
+ },
|
|
|
+ // yAxis: 80
|
|
|
+ yAxis: this.result.active.base_ratio // 警戒线的标注值,可以有多个yAxis,多条警示线 或者采用 {type : 'average', name: '平均值'},type值有 max min average,分为最大,最小,平均值
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ myChart.setOption(option);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //echarts自适应
|
|
|
+ selfAdaption() {
|
|
|
+ if(document.getElementById('left')){
|
|
|
+ let height=document.getElementById('left').offsetHeight;
|
|
|
+ this.h1=height-344;
|
|
|
+ this.h2=height-358;
|
|
|
+ this.h3=height-108;
|
|
|
+ this.h4=height-234;
|
|
|
+ this.h5=height-168;
|
|
|
+ this.h6=height-72;
|
|
|
+ this.$nextTick(()=>{
|
|
|
+ var myChart1 = this.$echarts.init(this.$refs.ManagerSAwardChart);
|
|
|
+ myChart1.resize();
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ timeFormate() {
|
|
|
+ let timeStamp=new Date();
|
|
|
+ let year = new Date(timeStamp).getFullYear();
|
|
|
+ let month = new Date(timeStamp).getMonth() + 1 < 10 ? '0' + (new Date(timeStamp).getMonth() + 1) : new Date(timeStamp).getMonth() + 1;
|
|
|
+ let date = new Date(timeStamp).getDate() < 10 ? '0' + new Date(timeStamp).getDate() : new Date(timeStamp).getDate();
|
|
|
+ let hh = new Date(timeStamp).getHours() < 10 ? '0' + new Date(timeStamp).getHours() : new Date(timeStamp).getHours();
|
|
|
+ let mm = new Date(timeStamp).getMinutes() < 10 ? '0' + new Date(timeStamp).getMinutes() : new Date(timeStamp).getMinutes();
|
|
|
+ let ss = new Date(timeStamp).getSeconds() < 10 ? '0' + new Date(timeStamp).getSeconds() : new Date(timeStamp).getSeconds();
|
|
|
+ let week = new Date(timeStamp).getDay();
|
|
|
+ let weeks = ['日', '一', '二', '三', '四', '五', '六'];
|
|
|
+ let getWeek = '星期' + weeks[week];
|
|
|
+ this.nowTime = year + '年' + month + '月' + date + '日'+' '+getWeek;
|
|
|
+ // this.nowTime = year + '年' + month + '月' + date + '日' + ' ' + hh + ':' + mm + ':' + ss + ' ' + getWeek;
|
|
|
+ }, // 实时刷新当前时间,格式化
|
|
|
+ nowTimes() {
|
|
|
+ this.isSetInterval=setInterval(this.timeFormate, 1000);
|
|
|
+ },
|
|
|
+ clear() {
|
|
|
+ clearInterval(this.isSetInterval);
|
|
|
+ this.nowTimes = null;
|
|
|
+ },
|
|
|
+ fullScreen(){
|
|
|
+ if(this.isDp){
|
|
|
+ this.exitScreen();
|
|
|
+ this.isDp=false;
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ this.isDp=true;
|
|
|
+ var el = document.documentElement;
|
|
|
+ var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;
|
|
|
+ if(typeof rfs != "undefined" && rfs) {
|
|
|
+ rfs.call(el);
|
|
|
+ };
|
|
|
+ return;
|
|
|
+ },
|
|
|
+ exitScreen(){
|
|
|
+ if (document.exitFullscreen) {
|
|
|
+ document.exitFullscreen();
|
|
|
+ }
|
|
|
+ else if (document.mozCancelFullScreen) {
|
|
|
+ document.mozCancelFullScreen();
|
|
|
+ }
|
|
|
+ else if (document.webkitCancelFullScreen) {
|
|
|
+ document.webkitCancelFullScreen();
|
|
|
+ }
|
|
|
+ else if (document.msExitFullscreen) {
|
|
|
+ document.msExitFullscreen();
|
|
|
+ }
|
|
|
+ if(typeof cfs != "undefined" && cfs) {
|
|
|
+ cfs.call(el);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ returnEvent(list) {
|
|
|
+ return list;
|
|
|
+ },
|
|
|
+ ranking(arr, index) {
|
|
|
+ if (index == 1) {
|
|
|
+ return arr.filter(item => {
|
|
|
+ return item.rank < 4;
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ return arr.filter(item => {
|
|
|
+ return item.rank >= 4;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ window.removeEventListener('resize', this.selfAdaption); //取消echarts自适应
|
|
|
+ this.clear();
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.list-item{
|
|
|
+ padding: 12px 0;
|
|
|
+ border-bottom: 1px solid #EBEEF5;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+.list-item:hover{
|
|
|
+ background-color: #F5F7FA;
|
|
|
+}
|
|
|
+.back{
|
|
|
+ background-image: url('assets/image/shuju.jpg');
|
|
|
+ background-position: center center;
|
|
|
+ background-size: cover;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+}
|
|
|
+.bjs{
|
|
|
+ background-color: #F5F7FA;
|
|
|
+}
|
|
|
+.da{
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: 700;
|
|
|
+}
|
|
|
+.index2 img{
|
|
|
+ width: 1.4rem !important;
|
|
|
+ height: 1.4rem !important;
|
|
|
+}
|
|
|
+.data-all{
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+ html,body{
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+.barg {
|
|
|
+ position: absolute;
|
|
|
+}
|
|
|
+.barg div {
|
|
|
+ width: 1.4rem;
|
|
|
+ height: 2.8rem;
|
|
|
+ background-color: #1d2242;
|
|
|
+ margin: 0 1rem;
|
|
|
+ top: ;
|
|
|
+}
|
|
|
+.boxTitle {
|
|
|
+ padding: 0.6rem 1.4rem;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 22px;
|
|
|
+ position: relative;
|
|
|
+ background-color: #16215F;
|
|
|
+ display: inline-block;
|
|
|
+ border-radius: 25px;
|
|
|
+ margin-left: 16px;
|
|
|
+ padding-left: 50px;
|
|
|
+ margin-top: 30px;
|
|
|
+ box-shadow: 2px 0px 2px #ccc;
|
|
|
+}
|
|
|
+.boxTitle::before {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ height: 18px;
|
|
|
+ width: 18px;
|
|
|
+ background-color: #F8E908;
|
|
|
+ border-radius: 25px;
|
|
|
+ top: 16px;
|
|
|
+ left: 20px;
|
|
|
+}
|
|
|
+.boxTitle::after {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ height: 3px;
|
|
|
+ width: 150px;
|
|
|
+ background-color: #03F4FD;
|
|
|
+ top: -20px;
|
|
|
+ left: 0px;
|
|
|
+ border-radius: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.boxTitle2 {
|
|
|
+ padding:0.4rem 0.8rem;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ position: relative;
|
|
|
+ background-color: #16215F;
|
|
|
+ display: inline-block;
|
|
|
+ border-radius: 25px;
|
|
|
+ margin-left: 10px;
|
|
|
+ padding-left: 30px;
|
|
|
+ margin-top: 20px;
|
|
|
+ box-shadow: 2px 0px 2px #ccc;
|
|
|
+}
|
|
|
+.boxTitle2::before {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ height: 12px;
|
|
|
+ width: 12px;
|
|
|
+ background-color: #F8E908;
|
|
|
+ border-radius: 25px;
|
|
|
+ top: 10px;
|
|
|
+ left: 10px;
|
|
|
+}
|
|
|
+.boxTitle2::after {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ height: 3px;
|
|
|
+ width: 120px;
|
|
|
+ background-color: #03F4FD;
|
|
|
+ top: -14px;
|
|
|
+ left: 0px;
|
|
|
+ border-radius: 2px;
|
|
|
+}
|
|
|
+.chart {
|
|
|
+ height: 480px;
|
|
|
+}
|
|
|
+.main-right {
|
|
|
+ margin-left: 5px;
|
|
|
+}
|
|
|
+.main-right .name {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #0DD3DB;
|
|
|
+}
|
|
|
+.main-right .context {
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ display: -webkit-box;
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
+ font-size: 20px;
|
|
|
+ height: 50px;
|
|
|
+ margin-bottom: 6px;
|
|
|
+}
|
|
|
+.main-right2 .date {
|
|
|
+ color: #909399;
|
|
|
+}
|
|
|
+.main-right2 {
|
|
|
+ margin-left: 5px;
|
|
|
+}
|
|
|
+.main-right2 .name {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #0DD3DB;
|
|
|
+}
|
|
|
+.main-right2 .context {
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ display: -webkit-box;
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
+ height: 40px;
|
|
|
+ font-size: 16px;
|
|
|
+ margin-bottom: 5px;
|
|
|
+}
|
|
|
+.main-right .date {
|
|
|
+ color: #909399;
|
|
|
+}
|
|
|
+.numBox .flex-1 {
|
|
|
+ height: 13rem;
|
|
|
+ text-align: center;
|
|
|
+ color: #fff;
|
|
|
+ padding: 0.8rem;
|
|
|
+}
|
|
|
+.seamless-warp {
|
|
|
+ /* padding: 10px; */
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.num {
|
|
|
+ font-size: 24px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #9ecef8;
|
|
|
+}
|
|
|
+.ranking {
|
|
|
+ /* height: 100%; */
|
|
|
+}
|
|
|
+.rankingItem {
|
|
|
+ color: #fff;
|
|
|
+ border-radius: 8px;
|
|
|
+ padding: 10px;
|
|
|
+}
|
|
|
+.rankingItem img {
|
|
|
+ width: 30px;
|
|
|
+ height: 30px;
|
|
|
+}
|
|
|
+.el-icon-help {
|
|
|
+ font-size: 26px;
|
|
|
+ margin-left: 10px;
|
|
|
+}
|
|
|
+.logo {
|
|
|
+ width: 2.1rem;
|
|
|
+ height: 2.1rem;
|
|
|
+ margin-right: 10px;
|
|
|
+ border-radius: 3px;
|
|
|
+}
|
|
|
+.box {
|
|
|
+ background-color: rgba(23, 30, 72, 0.6);
|
|
|
+ border-radius: 8px;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+.screenBox {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ min-width: 1000px;
|
|
|
+}
|
|
|
+.zhuColor {
|
|
|
+ background-color: #021D3B;
|
|
|
+ box-shadow: 0px 2px 2px #01EEFE;
|
|
|
+ position: relative;
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+.title span {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 1.8rem;
|
|
|
+ font-weight: 550;
|
|
|
+ position: relative;
|
|
|
+ top: -1.8rem;
|
|
|
+}
|
|
|
+.title::after {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ top: 0px;
|
|
|
+ right: -15px;
|
|
|
+ border-width: 20px 15px;
|
|
|
+ border-style: solid;
|
|
|
+ border-color: transparent transparent #021D3B transparent;
|
|
|
+ transform: rotate(180deg);
|
|
|
+}
|
|
|
+.title::before {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ top: 0px;
|
|
|
+ left: -15px;
|
|
|
+ border-width: 20px 15px;
|
|
|
+ border-style: solid;
|
|
|
+ transform: rotate(180deg);
|
|
|
+ border-color: transparent transparent #021D3B transparent;
|
|
|
+}
|
|
|
+.title2 span {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 2rem;
|
|
|
+ font-weight: 550;
|
|
|
+ position: relative;
|
|
|
+ top: -2.1rem;
|
|
|
+}
|
|
|
+.title2::after {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ top: 0px;
|
|
|
+ right: -7px;
|
|
|
+ border-width: 14px 7px;
|
|
|
+ border-style: solid;
|
|
|
+ border-color: transparent transparent #021D3B transparent;
|
|
|
+ transform: rotate(180deg);
|
|
|
+}
|
|
|
+.title2::before {
|
|
|
+ content: ' ';
|
|
|
+ position: absolute;
|
|
|
+ top: 0px;
|
|
|
+ left: -7px;
|
|
|
+ border-width: 14px 7px;
|
|
|
+ border-style: solid;
|
|
|
+ transform: rotate(180deg);
|
|
|
+ border-color: transparent transparent #021D3B transparent;
|
|
|
+}
|
|
|
+</style>
|