From 0c296ab5e1e4ed1eaab1940f85959ed66f68fbe7 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 18 二月 2025 09:39:36 +0800
Subject: [PATCH] 完成工时管理搬迁
---
src/api/performance/manHour.js | 78 +
src/components/Table/lims-table.vue | 18
src/views/performance/manHour/workTimeManagement.vue | 81 +
src/views/standard/model/index.vue | 2
src/views/performance/manHour/workTimeStatistics.vue | 11
src/views/standard/standardLibrary/index.vue | 2
src/api/performance/class.js | 100 ++
src/main.js | 113 +-
src/assets/styles/element-ui.scss | 62 +
src/views/performance/manHour/index.vue | 4
src/views/performance/class/index.vue | 1335 ++++++++++++++++++++++++++++++++++++++
src/views/performance/manHour/workTimeConfig.vue | 253 +++++-
12 files changed, 1,881 insertions(+), 178 deletions(-)
diff --git a/src/api/performance/class.js b/src/api/performance/class.js
new file mode 100644
index 0000000..38c2c3a
--- /dev/null
+++ b/src/api/performance/class.js
@@ -0,0 +1,100 @@
+import request from "@/utils/request";
+
+// 缁╂晥绠$悊-鐝-鍒嗛〉鏌ヨ
+export function page(query) {
+ return request({
+ url: "/performanceShift/page",
+ method: "get",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-骞翠唤鍒嗛〉鏌ヨ
+export function pageYear(query) {
+ return request({
+ url: "/performanceShift/pageYear",
+ method: "get",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鎺掔彮
+export function add(data) {
+ return request({
+ url: "/performanceShift/add",
+ method: "post",
+ data: data,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鏃堕棿閰嶇疆-鏌ヨ鏃堕棿閰嶇疆淇℃伅
+export function list(query) {
+ return request({
+ url: "/shiftTime/list",
+ method: "get",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鏃堕棿閰嶇疆-鏂板
+export function shiftAdd(data) {
+ return request({
+ url: "/shiftTime/add",
+ method: "post",
+ data: data,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鏃堕棿閰嶇疆-淇敼
+export function shiftUpdate(data) {
+ return request({
+ url: "/shiftTime/update",
+ method: "post",
+ data: data,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鏃堕棿閰嶇疆-鍒犻櫎
+export function shiftRemove(query) {
+ return request({
+ url: "/shiftTime/remove",
+ method: "delete",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-瀵煎嚭
+export function exportFile(query) {
+ return request({
+ url: "/performanceShift/export",
+ method: "get",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-瀵煎嚭
+export function obtainItemParameterList(query) {
+ return request({
+ url: "/laboratoryScope/obtainItemParameterList",
+ method: "get",
+ params: query,
+ });
+}
+
+// 缁╂晥绠$悊-鐝-鐝鐘舵�佷慨鏀�
+export function update(data) {
+ return request({
+ url: "/performanceShift/update",
+ method: "post",
+ data: data,
+ });
+}
+
+// 鑾峰彇鐢ㄦ埛鍒楄〃 (鐢ㄤ簬鐝,宸ユ椂)
+export function selectUserList(query) {
+ return request({
+ url: "/user/selectUserList",
+ method: "get",
+ params: query,
+ });
+}
diff --git a/src/api/performance/manHour.js b/src/api/performance/manHour.js
index 67d27c8..4ba20ae 100644
--- a/src/api/performance/manHour.js
+++ b/src/api/performance/manHour.js
@@ -1,38 +1,38 @@
import request from "@/utils/request";
// 鏌ヨ宸ユ椂姹囨��
-export function selectAuxiliaryAllByMonth(data) {
+export function selectAuxiliaryAllByMonth(query) {
return request({
url: "/auxiliaryOriginalHours/selectAuxiliaryAllByMonth",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
// 鏌ヨ杈呭姪宸ユ椂
-export function selectAuxiliaryWorkingHoursDay(data) {
+export function selectAuxiliaryWorkingHoursDay(query) {
return request({
url: "/auxiliaryWorkingHoursDay/selectAuxiliaryWorkingHoursDay",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
// 鏌ヨ浜ч噺宸ユ椂
-export function selectAuxiliaryOutputWorkingHours(data) {
+export function selectAuxiliaryOutputWorkingHours(query) {
return request({
url: "/auxiliaryOutputWorkingHours/selectAuxiliaryOutputWorkingHours",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
// 鍒犻櫎杈呭姪宸ユ椂
-export function deleteAuxiliaryWorkingHoursDay(data) {
+export function deleteAuxiliaryWorkingHoursDay(query) {
return request({
url: "/auxiliaryWorkingHoursDay/deleteAuxiliaryWorkingHoursDay",
- method: "post",
- data: data,
+ method: "delete",
+ params: query,
});
}
@@ -64,30 +64,29 @@
}
// 缁熻浜ч噺宸ユ椂姹囨�诲拰杈呭姪宸ユ椂姹囨��
-export function collectWorkingHours(data) {
+export function collectWorkingHours(query) {
return request({
url: "/auxiliaryOutputWorkingHours/collectWorkingHours",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
// 鏍规嵁缂栧彿褰撳墠鐢ㄦ埛淇℃伅鏌ヨ鎵�鍦ㄧ彮娆�
-export function selectshiftByUser(data) {
+export function selectshiftByUser(query) {
return request({
url: "/auxiliaryWorkingHoursDay/selectshiftByUser",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
// 鏍规嵁缂栧彿鏌ヨ杈呭姪宸ユ椂閰嶇疆淇℃伅
-export function selectAuxiliaryWorkingHoursByNumber(number) {
+export function selectAuxiliaryWorkingHoursByNumber(query) {
return request({
- url:
- "/auxiliaryWorkingHoursDay/selectAuxiliaryWorkingHoursByNumber?number=" +
- number,
- method: "post",
+ url: "/auxiliaryWorkingHoursDay/selectAuxiliaryWorkingHoursByNumber",
+ method: "get",
+ params: query,
});
}
@@ -110,11 +109,11 @@
}
// 鏌ヨ杈呭姪宸ユ椂
-export function selectAuxiliaryWorkingHours(data) {
+export function selectAuxiliaryWorkingHours(query) {
return request({
url: "/auxiliaryWorkingHours/selectAuxiliaryWorkingHours",
- method: "post",
- data: data,
+ method: "get",
+ params: query,
});
}
@@ -126,3 +125,30 @@
params: query,
});
}
+
+// 鏂板杈呭姪宸ユ椂
+export function insertAuxiliaryWorkingHours(data) {
+ return request({
+ url: "/auxiliaryWorkingHours/insertAuxiliaryWorkingHours",
+ method: "post",
+ data: data,
+ });
+}
+
+// 淇敼杈呭姪宸ユ椂
+export function upAuxiliaryWorkingHours(data) {
+ return request({
+ url: "/auxiliaryWorkingHours/upAuxiliaryWorkingHours",
+ method: "post",
+ data: data,
+ });
+}
+
+// 鍒犻櫎杈呭姪宸ユ椂
+export function deleteAuxiliaryWorkingHours(query) {
+ return request({
+ url: "/auxiliaryWorkingHours/deleteAuxiliaryWorkingHours",
+ method: "delete",
+ params: query,
+ });
+}
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
index 363092a..b55f057 100644
--- a/src/assets/styles/element-ui.scss
+++ b/src/assets/styles/element-ui.scss
@@ -69,7 +69,7 @@
// dropdown
.el-dropdown-menu {
a {
- display: block
+ display: block;
}
}
@@ -89,4 +89,62 @@
> .el-submenu__title
.el-submenu__icon-arrow {
display: none;
-}
\ No newline at end of file
+}
+
+/* 鍏ㄥ眬妯℃�佹鏍峰紡 */
+.el-dialog__header,
+.el-message-box__header {
+ box-sizing: border-box;
+ height: 56px;
+ border-bottom: 1px solid rgb(238, 238, 238);
+ padding: 0px;
+ display: flex;
+ align-items: center;
+}
+
+.el-dialog__header::before {
+ content: "";
+ display: inline-block;
+ width: 4px;
+ height: 28px;
+ background: #3a7bfa;
+ border-radius: 10px;
+ margin-left: 32px;
+ margin-right: 8.5px;
+}
+
+.el-message-box__header::before {
+ content: "";
+ display: inline-block;
+ width: 4px;
+ height: 28px;
+ background: #3a7bfa;
+ border-radius: 10px;
+ margin-left: 20px;
+ margin-right: 8.5px;
+}
+
+.el-dialog__header .el-dialog__title {
+ font-size: 16px !important;
+}
+
+.el-dialog__footer {
+ padding-right: 40px;
+}
+
+.el-dialog__footer .el-button * {
+ font-size: 14px !important;
+}
+
+.el-dialog__footer .el-button {
+ height: 36px;
+ padding: 0 14px;
+}
+
+.el-message-box__btns .el-button * {
+ font-size: 14px !important;
+}
+
+.el-button--primary {
+ background: #3a7bfa;
+}
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index 3150e97..3e4c8e4 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -326,19 +326,19 @@
},
rowKey: {
type: String,
- default: undefined
+ default: undefined,
},
- page:{
- type:Object,
+ page: {
+ type: Object,
default() {
return {
- total:0,
- current:0,
- size:10,
- layout: 'total, sizes, prev, pager, next, jumper'
+ total: 0,
+ current: 0,
+ size: 10,
+ layout: "total, sizes, prev, pager, next, jumper",
};
- }
- }
+ },
+ },
},
methods: {
diff --git a/src/main.js b/src/main.js
index 5d36f6c..e82c37b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,71 +1,80 @@
-import Vue from 'vue'
+import Vue from "vue";
-import Cookies from 'js-cookie'
+import Cookies from "js-cookie";
-import Element from 'element-ui'
-import './assets/styles/element-variables.scss'
+import Element from "element-ui";
+import "./assets/styles/element-variables.scss";
-import '@/assets/styles/index.scss' // global css
-import '@/assets/styles/ruoyi.scss' // ruoyi css
-import App from './App'
-import store from './store'
-import router from './router'
-import directive from './directive' // directive
-import plugins from './plugins' // plugins
-import { download } from '@/utils/request'
+import "@/assets/styles/index.scss"; // global css
+import "@/assets/styles/ruoyi.scss"; // ruoyi css
+import App from "./App";
+import store from "./store";
+import router from "./router";
+import directive from "./directive"; // directive
+import plugins from "./plugins"; // plugins
+import { download } from "@/utils/request";
-import './assets/icons' // icon
-import './permission' // permission control
+import "./assets/icons"; // icon
+import "./permission"; // permission control
import { getDicts } from "@/api/system/dict/data";
import { getConfigKey } from "@/api/system/config";
-import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
+import {
+ parseTime,
+ resetForm,
+ addDateRange,
+ selectDictLabel,
+ selectDictLabels,
+ handleTree,
+} from "@/utils/ruoyi";
// 鍒嗛〉缁勪欢
import Pagination from "@/components/Pagination";
// 鑷畾涔夎〃鏍煎伐鍏风粍浠�
-import RightToolbar from "@/components/RightToolbar"
+import RightToolbar from "@/components/RightToolbar";
// 瀵屾枃鏈粍浠�
-import Editor from "@/components/Editor"
+import Editor from "@/components/Editor";
// 鏂囦欢涓婁紶缁勪欢
-import FileUpload from "@/components/FileUpload"
+import FileUpload from "@/components/FileUpload";
// 鍥剧墖涓婁紶缁勪欢
-import ImageUpload from "@/components/ImageUpload"
+import ImageUpload from "@/components/ImageUpload";
// 鍥剧墖棰勮缁勪欢
-import ImagePreview from "@/components/ImagePreview"
+import ImagePreview from "@/components/ImagePreview";
// 瀛楀吀鏍囩缁勪欢
-import DictTag from '@/components/DictTag'
+import DictTag from "@/components/DictTag";
// 澶撮儴鏍囩缁勪欢
-import VueMeta from 'vue-meta'
+import VueMeta from "vue-meta";
// 瀛楀吀鏁版嵁缁勪欢
-import DictData from '@/components/DictData'
+import DictData from "@/components/DictData";
+import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
// 鍏ㄥ眬鏂规硶鎸傝浇
-Vue.prototype.getDicts = getDicts
-Vue.prototype.getConfigKey = getConfigKey
-Vue.prototype.parseTime = parseTime
-Vue.prototype.resetForm = resetForm
-Vue.prototype.addDateRange = addDateRange
-Vue.prototype.selectDictLabel = selectDictLabel
-Vue.prototype.selectDictLabels = selectDictLabels
-Vue.prototype.download = download
-Vue.prototype.handleTree = handleTree
+Vue.prototype.getDicts = getDicts;
+Vue.prototype.getConfigKey = getConfigKey;
+Vue.prototype.parseTime = parseTime;
+Vue.prototype.resetForm = resetForm;
+Vue.prototype.addDateRange = addDateRange;
+Vue.prototype.selectDictLabel = selectDictLabel;
+Vue.prototype.selectDictLabels = selectDictLabels;
+Vue.prototype.download = download;
+Vue.prototype.handleTree = handleTree;
Vue.prototype.HaveJson = (val) => {
- return JSON.parse(JSON.stringify(val))
-}
-Vue.prototype.javaApi = process.env.VUE_APP_BASE_API
+ return JSON.parse(JSON.stringify(val));
+};
+Vue.prototype.javaApi = process.env.VUE_APP_BASE_API;
+Vue.prototype.checkPermi = checkPermi;
// 鍏ㄥ眬缁勪欢鎸傝浇
-Vue.component('DictTag', DictTag)
-Vue.component('Pagination', Pagination)
-Vue.component('RightToolbar', RightToolbar)
-Vue.component('Editor', Editor)
-Vue.component('FileUpload', FileUpload)
-Vue.component('ImageUpload', ImageUpload)
-Vue.component('ImagePreview', ImagePreview)
+Vue.component("DictTag", DictTag);
+Vue.component("Pagination", Pagination);
+Vue.component("RightToolbar", RightToolbar);
+Vue.component("Editor", Editor);
+Vue.component("FileUpload", FileUpload);
+Vue.component("ImageUpload", ImageUpload);
+Vue.component("ImagePreview", ImagePreview);
-Vue.use(directive)
-Vue.use(plugins)
-Vue.use(VueMeta)
-DictData.install()
+Vue.use(directive);
+Vue.use(plugins);
+Vue.use(VueMeta);
+DictData.install();
/**
* If you don't want to use mock-server
@@ -77,14 +86,14 @@
*/
Vue.use(Element, {
- size: Cookies.get('size') || 'medium' // set element-ui default size
-})
+ size: Cookies.get("size") || "medium", // set element-ui default size
+});
-Vue.config.productionTip = false
+Vue.config.productionTip = false;
new Vue({
- el: '#app',
+ el: "#app",
router,
store,
- render: h => h(App)
-})
+ render: (h) => h(App),
+});
diff --git a/src/views/performance/class/index.vue b/src/views/performance/class/index.vue
index e69de29..fe9c55e 100644
--- a/src/views/performance/class/index.vue
+++ b/src/views/performance/class/index.vue
@@ -0,0 +1,1335 @@
+<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="small" @click="refresh()">閲� 缃�</el-button>
+ <el-button size="small" type="primary" @click="refreshTable()"
+ >鏌� 璇�</el-button
+ >
+ </div>
+ <div class="search_thing btns" style="padding-left: 30px">
+ <el-button
+ size="small"
+ type="primary"
+ v-if="listPower"
+ @click="configTime"
+ :loading="downLoading"
+ >鏃堕棿閰嶇疆</el-button
+ >
+ <el-button
+ size="small"
+ type="primary"
+ v-if="downPower"
+ @click="handleDown"
+ :loading="downLoading"
+ >瀵� 鍑�</el-button
+ >
+ <el-button
+ size="small"
+ type="primary"
+ @click="schedulingVisible = true"
+ v-if="addPower"
+ >鎺� 鐝�</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.charAt(0) }}</div>
+ <div class="user-info">
+ <p style="font-size: 14px; color: #3a7bfa; line-height: 24px">
+ {{ item.name }}
+ </p>
+ <p
+ style="
+ color: #999999;
+ font-size: 12px;
+ transform: scale(0.8) translateX(-20px);
+ white-space: nowrap;
+ width: 150px;
+ overflow-x: show;
+ "
+ >
+ 鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{
+ item.day3
+ }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}
+ </p>
+ <p style="margin-top: 4px">
+ <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: 4px"
+ 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="!upPower"
+ 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.value"
+ >{{ n.label }}</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.charAt(0) }}</div>
+ <div class="user-info">
+ <p style="font-size: 14px; color: #3a7bfa; line-height: 24px">
+ {{ item.name }}
+ </p>
+ <p
+ style="
+ color: #999999;
+ font-size: 12px;
+ transform: scale(0.8) translateX(-20px);
+ white-space: nowrap;
+ width: 150px;
+ overflow-x: show;
+ "
+ >
+ 鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{
+ item.day3
+ }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}
+ </p>
+ <p style="margin-top: 4px">
+ <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.value"
+ :label="obj.label"
+ :value="obj.value"
+ >
+ </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.value"
+ :label="item.label"
+ :value="item.value"
+ >
+ </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,
+ selectUserList,
+} from "@/api/performance/class";
+export default {
+ data() {
+ return {
+ addPower: true,
+ upPower: true,
+ downPower: true,
+ 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: [],
+ listPower: false,
+ };
+ },
+ 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();
+ this.getPower();
+ },
+ 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;
+ if (res.code == 201) return;
+ 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);
+ });
+ });
+ },
+ 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;
+ if (res.code == 201) return;
+ 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;
+ });
+ });
+ },
+ getPower() {
+ let power = JSON.parse(sessionStorage.getItem("power"));
+ let add = false;
+ let up = false;
+ let down = false;
+ let listPower = false;
+ for (var i = 0; i < power.length; i++) {
+ if (power[i].menuMethod == "performanceShiftUpdate") {
+ up = true;
+ }
+ if (power[i].menuMethod == "delDeviceParameter") {
+ down = true;
+ }
+ if (power[i].menuMethod == "performanceShiftAdd") {
+ add = true;
+ }
+ if (power[i].menuMethod == "shiftTimeList") {
+ listPower = true;
+ }
+ }
+ this.addPower = add;
+ this.upPower = up;
+ this.downPower = down;
+ this.listPower = listPower;
+ },
+ 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;
+ if (res.code == 201) return;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.schedulingVisible = false;
+ this.schedulingQuery = {
+ week: "",
+ userId: null,
+ shift: "",
+ };
+ this.refresh();
+ });
+ },
+ 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.code == 201) return;
+ if (res.data.length > 0) {
+ res.data.forEach((item) => {
+ item.isEdit = false;
+ const index = this.timeTypeList.findIndex(
+ (val) => val.value === item.shift
+ );
+ if (index > -1) {
+ item.type = this.timeTypeList[index].label;
+ }
+ });
+ 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.value === item.shift
+ );
+ if (index > -1) {
+ item.type = this.timeTypeList[index].label;
+ }
+ }
+ 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) => {
+ if (res.code == 201) return;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.getTimeList();
+ });
+ } else {
+ // 鏂板
+ shiftAdd(newObj).then((res) => {
+ if (res.code == 201) return;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.getTimeList();
+ });
+ }
+ },
+ deleteTime(item, index) {
+ if (item.id) {
+ shiftRemove({
+ id: item.id,
+ }).then((res) => {
+ if (res.code == 201) return;
+ 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");
+ });
+ },
+ 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) => {
+ if (res.code == 201) return;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ m.shift = e;
+ });
+ }
+ },
+ getUsers() {
+ selectUserList({
+ current: -1,
+ size: -1,
+ }).then((res) => {
+ if (res.code === 201) {
+ return;
+ }
+ let arr = res.data.body.records;
+ this.personList = arr;
+ });
+ },
+ getDayByDic(e) {
+ let obj = this.classType.find((m) => m.label == e);
+ if (obj) {
+ return obj.value;
+ }
+ },
+ getShiftByDic(e) {
+ let obj = this.classType.find((m) => m.value == e);
+ if (obj) {
+ return obj.label;
+ }
+ return "鏃�";
+ },
+ scrollInit() {
+ // 鑾峰彇瑕佺粦瀹氫簨浠剁殑鍏冪礌
+ const nav = document.getElementById("nav");
+ var flag; // 榧犳爣鎸変笅
+ var downX; // 榧犳爣鐐瑰嚮鐨剎涓嬫爣
+ var scrollLeft; // 褰撳墠鍏冪礌婊氬姩鏉$殑鍋忕Щ閲�
+ nav.addEventListener("mousedown", function (event) {
+ flag = true;
+ downX = event.clientX; // 鑾峰彇鍒扮偣鍑荤殑x涓嬫爣
+ scrollLeft = this.scrollLeft; // 鑾峰彇褰撳墠鍏冪礌婊氬姩鏉$殑鍋忕Щ閲�
+ });
+ nav.addEventListener("mousemove", function (event) {
+ if (flag) {
+ // 鍒ゆ柇鏄惁鏄紶鏍囨寜涓嬫粴鍔ㄥ厓绱犲尯鍩�
+ var moveX = event.clientX; // 鑾峰彇绉诲姩鐨剎杞�
+ var scrollX = moveX - downX; // 褰撳墠绉诲姩鐨剎杞翠笅鏍囧噺鍘诲垰鐐瑰嚮涓嬪幓鐨剎杞翠笅鏍囧緱鍒伴紶鏍囨粦鍔ㄨ窛绂�
+ this.scrollLeft = scrollLeft - scrollX; // 榧犳爣鎸変笅鐨勬粴鍔ㄦ潯鍋忕Щ閲忓噺鍘诲綋鍓嶉紶鏍囩殑婊戝姩璺濈
+ }
+ });
+ // 榧犳爣鎶捣鍋滄鎷栧姩
+ nav.addEventListener("mouseup", function () {
+ flag = false;
+ });
+ // 榧犳爣绂诲紑鍏冪礌鍋滄鎷栧姩
+ nav.addEventListener("mouseleave", function (event) {
+ flag = false;
+ });
+ },
+ },
+};
+</script>
+
+<style scoped>
+.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(100% - 100px);
+ 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: 52px;
+ line-height: 52px;
+ 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;
+}
+.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>
diff --git a/src/views/performance/manHour/index.vue b/src/views/performance/manHour/index.vue
index 9955ba5..9358001 100644
--- a/src/views/performance/manHour/index.vue
+++ b/src/views/performance/manHour/index.vue
@@ -34,7 +34,6 @@
import workTimeStatistics from "./workTimeStatistics.vue";
import workTimeManagement from "./workTimeManagement.vue";
import workTimeConfig from "./workTimeConfig.vue";
-import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
export default {
components: {
workTimeStatistics,
@@ -46,9 +45,6 @@
return {
currentComponent: "workTimeStatistics",
};
- },
- methods: {
- checkPermi,
},
};
</script>
diff --git a/src/views/performance/manHour/workTimeConfig.vue b/src/views/performance/manHour/workTimeConfig.vue
index 590c182..83dcc11 100644
--- a/src/views/performance/manHour/workTimeConfig.vue
+++ b/src/views/performance/manHour/workTimeConfig.vue
@@ -53,7 +53,8 @@
size="small"
type="primary"
style="position: absolute; right: 50px"
- @click="openAdd"
+ @click="openAdd('鏂板')"
+ v-if="checkPermi(['performance:manHour:workTimeConfig:add'])"
>鏂� 澧�</el-button
>
</div>
@@ -63,38 +64,145 @@
:column="column"
:page="page"
:tableLoading="tableLoading"
- :height="'calc(100vh - 150px)'"
+ :height="'calc(100vh - 290px)'"
@pagination="pagination"
></lims-table>
</div>
+ <!-- 鏂板/缂栬緫 -->
+ <el-dialog :title="title" :visible.sync="timeDia" width="500px">
+ <el-form
+ :model="timeForm"
+ ref="timeForm"
+ :rules="timeRules"
+ label-position="right"
+ label-width="120px"
+ >
+ <el-form-item label="缂栧彿" prop="number">
+ <el-input
+ size="small"
+ placeholder="璇疯緭鍏�"
+ clearable
+ v-model="timeForm.number"
+ ></el-input>
+ </el-form-item>
+ <el-form-item label="杈呭姪椤圭洰鍚嶇О" prop="auxiliaryProject">
+ <el-input
+ size="small"
+ placeholder="璇疯緭鍏�"
+ clearable
+ v-model="timeForm.auxiliaryProject"
+ >
+ </el-input>
+ </el-form-item>
+ <el-form-item label="閮ㄩ棬" prop="department">
+ <el-input
+ size="small"
+ placeholder="璇疯緭鍏�"
+ clearable
+ v-model="timeForm.department"
+ >
+ </el-input>
+ </el-form-item>
+ <el-form-item label="瀹為獙瀹�" prop="laboratory">
+ <el-select
+ v-model="timeForm.laboratory"
+ size="small"
+ clearable
+ placeholder="璇烽�夋嫨"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in laboratoryList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ >
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鍗曚綅" prop="unit">
+ <el-select
+ v-model="timeForm.unit"
+ size="small"
+ clearable
+ placeholder="璇烽�夋嫨"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in unitList"
+ :key="item.dictValue"
+ :label="item.dictLabel"
+ :value="item.dictValue"
+ >
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏍稿噯宸ユ椂" prop="approvedWorkingHour">
+ <el-input
+ size="small"
+ placeholder="璇疯緭鍏�"
+ clearable
+ v-model="timeForm.approvedWorkingHour"
+ >
+ </el-input>
+ </el-form-item>
+ <el-form-item label="澶囨敞" prop="remarks">
+ <el-input
+ size="small"
+ placeholder="璇疯緭鍏�"
+ type="textarea"
+ :rows="2"
+ clearable
+ v-model="timeForm.remarks"
+ >
+ </el-input>
+ </el-form-item>
+ </el-form>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="timeDia = false">鍙� 娑�</el-button>
+ <el-button
+ :loading="uploading"
+ type="primary"
+ @click="submitProduct('timeForm')"
+ >纭� 璁�</el-button
+ >
+ </span>
+ </el-dialog>
</div>
</template>
<script>
import ValueTable from "@/components/Table/value-table.vue";
import limsTable from "@/components/Table/lims-table.vue";
-import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
import {
selectAuxiliaryWorkingHours,
- insertAuxiliaryWorkingHoursDay,
+ insertAuxiliaryWorkingHours,
obtainItemParameterList,
+ upAuxiliaryWorkingHours,
+ deleteAuxiliaryWorkingHours,
} from "@/api/performance/manHour";
export default {
components: {
ValueTable,
limsTable,
},
+ dicts: ["sys_unit"],
data() {
return {
laboratoryList: [],
- partList: [],
- addPower: true,
queryParams: {},
tableData: [],
column: [
{ label: "缂栧彿", prop: "number" },
{ label: "杈呭姪椤圭洰鍚嶇О", prop: "auxiliaryProject", width: "120px" },
- { label: "瀹為獙瀹�", prop: "laboratory" },
+ {
+ label: "瀹為獙瀹�",
+ prop: "laboratory",
+ dataType: "tag",
+ formatData: (params) => {
+ return this.laboratoryList.find((m) => m.value == params).label;
+ },
+ },
{ label: "鍗曚綅", prop: "unit" },
{ label: "鏍稿噯宸ユ椂", prop: "approvedWorkingHour" },
{ label: "閮ㄩ棬", prop: "department" },
@@ -109,10 +217,12 @@
name: "缂栬緫",
type: "text",
clickFun: (row) => {
- this.handleEdit(row);
+ this.openAdd("缂栬緫", row);
},
showHide: (row) => {
- return this.checkPermi(["standard:model:edit"]);
+ return this.checkPermi([
+ "performance:manHour:workTimeConfig:edit",
+ ]);
},
},
{
@@ -122,7 +232,9 @@
this.handleDelete(row);
},
showHide: (row) => {
- return this.checkPermi(["standard:model:del"]);
+ return this.checkPermi([
+ "performance:manHour:workTimeConfig:del",
+ ]);
},
},
],
@@ -135,16 +247,31 @@
},
tableLoading: false,
unitList: [],
+ title: "鏂板",
+ timeDia: false,
+ timeForm: {},
+ timeRules: {
+ number: [{ required: true, message: "璇疯緭鍏ョ紪鍙�", trigger: "blur" }],
+ auxiliaryProject: [
+ { required: true, message: "璇疯緭鍏ヨ緟鍔╅」鐩悕绉�", trigger: "blur" },
+ ],
+ laboratory: [
+ { required: true, message: "璇烽�夋嫨瀹為獙瀹�", trigger: "change" },
+ ],
+ unit: [{ required: true, message: "璇烽�夋嫨鍗曚綅", trigger: "change" }],
+ approvedWorkingHour: [
+ { required: true, message: "璇疯緭鍏ユ牳鍑嗗伐鏃�", trigger: "blur" },
+ ],
+ },
+ uploading: false,
};
},
mounted() {
- this.entityCopy = this.HaveJson(this.componentData.entity);
- this.getPower();
this.obtainItemParameterList();
this.selectEnumByCategoryForUnit();
+ this.getList();
},
methods: {
- checkPermi,
getList() {
this.tableLoading = true;
let param = { ...this.queryParams, ...this.page };
@@ -161,8 +288,9 @@
this.tableLoading = false;
});
},
- pagination(current, size) {
- this.page.current = current;
+ pagination({ page, limit }) {
+ this.page.current = page;
+ this.page.size = limit;
this.getList();
},
refresh() {
@@ -174,34 +302,15 @@
this.page.current = 1;
this.getList();
},
- getPower(radio) {
- let power = JSON.parse(sessionStorage.getItem("power"));
- let up = false;
- let del = false;
- let add = false;
- for (var i = 0; i < power.length; i++) {
- if (power[i].menuMethod == "upDeviceParameter") {
- up = true;
- }
- if (power[i].menuMethod == "delDeviceParameter") {
- del = true;
- }
- if (power[i].menuMethod == "addDeviceParameter") {
- add = true;
- }
+ openAdd(title, row) {
+ this.title = title;
+ if (row) {
+ this.timeForm = row;
+ this.timeForm.laboratory = Number(this.timeForm.laboratory);
+ } else {
+ this.timeForm = {};
}
- if (!up) {
- this.componentData.do.splice(1, 1);
- }
- if (!del) {
- this.componentData.do.splice(0, 1);
- }
- this.addPower = add;
- },
- openAdd() {
- // this.$refs.ValueTable0.openAddDia(
- // this.$api.auxiliaryWorkingHours.insertAuxiliaryWorkingHours
- // );
+ this.timeDia = true;
},
obtainItemParameterList() {
obtainItemParameterList().then((res) => {
@@ -219,6 +328,59 @@
this.getDicts("sys_unit").then((response) => {
this.unitList = response.data;
});
+ },
+ submitProduct(formName) {
+ this.$refs[formName].validate((valid) => {
+ if (valid) {
+ this.uploading = true;
+ if (this.title == "鏂板") {
+ insertAuxiliaryWorkingHours(this.timeForm)
+ .then((res) => {
+ this.uploading = false;
+ if (res.code != 200) {
+ return;
+ }
+ this.$message.success("鎻愪氦鎴愬姛");
+ this.refresh();
+ this.timeDia = false;
+ })
+ .catch((err) => {
+ this.uploading = false;
+ });
+ } else {
+ upAuxiliaryWorkingHours(this.timeForm)
+ .then((res) => {
+ this.uploading = false;
+ if (res.code != 200) {
+ return;
+ }
+ this.$message.success("鎻愪氦鎴愬姛");
+ this.refresh();
+ this.timeDia = false;
+ })
+ .catch((err) => {
+ this.uploading = false;
+ });
+ }
+ } else {
+ return false;
+ }
+ });
+ },
+ handleDelete(row) {
+ this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ deleteAuxiliaryWorkingHours({ id: row.id }).then((res) => {
+ if (res.code == 201) return;
+ this.$message.success("鍒犻櫎鎴愬姛");
+ this.refresh();
+ });
+ })
+ .catch(() => {});
},
},
};
@@ -251,10 +413,7 @@
width: calc(100% - 70px);
}
.table {
- margin-top: 10px;
- background-color: #fff;
- width: calc(100% - 40px);
- height: calc(100% - 60px - 80px - 10px - 24px);
- padding: 20px;
+ padding: 10px;
+ padding-top: 0;
}
</style>
diff --git a/src/views/performance/manHour/workTimeManagement.vue b/src/views/performance/manHour/workTimeManagement.vue
index 4bbe90d..bf8ffec 100644
--- a/src/views/performance/manHour/workTimeManagement.vue
+++ b/src/views/performance/manHour/workTimeManagement.vue
@@ -75,6 +75,7 @@
placeholder="鍏ㄩ儴"
size="small"
@change="refreshTable()"
+ clearable
>
<el-option
v-for="item in stateList"
@@ -173,16 +174,18 @@
:column="column"
:page="page"
:tableLoading="tableLoading"
- :height="'calc(100vh - 320px)'"
+ :height="'calc(100vh - 350px)'"
+ :isSelection="true"
v-if="currentTable == 'ValueTable0'"
@pagination="pagination"
+ :handleSelectionChange="handleSelectionChange"
></lims-table>
<lims-table
:tableData="tableData0"
:column="column0"
:page="page0"
:tableLoading="tableLoading"
- :height="'calc(100vh - 320px)'"
+ :height="'calc(100vh - 350px)'"
v-if="currentTable == 'ValueTable1'"
@pagination="pagination0"
></lims-table>
@@ -466,7 +469,6 @@
exportOutputHours,
} from "@/api/performance/manHour";
import limsTable from "@/components/Table/lims-table.vue";
-import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
export default {
components: {
ValueTable,
@@ -648,7 +650,7 @@
page: {
total: 0,
size: 10,
- current: 0,
+ current: 1,
},
tableLoading: false,
tableData0: [],
@@ -670,7 +672,7 @@
page0: {
total: 0,
size: 10,
- current: 0,
+ current: 1,
},
shifList: [],
};
@@ -743,7 +745,6 @@
this.getList0();
},
methods: {
- checkPermi,
getList(entity) {
this.tableLoading = true;
let param = {};
@@ -751,6 +752,7 @@
param = { ...entity, ...this.page };
} else {
param = { ...this.entity, ...this.page };
+ param.dateTime = JSON.stringify(param.dateTime);
}
delete param.total;
selectAuxiliaryWorkingHoursDay({ ...param })
@@ -772,6 +774,7 @@
param = { ...entity, ...this.page0 };
} else {
param = { ...this.entity, ...this.page0 };
+ param.dateTime = JSON.stringify(param.dateTime);
}
delete param.total;
selectAuxiliaryOutputWorkingHours({ ...param })
@@ -786,13 +789,15 @@
this.tableLoading = false;
});
},
- pagination(current, size) {
- this.page.current = current;
+ pagination({ page, limit }) {
+ this.page.current = page;
+ this.page.size = limit;
this.getList();
},
- pagination0(current, size) {
- this.page0.current = current;
- this.getList();
+ pagination0({ page, limit }) {
+ this.page0.current = page;
+ this.page0.size = limit;
+ this.getList0();
},
/** 灏嗘椂闂撮�夋嫨鍣ㄩ粯璁ら�変负褰撳ぉ鐨勬棩鏈� */
setDate() {
@@ -947,7 +952,23 @@
}
},
batchCheck(e) {
- this.$refs.ValueTable0.batchCheck(e);
+ const list = JSON.parse(JSON.stringify(this.ValueTable0Selected));
+ const state = e === 0 ? "涓嶆壒鍑�" : "宸叉壒鍑�";
+ let auxiliaryWorkingHoursDays = [];
+ list.forEach((item) => {
+ delete item.orderBy;
+ item.state = state;
+ auxiliaryWorkingHoursDays.push(item);
+ });
+ approve({ auxiliaryWorkingHoursDays: auxiliaryWorkingHoursDays }).then(
+ (res) => {
+ if (res.code === 201) {
+ return;
+ }
+ this.submitBatchCheckDialog();
+ this.$message.success("鎿嶄綔鎴愬姛");
+ }
+ );
},
closeBatchCheckDialog() {
this.batchCheckDialog = false;
@@ -1036,7 +1057,7 @@
}
entity.weekDay = this.entity.weekDay;
entity.name = this.entity.name;
- collectWorkingHours({ entity: entity }).then((res) => {
+ collectWorkingHours(entity).then((res) => {
this.totalInfo = res.data;
});
},
@@ -1047,22 +1068,22 @@
},
getInfoByCode() {
if (this.formData.number) {
- selectAuxiliaryWorkingHoursByNumber(this.formData.number).then(
- (res) => {
- this.auxiliaryWorking = res.data;
- if (this.addVisible) {
- this.formData.approvedWorkingHour =
- this.auxiliaryWorking.approvedWorkingHour;
- this.formData.auxiliaryProject =
- this.auxiliaryWorking.auxiliaryProject;
- } else if (this.title == "瀹℃牳" && this.checkVisible) {
- this.formData0.approvedWorkingHour =
- this.auxiliaryWorking.approvedWorkingHour;
- this.formData0.auxiliaryProject =
- this.auxiliaryWorking.auxiliaryProject;
- }
+ selectAuxiliaryWorkingHoursByNumber({
+ number: this.formData.number,
+ }).then((res) => {
+ this.auxiliaryWorking = res.data;
+ if (this.addVisible) {
+ this.formData.approvedWorkingHour =
+ this.auxiliaryWorking.approvedWorkingHour;
+ this.formData.auxiliaryProject =
+ this.auxiliaryWorking.auxiliaryProject;
+ } else if (this.title == "瀹℃牳" && this.checkVisible) {
+ this.formData0.approvedWorkingHour =
+ this.auxiliaryWorking.approvedWorkingHour;
+ this.formData0.auxiliaryProject =
+ this.auxiliaryWorking.auxiliaryProject;
}
- );
+ });
}
},
handleOut() {
@@ -1103,6 +1124,10 @@
this.outLoading = false;
});
},
+ handleSelectionChange(val) {
+ // console.log(111, val);
+ this.ValueTable0Selected = val;
+ },
},
};
</script>
diff --git a/src/views/performance/manHour/workTimeStatistics.vue b/src/views/performance/manHour/workTimeStatistics.vue
index 4425caf..daffdf6 100644
--- a/src/views/performance/manHour/workTimeStatistics.vue
+++ b/src/views/performance/manHour/workTimeStatistics.vue
@@ -45,6 +45,8 @@
:table-loading="tableLoading"
:page="page"
style="padding: 0 15px"
+ :height="'calc(100vh - 290px)'"
+ @pagination="pagination"
>
</limsTable>
</template>
@@ -132,12 +134,9 @@
this.refreshTable();
},
// 鍒嗛〉
- handleCurrent(page) {
- this.pagination.curent = page;
- this.refreshTable();
- },
- handleSizeChange(size) {
- this.pagination.pageSize = size;
+ pagination({ page, limit }) {
+ this.page.current = page;
+ this.page.size = limit;
this.refreshTable();
},
},
diff --git a/src/views/standard/model/index.vue b/src/views/standard/model/index.vue
index e3bf16c..9a366c8 100644
--- a/src/views/standard/model/index.vue
+++ b/src/views/standard/model/index.vue
@@ -109,7 +109,6 @@
delStandardTemplate,
getEditTemplatePreparation,
} from "@/api/standard/model";
-import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
export default {
components: {
Excel,
@@ -217,7 +216,6 @@
this.getList();
},
methods: {
- checkPermi,
getList() {
this.tableLoading = true;
let param = { ...this.queryParams, ...this.page };
diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue
index 60997c2..ff3c615 100644
--- a/src/views/standard/standardLibrary/index.vue
+++ b/src/views/standard/standardLibrary/index.vue
@@ -806,7 +806,6 @@
selectStandardProductByMethodId,
selectStandardProductEnumByMethodId,
} from "@/api/standard/standardLibrary";
-import { checkPermi } from "@/utils/permission"; // 鏉冮檺鍒ゆ柇鍑芥暟
import bindSupplierDensityDialogAsk from "./components/bindSupplierDensityDialogAsk.vue";
import BatchCopy from "./components/BatchCopy.vue";
export default {
@@ -902,7 +901,6 @@
};
},
methods: {
- checkPermi,
// 淇敼鏈�瀛愮骇鍚嶅瓧
editTreeName(info) {
this.updateDia = true;
--
Gitblit v1.9.3