Commit def99056 authored by zhengke's avatar zhengke

111

parents e390038c 84cda05e
......@@ -24,6 +24,7 @@
"cos-js-sdk-v5": "^1.1.5",
"echarts": "^5.1.2",
"element-ui": "^2.14.1",
"flv.js": "^1.6.2",
"html2canvas": "^1.3.2",
"js-md5": "^0.7.3",
"jsencrypt": "^3.2.1",
......@@ -36,6 +37,8 @@
"quasar": "^1.0.0",
"relation-graph": "^1.0.8",
"v-viewer": "^1.5.1",
"videojs-flash": "^2.2.1",
"videojs-swf": "^5.4.2",
"vue-amap": "^0.5.10",
"vue-apexcharts": "^1.6.2",
"vue-draggable-resizable": "^1.7.2",
......
......@@ -51,11 +51,14 @@ module.exports = function (ctx) {
// API: 'http://192.168.10.46:8300/api',
// API: 'https://eduapi.oytour.com/api',
API_ZC: 'http://192.168.10.17:8087/api',
API_SK: 'ws:192.168.10.214:'
API_SK: 'ws:192.168.10.214:',
API_SIG: 'http://localhost:5001/messagecenter'
} : {
API: 'https://eduapi.oytour.com/api',
API_ZC: 'http://propertyedu.oytour.com/api',
API_SK: 'ws://47.96.23.199:'
API_SK: 'ws://47.96.23.199:',
API_SK_WSS: 'wss://sk.kookaku.com',
API_SIG: 'http://eduapi.oytour.com/messagecenter'
},
// transpile: false,
......@@ -75,12 +78,11 @@ module.exports = function (ctx) {
// https://quasar.dev/quasar-cli/handling-webpack
extendWebpack(cfg) {
// cfg.module.rules.push({
// enforce: 'pre',
// test: /\.(js|vue)$/,
// loader: 'eslint-loader',
// exclude: /node_modules/
// })
cfg.module.rules.push({
enforce: 'pre',
test: /\.swf$/,
loader: 'url-loader'
})
}
},
......@@ -188,30 +190,30 @@ module.exports = function (ctx) {
background_color: '#ffffff',
theme_color: '#027be3',
icons: [{
src: 'icons/icon-128x128.png',
sizes: '128x128',
type: 'image/png'
},
{
src: 'icons/icon-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: 'icons/icon-256x256.png',
sizes: '256x256',
type: 'image/png'
},
{
src: 'icons/icon-384x384.png',
sizes: '384x384',
type: 'image/png'
},
{
src: 'icons/icon-512x512.png',
sizes: '512x512',
type: 'image/png'
}
src: 'icons/icon-128x128.png',
sizes: '128x128',
type: 'image/png'
},
{
src: 'icons/icon-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: 'icons/icon-256x256.png',
sizes: '256x256',
type: 'image/png'
},
{
src: 'icons/icon-384x384.png',
sizes: '384x384',
type: 'image/png'
},
{
src: 'icons/icon-512x512.png',
sizes: '512x512',
type: 'image/png'
}
]
}
},
......@@ -252,7 +254,7 @@ module.exports = function (ctx) {
// More info: https://quasar.dev/quasar-cli/developing-electron-apps/node-integration
nodeIntegration: true,
extendWebpack( /* cfg */ ) {
extendWebpack( /* cfg */) {
// do something with Electron main process Webpack cfg
// chainWebpack also available besides this extendWebpack
}
......
@font-face {
font-family: 'perfectFont';
src: url('../font/MicrosoftYaHeiLight.woff') format('woff');
font-family: 'perfectFont';
src: url('../font/MicrosoftYaHeiLight.woff') format('woff');
}
@font-face {
font-family: 'pingfang';
src: url('../font/PingFang2.ttf');
font-family: 'pingfang';
src: url('../font/PingFang2.ttf');
}
.perfectFont {
font-family: 'perfectFont' !important;
}
......@@ -631,7 +631,8 @@ import {
ClassId:'',
CourseName:'',
SuppliesId:item.Id,
Number:item.Number
Number:item.Number,
haocaiList:item.hcItemList,
}
arr.push(obj)
})
......
......@@ -206,13 +206,24 @@
}
.hover_Suspended{
position: relative;
padding: 0 3px;
background-color: #fff;
padding: 0 8px;
border-radius: 10px;
font-size: 15px;
color: white;
}
.hover_Suspended.started{
background-color: #eee;
color: #3f4254;
}
.hover_Suspended.progress{
background-color: #21BA45;
}
.hover_Suspended.over{
background-color: #1976D2;
}
.hover_Suspended:hover{
color: #F8A535;
background-color: #fff;
}
.hover_Suspended:hover .Suspended{
display: block;
......@@ -261,14 +272,15 @@
display: inline-block;
padding: 0 5px;
}
.Suspended_text p.grey{
background-color: grey;
.Suspended_text p.started{
background-color: #eee;
color: #3f4254;
}
.Suspended_text p.green{
background-color: green;
.Suspended_text p.progress{
background-color: #21BA45;
}
.Suspended_text p.red{
background-color: red;
.Suspended_text p.over{
background-color: #1976D2;
}
</style>
<template>
......@@ -288,17 +300,17 @@
<div class="eventsCalendar_box">
<div class="eventsCalendar" v-for="(items,indexs) in item.ActivityList" :key="indexs"
@click="eventName(items.ActivityName)">
<div class="hover_Suspended">
<div class="hover_Suspended" :class="items.ActivityStatus==1?'progress':(items.ActivityStatus==2?'over':'started')">
{{items.ActivityName}}
<div class="Suspended">
<div class="Suspended-b"></div>
<div class="Suspended_text"><span>标题 :</span>{{items.ActivityName}}</div>
<div class="Suspended_text"><span>时间 :</span>{{items.StartTime}}~{{items.EndTime}}</div>
<div class="Suspended_text"><span>类型 :</span>{{items.ActivityTypeName}}</div>
<div class="Suspended_text"><span>价格 :</span>{{!items.IsFree?items.Price:'免费'}}</div>
<div class="Suspended_text"><span>价格 :</span>{{items.IsFree==1?'免费':items.Price+' 元'}}</div>
<div class="Suspended_text" v-show="items.LocationName"><span>地址 :</span> {{items.LocationName}}</div>
<div class="Suspended_text"><span>状态 :</span>
<p :class="items.ActivityStatus==1?'green':(items.ActivityStatus==2?'red':'grey')">
<p :class="items.ActivityStatus==1?'progress':(items.ActivityStatus==2?'over':'started')">
{{items.ActivityStatus==1?'进行中':(items.ActivityStatus==2?'已结束':'未开始')}}</p>
</div>
</div>
......
......@@ -123,7 +123,7 @@
<div class="col q-pt-md q-pr-md">
<!-- <div class="row work_Top">
<div class="text-h6 col"></div>
</div> -->
<q-btn-group
outline
......
......@@ -389,7 +389,7 @@ export default {
that.injectTCCC(
r.Data.Token,
1400617921,
this.userInfo.Email,
that.userInfo.Email,
r.Data.SdkURL
);
}
......
<template>
<div class="page-body room-list" v-loading="loading">
<div v-for="item in classdata" :key="item.Key" class="school-item">
<div class="school-name">{{item.SchoolName}}</div>
<div class="classroom-box">
<div v-for="(_item,_index) in item.RoomList" :key="item.RoomId" >
<div class="classroom-item q-mr-lg q-mb-lg" :class="{'classroom-item-noUse':_item.UserRate==0}" >
<div @click="goUrl(item,_item)">
<div class="divCalssRoom"> <el-image class="classroom-img" :src="_item.RoomPicList[0]" fit="cover" >
<div slot="error" class="image-slot">
<img src="../../assets/images/classroom/bg-img.jpg" alt="" srcset="" style=" opacity: 0.8;">
</div>
</el-image></div>
</div>
<div class="classroom-name" >{{_item.RoomName}}
<!-- <img src="../../assets/images/classroom/warning.png" class="q-ml-sm" v-if="_item.warn">
<img src="../../assets/images/classroom/normal.png" class="q-ml-sm" v-if="!_item.warn"> -->
</div>
<q-knob
show-value
font-size="0.1rem"
v-model="_item.user"
size="50px"
:thickness="0.1"
color="primary"
track-color="grey-3"
class="q-ma-md classroom-user"
readonly
style="text-align: center"
>
{{ _item.UserRate}}%
<br/>
使用率
</q-knob>
<div class="classroom-info">
<div v-if="_item.TimeList.length>0">
<q-carousel
v-model="_item.slide"
animated
:navigation="false"
height="75px"
class=" text-white shadow-1 rounded-borders"
arrows
control-color="grey-1"
control-text-color="primary"
control-type="unelevated"
>
<q-carousel-slide v-for="(slide,slideIndex) in _item.TimeList" :key="slideIndex" :name="slideIndex" >
<div class="info-box">
<div class="time">{{ slide.StartTime }}</div>
<div class="info">{{slide.TeacherName}}{{slide.ClassName}}</div>
</div>
</q-carousel-slide>
</q-carousel>
</div>
<div v-if="_item.TimeList.length===0" class="no-data">
暂无课程安排
</div>
<div v-for="(item, i) in classdata" :key="item.Key">
<template
v-if="
item.SchoolName.indexOf('武侯') == -1 &&
item.SchoolName.indexOf('眉山') == -1
"
>
<div class="row items-center">
<div class="text-h6 col">{{ item.SchoolName }}</div>
<div v-if="i == 0" class="f12">只看在线:</div>
<div v-if="i == 0">
<el-switch
v-model="queryStatus"
@change="changeViewStatusHandler"
></el-switch>
</div>
</div>
<div class="q-mt-md q-mb-lg row">
<template v-for="(x, xi) in item.RoomList">
<div
class="class-room"
style="width:calc(20% - 10px);margin-right:10px;margin-bottom:10px;"
v-if="queryStatus == 0 || (queryStatus == 1 && x.StatusInfo)"
:key="xi"
>
<div class="img-box">
<q-img
:src="x.RoomPicList[0]"
height="100%"
fit="fill"
spinner-color="primary"
spinner-size="30px"
v-if="x.RoomPicList && x.RoomPicList.length > 0"
/>
<q-img
src="../../assets/images/classroom/bg-img.jpg"
fit="fill"
height="100%"
spinner-color="primary"
spinner-size="30px"
v-else
/>
</div>
<div class="xuhua"></div>
<div class="q-pa-md">
<div class="row items-end">
<div style="font-size:18px;" class="col">
{{ x.RoomName }}
</div>
<div class="f12 q-ml-md text-grey-5">
<div class="text-right">时段</div>
<div class="text-dark">
{{ x.StartTime }} - {{ x.EndTime }}
</div>
</div>
</div>
</div>
<div class="q-mt-lg f12 row items-center">
<div class="text-grey-6 f12 col">
<span
class="q-px-xs text-white q-mr-md inline-block text-weight-bold"
style="border-radius:4px;font-size:15;"
:class="{
'bg-grey-3': !x.StatusInfo,
'bg-negative': x.StatusInfo
}"
>
LIVE
</span>
<span class="text-grey-6" v-if="!x.StatusInfo"
>设备离线</span
>
<span
class="text-grey-6"
v-else-if="x.StatusInfo.UnLockUserName == 'lock'"
>设备在线,未解锁</span
>
<span class="text-grey-6" v-else
>{{ x.StatusInfo.UnLockUserName }}正在使用</span
>
</div>
<div v-if="x.StatusInfo">
<q-btn
color="primary"
dense
class="f12"
flat
label="链接"
@click="openVideo(x)"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</div>
</template>
</div>
<q-dialog v-model="showVideo" @hide="clearVideo">
<q-card
class="my-card"
style="width:64vw !important;max-width:64vw !important;max-height:32vw !important;height:32vw !important;"
flat
>
<div
id="player-con"
style="width:100%;height:100%;overflow:hidden;"
></div>
</q-card>
</q-dialog>
</div>
</template>
<script>
import {
getUseClassRoomList
} from '../../api/classroom/index';
export default {
meta: {
title: "教室状态"
},
data() {
return {
classdata:[
{
SchoolName:"锦江校区一",
list:[
{
slide:0,
img:"",
classroom:'樱花教室',
user:80,
warn:0,
course:[]
},
]
}
<script>
import { getUseClassRoomList } from "../../api/classroom/index";
import * as signalR from "@aspnet/signalr";
export default {
meta: {
title: "教室状态"
},
data() {
return {
classdata: [],
loading: true,
showVideo: false,
videoObj: null,
currentRoom: null,
queryStatus: 0,
player: null,
connection: "", //signalr连接
roomStatusList: [] //返回消息
};
},
],
loading: true,
};
created() {
let thisVue = this;
console.log(process.env.API_SIG);
this.connection = new signalR.HubConnectionBuilder()
.withUrl(process.env.API_SIG, {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.build();
this.connection.on("RoomStatusChange", function(message) {
thisVue.roomStatusList = JSON.parse(message);
console.log(thisVue.roomStatusList);
thisVue.changeStatus();
});
this.connection.onclose(async () => {
setTimeout(() => {
thisVue.linkHub();
}, 3000);
});
this.linkHub();
},
mounted() {
this.getList();
//this.openVideo();
},
methods: {
changeViewStatusHandler() {},
clearVideo() {
this.player.stop();
this.player.dispose();
this.showVideo = false;
},
mounted(){
this.getList();
openVideo(item) {
this.showVideo = true;
this.currentRoom = item;
let url = `http://47.96.12.235:5000/live/${item.RoomId}.m3u8`;
this.$nextTick(() => {
this.initPlayer(url);
});
},
methods:{
goUrl(x,y){
this.$router.push({
path:"/classroom/useRecord",
query:{
key:x.Key,
roomId:y.RoomId
}
})
},
getList() {
getUseClassRoomList({}).then(res => {
this.loading = false
if(res.Code===1){
res.Data.forEach(e => {
e.RoomList.forEach(_e=>{
_e.slide=0
})
});
this.classdata=res.Data
}
}).catch(() => {
this.loading = false;
})
initPlayer(url) {
this.player = new Aliplayer(
{
id: "player-con",
source: url,
width: "100%",
height: "100%",
autoplay: true,
isLive: true,
rePlay: false,
playsinline: true,
preload: true,
controlBarVisibility: "hover",
useH5Prism: true
},
}
};
</script>
<style lang="scss" scoped>
.school-item{
margin-bottom: 10px;
.school-name{
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: bold;
color: #000000;
margin-bottom: 30px;
}
.classroom-box{
width: 1680px;
display: flex;
// justify-content: space-between;
flex-wrap: wrap;
.classroom-item-noUse{
opacity:0.8;
}
.classroom-item{
width: 390px;
height: 235px;
background: #FFFFFF;
border: 1px solid #EBEBEB;
box-shadow: 0px 1px 1px 0px #E4E7FB;
border-radius: 16px;
position: relative;
overflow: hidden;
.classroom-img{
display: block;
width: 390px;
// height: 160px;
// border-radius: 16px;
background-color: #333;
overflow: hidden;
}
.divCalssRoom{
height: 160px;
border-radius: 16px;
overflow: hidden;
}
.classroom-name{
position: absolute;
top: 20px;
left: 20px;
z-index: 5999;
font-size: 20px;
font-family: PingFang SC;
font-weight: 800;
color: #FFFFFF;
display: flex;
align-items: center;
}
.classroom-user{
position: absolute;
top: 10px;
right: 10px;
z-index: 5999;
color: #FFFFFF;
}
.classroom-info{
width: 390px;
height: 75px;
// background-color: tomato;
.info-box{
height: 43px;
display: flex;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
padding: 0 40px;
.time{
font-size: 14px;
font-family: PingFang SC;
font-weight: bold;
color: #6D97FF;
margin-right: 10px;
}
.info{
// width: 225px;
height: 100%;
font-size: 14px;
font-family: PingFang SC;
display: flex;
align-items: center;
color: #000000;
}
}
}
function(player) {}
);
},
changeStatus() {
this.initStatus();
if (this.roomStatusList && this.roomStatusList.length > 0) {
this.roomStatusList.forEach(x => {
this.classdata.forEach(y => {
y.RoomList.forEach(z => {
if (z.RoomId == x.RoomId) {
z.StatusInfo = x;
}
});
});
});
}
this.$forceUpdate();
},
initStatus() {
this.classdata.forEach(y => {
y.RoomList.forEach(z => {
this.classdata.forEach(y => {
y.RoomList.forEach(z => {
z.StatusInfo = null;
});
});
});
});
this.$forceUpdate();
},
linkHub() {
let thatVue = this;
this.connection
.start()
.then(() => {
console.log("linke success");
thatVue.connection.invoke("RegistErp", "IMERP");
})
.catch(e => {
console.log(e);
setTimeout(() => {
thatVue.linkHub();
}, 3000);
});
},
goUrl(x, y) {
this.$router.push({
path: "/classroom/useRecord",
query: {
key: x.Key,
roomId: y.RoomId
}
});
},
getList() {
getUseClassRoomList({})
.then(res => {
this.loading = false;
if (res.Code === 1) {
res.Data.forEach(e => {
e.RoomList.forEach(_e => {
_e.slide = 0;
});
});
this.classdata = res.Data;
this.changeStatus();
}
})
.catch(() => {
this.loading = false;
});
}
}
};
</script>
<style>
.class-room {
border: 1px solid #f5f5f5;
border-radius: 10px;
position: relative;
overflow: hidden;
}
.class-room .img-box {
height: 80px;
}
.class-room .xuhua {
position: absolute;
top: 0;
height: 80px;
left: 0;
right: 0;
backdrop-filter: blur(4px);
}
.no-data{
height: 75px;
font-size: 14px;
color: #000000;
display: flex;
justify-content: center;
align-items: center;
.class-room:hover .xuhua {
backdrop-filter: none;
}
.room-list{
overflow: scroll;
.no-data {
height: 75px;
font-size: 14px;
color: #000000;
display: flex;
justify-content: center;
align-items: center;
}
</style>
<style scoped>
#player-con{
#player-con {
width: 100%;
height: 500px;
background-color: #eee;
}
.no-video{
.no-video {
width: 800px;
height: 450px;
margin: 0 auto;
background-color: #000;
display: flex;
align-items: center;
justify-content:center;
justify-content: center;
color: #fff;
font-size: 30px;
}
.title{
color: #000000;
font-size: 18px;
font-weight: bold;
margin-bottom: 20px;
}
.scheduInfo {
height: 100%;
width: 100%;
padding: 15px;
background-color: #f2f4f7;
overflow: hidden;
}
.scheduInfo .schedu_left {
width: 248px;
flex: 0 0 auto;
position: relative;
background-image: url(../../assets/images/sched_bg.png);
background-repeat: no-repeat;
background-size: 100% auto;
height: 100%;
}
.scheduInfo .okr-menu-active {
color: var(--q-color-primary);
font-weight: bold;
background: #ecf1ff;
}
.title {
color: #000000;
font-size: 18px;
font-weight: bold;
margin-bottom: 20px;
}
.scheduInfo {
height: 100%;
width: 100%;
padding: 15px;
background-color: #f2f4f7;
overflow: hidden;
}
.mySched {
border-radius: 8px;
overflow: hidden;
height: 100%;
background-color: #fff;
}
.scheduInfo .schedu_left {
width: 248px;
flex: 0 0 auto;
position: relative;
background-image: url(../../assets/images/sched_bg.png);
background-repeat: no-repeat;
background-size: 100% auto;
height: 100%;
}
.schedu_ImgDiv {
width: 68px;
height: 68px;
border-radius: 20px;
overflow: hidden;
margin: 75px auto 0;
}
.scheduInfo .okr-menu-active {
color: var(--q-color-primary);
font-weight: bold;
background: #ecf1ff;
}
.schedu_ImgDiv img {
width: 100%;
height: 100%;
}
.mySched {
border-radius: 8px;
overflow: hidden;
height: 100%;
background-color: #fff;
}
.schedu_Name {
color: #fff;
font-size: 16px;
margin-top: 26px;
text-align: center;
}
.schedu_ImgDiv {
width: 68px;
height: 68px;
border-radius: 20px;
overflow: hidden;
margin: 75px auto 0;
}
.schedu_Status {
font-size: 12px;
color: #fff;
text-align: center;
margin-top: 15px;
}
.schedu_ImgDiv img {
width: 100%;
height: 100%;
}
.schedu_st {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: 5px;
position: relative;
top: 1px;
}
.schedu_Name {
color: #fff;
font-size: 16px;
margin-top: 26px;
text-align: center;
}
.zbz {
background-color: #00DB4E;
}
.schedu_Status {
font-size: 12px;
color: #fff;
text-align: center;
margin-top: 15px;
}
.xxz {
background-color: #DBDBDB;
}
.schedu_st {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: 5px;
position: relative;
top: 1px;
}
.wdk {
background-color: #FE4475;
}
.zbz {
background-color: #00db4e;
}
.clockon_Duty {
width: 120px;
height: 34px;
background: linear-gradient(90deg, #00BDD3, #00D761);
border-radius: 10px;
margin: 100px auto 24px;
text-align: center;
line-height: 31px;
color: #fff;
font-size: 14px;
cursor: pointer;
}
.xxz {
background-color: #dbdbdb;
}
.sche_daka {
font-size: 18px;
position: relative;
left: 5px;
top: 2px;
}
.wdk {
background-color: #fe4475;
}
.schedu_jiaojie {
width: 120px;
height: 34px;
line-height: 34px;
text-align: center;
border-radius: 10px;
border: 1px solid #91AEFF;
color: #C4D4FF;
font-size: 14px;
margin: auto;
cursor: pointer;
}
.clockon_Duty {
width: 120px;
height: 34px;
background: linear-gradient(90deg, #00bdd3, #00d761);
border-radius: 10px;
margin: 100px auto 24px;
text-align: center;
line-height: 31px;
color: #fff;
font-size: 14px;
cursor: pointer;
}
.scheInfo_rightTop {
width: 100%;
/* height: 80px; */
padding: 20px 0;
background-color: #fff;
}
.sche_daka {
font-size: 18px;
position: relative;
left: 5px;
top: 2px;
}
.schScroll {
background-color: #F6F8FA;
}
.schedu_jiaojie {
width: 120px;
height: 34px;
line-height: 34px;
text-align: center;
border-radius: 10px;
border: 1px solid #91aeff;
color: #c4d4ff;
font-size: 14px;
margin: auto;
cursor: pointer;
}
.scheInfo_Topflex {
display: flex;
/* width: 90%; */
/* height: 80px; */
align-items: center;
}
.scheInfo_rightTop {
width: 100%;
/* height: 80px; */
padding: 20px 0;
background-color: #fff;
}
.Sctop_Color {
font-size: 18px;
color: #000000;
width: 246px;
text-align: center;
}
.schScroll {
background-color: #f6f8fa;
}
.Scotop_little {
color: #AAAAAA;
font-size: 14px;
margin-right: 15px;
display: inline-block;
text-align: right;
width: 60px;
}
.scheInfo_Topflex {
display: flex;
/* width: 90%; */
/* height: 80px; */
align-items: center;
}
.Scdu_benci::after {
content: "";
position: absolute;
height: 29px;
width: 2px;
background: #EBEBEB;
right: 0;
}
.Sctop_Color {
font-size: 18px;
color: #000000;
width: 246px;
text-align: center;
}
.sche_mid {
display: flex;
width: 100%;
justify-content: space-between;
}
.Scotop_little {
color: #aaaaaa;
font-size: 14px;
margin-right: 15px;
display: inline-block;
text-align: right;
width: 60px;
}
.sche_midList {
width: 31.6%;
height: 300px;
background: #fff;
border-radius: 16px;
border: 1px solid #EBEBEB;
box-shadow: 0px 1px 1px 0px #E4E7FB;
overflow: hidden;
font-family: 'MicrosoftYaHei';
position: relative;
}
.Scdu_benci::after {
content: "";
position: absolute;
height: 29px;
width: 2px;
background: #ebebeb;
right: 0;
}
.Sche_Bottom {
margin: 26px 40px 0 40px;
}
.sche_mid {
display: flex;
width: 100%;
justify-content: space-between;
}
.scheList_TOP {
width: 100%;
height: 107px;
border-radius: 16px;
overflow: hidden;
position: relative;
}
.sche_midList {
width: 31.6%;
height: 300px;
background: #fff;
border-radius: 16px;
border: 1px solid #ebebeb;
box-shadow: 0px 1px 1px 0px #e4e7fb;
overflow: hidden;
font-family: "MicrosoftYaHei";
position: relative;
}
.scheList_TOP img {
width: 100%;
height: 100%;
}
.Sche_Bottom {
margin: 26px 40px 0 40px;
}
.word_sche {
color: #fff;
font-size: 20px;
position: absolute;
top: 25px;
left: 32px;
}
.scheList_TOP {
width: 100%;
height: 107px;
border-radius: 16px;
overflow: hidden;
position: relative;
}
.word_scheNumber {
display: inline-block;
width: 36px;
height: 36px;
color: #fff;
background-color: #FE4475;
position: absolute;
top: 30px;
left: 130px;
text-align: center;
line-height: 36px;
border-radius: 8px;
font-size: 25px;
}
.scheList_TOP img {
width: 100%;
height: 100%;
}
.scheList_Bottom {
font-size: 14px;
color: #000000;
height: 46px;
padding-bottom: 10px;
border-bottom: 1px solid #F3F3F3;
}
.word_sche {
color: #fff;
font-size: 20px;
position: absolute;
top: 25px;
left: 32px;
}
.sche_Dian {
display: inline-block;
width: 6px;
height: 6px;
background-color: #6D97FF;
border-radius: 50%;
margin-right: 10px;
}
.word_scheNumber {
display: inline-block;
width: 36px;
height: 36px;
color: #fff;
background-color: #fe4475;
position: absolute;
top: 30px;
left: 130px;
text-align: center;
line-height: 36px;
border-radius: 8px;
font-size: 25px;
}
.schScroll::-webkit-scrollbar {
display: none;
}
.scheList_Bottom {
font-size: 14px;
color: #000000;
height: 46px;
padding-bottom: 10px;
border-bottom: 1px solid #f3f3f3;
}
.Sch_MainColor {
font-size: 18px;
color: #000000;
.sche_Dian {
display: inline-block;
width: 6px;
height: 6px;
background-color: #6d97ff;
border-radius: 50%;
margin-right: 10px;
}
}
.schScroll::-webkit-scrollbar {
display: none;
}
.Sch_MainColor {
font-size: 18px;
color: #000000;
}
</style>
<template>
......@@ -270,90 +268,90 @@
<div class="col scroll schScroll">
<schedulHead :dataList="dataList"></schedulHead>
<div class="Sche_Bottom">
<div class="title">课程录像</div>
<div class="no-video" v-if="!dataList.VideoUrl">暂无视频</div>
<div id="player-con" v-if="dataList.VideoUrl"></div>
<schedulVisit :tabledata="dataList.GuestList"></schedulVisit>
<div class="title">课程录像</div>
<div class="no-video" v-if="!dataList.VideoUrl">暂无视频</div>
<div id="player-con" v-if="dataList.VideoUrl"></div>
<schedulVisit :tabledata="dataList.GuestList"></schedulVisit>
</div>
</div>
</div>
</div>
</template>
<script>
import {getTimeDetail} from '../../api/classroom/index'
import {getVideoPlayAuth,getVideoPlayUrl} from '../../api/classroom/video'
import schedulVisit from './components/schedul-visit'
import schedulHead from './components/schedul-head'
export default {
props: {},
components: {
schedulVisit,
schedulHead,
},
data() {
return {
dataList: {},
player:null,
}
import { getTimeDetail } from "../../api/classroom/index";
import { getVideoPlayAuth, getVideoPlayUrl } from "../../api/classroom/video";
import schedulVisit from "./components/schedul-visit";
import schedulHead from "./components/schedul-head";
export default {
props: {},
components: {
schedulVisit,
schedulHead
},
data() {
return {
dataList: {},
player: null
};
},
created() {
if (this.$route.query.id) {
this.id = this.$route.query.id;
}
},
mounted() {
this.getdata();
},
methods: {
getdata() {
getTimeDetail({ ID: this.id }).then(res => {
if (res.Code === 1) {
this.dataList = res.Data;
if (res.Data.VideoUrl) {
this.getAuth(res.Data.VideoUrl);
// this.$nextTick(() => {
// this.initPlayer(res.Data.VideoUrl);
// });
}
}
});
},
created() {
if (this.$route.query.id) {
this.id = this.$route.query.id;
}
//初始化视频播放器
initPlayer(url, cover, auth) {
this.player = new Aliplayer(
{
id: "player-con",
source: url,
width: "100%",
height: "500px",
autoplay: false,
isLive: false,
rePlay: false,
playsinline: true,
preload: true,
controlBarVisibility: "hover",
useH5Prism: true,
cover: cover,
playauth: auth
},
function(player) {}
);
},
mounted(){
this.getdata();
getAuth(url) {
getVideoPlayAuth({ strVid: url }).then(res => {
if (res.Code === 1 && res.Data.PlayAuth) {
this.getUrl(url, res.Data.PlayAuth);
}
});
},
methods: {
getdata(){
getTimeDetail({ID:this.id}).then(res=>{
if(res.Code===1){
this.dataList=res.Data
if(res.Data.VideoUrl){
this.getAuth(res.Data.VideoUrl)
}
}
})
},
//初始化视频播放器
initPlayer(url,cover,auth){
this.player = new Aliplayer({
"id": "player-con",
"source": url,
"width": "100%",
"height": "500px",
"autoplay": true,
"isLive": false,
"rePlay": false,
"playsinline": true,
"preload": true,
"controlBarVisibility": "hover",
"useH5Prism": true,
"cover":cover,
"playauth":auth,
}, function (player) {
}
);
},
getAuth(url){
getVideoPlayAuth({strVid:url}).then(res=>{
if(res.Code===1&&res.Data.PlayAuth){
this.getUrl(url,res.Data.PlayAuth)
}
})
},
getUrl(url,auth){
getVideoPlayUrl({strVid:url}).then(res=>{
if(res.Code===1){
this.initPlayer(res.Data.URL,res.Data.VideoImg,auth)
}
})
}
},
}
getUrl(url, auth) {
getVideoPlayUrl({ strVid: url }).then(res => {
if (res.Code === 1) {
this.initPlayer(res.Data.URL, res.Data.VideoImg, auth);
}
});
}
}
};
</script>
<template>
<div class="page-body studentTracking">
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @keyup.enter.native="resetSearch" dense clearable filled v-model="msg.StuName" label="昵称"
maxlength="20" />
</div>
<div class="col-3">
<q-input @keyup.enter.native="resetSearch" dense clearable filled v-model="msg.StuRealMobile" label="电话"
maxlength="20" />
</div>
<div class="col-3">
<q-input @keyup.enter.native="resetSearch" dense clearable filled v-model="msg.QQ" label="QQ"
maxlength="20" />
</div>
<div class="col-3">
<q-input @keyup.enter.native="resetSearch" dense clearable filled v-model="msg.WeChatNo" label="微信号"
maxlength="20" />
</div>
<div class="col-3">
<q-select @input="resetSearch" filled v-model="msg.StuType" dense clearable :options="customTypeList"
option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled v-model="msg.StuStage" :options="customState" option-label="Name"
option-value="Id" emit-value map-options label="客户状态" clearable />
</div>
<div class="col-3">
<q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList"
option-label="Name" option-value="Id" emit-value map-options label="学习目的" />
</div>
<div class="col-3">
<q-select @input="resetBelong" dense filled option-value="Id" option-label="Name" v-model="msg.BelongType"
:options="BelongTypeList" emit-value map-options label="归属类型" />
</div>
<div class="col-3" v-if="msg.BelongType == 4">
<q-select @input="resetSearch" dense clearable @filter="filterSubord" use-input filled option-value="Id"
option-label="EmployeeName" v-model="msg.CreateIds" multiple :options="SubordList" emit-value map-options
label="我下属的" />
</div>
<div class="col-3">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="dateArray" size="mini" @change="resetSearch" value-format="yyyy-MM-dd"
type="daterange" style="border:none;" range-separator="至" start-placeholder="跟进开始时间"
end-placeholder="跟进结束时间" />
</template>
</q-field>
</div>
<template v-if="morequery">
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="SId" option-label="SName" v-model="msg.School_Id"
:options="CompanyList" emit-value map-options label="校区" />
</div>
<div class="col-3">
<q-select @input="resetSearch" filled option-value="CourseId" option-label="CourseName"
v-model="msg.CourseId" clearable emit-value use-input :options="myCourseList" label="课程" dense map-options
@filter="filterFnkec" />
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="Id" option-label="EmployeeName"
v-model="msg.ConsultantId" clearable :options="RoleListData" emit-value map-options label="课程顾问" />
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="Id" option-label="Name"
v-model="msg.StuGuestState" clearable :options="hetongList" emit-value map-options label="合同状态" />
</div>
<div class="col-3">
<q-select @input="msg.StuSourceId='',msg.StuChannel='',resetSearch()" dense clearable filled
option-value="Id" option-label="Name" v-model="msg.CreateType" :options="customFromList" emit-value
map-options label="客户来源" />
</div>
<div class="col-3" v-if="msg.CreateType==1">
<q-select filled v-model="msg.StuChannel" @input="resetSearch" label="收客渠道" dense :options="StuChannelList"
option-label="Name" option-value="Id" emit-value map-options use-input clearable
@filter="filterStuChannel">
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
未找到相关数据
</q-item-section>
</q-item>
</template>
</q-select>
</div>
<div class="col-3" v-if="msg.CreateType==2">
<q-select filled v-model="msg.StuSourceId" dense :options="customList" use-input label="关联同行"
@filter="filterFn" option-label="CustomerName" @input="resetSearch" clearable option-value="CustomerId"
emit-value map-options>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
未找到相关数据
</q-item-section>
</q-item>
</template>
</q-select>
</div>
<div class="col-3" v-if="msg.CreateType==3">
<q-select filled v-model="msg.StuSourceId" dense @filter="filterEmployee" label="介绍人" use-input
:options="myEmployeeList" option-label="EmployeeName" @input="resetSearch" clearable option-value="Id"
emit-value map-options />
</div>
<div class="col-3" v-if="msg.CreateType==4">
<q-select filled v-model="msg.StuSourceId" dense use-input @filter="filterStudent" label="转介人"
:options="MyTransListData" option-label="StuName" @input="resetSearch" clearable option-value="StuId"
emit-value map-options />
</div>
<div class="col-3">
(
<q-radio size="xs" v-model="msg.Q_FType" val="1" label="范围内有跟进记录" @input='resetSearch' />
<q-radio size="xs" v-model="msg.Q_FType" val="2" label="范围内没有跟进记录" @input='resetSearch' />
</div>
</template>
</div>
</div>
<div style="width: 100%;text-align: right;padding: 0 20px;margin-bottom: 10px;">
<span @click="morequery=!morequery" style="display:inline-flex;align-items:center;cursor: pointer;">
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" label="下载" v-if="isHaveDownLoad"
@click="downloadStudentFollow" />
<span style="margin-right:5px;color: #089bab;">高级查询</span>
<img v-show="!morequery" style="width:12px;height:12px" src="../../../assets/images/more.png" alt="">
<img v-show="morequery" class="roatImg" style="width:12px;height:12px" src="../../../assets/images/more.png"
alt="">
</span>
</div>
<div class="col row wrap q-gutter-x-md" v-if="dataList.Stat">
<div class="col stics">
<span class="stics-name">学生总数</span>
<span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">续费数量</span>
<span style="color: #F72E52">{{dataList.Stat.RenewNum?dataList.Stat.RenewNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">新生数量</span>
<span style="color:#2961FE;">{{dataList.Stat.NewNum?dataList.Stat.NewNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">学习中数量</span>
<span>{{dataList.Stat.StudyNum?dataList.Stat.StudyNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">毕业数量</span>
<span>{{dataList.Stat.GraduateNum?dataList.Stat.GraduateNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">停课数量</span>
<span>{{dataList.Stat.SuspendNum?dataList.Stat.SuspendNum:0}}人</span>
</div>
<div class="col stics">
<span class="stics-name">退学数量</span>
<span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span>
</div>
</div>
<div style="width: 100%;margin-top: 20px">
<div style="width: 100%;overflow-x: auto;">
<table class="po_content singeRowTable" ref="table" style="border:1px solid #E6E6E6;" cellspacing="0"
cellpadding="0" v-loading="loading">
<tr>
<th width="120" rowspan="2" style="min-width: 110px;z-index: 999;">学生</th>
<th width="120" rowspan="2" style="min-width: 110px;">电话</th>
<th width="120" rowspan="2" style="min-width: 110px;">课程顾问</th>
<th width="120" rowspan="2" style="min-width: 110px;">班主任</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">所报课程</th>
<th width="200" rowspan="2" style="min-width: 200px;">开课时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">结课时间</th>
<th width="80" rowspan="2" style="min-width: 80px;">当前级别</th>
<th width="100" rowspan="2" style="min-width: 100px;">生日</th>
<th width="100" rowspan="2" style="min-width: 100px;">客户来源</th>
<th width="100" rowspan="2" style="min-width: 100px;">学习目的</th>
<th width="100" rowspan="2" style="min-width: 100px;">来源关联人</th>
<th width="100" rowspan="2" style="min-width: 100px;">收客渠道</th>
<th width="100" rowspan="2" style="min-width: 100px;">负责人</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同状态</th>
<th width="100" rowspan="2" style="min-width: 120px;">期望达成协议日期</th>
<th width="100" rowspan="2" style="min-width: 100px;">目前状态</th>
<th width="100" rowspan="2" style="min-width: 100px;">胜率</th>
<th width="100" rowspan="2" style="min-width: 100px;">跟踪记录</th>
<th width="500" colspan="3" style="min-width: 500px;" v-for=" ( item , index ) in RListlength "
:key='index'>
<div>第{{index+1}}个月</div>
<div v-if="dataList.MonthList">(累计续约:<span style="color: #F72E52">{{getxuyue(index).RenewNum}} </span>
<span style="margin-left: 5px;">学员介绍:{{getxuyue(index).IntroductionNum}}</span>) </div>
</th>
</tr>
<tr>
<th v-for=" ( item , index ) in titlelist " :key='index' :width="item.Id==1?120:200">{{item.Name}}</th>
</tr>
<tr v-for=" ( item , index ) in dataList.RList " :key="index"
v-if='dataList.RList && dataList.RList.length>0'>
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.StuTel }}</span>
</td>
<td>
<span v-html="getCurseManager(item)"></span>
</td>
<td>
<span v-html="getTeacherManager(item)"></span>
</td>
<td>
<span>{{ item.ContractSTime }}</span>
</td>
<td>
<span>{{ item.CourseName }}</span>
</td>
<td>
<span>{{ item.BeginClassDate }}</span>
</td>
<td>
<span>{{ item.GraduationTime }}</span>
</td>
<td>
<span>{{ item.JapanBaseInfo }}</span>
</td>
<td>
<span>{{ item.StuBirthStr }}</span>
</td>
<td>
<span>{{ item.CreateTypeName?item.CreateTypeName:'-' }}</span>
</td>
<td>
{{item.StuPurposeName}}
</td>
<td>
<span><span v-if="item.CreateType==2 && item.EnterpriseName">{{item.EnterpriseName}}:</span>
{{ item.StuSourceIdName?item.StuSourceIdName:'-' }}</span>
</td>
<td>
<span>{{ item.StuChannelName?item.StuChannelName:'-' }}</span>
</td>
<td>
<span>{{ item.CreateByName?item.CreateByName:'-' }}</span>
</td>
<td>
<span>{{ item.StuGuestStateName }}</span>
</td>
<td>
{{item.AdvisorExpectDate}}
</td>
<td>
{{item.AdvisorStatusName}}
</td>
<td>
{{item.AdvisorWinRate}}%
</td>
<td>
<template v-if="item.AdvisorList">
<template v-if="item.AdvisorList.length>0">
{{item.AdvisorList[0].AdvisorStatusName}}
<span class="stulistNumber">
{{item.AdvisorList.length}}
<q-popup-proxy>
<q-banner>
<table class="OCourseTable" style="border-collapse:collapse;">
<tr>
<th>跟进状态</th>
<th>跟进日期</th>
<th>跟进比例</th>
<th>跟进备注</th>
</tr>
<tr v-for="(sItem,sIndex) in item.AdvisorList" style="border-bottom:1px dashed #d1d1d1;"
:key="sIndex">
<td>{{sItem.AdvisorStatusName}}</td>
<td>{{sItem.AdvisorDate}}</td>
<td>{{sItem.AdvisorRate}}</td>
<td>{{sItem.AdvisorRemark}}</td>
</tr>
</table>
</q-banner>
</q-popup-proxy>
</span>
</template>
<template v-if="item.AdvisorList.length==0">
</template>
</template>
</td>
<td v-for=" ( x , y ) in titlelist " :key="y">
<div v-if="item.MonthList[x.index]">
<div v-if="x.Id==1">
<span>{{item.MonthList[x.index].Month}}</span>
<span style="margin:0 3px">/</span>
<span v-if="item.MonthList[x.index].IsRenew==1" style="color: red;"></span>
<span v-if="item.MonthList[x.index].IsRenew==2"></span>
<span style="margin:0 3px">/</span>
<span
:style="{'color':item.MonthList[x.index].IntroductionNum>0?'red':'#111'}">{{item.MonthList[x.index].IntroductionNum}}</span>
</div>
<div v-if="x.Id==2" style="padding: 7px;">
<div v-if="item.MonthList[x.index].TeacherTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].TeacherTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].TeacherTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Teacher!=''" v-html="item.MonthList[x.index].Teacher"></div>
<span v-if="item.MonthList[x.index].Teacher==''">-</span>
</template>
</div>
<div v-if="x.Id==3" style="padding: 3px;">
<div v-if="item.MonthList[x.index].ConsultantTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].ConsultantTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].ConsultantTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Consultant" v-html="item.MonthList[x.index].Consultant"></div>
<span v-if="item.MonthList[x.index].Consultant==''">-</span>
</template>
</div>
</div>
</td>
</tr>
</table>
</div>
<div v-if='!dataList.RList||(dataList.RList && dataList.RList.length==0)'
style="width: 100%;border:1px solid #E6E6E6;display: flex;align-items: center;justify-content: center;height: 60px;">
暂无数据
</div>
<q-pagination v-if='dataList.RList && dataList.RList.length>0' class="full-width justify-end"
v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" />
</div>
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :BelongType="BelongType" :save-obj="stuOption"
@close="closeStuForm" @success="getList" @reload="getList">
</studentRight-form>
<studentFUForm v-if="isShowStuFU" :save-obj="stuOption" @close="closeStuForm">
</studentFUForm>
</div>
</template>
<script>
import Vue from 'vue'
export default {
data() {
return {
msg: {
pageIndex: 1,
pageSize: 12,
rowsPerPage: 12,
StuName: "",
StuRealMobile: '',
QQ: '',
WeChatNo: '',
StuType: '', //学生类型
StuGuestState: '', //合同状态
SFTime: '',
EFTime: '',
StuStage: '', //客户状态
Q_FType: '1', //跟进类型 1范围内有跟进记录 2范围内没有跟进记录
BelongType: 1,
CreateIds: [],
School_Id: '-1', //校区
CourseId: '', //课程
ConsultantId: '', //课程顾问
CreateType: '', //客户来源
StuChannel: "", //收客渠道
StuSourceId: '',
StuPurpose: '' //学习目的
},
//归属类型列表
BelongTypeList: [{
Id: 1,
Name: "全部"
},
{
Id: 2,
Name: "我负责的"
},
{
Id: 3,
Name: "我协同的"
},
{
Id: 4,
Name: "我下属的"
}
],
loading: false,
dataList: [], //列表数据
PageCount: 0,
customTypeList: [], //客户类型
customState: [],
isMyStuList: [{
Id: '-1',
Name: '不限'
}, {
Id: '1',
Name: '是'
}, {
Id: '0',
Name: '否'
}, ],
hetongList: [{
Id: '1',
Name: '正常'
}, {
Id: '2',
Name: '退学'
}, {
Id: '5',
Name: '停课'
}, {
Id: '7',
Name: '毕业'
}, ],
dateArray: [], //日期数组
RListlength: 0,
titlelist: [],
stuOption: null,
BelongType: 1,
isShowStuRight: false,
isJudgeTrans: 1,
SubordList: [], //我的下属数据
AllSubordList: [],
stuOption: null,
isShowStuFU: false,
morequery: true,
CompanyList: [],
allCourseList: [], //课程
myCourseList: [],
RoleListData: [], //课程顾问下拉数据
customFromList: [], //客户来源
StuChannelList: [], //收客渠道
allStuChannelList: [], //所有收客渠道
customList: [], //同行列表
allCustomList: [], //所有同行列表
//员工列表
employeeList: [],
myEmployeeList: [],
TransListData: [], //转介人数据
MyTransListData: [],
goalsList: [], //学习目的列表
}
},
methods: {
},
mounted() {
},
created() {
}
};
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<style scoped>
/deep/.el-input__inner,
/deep/.el-range-input {
background-color: transparent;
border: none;
}
.stics {
padding: 10px 20px;
background: #DDDEE0;
border-radius: 4px;
font-size: 13px;
color: #000000;
font-weight: bold
}
.stics .stics-name {
color: #2D2D2D;
font-weight: 600;
margin-right: 10px
}
.roatImg {
transform: rotate(180deg);
}
</style>
......@@ -17,6 +17,10 @@
</template>
</q-field>
</div>
<div class="col-2" v-if="isHaveEdit">
<q-select filled v-model="msg.TeacherAccountId" dense use-input label="教师" :options="MyTeacherListData"
option-label="EmployeeName" @input="refreshPage" clearable option-value="Id" emit-value map-options />
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" :loading="loading" no-data-label="暂无相关数据" flat
......@@ -26,27 +30,21 @@
<div class="col-2 q-table__title">教师月度考核列表</div>
<q-space />
<div class="page-option">
<q-btn color="accent" size="sm" class="q-mr-md" icon="add" label="考核" @click="goAssessTable()" />
<q-btn v-if="isHaveEdit" color="accent" size="sm" class="q-mr-md" icon="add" label="考核"
@click="goAssessTable()" />
</div>
</template>
<template v-slot:body-cell-AuditStatus="props">
<q-td :props="props">
<template v-if="props.row.AuditStatus==0">
待提交
</template>
<template v-else>
{{props.row.AuditStatusName}}
</template>
</q-td>
</template>
<template v-slot:body-cell-OptionId="props">
<q-td :props="props">
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="submitApproval(props.row)"
<!-- <q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="submitApproval(props.row)"
label="提交审批" v-if="props.row.AuditStatus==0&&props.row.TeacherSignDate" />
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="showForm(props.row,1)"
label="评价" />
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="showForm(props.row,2)"
label="建议" />
label="建议" /> -->
<q-btn v-if="isHaveEdit" flat size="xs" icon="edit" color="accent" style="font-weight:400"
@click="goAssessTable(props.row)" label="修改" />
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" @click="gotoDetail(props.row)"
label="详情" />
</q-td>
......@@ -67,8 +65,14 @@
queryTeacherAssessmentPage,
SubmitTeacherAssessmentApproval
} from '../../api/teacher/index';
import {
queryEmployee,
} from "../../api/users/user";
import behaviorForm from "../../components/teacher/behavior-form.vue";
import helpForm from "../../components/teacher/help-form.vue";
import {
mapState
} from "vuex";
export default {
meta: {
title: "教师月度考评"
......@@ -125,12 +129,6 @@
field: "TotalScore",
align: "left"
},
{
name: "AuditStatus",
label: "审核状态",
field: "AuditStatus",
align: "left"
},
{
name: 'OptionId',
label: '操作',
......@@ -142,21 +140,49 @@
isShowBehavior: false, //是否显示对员工评价弹窗
isShowHelp: false, //是否显示员工对公司建议弹窗
objOption: null,
MyTeacherListData: [], //教师列表
}
},
computed: mapState({
//是否有下载权限
isHaveEdit(state) {
if (state.user.userInfo && state.user.userInfo.ActionMenuList && state.user.userInfo.ActionMenuList.length >
0) {
let action = state.user.userInfo.ActionMenuList.find(x => {
if (x.FunctionCode == "Edit_TeacherAssessment") {
return x;
}
});
return action && action.FunctionCode;
}
return false;
}
}),
created() {
let today = new Date();
this.msg.YearStr = today.getFullYear().toString();
this.msg.MonthStr = (today.getMonth() + 1).toString();
this.queryDate = this.msg.YearStr + '-' + this.msg.MonthStr;
if (this.$route.query) {
this.findData();
if (!this.isHaveEdit) {
let userinfo = this.getLocalStorage();
this.msg.TeacherAccountId = userinfo.Id;
}
},
mounted() {
this.getTeacherAssessmentPage()
},
methods: {
findData() {
queryEmployee({
AccountTypeStr: "2",
IsLeave: 1
}).then(res => {
if (res.Code == 1) {
this.MyTeacherListData = res.Data;
}
})
},
//翻页
changePage(val) {
this.msg.pageIndex = val;
......@@ -181,8 +207,12 @@
this.getTeacherAssessmentPage();
},
//跳转考核新增修改页面
goAssessTable() {
this.OpenNewUrl('/teacher/jobEvaluation', {});
goAssessTable(item) {
var qObj = {};
if (item) {
qObj.Id = item.Id;
}
this.OpenNewUrl('/teacher/jobEvaluation', qObj);
},
//跳转到考核详情页面
gotoDetail(item) {
......
......@@ -34,7 +34,8 @@
<div class="col-2 jobEvaluationDate q-mr-lg">
<q-field filled stack-label dense label="考核月份">
<template v-slot:control>
<el-date-picker v-model="teacherDate" value-format="yyyy-MM" size="mini" type="month" placeholder="选择考核月份">
<el-date-picker v-model="teacherDate" value-format="yyyy-MM" size="mini" type="month"
placeholder="选择考核月份">
</el-date-picker>
</template>
</q-field>
......@@ -107,8 +108,8 @@
TotalScore: 0, //总分
DetailsList: [],
CheckType: 0, //1-教学主管,2-教务主管
IsJiaoWuFinish:0,//教务主管是否完成打分
IsTeacherFinish:0,//教学主管是否完成打分
IsJiaoWuFinish: 0, //教务主管是否完成打分
IsTeacherFinish: 0, //教学主管是否完成打分
},
isAuth: false, //是否有权限
saveLoading: false,
......@@ -122,7 +123,10 @@
this.GetTeacherList();
},
mounted() {
if (this.$route.query && this.$route.query.Id) {
this.saveObj.Id = this.$route.query.Id;
this.getInfo();
}
},
methods: {
changeStatus(subItem, optionItem) {
......@@ -161,6 +165,7 @@
TeacherAccountId: this.saveObj.TeacherAccountId,
YearStr: this.saveObj.YearStr,
MonthStr: this.saveObj.MonthStr,
Id:this.saveObj.Id,
};
queryTeacherAssessmentInfo(qMsg).then(res => {
if (res.Code == 1) {
......@@ -176,8 +181,8 @@
this.saveObj.TotalScore = tempData.TotalScore;
this.saveObj.CheckType = tempData.CheckType;
this.saveObj.DetailsList = tempData.DetailsList;
this.saveObj.IsTeacherFinish=tempData.IsTeacherFinish;
this.saveObj.IsJiaoWuFinish=tempData.IsJiaoWuFinish;
this.saveObj.IsTeacherFinish = tempData.IsTeacherFinish;
this.saveObj.IsJiaoWuFinish = tempData.IsJiaoWuFinish;
} else {
this.$q.notify({
type: 'negative',
......
......@@ -81,7 +81,7 @@
{{saveObj.S_JiaoWu_Time}}
</td>
</tr>
<tr>
<!-- <tr>
<td colspan="9" style="text-align:left;padding-left:5px;">
注:以下由部门考核者填写
</td>
......@@ -170,7 +170,7 @@
<td colspan="9" style="text-align:left;padding-left:5px;">
签字/日期:{{saveObj.TeacherSignDate}}
</td>
</tr>
</tr> -->
</tfoot>
</table>
</div>
......
......@@ -191,6 +191,11 @@ export default {
immediate: true
}
},
mounted() {
if (tccc && tccc.Agent) {
tccc.Agent.offline();
}
},
methods: {
callBackUserInfo(code) {
setUserCodeCallBack({
......@@ -228,7 +233,7 @@ export default {
const s = document.createElement("script");
s.type = "text/javascript";
s.src =
"http://wwcdn.weixin.qq.com/node/wework/wwopen/js/wwLogin-1.2.5.js";
"https://wwcdn.weixin.qq.com/node/wework/wwopen/js/wwLogin-1.2.5.js";
const wxElement = document.body.appendChild(s);
// 调用企业微信二维码方法
wxElement.onload = function() {
......
......@@ -618,6 +618,176 @@ const routes = [{
import ("pages/financial/financalDocument/receiptManager.vue")
},
{
path: "/financial/financalDocument/BasicDocuments", //财务 财务单据 审核标准单据
component: () =>
import ("pages/financial/financalDocument/BasicDocuments.vue")
},
{
path: "/financial/reportform/RecPayQueryTeam", //财务报表 月度班级收支统计
component: () =>
import ("pages/financial/reportform/RecPayQueryTeam.vue")
},
{
path: "/financial/reportform/RevenueFileMan", //财务报表 营收文件管理
component: () =>
import ("pages/financial/reportform/RevenueFileMan.vue")
},
{
path: "/financial/reportform/performanceCommission", //财务报表 业绩提成汇总
component: () =>
import ("pages/financial/reportform/performanceCommission.vue")
},
{
path: "/financial/reportform/settleAccounts", //财务报表 财务轧账月份列表
component: () =>
import ("pages/financial/reportform/settleAccounts.vue")
},
{
path: "/financial/reportform/activityDeploy", //财务流程 获取活动配置
component: () =>
import ("pages/financial/reportform/activityDeploy.vue")
},
{
path: "/financial/reportform/activityCommissionDetails", //工作台 活动提成明细
component: () =>
import ("pages/financial/reportform/activityCommissionDetails.vue")
},
{
path: "/financial/reportform/activityCommissionForOrderList", //工作台 查询订单活动提成明细
component: () =>
import ("pages/financial/reportform/activityCommissionForOrderList.vue")
},
{
path: "/financial/reportform/activityCommissionUserList", //工作台 获取活动提成用户列表
component: () =>
import ("pages/financial/reportform/activityCommissionUserList.vue")
},
{
path: "/financial/reportform/activityStatistics", //工作台 获取活动提成统计
component: () =>
import ("pages/financial/reportform/activityStatistics.vue")
},
{
path: "/financial/studyabroad/studyAbroadRules", //财务流程 留学提成规则
component: () =>
import ("pages/financial/studyabroad/studyAbroadRules.vue")
},
{
path: "/financial/studyabroad/studyAbroadCommission", //工作台 留学销售提成
component: () =>
import ("pages/financial/studyabroad/studyAbroadCommission.vue")
},
{
path: "/financial/studyabroad/studyAbroadCommissionTJ", //工作台 留学销售统计
component: () =>
import ("pages/financial/studyabroad/studyAbroadCommissionTJ.vue")
},
{
path: "/financial/studyabroad/commissionDetail", //工作台 留学销售列表
component: () =>
import ("pages/financial/studyabroad/commissionDetail.vue")
},
{
path: "/financial/studyabroad/sBuserCommissionDetails", //工作台 留学销售明细
component: () =>
import ("pages/financial/studyabroad/sBuserCommissionDetails.vue")
},
{
path: "/financial/studyabroad/ordercommission", //工作台 获取销售提成-订单跳转列表 传的参数不同
component: () =>
import ("pages/financial/studyabroad/ordercommission.vue")
},
{
path: "/financial/contribution/toConfigure", //财务流程 投稿规则
component: () =>
import ("pages/financial/contribution/toConfigure.vue")
},
{
path: "/financial/contribution/contributeCommission", // 工作台 投稿销售提成
component: () =>
import ("pages/financial/contribution/contributeCommission.vue")
},
{
path: "/financial/contribution/commissionUserList", // 工作台 投稿销售提成 用户列表
component: () =>
import ("pages/financial/contribution/commissionUserList.vue")
},
{
path: "/financial/contribution/CommissionUserDetailList", // 工作台 投稿销售提成 用户详情
component: () =>
import ("pages/financial/contribution/CommissionUserDetailList.vue")
},
{
path: "/financial/contribution/commissionStatistics", // 工作台 投稿销售统计
component: () =>
import ("pages/financial/contribution/commissionStatistics.vue")
},
{
path: "/financial/market/commissionRule", // 市场顾问 提现规则
component: () =>
import ("pages/financial/market/commissionRule.vue")
},
{
path: "/financial/market/courseConsultant", // 课程顾问 提现规则
component: () =>
import ("pages/financial/market/courseConsultant.vue")
},
{
path: "/financial/market/achievementPeriodsList", // 业绩提成 分期列表
component: () =>
import ("pages/financial/market/achievementPeriodsList.vue")
},
{
path: "/financial/market/employeeCommission", // 业绩提成 员工提成
component: () =>
import ("pages/financial/market/employeeCommission.vue")
},
{
path: "/financial/market/AchievementsUserDetailList", // 业绩提成 员工提成明细列表
component: () =>
import ("pages/financial/market/AchievementsUserDetailList.vue")
},
{
path: "/financial/market/AchievementsForOrderList", // 业绩提成 获取订单跳转 提成详情
component: () =>
import ("pages/financial/market/AchievementsForOrderList.vue")
},
{
path: "/financial/market/marketStatistics", // 业绩提成 统计
component: () =>
import ("pages/financial/market/marketStatistics.vue")
},
{
path: "/financial/market/empBonus", // 员工人头奖励
component: () =>
import ("pages/financial/market/empBonus.vue")
},
{
path: "/financial/market/empBonusDetail", // 员工人头奖励详情
component: () =>
import ("pages/financial/market/empBonusDetail.vue")
},
{
path: "/financial/returnPassbook/ReturnperiodsList", // 返佣期数列表
component: () =>
import ("pages/financial/returnPassbook/ReturnperiodsList.vue")
},
{
path: "/financial/returnPassbook/ReturnUserList", // 返佣 用户分组列表
component: () =>
import ("pages/financial/returnPassbook/ReturnUserList.vue")
},
{
path: "/financial/returnPassbook/returnpassbookStatistics", // 返佣 幸福存折明细
component: () =>
import ("pages/financial/returnPassbook/returnpassbookStatistics.vue")
},
{
path: "/financial/returnPassbook/PassbookperiodsList", // 幸福存折期数列表
component: () =>
import ("pages/financial/returnPassbook/PassbookperiodsList.vue")
},
{
path: "/financial/financalDocument/BasicDocuments", //财务 财务单据 审核标准单据
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment