|
@@ -1,19 +1,30 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
<div class="personPage">
|
|
|
- <!-- <div style="width: 100%;display: flex;justify-content: flex-end;">
|
|
|
- <el-select v-model="teas" multiple placeholder="请选择">
|
|
|
+ <div
|
|
|
+ style="width: 100%;display: flex;justify-content: flex-end;align-items: center;"
|
|
|
+ >
|
|
|
+ <!-- <el-select v-model="teas" multiple placeholder="请选择">
|
|
|
<el-option
|
|
|
- v-for="item in TeaOptions"
|
|
|
- :key="item.value"
|
|
|
- :label="item.label"
|
|
|
- :value="item.value"
|
|
|
+ v-for="item in TeaList"
|
|
|
+ :key="item.id"
|
|
|
+ :label="item.name"
|
|
|
+ :value="item.id"
|
|
|
>
|
|
|
</el-option>
|
|
|
- </el-select>
|
|
|
- <div><el-button type="primary" size="mini">提醒</el-button></div>
|
|
|
- </div> -->
|
|
|
- <el-table :data="tableData" class="scoTab" style="width: 100%">
|
|
|
+ </el-select> -->
|
|
|
+ <!-- <div style="margin-left: 10px;">
|
|
|
+ <el-button type="primary" @click="remindExamine" size="mini"
|
|
|
+ >提醒</el-button
|
|
|
+ >
|
|
|
+ </div> -->
|
|
|
+ </div>
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ class="scoTab"
|
|
|
+ v-loading="tabLoading"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
<el-table-column type="index" align="center" label="序号" width="180">
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="username" align="center" label="教师姓名">
|
|
@@ -21,24 +32,51 @@
|
|
|
<el-table-column
|
|
|
prop="tea"
|
|
|
show-overflow-tooltip
|
|
|
+ :filters="TeachingOptions"
|
|
|
+ :filter-method="filterTea"
|
|
|
align="center"
|
|
|
label="教研室"
|
|
|
width="180"
|
|
|
>
|
|
|
</el-table-column>
|
|
|
- <el-table-column align="center" label="考核进度">
|
|
|
+ <el-table-column
|
|
|
+ :filters="[
|
|
|
+ { text: '已完成', value: '已完成' },
|
|
|
+ { text: '未完成', value: '未完成' }
|
|
|
+ ]"
|
|
|
+ :filter-method="filterExa"
|
|
|
+ :filter-multiple="false"
|
|
|
+ prop="state"
|
|
|
+ align="center"
|
|
|
+ label="考核进度"
|
|
|
+ >
|
|
|
<template slot-scope="scope">
|
|
|
<div v-if="scope.row.step == scope.row.allStep">√</div>
|
|
|
<div v-else>{{ scope.row.step }}/{{ scope.row.allStep }}</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="evaSca" align="center" label="自评分数">
|
|
|
+ <el-table-column
|
|
|
+ prop="evaSca"
|
|
|
+ :sortable="true"
|
|
|
+ :sort-method="sortEvaMethod"
|
|
|
+ align="center"
|
|
|
+ label="自评分数"
|
|
|
+ >
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="cogSco" align="center" label="考核分数">
|
|
|
+ <el-table-column
|
|
|
+ prop="cogSco"
|
|
|
+ :sortable="true"
|
|
|
+ :sort-method="sortCogMethod"
|
|
|
+ align="center"
|
|
|
+ label="考核分数"
|
|
|
+ >
|
|
|
</el-table-column>
|
|
|
- <el-table-column align="center" label="评分">
|
|
|
+ <el-table-column align="center" label="操作">
|
|
|
<template slot-scope="scope">
|
|
|
- <div class="TabBtn" @click="lookScore(scope.row)">评分</div>
|
|
|
+ <div style="display: flex;justify-content: center;">
|
|
|
+ <div class="TabBtn" @click="lookScore(scope.row)">评分</div>
|
|
|
+ <div class="TabBtn" @click="withdraw(scope.row.id)">退回</div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
@@ -171,6 +209,10 @@
|
|
|
<div style="display: flex;justify-content: center;">
|
|
|
<div v-if="tableData.length > 0" class="ScoreStep">
|
|
|
<input
|
|
|
+ :style="{
|
|
|
+ color: k.sco1 == k.sco2 ? '#000' : 'red'
|
|
|
+ }"
|
|
|
+ :readonly="txtLoading"
|
|
|
@blur="
|
|
|
saveTab(
|
|
|
k.sco2 > k.score ? (k.sco2 = k.score) : ''
|
|
@@ -179,11 +221,11 @@
|
|
|
type="number"
|
|
|
v-model="k.sco2"
|
|
|
/>
|
|
|
- <!-- @blur="Submit(scope.row)" -->
|
|
|
</div>
|
|
|
</div>
|
|
|
<div style="display: flex;justify-content: center;">
|
|
|
<textarea
|
|
|
+ :readonly="txtLoading"
|
|
|
v-if="tableData.length > 0"
|
|
|
@blur="saveTab()"
|
|
|
v-model.trim="k.cogSum"
|
|
@@ -205,7 +247,7 @@
|
|
|
:visible.sync="diaIframe"
|
|
|
:append-to-body="true"
|
|
|
width="95%"
|
|
|
- :before-close="handleClose"
|
|
|
+ :before-close="handleClose2"
|
|
|
class="dialog_diy"
|
|
|
>
|
|
|
<div style="height: 100%;">
|
|
@@ -216,19 +258,79 @@
|
|
|
></iframe>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
+ <!-- 提醒弹框 -->
|
|
|
+
|
|
|
+ <shareBox
|
|
|
+ :remDig.sync="remDig"
|
|
|
+ :pType="pType"
|
|
|
+ :TeaList="TeaList"
|
|
|
+ ></shareBox>
|
|
|
+
|
|
|
+ <!-- <el-dialog
|
|
|
+ title="提醒"
|
|
|
+ :visible.sync="remDig"
|
|
|
+ :append-to-body="true"
|
|
|
+ width="600"
|
|
|
+ :before-close="handleClose3"
|
|
|
+ class="dialog_remDig"
|
|
|
+ >
|
|
|
+ <div v-loading="digLoading" style="height: 100%;padding: 15px;">
|
|
|
+ <div class="remFlex" style="align-items: center;">
|
|
|
+ <div class="remFlexTit">填写范围:</div>
|
|
|
+ <el-select v-model="teas" multiple placeholder="请选择">
|
|
|
+ <el-option
|
|
|
+ v-for="item in TeaList"
|
|
|
+ :key="item.id"
|
|
|
+ :label="item.name"
|
|
|
+ :value="item.id"
|
|
|
+ @change="remindExamine"
|
|
|
+ >
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ <div class="remFlex">
|
|
|
+ <div class="remFlexTit">需提交人数:</div>
|
|
|
+ <div>{{ remindNum }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="remFlex">
|
|
|
+ <div class="remFlexTit">未完成人数:</div>
|
|
|
+ <div>{{ remindList.length }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="remFlex">
|
|
|
+ <div class="remFlexTit">需提交人数:</div>
|
|
|
+ <div class="remFlex" style="flex-wrap: wrap;">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in remindList"
|
|
|
+ :key="index"
|
|
|
+ style="margin-right: 2px;"
|
|
|
+ >
|
|
|
+ {{ item }},
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-dialog> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+import shareBox from "./shareBox/index";
|
|
|
export default {
|
|
|
props: {
|
|
|
pType: {
|
|
|
//2专任教师 1班主任
|
|
|
type: Number,
|
|
|
default: 0
|
|
|
+ },
|
|
|
+ teacherName: {
|
|
|
+ type: String,
|
|
|
+ default: ""
|
|
|
}
|
|
|
},
|
|
|
-
|
|
|
+ components: {
|
|
|
+ shareBox
|
|
|
+ },
|
|
|
data() {
|
|
|
return {
|
|
|
digType: 2,
|
|
@@ -247,34 +349,16 @@ export default {
|
|
|
computedScoData: 0,
|
|
|
computedStepData: 0,
|
|
|
computedCogSCoData: 0,
|
|
|
-
|
|
|
+ TeaList: [],
|
|
|
+ tabLoading: false,
|
|
|
userid: this.$route.query.userid, //用户id
|
|
|
oid: this.$route.query.oid, //学校id
|
|
|
org: this.$route.query.org, //组织id
|
|
|
tableData: [],
|
|
|
- TeaOptions: [
|
|
|
- {
|
|
|
- value: "选项1",
|
|
|
- label: "黄金糕"
|
|
|
- },
|
|
|
- {
|
|
|
- value: "选项2",
|
|
|
- label: "双皮奶"
|
|
|
- },
|
|
|
- {
|
|
|
- value: "选项3",
|
|
|
- label: "蚵仔煎"
|
|
|
- },
|
|
|
- {
|
|
|
- value: "选项4",
|
|
|
- label: "龙须面"
|
|
|
- },
|
|
|
- {
|
|
|
- value: "选项5",
|
|
|
- label: "北京烤鸭"
|
|
|
- }
|
|
|
- ],
|
|
|
- teas: []
|
|
|
+ TeachingOptions: [],
|
|
|
+ txtLoading: false,
|
|
|
+
|
|
|
+ remDig: false
|
|
|
};
|
|
|
},
|
|
|
watch: {
|
|
@@ -333,18 +417,21 @@ export default {
|
|
|
},
|
|
|
mounted() {
|
|
|
this.getData();
|
|
|
+ this.getTeaList();
|
|
|
},
|
|
|
methods: {
|
|
|
// 获取页面数据
|
|
|
getData() {
|
|
|
+ this.tabLoading = true;
|
|
|
let params = {
|
|
|
oid: this.oid,
|
|
|
org: this.org,
|
|
|
- type: this.pType
|
|
|
+ type: this.pType,
|
|
|
+ tname: this.teacherName
|
|
|
};
|
|
|
// console.log(params);
|
|
|
this.ajax
|
|
|
- .get(this.$store.state.api + "selectTestExamineSecondData", params)
|
|
|
+ .get(this.$store.state.api + "selectTestExaminePersonData", params)
|
|
|
.then(res => {
|
|
|
let data = res.data[0];
|
|
|
|
|
@@ -371,16 +458,25 @@ export default {
|
|
|
});
|
|
|
|
|
|
data.forEach(e => {
|
|
|
+ if (e.step == e.allStep) {
|
|
|
+ e.state = "已完成";
|
|
|
+ } else {
|
|
|
+ e.state = "未完成";
|
|
|
+ }
|
|
|
+ if (!e.tea) {
|
|
|
+ e.tea = "";
|
|
|
+ }
|
|
|
e.evaSca = e.evaSca.toFixed(2);
|
|
|
e.cogSco = e.cogSco.toFixed(2);
|
|
|
});
|
|
|
this.tableData = data;
|
|
|
+ this.tabLoading = false;
|
|
|
})
|
|
|
.catch(error => {
|
|
|
+ this.tabLoading = false;
|
|
|
console.log(error);
|
|
|
});
|
|
|
},
|
|
|
-
|
|
|
// 点击评分
|
|
|
lookScore(val) {
|
|
|
this.digLoading = true;
|
|
@@ -398,24 +494,132 @@ export default {
|
|
|
this.cutPerson();
|
|
|
this.getPageBase();
|
|
|
},
|
|
|
- // getTeaList() {
|
|
|
- // let params = {
|
|
|
- // oid: this.oid,
|
|
|
- // };
|
|
|
- // this.ajax
|
|
|
- // .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
|
|
|
- // .then((res) => {
|
|
|
- // this.TeachingOptions = res.data[0];
|
|
|
- // console.log('this.TeachingOptions',this.TeachingOptions);
|
|
|
- // })
|
|
|
- // .catch((err) => {
|
|
|
- // this.isLoading = false;
|
|
|
- // console.error(err);
|
|
|
- // });
|
|
|
- // },
|
|
|
+ // 获取教研室
|
|
|
+ getTeaList() {
|
|
|
+ let params = {
|
|
|
+ oid: this.oid
|
|
|
+ };
|
|
|
+ this.ajax
|
|
|
+ .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
|
|
|
+ .then(res => {
|
|
|
+ // return console.log("this.TeachingOptions", res.data[0]);
|
|
|
+ let data = res.data[0];
|
|
|
+ let dataCopy = [];
|
|
|
+
|
|
|
+ data.forEach(e => {
|
|
|
+ let a = {};
|
|
|
+ a.value = e.name;
|
|
|
+ a.text = e.name;
|
|
|
+ dataCopy.push(a);
|
|
|
+ });
|
|
|
+ data.forEach(e => {
|
|
|
+ let a = {};
|
|
|
+ a.id = e.id;
|
|
|
+ a.name = e.name;
|
|
|
+ this.TeaList.push(a);
|
|
|
+ });
|
|
|
+
|
|
|
+ this.TeachingOptions = dataCopy;
|
|
|
+ // console.log("this.TeachingOptions", this.TeachingOptions);
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ console.error(err);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 撤回
|
|
|
+ withdraw(id) {
|
|
|
+ let params = [
|
|
|
+ {
|
|
|
+ tid: id
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ this.$confirm("是否确认退回?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: " info"
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ this.ajax
|
|
|
+ .post(this.$store.state.api + "updateExamineState", params)
|
|
|
+ .then(res => {
|
|
|
+ this.getData();
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ console.log(error);
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ // this.$message({
|
|
|
+ // type: "info",
|
|
|
+ // message: "已取消退回"
|
|
|
+ // });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 提醒
|
|
|
+ remindExamine() {
|
|
|
+ this.remDig = true;
|
|
|
+ },
|
|
|
+ getExcel() {
|
|
|
+
|
|
|
+ var res = this.tableData;
|
|
|
+ // console.log('导出数据',res);
|
|
|
+ //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
|
|
|
+ //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
|
|
|
+ var array = [];
|
|
|
+ for (var i = 0; i < res.length; i++) {
|
|
|
+ var _json = {};
|
|
|
+ _json["教师姓名"] = res[i].username;
|
|
|
+ _json["教师账号"] = res[i].eName;
|
|
|
+ _json["所属教研室"] = res[i].tea;
|
|
|
+ array.push(_json);
|
|
|
+ }
|
|
|
+
|
|
|
+ var XLSX = require("xlsx");
|
|
|
+ const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
|
|
|
+ let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
|
|
|
+ ws["!cols"] = [
|
|
|
+ //设置每一列的宽度
|
|
|
+ { wch: 30 },
|
|
|
+ { wch: 30 },
|
|
|
+ { wch: 30 },
|
|
|
+ ];
|
|
|
+
|
|
|
+ XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
|
|
|
+ XLSX.writeFile(workbook, "教师发展.xlsx");
|
|
|
+ // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
|
|
|
+ // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
|
|
|
+ // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
|
|
|
+ this.$message({
|
|
|
+ message: "导出成功",
|
|
|
+ type: "success"
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 按照数字大小排序 方法-
|
|
|
+ sortCogMethod(before, after) {
|
|
|
+ return Number(before.cogSco) - Number(after.cogSco);
|
|
|
+ },
|
|
|
+ sortEvaMethod(before, after) {
|
|
|
+ return Number(before.evaSca) - Number(after.evaSca);
|
|
|
+ },
|
|
|
+ // 教研室筛选
|
|
|
+ filterTea(value, row, column) {
|
|
|
+ // console.log(value, row, column);
|
|
|
+ const property = column["property"];
|
|
|
+ return row[property].includes(value);
|
|
|
+ },
|
|
|
+ // 是否完成筛选
|
|
|
+ filterExa(value, row, column) {
|
|
|
+ // console.log(value, row, column);
|
|
|
+ const property = column["property"];
|
|
|
+ return row[property] == value;
|
|
|
+ },
|
|
|
// ----------------
|
|
|
+
|
|
|
// 保存修改
|
|
|
saveTab() {
|
|
|
+ this.txtLoading = true;
|
|
|
+
|
|
|
let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
|
|
|
|
|
|
for (const e of PageBaseDataCopy) {
|
|
@@ -452,7 +656,7 @@ export default {
|
|
|
return this.$message.error("暂无人员提交");
|
|
|
// this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}`;
|
|
|
|
|
|
- this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${this.oid}&org=${this.oid}&type=2&role=0&peopleId=${this.digUserid}`;
|
|
|
+ this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${cid}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.digUserid}`;
|
|
|
// this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
|
|
|
this.diaIframe = true;
|
|
|
},
|
|
@@ -615,6 +819,7 @@ export default {
|
|
|
this.DigSelfSco = 0;
|
|
|
this.twoTarget = 0;
|
|
|
}
|
|
|
+ this.txtLoading = false;
|
|
|
this.digLoading = false;
|
|
|
})
|
|
|
.catch(error => {
|
|
@@ -645,12 +850,20 @@ export default {
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
- // 关闭弹框
|
|
|
+ // 评分关闭弹框
|
|
|
handleClose(done) {
|
|
|
this.getData();
|
|
|
done();
|
|
|
},
|
|
|
-
|
|
|
+ // 数据来源关闭弹框
|
|
|
+ handleClose2(done) {
|
|
|
+ this.digLoading = true;
|
|
|
+ this.getPageBase();
|
|
|
+ done();
|
|
|
+ },
|
|
|
+ // handleClose3(done) {
|
|
|
+ // done();
|
|
|
+ // },
|
|
|
// 处理数据来源
|
|
|
async handleData() {
|
|
|
for (const e of this.PageBaseData) {
|
|
@@ -665,7 +878,7 @@ export default {
|
|
|
computedTest(val) {
|
|
|
let params = [
|
|
|
{
|
|
|
- uid: this.uid,
|
|
|
+ uid: this.digUserid,
|
|
|
testId: val.join(",")
|
|
|
}
|
|
|
];
|
|
@@ -693,6 +906,15 @@ export default {
|
|
|
white-space: nowrap;
|
|
|
text-overflow: ellipsis;
|
|
|
}
|
|
|
+.remFlex {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-start;
|
|
|
+ margin-bottom: 20px;
|
|
|
+}
|
|
|
+.remFlexTit {
|
|
|
+ width: 80px;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
.digTop {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
@@ -702,6 +924,19 @@ export default {
|
|
|
.TabBtn {
|
|
|
cursor: pointer;
|
|
|
color: #528df6;
|
|
|
+ margin: 0 10px;
|
|
|
+}
|
|
|
+.dialog_remDig >>> .el-dialog {
|
|
|
+ height: 700px;
|
|
|
+ margin: 0 auto !important;
|
|
|
+ margin-top: 20px !important;
|
|
|
+ overflow: hidden;
|
|
|
+ min-width: 800px !important;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_remDig >>> .el-dialog__header {
|
|
|
+ background: #454545 !important;
|
|
|
+ padding: 15px 20px;
|
|
|
}
|
|
|
.dialog_diy >>> .el-dialog {
|
|
|
height: 95%;
|