|
@@ -0,0 +1,419 @@
|
|
|
+<template>
|
|
|
+ <div class="m-container">
|
|
|
+ <h2>
|
|
|
+ <el-page-header @back="onCancel" :content="title"></el-page-header>
|
|
|
+ <!-- <div class="squrt" /> -->
|
|
|
+ </h2>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="week"
|
|
|
+ type="week"
|
|
|
+ format="yyyy-MM 第 WW 周"
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ placeholder="选择周"
|
|
|
+ @change="changeWeek"
|
|
|
+ :picker-options="{
|
|
|
+ firstDayOfWeek: 1,
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ <div class="taskList">
|
|
|
+ <div class="teamDot dotBtn" draggable="true">下校巡查</div>
|
|
|
+ <p>任务数量:<span :style="times>activeTotal?'color:red':''">{{activeTotal}}</span>/<span>{{times}}</span></p>
|
|
|
+ </div>
|
|
|
+ <div class="timeWrap">
|
|
|
+ <div class="weekDotList">
|
|
|
+ <!-- @click="setWeekDotList(item, index)" -->
|
|
|
+ <div class="weekDot" v-for="(item, index) in weekList" :key="index">
|
|
|
+ <p class="week">{{ item.week }}</p>
|
|
|
+ <p class="date">{{ item.dateStr }}</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="timer" @drop="drop" @dragover="dragOver($event)">
|
|
|
+ <div class="imgWrap" v-drag>
|
|
|
+ <img :src="timerImg" />
|
|
|
+ <div v-for="(item, index) in taskList" :key="index + 'new'">
|
|
|
+ <el-popover placement="top" trigger="hover">
|
|
|
+ <p>巡查日期:{{ item.planStart | dayjsFormat }}</p>
|
|
|
+ <p>
|
|
|
+ 巡查时间:{{ item.planStart | dayjsFormatMinute }}~{{
|
|
|
+ item.planEnd | dayjsFormatMinute
|
|
|
+ }}
|
|
|
+ </p>
|
|
|
+ <p>巡查乐团:{{ item.musicGroupName }}</p>
|
|
|
+ <div
|
|
|
+ slot="reference"
|
|
|
+ :style="item.style"
|
|
|
+ class="teamDot dot"
|
|
|
+ @click="resetSchedule(item)"
|
|
|
+ >
|
|
|
+ 下校巡查
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-dialog
|
|
|
+ :title="isNew ? '新增下校巡查' : '修改下校巡查'"
|
|
|
+ width="600px"
|
|
|
+ :visible.sync="taskStatus"
|
|
|
+ v-if="taskStatus"
|
|
|
+ >
|
|
|
+ <taskinfo
|
|
|
+ :taskInfo="activeTask"
|
|
|
+ ref="taskinfo"
|
|
|
+ :rangeStart="rangeStart"
|
|
|
+ :rangeEnd="rangeEnd"
|
|
|
+ :MusicGroupList="MusicGroupList"
|
|
|
+ :itemId="itemId"
|
|
|
+ @refreshList="refreshList"
|
|
|
+ />
|
|
|
+ <div slot="footer" style="margin-top: 20px" class="dialog-footer">
|
|
|
+ <el-button @click="taskStatus = false">取 消</el-button>
|
|
|
+ <el-button type="primary" v-if="isNew" @click="submitInfo(0)"
|
|
|
+ >确 定</el-button
|
|
|
+ >
|
|
|
+ <el-button type="primary" v-else @click="submitInfo(1)"
|
|
|
+ >确 定</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ <taskList ref="taskList" @resetSchedule="resetSchedule" @getTotal='getTotal'/>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import dayjs from "dayjs";
|
|
|
+import { getInspectionItemPlan, getMusicGroup } from "../api";
|
|
|
+import taskinfo from "./compontent/taskInfo";
|
|
|
+import taskList from "./compontent/taskList";
|
|
|
+import { permission } from "@/utils/directivePage";
|
|
|
+import {
|
|
|
+ setDate,
|
|
|
+ getNowDateAndSunday,
|
|
|
+ getNowDateAndMonday,
|
|
|
+ getWeekDay,
|
|
|
+} from "@/utils/date";
|
|
|
+export default {
|
|
|
+ components: {
|
|
|
+ taskinfo,
|
|
|
+ taskList,
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ timerImg: require("@/views/teacherManager/teacherDetail/components/weekUitl/weekTimer.png"),
|
|
|
+ active: -1,
|
|
|
+ week: new Date(),
|
|
|
+ weekList: [],
|
|
|
+ startTime: "",
|
|
|
+ endTime: "",
|
|
|
+ taskList: [],
|
|
|
+ weekDay: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
|
|
|
+ tableTime: "",
|
|
|
+ title: "",
|
|
|
+ userId: "",
|
|
|
+ taskStatus: false,
|
|
|
+ activeTask: null,
|
|
|
+ isNew: false,
|
|
|
+ rangeStart: "",
|
|
|
+ rangeEnd: "",
|
|
|
+ organId: "",
|
|
|
+ MusicGroupList: [],
|
|
|
+ times:'',
|
|
|
+ activeTotal:''
|
|
|
+ };
|
|
|
+ },
|
|
|
+ async mounted() {
|
|
|
+ this.init();
|
|
|
+ // 获取乐团
|
|
|
+ try {
|
|
|
+ const ruselt = await getMusicGroup({ organId: this.organId });
|
|
|
+ this.MusicGroupList = ruselt.data;
|
|
|
+ } catch (e) {}
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ this.times = this.$route.query.times
|
|
|
+ this.itemId = this.$route.query.itemId;
|
|
|
+ this.organId = this.$route.query.organId;
|
|
|
+ this.rangeStart = this.$route.query.startTime;
|
|
|
+ this.rangeEnd = this.$route.query.endTime;
|
|
|
+ this.week = this.$route.query.startTime;
|
|
|
+ this.userId = this.$route.query.teacher;
|
|
|
+ this.startTime = this.$route.query.startTime;
|
|
|
+ let titleMoth = dayjs(this.startTime).format("MM");
|
|
|
+ this.title = `${this.$route.query.name}${titleMoth}月下校巡查安排`;
|
|
|
+ this.getCalendatList();
|
|
|
+ this.setWeekList();
|
|
|
+ },
|
|
|
+ setStartTimeAndEndTime(date) {
|
|
|
+ this.startTime = getNowDateAndMonday(date);
|
|
|
+ if (this.active === -1) {
|
|
|
+ this.active = 0;
|
|
|
+ this.tableTime = this.startTime;
|
|
|
+ }
|
|
|
+ this.endTime = getNowDateAndSunday(date);
|
|
|
+ },
|
|
|
+ async getCalendatList() {
|
|
|
+ // console.log(this.$route.query.startTIme)
|
|
|
+ // 获取本周的周一和周日 以及这一周得课
|
|
|
+ this.setStartTimeAndEndTime(this.week);
|
|
|
+ try {
|
|
|
+ const result = await getInspectionItemPlan({
|
|
|
+ startTime: this.startTime,
|
|
|
+ endTime: this.endTime,
|
|
|
+ userId: this.userId,
|
|
|
+ page: 1,
|
|
|
+ rows: 9999,
|
|
|
+ });
|
|
|
+ this.dataList = result.data.rows;
|
|
|
+ for (let i in this.dataList) {
|
|
|
+ this.setCourseTime(this.dataList[i]);
|
|
|
+ this.taskList.push(this.dataList[i]);
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setCourseTime(row) {
|
|
|
+ let startMinutes = this.getMinutes(row.planStart.split(" ")[1]);
|
|
|
+ let endMinutes = this.getMinutes(row.planEnd.split(" ")[1]);
|
|
|
+ let width = (endMinutes - startMinutes) * 1.8;
|
|
|
+ let left = startMinutes - 240 > 0 ? (startMinutes - 240) * 1.8 + 17 : 17;
|
|
|
+ let top =
|
|
|
+ getWeekDay(row.planStart) === 1
|
|
|
+ ? 40
|
|
|
+ : getWeekDay(row.planStart) * 60 - 16;
|
|
|
+ row.style = {
|
|
|
+ width: width + "px",
|
|
|
+ top: top + "px",
|
|
|
+ left: left + "px",
|
|
|
+ };
|
|
|
+ },
|
|
|
+ getMinutes(str) {
|
|
|
+ return parseInt(str.split(":")[0]) * 60 + parseInt(str.split(":")[1]);
|
|
|
+ },
|
|
|
+ setWeekList() {
|
|
|
+ this.weekList = [];
|
|
|
+ let startTime = new Date(this.startTime.replace(/-/g, "/"));
|
|
|
+
|
|
|
+ startTime.setTime(startTime.getTime() - 1000 * 60 * 60 * 24);
|
|
|
+ for (let i = 0; i < 7; i++) {
|
|
|
+ startTime.setTime(startTime.getTime() + 1000 * 60 * 60 * 24);
|
|
|
+ // startTime.setTime(startTime.getTime() - 1000 * 60 * 60 * 24)
|
|
|
+ this.weekList.push({
|
|
|
+ week: this.weekDay[i],
|
|
|
+ dateStr: startTime.getMonth() + 1 + "月" + startTime.getDate() + "日",
|
|
|
+ date: setDate(startTime),
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setWeekDotList(item, index) {
|
|
|
+ this.active = index;
|
|
|
+ this.tableTime = item.date;
|
|
|
+ },
|
|
|
+ changeWeek(val) {
|
|
|
+ this.week = val;
|
|
|
+ this.active = -1;
|
|
|
+ this.getCalendatList();
|
|
|
+ this.setWeekList();
|
|
|
+ this.$refs.taskList.getList();
|
|
|
+ },
|
|
|
+ onCancel() {
|
|
|
+ this.$router.push({
|
|
|
+ path: "/main/main",
|
|
|
+ query: { tabrouter: "teamSchedule" },
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ drop(e, name) {
|
|
|
+ this.isNew = true;
|
|
|
+ this.activeTask = null;
|
|
|
+ this.taskStatus = true;
|
|
|
+ },
|
|
|
+ dragOver(event) {
|
|
|
+ event.preventDefault();
|
|
|
+ },
|
|
|
+ submitInfo(val) {
|
|
|
+ // 新增修改提交
|
|
|
+ this.$refs.taskinfo.submitInfo(val);
|
|
|
+ },
|
|
|
+ refreshList(date) {
|
|
|
+ // 根据这个时间刷新
|
|
|
+
|
|
|
+ this.taskStatus = false;
|
|
|
+ this.changeWeek(date);
|
|
|
+ },
|
|
|
+ resetSchedule(row) {
|
|
|
+ // 判断是否有权限
|
|
|
+ if (permission("inspectionItemPlan/update")) {
|
|
|
+ this.isNew = false;
|
|
|
+ this.activeTask = row;
|
|
|
+ this.taskStatus = true;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getTotal(val){
|
|
|
+ this.activeTotal = val
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ directives: {
|
|
|
+ drag(el) {
|
|
|
+ // 拖拽大图片移动
|
|
|
+ let oDiv = el; //当前元素
|
|
|
+ let self = this; //上下文
|
|
|
+ oDiv.onmousedown = function (e) {
|
|
|
+ //鼠标按下,计算当前元素距离可视区的距离
|
|
|
+ let disX = e.clientX - oDiv.offsetLeft;
|
|
|
+ let disY = e.clientY - oDiv.offsetTop;
|
|
|
+ let wrapW = document.querySelector(".timer").offsetWidth;
|
|
|
+ let imgW = document.querySelector(".imgWrap").offsetWidth;
|
|
|
+ document.onmousemove = function (e) {
|
|
|
+ //通过事件委托,计算移动的距离
|
|
|
+ let l = e.clientX - disX;
|
|
|
+ let t = e.clientY - disY;
|
|
|
+ //移动当前元素
|
|
|
+
|
|
|
+ if (l > 0) {
|
|
|
+ l = 0;
|
|
|
+ } else if (l < -(imgW - wrapW) + 2) {
|
|
|
+ l = -(imgW - wrapW) + 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ oDiv.style.left = l + "px";
|
|
|
+ // oDiv.style.top = t + "px";
|
|
|
+ };
|
|
|
+ document.onmouseup = function (e) {
|
|
|
+ document.onmousemove = null;
|
|
|
+ document.onmouseup = null;
|
|
|
+ };
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped>
|
|
|
+.taskList {
|
|
|
+ margin-top: 10px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: center;
|
|
|
+ .dotBtn {
|
|
|
+ cursor: pointer;
|
|
|
+ padding: 0 10px;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 25px;
|
|
|
+ border-radius: 3px;
|
|
|
+ margin-right: 20px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.teamDot {
|
|
|
+ background: linear-gradient(
|
|
|
+ to left,
|
|
|
+ rgba(90, 121, 246, 0.75),
|
|
|
+ rgba(90, 121, 246, 1)
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+.timeWrap {
|
|
|
+ margin-top: 20px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: flex-start;
|
|
|
+ .timer {
|
|
|
+ width: 1478px;
|
|
|
+ overflow: auto;
|
|
|
+ position: relative;
|
|
|
+ .imgWrap {
|
|
|
+ width: 2194px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
+ img {
|
|
|
+ width: 2194px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
+ }
|
|
|
+ .dot {
|
|
|
+ -moz-user-select: none; /*火狐*/
|
|
|
+ -webkit-user-select: none; /*webkit浏览器*/
|
|
|
+ -ms-user-select: none; /*IE10*/
|
|
|
+ user-select: none;
|
|
|
+ cursor: pointer;
|
|
|
+ position: absolute;
|
|
|
+ min-width: 75px;
|
|
|
+ height: 25px;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 25px;
|
|
|
+ padding-left: 5px;
|
|
|
+ z-index: 10;
|
|
|
+ top: 40px;
|
|
|
+ right: 0;
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+ .vipDot {
|
|
|
+ background: linear-gradient(
|
|
|
+ to left,
|
|
|
+ rgba(42, 174, 166, 0.75),
|
|
|
+ rgba(42, 174, 166, 1)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ .newDot {
|
|
|
+ background: linear-gradient(
|
|
|
+ to left,
|
|
|
+ rgba(52, 177, 246, 0.75),
|
|
|
+ rgba(52, 177, 246, 1)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .weekDotList {
|
|
|
+ margin: 24px 10px 0 0;
|
|
|
+ width: 70px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ background-color: #fff;
|
|
|
+
|
|
|
+ .weekDot {
|
|
|
+ cursor: pointer;
|
|
|
+ -moz-user-select: none; /*火狐*/
|
|
|
+ -webkit-user-select: none; /*webkit浏览器*/
|
|
|
+ -ms-user-select: none; /*IE10*/
|
|
|
+ user-select: none;
|
|
|
+ width: 70px;
|
|
|
+ height: 60px;
|
|
|
+ background-color: #fff;
|
|
|
+ color: #fff;
|
|
|
+ padding: 10px 0 10px 10px;
|
|
|
+ border-radius: 5px;
|
|
|
+ color: #000;
|
|
|
+ p {
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 20px;
|
|
|
+ }
|
|
|
+ .week {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #999;
|
|
|
+ }
|
|
|
+ .date {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .weekDot.active {
|
|
|
+ background-color: rgba(19, 129, 122, 1);
|
|
|
+ color: #fff !important;
|
|
|
+ border-radius: 5px;
|
|
|
+ .week {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ .date {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|