|
@@ -0,0 +1,517 @@
|
|
|
|
+<template>
|
|
|
|
+ <div>
|
|
|
|
+ <!-- class="m-container" -->
|
|
|
|
+ <div class="m-core">
|
|
|
|
+ <save-form
|
|
|
|
+ :inline="true"
|
|
|
|
+ @submit="search"
|
|
|
|
+ @reset="onReSet"
|
|
|
|
+ :model="searchForm"
|
|
|
|
+ save-key="studentManager-returnVisitList"
|
|
|
|
+ ref="searchForm"
|
|
|
|
+ >
|
|
|
|
+ <el-form-item>
|
|
|
|
+ <el-select
|
|
|
|
+ v-model.trim="searchForm.visiterType"
|
|
|
|
+ placeholder="请选择角色"
|
|
|
|
+ clearable
|
|
|
|
+ filterable
|
|
|
|
+ >
|
|
|
|
+ <el-option value="TEACHER" label="指导老师"></el-option>
|
|
|
|
+ <el-option value="EDU_TEACHER" label="乐团主管"></el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <!-- @change="handleChange" -->
|
|
|
|
+ <el-form-item>
|
|
|
|
+ <el-cascader
|
|
|
|
+ expand-trigger="hover"
|
|
|
|
+ clearable
|
|
|
|
+ placeholder="请选择回访类型"
|
|
|
|
+ :options="visitChiose"
|
|
|
|
+ v-model="searchForm.typeList"
|
|
|
|
+ >
|
|
|
|
+ </el-cascader>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item>
|
|
|
|
+ <el-select
|
|
|
|
+ v-model.trim="searchForm.probStatus"
|
|
|
|
+ placeholder="问题状态"
|
|
|
|
+ clearable
|
|
|
|
+ filterable
|
|
|
|
+ >
|
|
|
|
+ <el-option :value="0" label="待跟进"></el-option>
|
|
|
|
+ <el-option :value="1" label="已解决"></el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item>
|
|
|
|
+ <el-date-picker
|
|
|
|
+ v-model.trim="searchForm.timer"
|
|
|
|
+ style="width: 420px"
|
|
|
|
+ type="daterange"
|
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
|
+ range-separator="至"
|
|
|
|
+ start-placeholder="回访开始日期"
|
|
|
|
+ end-placeholder="回访结束日期"
|
|
|
|
+ :picker-options="{
|
|
|
|
+ firstDayOfWeek: 1,
|
|
|
|
+ }"
|
|
|
|
+ >
|
|
|
|
+ </el-date-picker>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item>
|
|
|
|
+ <el-button type="danger" native-type="submit">搜索</el-button>
|
|
|
|
+ <el-button native-type="reset" type="primary">重置</el-button>
|
|
|
|
+ <el-button
|
|
|
|
+ v-if="permission('export/studentVisitRecord')"
|
|
|
|
+ type="primary"
|
|
|
|
+ @click="onExport"
|
|
|
|
+ >导出</el-button
|
|
|
|
+ >
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </save-form>
|
|
|
|
+ <el-button type="primary" style="margin-bottom:20px" @click="visitVisible= true">新增回访</el-button>
|
|
|
|
+ <div class="tableWrap">
|
|
|
|
+ <el-table
|
|
|
|
+ :data="tableList"
|
|
|
|
+ :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
|
|
|
|
+ >
|
|
|
|
+ <el-table-column align="center" prop="teacherName" label="老师姓名">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <copy-text>{{ scope.row.teacherName }}</copy-text>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="organName" label="所属分部">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <copy-text>{{ scope.row.organName }}</copy-text>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="visiterType" label="角色">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div>
|
|
|
|
+ {{ scope.row.visiterType | visiterType }}
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <!-- <el-table-column align="center" prop="studentId" label="学生ID">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <copy-text>{{ scope.row.studentId }}</copy-text>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="studentName" label="学生姓名">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <copy-text>{{ scope.row.studentName }}</copy-text>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column> -->
|
|
|
|
+
|
|
|
|
+ <el-table-column align="center" prop="type" label="回访类型">
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="purpose" label="回访目的">
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="probStatus" label="问题状态">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div>
|
|
|
|
+ {{ scope.row.probStatus ? "已解决" : "待跟进" }}
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+
|
|
|
|
+ <el-table-column align="center" prop="name" label="回访图片">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div class="flexBox">
|
|
|
|
+ <el-image
|
|
|
|
+ v-if="scope.row.attachments"
|
|
|
|
+ style="width: 60px; height: 60px"
|
|
|
|
+ fit="cover"
|
|
|
|
+ :src="scope.row.attachments.split(',')[0]"
|
|
|
|
+ :previewSrcList="scope.row.attachments.split(',')"
|
|
|
|
+ >
|
|
|
|
+ </el-image>
|
|
|
|
+ <p v-if="scope.row.attachments.split(',').length - 1 > 0">
|
|
|
|
+ +{{ scope.row.attachments.split(",").length - 1 }}
|
|
|
|
+ </p>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="visitTime" label="回访时间">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div>
|
|
|
|
+ {{
|
|
|
|
+ scope.row.visitTime ? scope.row.visitTime.split(" ")[0] : "--"
|
|
|
|
+ }}
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column align="center" prop="masterTeacherName" label="操作">
|
|
|
|
+ <template slot-scope="scope">
|
|
|
|
+ <div>
|
|
|
|
+ <el-button type="text" @click="lookDetail(scope.row)"
|
|
|
|
+ >查看</el-button
|
|
|
|
+ >
|
|
|
|
+ <el-button
|
|
|
|
+ type="text"
|
|
|
|
+ v-if="
|
|
|
|
+ !scope.row.probStatus &&
|
|
|
|
+ permission('visit/updateProbStatus')
|
|
|
|
+ "
|
|
|
|
+ @click="updateState(scope.row)"
|
|
|
|
+ >状态修改</el-button
|
|
|
|
+ >
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ <pagination
|
|
|
|
+ save-key="studentManager-returnVisitList"
|
|
|
|
+ sync
|
|
|
|
+ :total.sync="rules.total"
|
|
|
|
+ :page.sync="rules.page"
|
|
|
|
+ :limit.sync="rules.limit"
|
|
|
|
+ :page-sizes="rules.page_size"
|
|
|
|
+ @pagination="getList"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <el-dialog
|
|
|
|
+ title="回访详情"
|
|
|
|
+ width="740px"
|
|
|
|
+ v-if="detailVisible"
|
|
|
|
+ :visible.sync="detailVisible"
|
|
|
|
+ >
|
|
|
|
+ <div>
|
|
|
|
+ <descriptions :column="2" v-if="activeRow" class="returnDialog">
|
|
|
|
+ <descriptions-item label="老师姓名:">{{
|
|
|
|
+ activeRow.teacherName
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="所属分部:">{{
|
|
|
|
+ activeRow.organName
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="角色:">{{
|
|
|
|
+ activeRow.visiterType | visiterType
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="学生姓名:">{{
|
|
|
|
+ activeRow.studentName
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="回访类型:">{{
|
|
|
|
+ activeRow.type
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="回访目的:">{{
|
|
|
|
+ activeRow.purpose
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item
|
|
|
|
+ label="家长反馈:"
|
|
|
|
+ v-if="activeRow.type == '小课回访'"
|
|
|
|
+ >{{
|
|
|
|
+ activeRow.feedbackType | feedbackTypeFilter
|
|
|
|
+ }}</descriptions-item
|
|
|
|
+ >
|
|
|
|
+ <descriptions-item
|
|
|
|
+ label="反馈详情:"
|
|
|
|
+ v-if="
|
|
|
|
+ (activeRow.feedbackType == 'THINKING' ||
|
|
|
|
+ activeRow.feedbackType == 'LOST') &&
|
|
|
|
+ activeRow.type == '小课回访'
|
|
|
|
+ "
|
|
|
|
+ >{{
|
|
|
|
+ activeRow.feedbackTypeDesc | feedbackTypeDescFilter
|
|
|
|
+ }}</descriptions-item
|
|
|
|
+ >
|
|
|
|
+ <descriptions-item label="问题状态:">{{
|
|
|
|
+ activeRow.probStatus ? "已解决" : "待跟进"
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item label="回访情况:" :span="6">{{
|
|
|
|
+ activeRow.overview
|
|
|
|
+ }}</descriptions-item>
|
|
|
|
+ <descriptions-item
|
|
|
|
+ :label="activeRow.type == '小课回访' ? '原因' : '家长反馈'"
|
|
|
|
+ :span="6"
|
|
|
|
+ >{{ activeRow.feedback }}</descriptions-item
|
|
|
|
+ >
|
|
|
|
+ <descriptions-item label="回访图片" :span="6">
|
|
|
|
+ <div class="list" v-if="imageList.length > 0">
|
|
|
|
+ <div v-for="item in imageList" :key="item.url" class="item">
|
|
|
|
+ <el-image
|
|
|
|
+ v-if="item"
|
|
|
|
+ :src="item"
|
|
|
|
+ :preview-src-list="imageList.map((item) => item)"
|
|
|
|
+ class="img"
|
|
|
|
+ >
|
|
|
|
+ </el-image>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <empty v-else />
|
|
|
|
+ </descriptions-item>
|
|
|
|
+ </descriptions>
|
|
|
|
+ </div>
|
|
|
|
+ </el-dialog>
|
|
|
|
+ <el-dialog
|
|
|
|
+ title="新增回访"
|
|
|
|
+ width="760px"
|
|
|
|
+ :visible.sync="visitVisible"
|
|
|
|
+ append-to-body
|
|
|
|
+ >
|
|
|
|
+ <visit
|
|
|
|
+ v-if="visitVisible"
|
|
|
|
+ :detail="{
|
|
|
|
+ studentName:$route.query.username,
|
|
|
|
+ studentId: $route.query.userId,
|
|
|
|
+ }"
|
|
|
|
+ :username="$route.query.username"
|
|
|
|
+ @close="visitVisible = false"
|
|
|
|
+ @submited="getList"
|
|
|
|
+ :isMainGo="false"
|
|
|
|
+ :useVisitType="false"
|
|
|
|
+ />
|
|
|
|
+ </el-dialog>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+<script>
|
|
|
|
+import { visitChiose1 } from "@/utils/searchArray";
|
|
|
|
+import { Export } from "@/utils/downLoadFile";
|
|
|
|
+import pagination from "@/components/Pagination/index";
|
|
|
|
+import { getEmployeeOrgan } from "@/api/buildTeam";
|
|
|
|
+import {
|
|
|
|
+ getVisitList,
|
|
|
|
+ updateProbStatus,
|
|
|
|
+} from "@/views/returnVisitManager/api.js";
|
|
|
|
+import cleanDeep from "clean-deep";
|
|
|
|
+import { getTimes } from "@/utils";
|
|
|
|
+import { resetQuery } from "@/utils/utils";
|
|
|
|
+import { permission } from "@/utils/directivePage";
|
|
|
|
+import visit from "@/views/withdrawal-application/modals/visit";
|
|
|
|
+import qs from "qs";
|
|
|
|
+export default {
|
|
|
|
+ components: { pagination,visit },
|
|
|
|
+ data() {
|
|
|
|
+ return {
|
|
|
|
+ searchForm: {
|
|
|
|
+ search: "",
|
|
|
|
+ organId: "",
|
|
|
|
+ visiterType: "",
|
|
|
|
+ typeList: [],
|
|
|
|
+ timer: [],
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ visitChiose: visitChiose1,
|
|
|
|
+ organList: [],
|
|
|
|
+ rules: {
|
|
|
|
+ // 分页规则
|
|
|
|
+ limit: 10, // 限制显示条数
|
|
|
|
+ page: 1, // 当前页
|
|
|
|
+ total: 0, // 总条数
|
|
|
|
+ page_size: [10, 20, 40, 50], // 选择限制显示条数
|
|
|
|
+ },
|
|
|
|
+ tableList: [],
|
|
|
|
+ imageList: [],
|
|
|
|
+ detailVisible: false,
|
|
|
|
+ activeRow: null,
|
|
|
|
+ visitVisible:false
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+ mounted() {
|
|
|
|
+ // getEmployeeOrgan().then((res) => {
|
|
|
|
+ // if (res.code == 200) {
|
|
|
|
+ // this.organList = res.data;
|
|
|
|
+ // }
|
|
|
|
+ // });
|
|
|
|
+ this.$store.dispatch("setBranchs");
|
|
|
|
+
|
|
|
|
+ if (this.$route.query) {
|
|
|
|
+ // 兼容老功能
|
|
|
|
+ if (this.$route.query.search) {
|
|
|
|
+ this.searchForm.search = this.$route.query.teacher;
|
|
|
|
+ this.searchForm.search = this.$route.query.search;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.searchForm.timer = this.$route.query.timer;
|
|
|
|
+ }
|
|
|
|
+ if (this.$route.query.typeList && this.$route.query.typeList.length > 0) {
|
|
|
|
+ this.searchForm.typeList = this.$route.query.typeList;
|
|
|
|
+ }
|
|
|
|
+ this.getList();
|
|
|
|
+ if (this.$route.query.search || this.$route.query.timer) {
|
|
|
|
+ // console.log( )
|
|
|
|
+ resetQuery(this, { timer: undefined, search: undefined });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ // activated() {
|
|
|
|
+ // this.getList();
|
|
|
|
+ // },
|
|
|
|
+ methods: {
|
|
|
|
+ handleChange(val) {
|
|
|
|
+ this.searchForm.type = val[0];
|
|
|
|
+ this.searchForm.purpose = val[1];
|
|
|
|
+ },
|
|
|
|
+ search() {
|
|
|
|
+ // this.$router.replace({query:{...this.$route.query,timer:undefined,teacher:undefined}})
|
|
|
|
+
|
|
|
|
+ this.rules.page = 1;
|
|
|
|
+ this.getList();
|
|
|
|
+ },
|
|
|
|
+ onReSet() {
|
|
|
|
+ this.type = [];
|
|
|
|
+ this.timer = [];
|
|
|
|
+ this.searchForm = {
|
|
|
|
+ search: "",
|
|
|
|
+ organId: "",
|
|
|
|
+ visiterType: "",
|
|
|
|
+ type: "",
|
|
|
|
+ purpose: "",
|
|
|
|
+ typeList: [],
|
|
|
|
+ timer: [],
|
|
|
|
+ };
|
|
|
|
+ this.search();
|
|
|
|
+ },
|
|
|
|
+ getList() {
|
|
|
|
+ // cleanDeep
|
|
|
|
+ let { timer, typeList, ...rest } = this.searchForm;
|
|
|
|
+ let type,
|
|
|
|
+ purpose = null;
|
|
|
|
+ if (typeList.length > 0) {
|
|
|
|
+ type = typeList[0];
|
|
|
|
+ purpose = typeList[1];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let params = {
|
|
|
|
+ ...rest,
|
|
|
|
+ page: this.rules.page,
|
|
|
|
+ rows: this.rules.limit,
|
|
|
|
+ ...getTimes(timer, ["startTime", "endTime"]),
|
|
|
|
+ type,
|
|
|
|
+ purpose,
|
|
|
|
+ studentId: this.$route.query.userId,
|
|
|
|
+ };
|
|
|
|
+ getVisitList(cleanDeep(params)).then((res) => {
|
|
|
|
+ if (res.code == 200) {
|
|
|
|
+ this.tableList = res.data.rows;
|
|
|
|
+ this.rules.total = res.data.total;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ lookDetail(row) {
|
|
|
|
+ this.activeRow = row;
|
|
|
|
+ this.imageList = this.activeRow.attachments.split(",");
|
|
|
|
+ this.detailVisible = true;
|
|
|
|
+ },
|
|
|
|
+ updateState(row) {
|
|
|
|
+ this.$confirm("是否将问题状态更变为'已解决'", "提示", {
|
|
|
|
+ confirmButtonText: "确定",
|
|
|
|
+ cancelButtonText: "取消",
|
|
|
|
+ type: "warning",
|
|
|
|
+ }).then((res) => {
|
|
|
|
+ updateProbStatus({ id: row.id, probStatus: 1 }).then((res) => {
|
|
|
|
+ this.$message.success("修改成功");
|
|
|
|
+ this.getList();
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ changeTimer(val) {
|
|
|
|
+ if (val && val.length > 0) {
|
|
|
|
+ this.searchForm.startTime = this.timer[0];
|
|
|
|
+ this.searchForm.endTime = this.timer[1];
|
|
|
|
+ } else {
|
|
|
|
+ this.searchForm.startTime = null;
|
|
|
|
+ this.searchForm.endTime = null;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ permission(str) {
|
|
|
|
+ return permission(str);
|
|
|
|
+ },
|
|
|
|
+ onExport() {
|
|
|
|
+ let { timer, typeList, ...rest } = this.searchForm;
|
|
|
|
+ let type,
|
|
|
|
+ purpose = null;
|
|
|
|
+ if (typeList.length > 0) {
|
|
|
|
+ type = typeList[0];
|
|
|
|
+ purpose = typeList[1];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let params = {
|
|
|
|
+ ...rest,
|
|
|
|
+ page: this.rules.page,
|
|
|
|
+ rows: this.rules.limit,
|
|
|
|
+ ...getTimes(timer, ["startTime", "endTime"]),
|
|
|
|
+ type,
|
|
|
|
+ purpose,
|
|
|
|
+ };
|
|
|
|
+ Export(
|
|
|
|
+ this,
|
|
|
|
+ {
|
|
|
|
+ url: "/api-web/export/studentVisitRecord",
|
|
|
|
+ params: qs.stringify(
|
|
|
|
+ cleanDeep({
|
|
|
|
+ ...params,
|
|
|
|
+ })
|
|
|
|
+ ),
|
|
|
|
+ fileName: `学员回访导出.xls`,
|
|
|
|
+ method: "post",
|
|
|
|
+ },
|
|
|
|
+ "确定导出学员回访"
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ watch: {
|
|
|
|
+ detailVisible(val) {
|
|
|
|
+ if (!val) {
|
|
|
|
+ this.activeRow = null;
|
|
|
|
+ this.imageList = [];
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+</script>
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+.msg {
|
|
|
|
+ min-width: 120px;
|
|
|
|
+}
|
|
|
|
+.label {
|
|
|
|
+ width: 520px;
|
|
|
|
+}
|
|
|
|
+::v-deep .description-title {
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
+}
|
|
|
|
+.returnDialog {
|
|
|
|
+ ::v-deep .description-view {
|
|
|
|
+ .description-content {
|
|
|
|
+ white-space: normal !important;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+.flexBox {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: row;
|
|
|
|
+ align-items: center;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.img-container {
|
|
|
|
+ margin: 10px auto;
|
|
|
|
+}
|
|
|
|
+.item {
|
|
|
|
+ width: 150px;
|
|
|
|
+ margin-top: 10px;
|
|
|
|
+ margin-right: 10px;
|
|
|
|
+ display: inline-block;
|
|
|
|
+ position: relative;
|
|
|
|
+}
|
|
|
|
+.img {
|
|
|
|
+ width: 150px;
|
|
|
|
+ height: 150px;
|
|
|
|
+}
|
|
|
|
+.ctrl-bar {
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.45);
|
|
|
|
+ height: 30px;
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 0;
|
|
|
|
+ width: 100%;
|
|
|
|
+ z-index: 1;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: flex-end;
|
|
|
|
+ align-items: center;
|
|
|
|
+ padding: 0 15px;
|
|
|
|
+ i {
|
|
|
|
+ color: #fff;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|