From 7bdc84b5844d2a481e2f17cdd2c8204fd4a403ee Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期一, 29 九月 2025 16:48:31 +0800
Subject: [PATCH] 业务管理相关页面添加`批号`查询条件
---
src/views/performance/class/index.vue | 1121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,121 insertions(+), 0 deletions(-)
diff --git a/src/views/performance/class/index.vue b/src/views/performance/class/index.vue
index e69de29..ff3a4f1 100644
--- a/src/views/performance/class/index.vue
+++ b/src/views/performance/class/index.vue
@@ -0,0 +1,1121 @@
+<template>
+ <div class="class-page">
+ <div class="search">
+ <div class="search_thing">
+ <div class="search_label">閫夋嫨鏃堕棿锛�</div>
+ <div class="search_input">
+ <el-date-picker v-model="query.year" type="year" size="small" format="yyyy" placeholder="閫夋嫨骞�"
+ @change="refreshTable()" style="width: 140px" :clearable="false">
+ </el-date-picker>
+ <el-select v-model="query.month" clearable placeholder="閫夋嫨鏈�" style="width: 140px; margin-left: 16px"
+ size="small" @change="refreshTable()">
+ <el-option v-for="item in monthOptions" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ <el-input v-model="query.userName" placeholder="璇疯緭鍏ヤ汉鍛樺悕绉�" size="small" style="width: 140px; margin: 0 16px"
+ clearable @keyup.enter.native="refreshTable()"></el-input>
+ <el-select v-model="query.laboratory" placeholder="璇烽�夋嫨瀹為獙瀹�" style="width: 140px" size="small" clearable
+ @change="refreshTable()">
+ <el-option v-for="item in laboratory" :key="item.value" :label="item.label" :value="item.value">
+ </el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="search_thing" style="padding-left: 30px">
+ <el-button size="mini" type="primary" @click="refreshTable()"> 璇�</el-button>
+ <el-button size="mini" @click="refresh()">閲嶇疆</el-button>
+ </div>
+ <div class="search_thing btns" style="padding-left: 30px">
+ <el-button size="small" type="primary" v-if="checkPermi(['performance:class:time'])"
+ @click="configTime">鏃堕棿閰嶇疆</el-button>
+ <el-button size="small" type="primary" v-if="checkPermi(['performance:class:down'])" @click="handleDown"
+ :loading="downLoading">瀵� 鍑�</el-button>
+ <el-button size="small" type="primary" @click="schedulingVisible = true"
+ v-if="checkPermi(['performance:class:add'])">鎺� 鐝�</el-button>
+ </div>
+ </div>
+ <div class="center" v-loading="pageLoading">
+ <div class="clearfix" style="width: 100%" v-show="query.month">
+ <div class="fixed-left">
+ <div class="content-title" style="padding-left: 16px; box-sizing: border-box">
+ 浜哄憳鍚嶇О
+ </div>
+ <div class="content-user" :class="{ hoverType: currentUserIndex == index }" v-for="(item, index) in list"
+ :key="'e' + index" v-on:mouseenter="onMouseEnter(index)" v-on:mouseleave="currentUserIndex = null">
+ <div class="user-pic">
+ {{ item.name ? item.name.charAt(0) : "" }}
+ </div>
+ <div class="user-info">
+ <p style="
+ font-size: 14px;
+ color: #3a7bfa;
+ line-height: 24px;
+ margin: 0;
+ ">
+ {{ item.name }}
+ </p>
+ <p style="
+ color: #999999;
+ font-size: 12px;
+ transform: scale(0.8) translateX(-20px);
+ white-space: nowrap;
+ width: 150px;
+ overflow-x: show;
+ margin: 0;
+ ">
+ 鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{
+ item.day3
+ }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}
+ </p>
+ <p style="margin-top: 4px; margin: 0">
+ <span style="
+ color: #999999;
+ font-size: 12px;
+ display: inline-block;
+ transform: scale(0.8) translateX(-10px);
+ ">鍚堣鍑哄嫟: </span><span style="font-size: 16px; color: #ff4902">{{
+ query.month
+ ? item.monthlyAttendance.totalAttendance
+ : item.sidebarAnnualAttendance.totalAttendance
+ }}澶�</span>
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="scroll-right">
+ <div class="content">
+ <div class="content-title content-title-right" style="border-bottom: 0">
+ <div class="content-title-item" v-for="(item, index) in weeks" :key="'b' + index">
+ <span class="month" style="position: absolute; top: 0px" v-if="item.week == '鍛ㄦ棩'">{{ item.weekNum
+ }}鍛�</span>
+ <p style="height: 26px; position: absolute; bottom: 12px">
+ <span class="day">{{ item.day }}</span>
+ <span class="week">{{ item.week.charAt(1) }}</span>
+ </p>
+ </div>
+ </div>
+ <div class="content-body" v-for="(item, index) in list" :key="'c' + index"
+ v-on:mouseenter="onMouseEnter(index)" v-on:mouseleave="currentUserIndex = null">
+ <div class="content-body-item" v-for="(m, i) in item.list" :key="'d' + i"
+ :class="{ hoverType: currentUserIndex == index }">
+ <el-dropdown trigger="click" placement="bottom" @command="(e) => handleCommand(e, m)"
+ :disabled="!checkPermi(['performance:class:edit'])"
+ style="width: 100%; height: 100%; cursor: pointer">
+ <div class="work-box" :class="{
+ type0: m.shift === '0',
+ type1: m.shift === '1',
+ type2: m.shift === '2',
+ type3: m.shift === '3',
+ type4: m.shift === '4',
+ type5: m.shift === '5',
+ type6: m.shift === '6',
+ }">
+ <span style="cursor: pointer" :style="`opacity: ${getShiftByDic(m.shift) == '鏃�' ? 0 : 1
+ };`">{{ getShiftByDic(m.shift) }}</span>
+ </div>
+ <el-dropdown-menu slot="dropdown">
+ <el-dropdown-item v-for="(n, j) in classType" :key="'h' + j" :command="n.dictValue">{{ n.dictLabel
+ }}</el-dropdown-item>
+ </el-dropdown-menu>
+ </el-dropdown>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="clearfix year-table" style="width: 100%" v-show="!query.month">
+ <div class="fixed-left">
+ <div class="content-title" style="padding-left: 16px; box-sizing: border-box">
+ 浜哄憳鍚嶇О
+ </div>
+ <div class="content-user" :class="{ hoverType: currentUserIndex == index }" v-for="(item, index) in yearList"
+ :key="'e' + index" v-on:mouseenter="onMouseEnter(index)" v-on:mouseleave="currentUserIndex = null">
+ <div class="user-pic">
+ {{ item.name ? item.name.charAt(0) : "" }}
+ </div>
+ <div class="user-info">
+ <p style="
+ font-size: 14px;
+ color: #3a7bfa;
+ line-height: 24px;
+ margin: 0;
+ ">
+ {{ item.name }}
+ </p>
+ <p style="
+ color: #999999;
+ font-size: 12px;
+ transform: scale(0.8) translateX(-20px);
+ white-space: nowrap;
+ width: 150px;
+ overflow-x: show;
+ margin: 0;
+ ">
+ 鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{
+ item.day3
+ }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}
+ </p>
+ <p style="margin-top: 4px; margin: 0">
+ <span style="
+ color: #999999;
+ font-size: 12px;
+ display: inline-block;
+ transform: scale(0.8) translateX(-10px);
+ ">鍚堣鍑哄嫟: </span><span style="font-size: 16px; color: #ff4902">{{ item.work_time }}澶�</span>
+ </p>
+ </div>
+ </div>
+ </div>
+ <div class="scroll-right">
+ <div class="content">
+ <div>
+ <div class="content-title content-title-right" style="border-bottom: 0; height: 52px" :style="`display: grid;
+ grid-template-columns: repeat(${monthList.length}, 1fr);`">
+ <div class="content-title-item" v-for="(item, index) in monthList" :key="'b' + index"
+ style="height: 52px">
+ <span class="month">{{ item }}鏈�</span>
+ </div>
+ </div>
+ <div class="content-body" v-for="(item, index) in yearList" :key="'c' + index"
+ v-on:mouseenter="onMouseEnter(index)" v-on:mouseleave="currentUserIndex = null" :style="`display: grid;
+ grid-template-columns: repeat(${monthList.length}, 1fr);`">
+ <div class="content-body-item" v-for="(m, i) in item.monthList" :key="'d' + i"
+ :class="{ hoverType: currentUserIndex == index }">
+ <p style="color: rgb(153, 153, 153); font-size: 12px">
+ 鍚堣鍑哄嫟锛�<span style="font-size: 14px; color: #000">{{
+ m.totalMonthAttendance
+ }}</span>
+ </p>
+ <p style="color: rgb(153, 153, 153); font-size: 12px">
+ 鏃�:{{ m.day0 }},涓�:{{ m.day1 }},澶�:{{ m.day2 }},浼�:{{
+ m.day3
+ }},鍋�:{{ m.day4 }},宸�:{{ m.day6 }}
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <el-pagination background @current-change="currentChange" :page-size="pageSize" :current-page="currentPage"
+ layout="total, prev, pager, next, jumper" :total="total"
+ style="margin-top: 10px; text-align: right; margin-right: 30px">
+ </el-pagination>
+
+ <el-dialog title="鏃堕棿閰嶇疆" :visible.sync="configTimeVisible" width="620px">
+ <div v-loading="configTimeVisibleLoading" style="min-height: 200px">
+ <div v-for="(item, index) in timeQuery">
+ <div class="form" style="display: flex; justify-content: space-between">
+ <div style="margin-bottom: 12px; width: 200px">
+ <span class="form_label">鐝锛�</span>
+ <span v-if="!item.isEdit"> {{ item.type }} </span>
+ <span class="form_input" v-if="item.isEdit">
+ <el-select v-model="item.shift" placeholder="璇烽�夋嫨" style="width: 70%; margin-right: 8px" clearable
+ size="small">
+ <el-option v-for="obj in timeTypeList" :key="obj.dictValue" :label="obj.dictLabel"
+ :value="obj.dictValue">
+ </el-option>
+ </el-select>
+ </span>
+ </div>
+ <div style="width: calc(100% - 260px)">
+ <span class="form_label">鏃堕棿锛�</span>
+ <span v-if="!item.isEdit">
+ {{
+ item.startTime && item.endTime
+ ? item.startTime + "~" + item.endTime
+ : ""
+ }}
+ </span>
+ <span class="form_input" v-if="item.isEdit">
+ <el-time-select placeholder="璧峰鏃堕棿" v-model="item.startTime" size="small" :picker-options="{
+ start: '00:00',
+ step: '00:15',
+ end: '24:00',
+ }" style="width: 120px">
+ </el-time-select>
+ <el-time-select style="width: 120px" placeholder="缁撴潫鏃堕棿" v-model="item.endTime" size="small"
+ :picker-options="{
+ start: '00:00',
+ step: '00:15',
+ end: '24:00',
+ }">
+ </el-time-select>
+ </span>
+ </div>
+ <span>
+ <i class="el-icon-circle-check" v-if="item.isEdit"
+ style="margin-left: 10px; color: #4b79f2; cursor: pointer" @click="saveEdit(item, index)"></i>
+ <i class="el-icon-edit" v-if="!item.isEdit" style="margin-left: 10px; color: #4b79f2; cursor: pointer"
+ @click="item.isEdit = true"></i>
+ <i class="el-icon-delete" v-if="timeQuery.length > 1"
+ style="margin-left: 10px; color: #ff4902; cursor: pointer" @click="deleteTime(item, index)"></i>
+ </span>
+ </div>
+ <el-divider></el-divider>
+ <div @click="addTimeForm" style="color: #4b79f2; cursor: pointer" v-if="index === timeQuery.length - 1">
+ 娣诲姞鏃堕棿閰嶇疆
+ </div>
+ </div>
+ <div @click="addTimeForm" style="color: #4b79f2" v-if="timeQuery.length === 0">
+ 娣诲姞鏃堕棿閰嶇疆
+ </div>
+ </div>
+ </el-dialog>
+ <el-dialog title="鎺掔彮" :visible.sync="schedulingVisible" width="400px">
+ <div class="search_thing">
+ <div class="search_label" style="width: 90px">
+ <span style="color: red; margin-right: 4px">*</span>鍛ㄦ锛�
+ </div>
+ <div class="search_input" style="width: calc(100% - 90px)">
+ <el-date-picker v-model="schedulingQuery.week" type="week" format="yyyy 绗� WW 鍛�" placeholder="閫夋嫨鍛ㄦ"
+ style="width: 100%">
+ </el-date-picker>
+ </div>
+ </div>
+ <div class="search_thing">
+ <div class="search_label" style="width: 90px">
+ <span style="color: red; margin-right: 4px">*</span>浜哄憳鍚嶇О锛�
+ </div>
+ <div class="search_input" style="width: calc(100% - 90px)">
+ <el-select v-model="schedulingQuery.userId" placeholder="璇烽�夋嫨" style="width: 100%" multiple clearable
+ collapse-tags>
+ <el-option v-for="item in personList" :key="item.id" :label="item.name" :value="item.id">
+ </el-option>
+ </el-select>
+ </div>
+ </div>
+ <div class="search_thing">
+ <div class="search_label" style="width: 90px">
+ <span style="color: red; margin-right: 4px">*</span>鐝锛�
+ </div>
+ <div class="search_input" style="width: calc(100% - 90px)">
+ <el-select v-model="schedulingQuery.shift" placeholder="璇烽�夋嫨" style="width: 100%">
+ <el-option v-for="item in classType" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue">
+ </el-option>
+ </el-select>
+ </div>
+ </div>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="schedulingVisible = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="confirmScheduling" :loading="loading">纭� 瀹�</el-button>
+ </span>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import { getYearAndMonthAndDays } from "@/utils/date";
+import {
+ page,
+ pageYear,
+ add,
+ list,
+ shiftAdd,
+ shiftUpdate,
+ shiftRemove,
+ exportFile,
+ obtainItemParameterList,
+ update,
+ selectUserCondition,
+} from "@/api/performance/class";
+export default {
+ name: 'Class',
+ data() {
+ return {
+ query: {
+ userName: "",
+ laboratory: "",
+ year: new Date(),
+ month: new Date().getMonth() + 1,
+ // month:''
+ },
+ monthOptions: [
+ {
+ value: 1,
+ label: "1鏈�",
+ },
+ {
+ value: 2,
+ label: "2鏈�",
+ },
+ {
+ value: 3,
+ label: "3鏈�",
+ },
+ {
+ value: 4,
+ label: "4鏈�",
+ },
+ {
+ value: 5,
+ label: "5鏈�",
+ },
+ {
+ value: 6,
+ label: "6鏈�",
+ },
+ {
+ value: 7,
+ label: "7鏈�",
+ },
+ {
+ value: 8,
+ label: "8鏈�",
+ },
+ {
+ value: 9,
+ label: "9鏈�",
+ },
+ {
+ value: 10,
+ label: "10鏈�",
+ },
+ {
+ value: 11,
+ label: "11鏈�",
+ },
+ {
+ value: 12,
+ label: "12鏈�",
+ },
+ ],
+ laboratory: [],
+ weeks: [],
+ classType: [],
+ currentUserIndex: null,
+ schedulingVisible: false,
+ personList: [],
+ loading: false,
+ schedulingQuery: {
+ week: "",
+ userId: null,
+ shift: "",
+ },
+ list: [],
+ currentPage: 1, // 褰撳墠椤�
+ pageSize: 6, // 涓�椤�10鏉�
+ total: 0,
+ pageLoading: false, // 缁勪欢loading鐨勫睍绀�,榛樿涓簍rue
+ finishLoding: false, // 鍔犺浇瀹屾垚锛屾樉绀哄凡缁忔病鏈夋洿澶氫簡
+ monthList: [],
+ yearList: [],
+ downLoading: false,
+ configTimeVisible: false, // 鏃堕棿閰嶇疆寮规
+ configTimeVisibleLoading: false, // 鏃堕棿閰嶇疆寮规loading
+ timeTypeList: [],
+ timeQuery: [],
+ };
+ },
+ watch: {
+ // 'query.year'(val){
+ // this.monthList = []
+ // if(val.getFullYear()==new Date().getFullYear()){
+ // for(let i=new Date().getMonth()+1;i>0;i--){
+ // this.monthList.push(i)
+ // }
+ // }else{
+ // for (let i=12;i>0;i--) {
+ // this.monthList.push(i)
+ // }
+ // }
+ // this.monthList.reverse()
+ // },
+ // 'query.month'(val){
+ // if(!val){
+ // this.currentPage = 1;
+ // this.yearList = []
+ // this.initYear()
+ // }
+ // }
+ },
+ mounted() {
+ this.selectEnumByCategory();
+ this.obtainItemParameterList();
+ this.getUsers();
+ if (this.query.month) {
+ this.init();
+ } else {
+ this.initYear();
+ }
+ this.monthList = [];
+ for (let i = 12; i > 0; i--) {
+ this.monthList.push(i);
+ }
+ this.monthList.reverse();
+ },
+ methods: {
+ refresh() {
+ this.list = [];
+ this.yearList = [];
+ this.currentPage = 1;
+ this.query = {
+ userName: "",
+ laboratory: "",
+ year: new Date(),
+ month: new Date().getMonth() + 1,
+ };
+ if (this.query.month) {
+ this.init();
+ } else {
+ this.initYear();
+ }
+ },
+ refreshTable() {
+ this.currentPage = 1;
+ if (this.query.month) {
+ this.list = [];
+ this.init();
+ } else {
+ this.yearList = [];
+ this.initYear();
+ }
+ },
+ currentChange(num) {
+ this.currentPage = num;
+ if (this.query.month) {
+ this.init();
+ } else {
+ this.initYear();
+ }
+ },
+ transFromNumber(num) {
+ let changeNum = [
+ "闆�",
+ "涓�",
+ "浜�",
+ "涓�",
+ "鍥�",
+ "浜�",
+ "鍏�",
+ "涓�",
+ "鍏�",
+ "涔�",
+ ]; //changeNum[0] = "闆�"
+ let unit = ["", "鍗�", "鐧�", "鍗�", "涓�"];
+ num = parseInt(num);
+ let getWan = (temp) => {
+ let strArr = temp.toString().split("").reverse();
+ let newNum = "";
+ for (var i = 0; i < strArr.length; i++) {
+ newNum =
+ (i == 0 && strArr[i] == 0
+ ? ""
+ : i > 0 && strArr[i] == 0 && strArr[i - 1] == 0
+ ? ""
+ : changeNum[strArr[i]] + (strArr[i] == 0 ? unit[0] : unit[i])) +
+ newNum;
+ }
+ return newNum;
+ };
+ let overWan = Math.floor(num / 10000);
+ let noWan = num % 10000;
+ if (noWan.toString().length < 4) noWan = "0" + noWan;
+ return overWan ? getWan(overWan) + "涓�" + getWan(noWan) : getWan(num);
+ },
+ init() {
+ this.pageLoading = true;
+ let year = this.query.year.getFullYear();
+ let month0 = this.query.month
+ ? this.query.month
+ : new Date().getMonth() + 1;
+ let month = month0 > 9 ? month0 : "0" + month0;
+ page({
+ size: this.pageSize,
+ current: this.currentPage,
+ time: year + "-" + month + "-01 00:00:00",
+ userName: this.query.userName,
+ laboratory: this.query.laboratory,
+ }).then((res) => {
+ this.pageLoading = false;
+ this.total = res.data.page.total;
+ this.list = res.data.page.records.map((item) => {
+ for (let key in item.monthlyAttendance) {
+ let type = this.getDayByDic(key);
+ if (type != undefined || type != null) {
+ item[`day${type}`] = item.monthlyAttendance[key];
+ }
+ }
+ return item;
+ });
+ let headerList = res.data.headerList;
+ this.weeks = [];
+ headerList.forEach((item) => {
+ let obj = {
+ weekNum: item.weekly,
+ week: item.headerTime.split(" ")[1],
+ day: item.headerTime.split(" ")[0],
+ };
+ this.weeks.push(obj);
+ });
+ }).catch(() => {
+ this.pageLoading = false;
+ })
+ },
+ initYear() {
+ this.pageLoading = true;
+ let year = this.query.year.getFullYear();
+ pageYear({
+ size: this.pageSize,
+ current: this.currentPage,
+ time: year + "-01-01 00:00:00",
+ userName: this.query.userName,
+ laboratory: this.query.laboratory,
+ }).then((res) => {
+ this.pageLoading = false;
+ this.total = res.data.total;
+ this.yearList = res.data.records.map((item) => {
+ for (let key in item.year) {
+ let type = this.getDayByDic(key);
+ if (type != undefined || type != null) {
+ item[`day${type}`] = item.year[key];
+ }
+ }
+ item.monthList = [];
+ for (let m in item.month) {
+ let obj = {};
+ for (let key in item.month[m]) {
+ let type = this.getDayByDic(key);
+ if (type != undefined || type != null) {
+ obj[`day${type}`] = item.month[m][key];
+ }
+ }
+ obj.totalMonthAttendance = item.month[m].totalMonthAttendance;
+ item.monthList.push(obj);
+ }
+ return item;
+ });
+ });
+ },
+ onMouseEnter(index) {
+ this.currentUserIndex = index;
+ },
+ confirmScheduling() {
+ if (!this.schedulingQuery.week) {
+ this.$message.error("璇烽�夋嫨鍛ㄦ");
+ return;
+ }
+ let time = this.schedulingQuery.week.getTime();
+ let startWeek =
+ getYearAndMonthAndDays(new Date(time - 24 * 60 * 60 * 1000)) +
+ " 00:00:00";
+ let endWeek =
+ getYearAndMonthAndDays(new Date(time + 24 * 60 * 60 * 1000 * 5)) +
+ " 00:00:00";
+ if (
+ !this.schedulingQuery.userId ||
+ this.schedulingQuery.userId.length == 0
+ ) {
+ this.$message.error("璇烽�夋嫨浜哄憳");
+ return;
+ }
+ if (!this.schedulingQuery.shift) {
+ this.$message.error("璇烽�夋嫨鐝");
+ return;
+ }
+ this.loading = true;
+ add({
+ startWeek,
+ endWeek,
+ userId: this.schedulingQuery.userId.join(","),
+ shift: this.schedulingQuery.shift,
+ })
+ .then((res) => {
+ this.loading = false;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.schedulingVisible = false;
+ this.schedulingQuery = {
+ week: "",
+ userId: null,
+ shift: "",
+ };
+ this.refresh();
+ })
+ .catch((err) => {
+ this.loading = false;
+ });
+ },
+ configTime() {
+ this.getDicts("sys_class_type").then((response) => {
+ this.timeTypeList = response.data;
+ });
+ this.getTimeList();
+ this.configTimeVisible = true;
+ },
+ getTimeList() {
+ this.configTimeVisibleLoading = true;
+ list()
+ .then((res) => {
+ if (res.data.length > 0) {
+ res.data.forEach((item) => {
+ item.isEdit = false;
+ const index = this.timeTypeList.findIndex(
+ (val) => val.dictValue === item.shift
+ );
+ if (index > -1) {
+ item.type = this.timeTypeList[index].dictLabel;
+ }
+ });
+ this.timeQuery = res.data;
+ }
+ this.configTimeVisibleLoading = false;
+ })
+ .catch((e) => {
+ this.configTimeVisibleLoading = false;
+ console.log("e--", e);
+ });
+ },
+ addTimeForm() {
+ this.timeQuery.push({
+ type: "",
+ shift: "",
+ time: null,
+ isEdit: true,
+ });
+ },
+ saveEdit(item, index) {
+ if (item.shift) {
+ const index = this.timeTypeList.findIndex(
+ (val) => val.dictValue === item.shift
+ );
+ if (index > -1) {
+ item.type = this.timeTypeList[index].dictLabel;
+ }
+ }
+ delete item.orderBy;
+ delete item.time;
+ const isEmpty = this.isObjectEmpty(item);
+ if (isEmpty) {
+ this.$message.error("璇峰~鍐欏畬鏁�");
+ return;
+ }
+ let newObj = {};
+ newObj.shift = item.shift;
+ newObj.startTime = item.startTime;
+ newObj.endTime = item.endTime;
+ if (item.id) {
+ // 缂栬緫
+ newObj.id = item.id;
+ shiftUpdate(newObj).then((res) => {
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.getTimeList();
+ });
+ } else {
+ // 鏂板
+ shiftAdd(newObj).then((res) => {
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.getTimeList();
+ });
+ }
+ },
+ deleteTime(item, index) {
+ if (item.id) {
+ shiftRemove({
+ id: item.id,
+ }).then((res) => {
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.getTimeList();
+ });
+ } else {
+ this.timeQuery.splice(index, 1);
+ }
+ },
+ isObjectEmpty(obj) {
+ return Object.keys(obj).some((key) => !obj[key]);
+ },
+ handleDown() {
+ let year = this.query.year.getFullYear();
+ let time = "";
+ if (this.query.month) {
+ let month =
+ this.query.month > 9 ? this.query.month : "0" + this.query.month;
+ time = year + "-" + month + "-01 00:00:00";
+ } else {
+ time = year + "-01-01 00:00:00";
+ }
+ this.downLoading = true;
+ exportFile({
+ time,
+ userName: this.query.userName,
+ laboratory: this.query.laboratory,
+ isMonth: this.query.month ? true : false,
+ })
+ .then((res) => {
+ this.$message.success("涓嬭浇鎴愬姛");
+ this.downLoading = false;
+ const blob = new Blob([res], {
+ type: "application/force-download",
+ });
+ let fileName = "";
+ if (this.query.month) {
+ fileName = year + "-" + this.query.month + " 鐝淇℃伅";
+ } else {
+ fileName = year + " 鐝姹囨��";
+ }
+ this.$download.saveAs(blob, fileName + ".xlsx");
+ })
+ .catch((err) => {
+ this.downLoading = false;
+ });
+ },
+ selectEnumByCategory() {
+ this.getDicts("sys_class_type").then((response) => {
+ this.classType = response.data;
+ });
+ },
+ obtainItemParameterList() {
+ if (this.PROJECT == "妫�娴嬩腑蹇�") {
+ this.laboratory = [
+ {
+ label: "閫氫俊浜у搧瀹為獙瀹�",
+ value: "閫氫俊浜у搧瀹為獙瀹�",
+ },
+ {
+ label: "鐢靛姏浜у搧瀹為獙瀹�",
+ value: "鐢靛姏浜у搧瀹為獙瀹�",
+ },
+ ];
+ } else {
+ obtainItemParameterList().then((res) => {
+ let data = [];
+ res.data.forEach((a) => {
+ data.push({
+ label: a.laboratoryName,
+ value: a.id,
+ });
+ });
+ this.laboratory = data;
+ });
+ }
+ },
+ handleCommand(e, m) {
+ if (e != m.shift) {
+ update({
+ id: m.id,
+ shift: e,
+ }).then((res) => {
+ this.$message.success("鎿嶄綔鎴愬姛");
+ m.shift = e;
+ });
+ }
+ },
+ getUsers() {
+ selectUserCondition({ type: 1 }).then((res) => {
+ let arr = res.data;
+ this.personList = arr;
+ });
+ },
+ getDayByDic(e) {
+ let obj = this.classType.find((m) => m.dictLabel == e);
+ if (obj) {
+ return obj.dictValue;
+ }
+ },
+ getShiftByDic(e) {
+ let obj = this.classType.find((m) => m.dictValue == e);
+ if (obj) {
+ return obj.dictLabel;
+ }
+ return "鏃�";
+ },
+ },
+};
+</script>
+
+<style scoped>
+.class-page {
+ padding: 10px;
+}
+
+.form_title {
+ height: 36px;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ font-weight: 800;
+}
+
+.search {
+ height: 50px;
+ display: flex;
+ align-items: center;
+ position: relative;
+}
+
+.search_thing {
+ display: flex;
+ align-items: center;
+ height: 50px;
+}
+
+.search_label {
+ width: 70px;
+ font-size: 14px;
+ text-align: right;
+}
+
+.search_input {
+ display: flex;
+ align-items: center;
+}
+
+.btns {
+ position: absolute;
+ right: 16px;
+ top: 50%;
+ transform: translate(0, -50%);
+}
+
+.center {
+ width: 100%;
+ height: calc(100vh - 220px);
+ background-color: #fff;
+ overflow-y: auto;
+ display: flex;
+}
+
+>>>.scroll-pagination {
+ overflow-y: scroll;
+ scrollbar-width: none;
+}
+
+>>>.scroll-pagination::-webkit-scrollbar {
+ display: none;
+}
+
+.fixed-left {
+ float: left;
+ width: 220px;
+ /* 宸﹁竟鍖哄煙瀹藉害 */
+ background-color: #fff;
+ box-shadow: 2px -2px 5px rgba(51, 51, 51, 0.12);
+ /* 宸﹁竟闃村奖 */
+}
+
+.clearfix::after {
+ content: "";
+ display: table;
+ clear: both;
+}
+
+.scroll-right {
+ width: calc(100% - 220px);
+ /* 鍑忓幓宸﹁竟鍖哄煙瀹藉害 */
+ min-height: calc(100% - 10px);
+ /* 瑙嗗彛楂樺害 */
+ margin-left: 220px;
+ overflow-x: scroll;
+}
+
+.content {
+ min-height: calc(100% - 10px);
+ /* 瑙嗗彛楂樺害 */
+}
+
+.content-title {
+ height: 58px;
+ line-height: 58px;
+ border-bottom: 1px solid #eeeeee;
+}
+
+.content-title-right {
+ display: flex;
+ align-items: center;
+}
+
+.content-title-item {
+ height: 100%;
+ width: 50px;
+ flex-shrink: 0;
+ border-bottom: 1px solid #eeeeee;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ position: relative;
+}
+
+.content-title-item .month {
+ font-size: 12px;
+ color: #3a7bfa;
+ box-sizing: border-box;
+ padding: 0 1px;
+ border-radius: 50%;
+ background: #d6e4ff;
+ text-align: center;
+ line-height: 22px;
+}
+
+.content-title-item .day {
+ font-size: 14px;
+ color: #333333;
+ margin-right: 4px;
+}
+
+.content-title-item .week {
+ font-size: 12px;
+ color: #999999;
+}
+
+.content-body {
+ display: flex;
+ align-items: center;
+}
+
+.content-body-item {
+ height: 70px;
+ width: 50px;
+ flex-shrink: 0;
+ font-size: 12px;
+ box-sizing: border-box;
+ padding: 4px;
+ border-right: 1px solid #eeeeee;
+ border-bottom: 1px solid #eeeeee;
+}
+
+.work-box {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ background: #edeff2;
+ border-radius: 8px 8px 8px 8px;
+ color: #999;
+ font-size: 14px;
+}
+
+.work-box.type0 {
+ background: rgba(58, 123, 250, 0.15);
+ color: #3a7bfa !important;
+}
+
+.work-box.type0 span {
+ color: #3a7bfa !important;
+}
+
+.work-box.type1 {
+ background: #e3dcfe;
+ color: #635998 !important;
+}
+
+.work-box.type1 span {
+ color: #635998 !important;
+}
+
+.work-box.type2 {
+ background: #fae2ca;
+ color: #bc8d5e !important;
+}
+
+.work-box.type2 span {
+ color: #bc8d5e !important;
+}
+
+.work-box.type3 {
+ background: #e1f3d8;
+ color: #67c23a !important;
+}
+
+.work-box.type3 span {
+ color: #67c23a !important;
+}
+
+.work-box.type4 {
+ background: #fde2e2;
+ color: #f56c6c !important;
+}
+
+.work-box.type4 span {
+ color: #f56c6c !important;
+}
+
+.work-box.type5 {
+ background: #ff46c145;
+ color: #ff46c0 !important;
+}
+
+.work-box.type5 span {
+ color: #ff46c0 !important;
+}
+
+.work-box.type6 {
+ background: #00036418;
+ color: #000464 !important;
+}
+
+.work-box.type6 span {
+ color: #000464 !important;
+}
+
+.work-box-left {
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ line-height: 24px;
+}
+
+.content-user {
+ width: 100%;
+ height: 70px;
+ box-sizing: border-box;
+ border-bottom: 1px solid #eeeeee;
+ display: flex;
+ align-items: center;
+}
+
+.user-pic {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ background: #c0c4cc;
+ color: #fff;
+ font-size: 20px;
+ text-align: center;
+ line-height: 50px;
+ margin-left: 10px;
+}
+
+.user-info {
+ flex: 1;
+ margin-left: 10px;
+}
+
+.hoverType {
+ background: rgba(58, 123, 250, 0.03);
+}
+
+.year-table {
+ width: 100%;
+}
+
+.year-table .scroll-right {
+ flex: 1;
+}
+
+.year-table .month {
+ font-size: 14px;
+ color: #3a7bfa;
+ box-sizing: border-box;
+ padding: 0 4px;
+ border-radius: 50%;
+ background: #d6e4ff;
+ text-align: center;
+ line-height: 30px;
+}
+
+.year-table .content-title-item {
+ width: 100%;
+}
+
+.year-table .content-body-item {
+ width: 100%;
+ height: 70px;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ justify-content: center;
+}
+</style>
--
Gitblit v1.9.3