From b0d4df5f39525ae7fe252e8ee65d85fd71dca721 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 07 五月 2026 14:53:32 +0800
Subject: [PATCH] 手动下单:检验中订单撤销报错问题修复
---
src/views/performance/class/index.vue | 787 ++++++++++++++++++++++++++++---------------------------
1 files changed, 397 insertions(+), 390 deletions(-)
diff --git a/src/views/performance/class/index.vue b/src/views/performance/class/index.vue
index 18e6ed2..f0c3c07 100644
--- a/src/views/performance/class/index.vue
+++ b/src/views/performance/class/index.vue
@@ -58,10 +58,10 @@
</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 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
@@ -93,20 +93,21 @@
<div class="fixed-left">
<div
class="content-title"
- style="padding-left: 16px; box-sizing: border-box"
+ style="
+ padding-left: 16px;
+ box-sizing: border-box;
+ position: fixed;
+ z-index: 1;
+ background-color: #fff;
+ width: 220px;
+ "
>
浜哄憳鍚嶇О
+ <span style="color: #ff4949">(浜哄憳鏁伴噺:{{ list.length }})</span>
</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="content-user" v-for="(item, index) in list">
<div class="user-pic">
- {{ item.name ? item.name.charAt(0) : "" }}
+ {{ item.userName ? item.userName.charAt(0) : "" }}
</div>
<div class="user-info">
<p
@@ -117,7 +118,7 @@
margin: 0;
"
>
- {{ item.name }}
+ {{ item.userName }}
</p>
<p
style="
@@ -126,14 +127,10 @@
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>
+ v-text="item.monthlyAttendanceStr"
+ ></p>
<p style="margin-top: 4px; margin: 0">
<span
style="
@@ -144,11 +141,7 @@
"
>鍚堣鍑哄嫟: </span
><span style="font-size: 16px; color: #ff4902"
- >{{
- query.month
- ? item.monthlyAttendance.totalAttendance
- : item.sidebarAnnualAttendance.totalAttendance
- }}澶�</span
+ >{{ item.monthlyAttendance.totalCount }}澶�</span
>
</p>
</div>
@@ -158,7 +151,12 @@
<div class="content">
<div
class="content-title content-title-right"
- style="border-bottom: 0"
+ style="
+ border-bottom: 0;
+ position: fixed;
+ z-index: 1;
+ background-color: #fff;
+ "
>
<div
class="content-title-item"
@@ -181,42 +179,59 @@
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
+ v-if="m"
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',
- }"
+ <el-tooltip
+ :disabled="m && !m.annotationText"
+ :content="m.annotationText"
>
- <span
- style="cursor: pointer"
- :style="`opacity: ${
- getShiftByDic(m.shift) == '鏃�' ? 0 : 1
- };`"
- >{{ getShiftByDic(m.shift) }}</span
+ <el-tag
+ @contextmenu.prevent.native="handleContextMenu(m, $event)"
+ class="work-box"
+ :type="getDictTypeByShift(m.shift)"
+ >{{ getShiftByDic(m.shift) }}</el-tag
>
- </div>
+ </el-tooltip>
+ <i
+ v-if="m.checkinResult === 'success'"
+ class="el-icon-success"
+ style="position: relative; top: -20px; color: #67c23a"
+ ></i>
+ <i
+ v-else-if="m.checkinResult === 'fail'"
+ class="el-icon-warning"
+ style="position: relative; top: -20px; color: #f56c6c"
+ ></i>
+ <svg
+ v-if="m.annotationText"
+ style="position: relative; top: -62px; left: 31px"
+ t="1772437700487"
+ class="icon"
+ viewBox="0 0 1024 1024"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ p-id="6193"
+ width="12"
+ height="12"
+ >
+ <path
+ d="M751.228537 117.332567c-1.023063 7.672974-1.470653 15.601715-1.278829 23.466514l1.278829 41.434062-32.418317 25.768406L473.466862 402.639333l-34.656268 27.494825-42.137418-13.747412a332.495559 332.495559 0 0 0-270.280524 28.965478l193.742604 194.637785 49.107037 49.362802 14.51471 14.642593 193.99837 194.829609a331.21673 331.21673 0 0 0 29.732776-271.559353l-13.747413-42.137418 27.494825-34.656268 194.509902-245.535182 25.768406-32.354375 41.434062 1.278829 4.220136 0.127883c6.522028 0 13.044057-0.44759 19.438202-1.406712l-155.377732-155.24985zM734.539817 0c9.719101 0 19.566085 3.644663 27.111177 11.189754l251.034146 250.650499a38.236989 38.236989 0 0 1-5.946555 59.081903 219.255244 219.255244 0 0 1-119.570518 35.359623c-2.301892 0-4.539843 0-6.841736-0.127882L685.752488 601.689078a413.253615 413.253615 0 0 1-71.742311 388.764038 39.451877 39.451877 0 0 1-58.378547 2.941307l-235.752139-236.775202L64.497325 1012.193211a37.277867 37.277867 0 1 1-52.623816-52.7517l255.510048-255.57399L31.631418 467.092319a39.451877 39.451877 0 0 1 3.197072-58.378548 411.399313 411.399313 0 0 1 258.771063-91.244454c43.480188 0 86.832494 6.905677 128.586263 20.461265l245.407299-194.573843A218.871596 218.871596 0 0 1 702.56909 17.264192a37.981223 37.981223 0 0 1 31.970727-17.264192z"
+ fill="#f56c6c"
+ p-id="6194"
+ ></path>
+ </svg>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(n, j) in classType"
@@ -226,6 +241,7 @@
>
</el-dropdown-menu>
</el-dropdown>
+ <div></div>
</div>
</div>
</div>
@@ -239,20 +255,25 @@
<div class="fixed-left">
<div
class="content-title"
- style="padding-left: 16px; box-sizing: border-box"
+ style="
+ padding-left: 16px;
+ box-sizing: border-box;
+ position: fixed;
+ z-index: 1;
+ background-color: #fff;
+ width: 220px;
+ "
>
浜哄憳鍚嶇О
+ <span style="color: #ff4949">(浜哄憳鏁伴噺:{{ yearList.length }})</span>
</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) : "" }}
+ {{ item.userName ? item.userName.charAt(0) : "" }}
</div>
<div class="user-info">
<p
@@ -263,7 +284,7 @@
margin: 0;
"
>
- {{ item.name }}
+ {{ item.userName }}
</p>
<p
style="
@@ -272,14 +293,10 @@
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>
+ v-text="item.sidebarAnnualAttendanceStr"
+ ></p>
<p style="margin-top: 4px; margin: 0">
<span
style="
@@ -290,7 +307,7 @@
"
>鍚堣鍑哄嫟: </span
><span style="font-size: 16px; color: #ff4902"
- >{{ item.work_time }}澶�</span
+ >{{ item.sidebarAnnualAttendance.totalCount }}澶�</span
>
</p>
</div>
@@ -301,7 +318,14 @@
<div>
<div
class="content-title content-title-right"
- style="border-bottom: 0; height: 52px"
+ style="
+ border-bottom: 0;
+ height: 63px;
+ position: fixed;
+ z-index: 1;
+ background-color: #fff;
+ width: calc(100% - 448px);
+ "
:style="`display: grid;
grid-template-columns: repeat(${monthList.length}, 1fr);`"
>
@@ -318,26 +342,21 @@
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"
+ v-for="(m, i) in item.monthlyAttendances"
: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
+ m.monthlyAttendance.totalCount
}}</span>
</p>
<p style="color: rgb(153, 153, 153); font-size: 12px">
- 鏃�:{{ m.day0 }},涓�:{{ m.day1 }},澶�:{{ m.day2 }},浼�:{{
- m.day3
- }},鍋�:{{ m.day4 }},宸�:{{ m.day6 }}
+ <span>{{ m.monthlyAttendanceStr }}</span>
</p>
</div>
</div>
@@ -346,17 +365,20 @@
</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>
+ <ul
+ v-show="showMenu"
+ class="contextmenu"
+ :style="{ left: menuX + 'px', top: menuY + 'px' }"
+ @click.stop
+ >
+ <li @click="updateAnnotation('edit')">
+ <i class="el-icon-edit-outline"></i> 缂栬緫鎵规敞
+ </li>
+ <li @click="updateAnnotation('delete')">
+ <i class="el-icon-delete"></i> 鍒犻櫎鎵规敞
+ </li>
+ </ul>
<el-dialog title="鏃堕棿閰嶇疆" :visible.sync="configTimeVisible" width="620px">
<div v-loading="configTimeVisibleLoading" style="min-height: 200px">
<div v-for="(item, index) in timeQuery">
@@ -460,50 +482,64 @@
</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-dialog
+ title="鎺掔彮"
+ :visible.sync="schedulingVisible"
+ width="20%"
+ @close="resetForm"
+ >
+ <el-form
+ ref="schedulingQueryRef"
+ :model="schedulingQuery"
+ :rules="schedulingQueryRules"
+ >
+ <el-form-item label="鎺掔彮鏃堕棿:" prop="dateRange">
<el-date-picker
- v-model="schedulingQuery.week"
- type="week"
- format="yyyy 绗� WW 鍛�"
- placeholder="閫夋嫨鍛ㄦ"
+ v-model="schedulingQuery.dateRange"
+ type="datetimerange"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ :default-time="['00:00:00', '23:59:59']"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-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-form-item>
+ <el-form-item label="浜哄憳鍚嶇О:" prop="userIdList">
<el-select
- v-model="schedulingQuery.userId"
+ v-model="schedulingQuery.userIdList"
+ popper-class="select-with-all"
placeholder="璇烽�夋嫨"
style="width: 100%"
multiple
- clearable
collapse-tags
+ clearable
>
+ <template slot="prefix">
+ <el-button
+ type="text"
+ size="mini"
+ @click="handleSelectAll"
+ style="margin: 4px 0"
+ >
+ {{ isAllSelected ? "鍙栨秷鍏ㄩ��" : "鍏ㄩ��" }}
+ </el-button>
+ <el-divider style="margin: 5px 0" />
+ </template>
<el-option
v-for="item in personList"
:key="item.id"
:label="item.name"
:value="item.id"
>
+ <span style="float: left">{{ item.name }}</span>
+ <span style="float: right; color: #8492a6; font-size: 13px">{{
+ item.account
+ }}</span>
</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-form-item>
+ <el-form-item label="鐝:" prop="shift">
<el-select
v-model="schedulingQuery.shift"
placeholder="璇烽�夋嫨"
@@ -517,10 +553,10 @@
>
</el-option>
</el-select>
- </div>
- </div>
+ </el-form-item>
+ </el-form>
<span slot="footer" class="dialog-footer">
- <el-button @click="schedulingVisible = false">鍙� 娑�</el-button>
+ <el-button @click="resetForm">鍙� 娑�</el-button>
<el-button type="primary" @click="confirmScheduling" :loading="loading"
>纭� 瀹�</el-button
>
@@ -530,7 +566,6 @@
</template>
<script>
-import { getYearAndMonthAndDays } from "@/utils/date";
import {
page,
pageYear,
@@ -542,17 +577,21 @@
exportFile,
obtainItemParameterList,
update,
- selectUserCondition,
+ editAnnotationText,
+ delAnnotationText,
} from "@/api/performance/class";
+import { selectUserListByPerformance } from "@/api/system/user";
+import { getWorkMonth } from "@/utils/date";
+import { transformExcel } from "@/utils/file";
export default {
+ name: "Class",
data() {
return {
query: {
userName: "",
laboratory: "",
year: new Date(),
- month: new Date().getMonth() + 1,
- // month:''
+ month: getWorkMonth().month() + 1,
},
monthOptions: [
{
@@ -612,13 +651,26 @@
personList: [],
loading: false,
schedulingQuery: {
- week: "",
- userId: null,
+ dateRange: [],
+ userIdList: [],
shift: "",
+ },
+ schedulingQueryRules: {
+ dateRange: {
+ required: true,
+ message: "璇烽�夋嫨鎺掔彮鏃ユ湡",
+ trigger: "change",
+ },
+ userIdList: {
+ required: true,
+ message: "璇烽�夋嫨浜哄憳鍚嶇О",
+ trigger: "change",
+ },
+ shift: { required: true, message: "璇烽�夋嫨鐝", trigger: "change" },
},
list: [],
currentPage: 1, // 褰撳墠椤�
- pageSize: 6, // 涓�椤�10鏉�
+ pageSize: 20, // 涓�椤�10鏉�
total: 0,
pageLoading: false, // 缁勪欢loading鐨勫睍绀�,榛樿涓簍rue
finishLoding: false, // 鍔犺浇瀹屾垚锛屾樉绀哄凡缁忔病鏈夋洿澶氫簡
@@ -629,31 +681,23 @@
configTimeVisibleLoading: false, // 鏃堕棿閰嶇疆寮规loading
timeTypeList: [],
timeQuery: [],
+ showMenu: false,
+ menuX: 0,
+ menuY: 0,
+ selectedTarget: null,
};
},
- 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()
- // }
- // }
+ computed: {
+ isAllSelected() {
+ return (
+ this.schedulingQuery.userIdList.length === this.personList.length &&
+ this.personList.length > 0
+ );
+ },
},
+ watch: {},
mounted() {
+ document.addEventListener("click", this.handleClickOutside);
this.selectEnumByCategory();
this.obtainItemParameterList();
this.getUsers();
@@ -667,9 +711,99 @@
this.monthList.push(i);
}
this.monthList.reverse();
- // this.getPower();
+ },
+ destroyed() {
+ document.removeEventListener("click", this.handleClickOutside);
},
methods: {
+ resetForm() {
+ this.$refs.schedulingQueryRef.resetFields();
+ this.$nextTick(() => {
+ this.schedulingVisible = false;
+ });
+ },
+ handleSelectAll() {
+ if (this.isAllSelected) {
+ this.schedulingQuery.userIdList = [];
+ } else {
+ // 鍙�変腑鍙敤閫夐」鐨剉alue
+ this.schedulingQuery.userIdList = this.personList.map(
+ (item) => item.id
+ );
+ }
+ },
+ handleContextMenu(target, e) {
+ // 闃绘娴忚鍣ㄩ粯璁ゅ彸閿彍鍗�
+ e.preventDefault();
+
+ const menuMinWidth = 105;
+ const offsetLeft = this.$el.getBoundingClientRect().left; // container margin left
+ const offsetWidth = this.$el.offsetWidth; // container width
+ const maxLeft = offsetWidth - menuMinWidth; // left boundary
+ const left = e.clientX - offsetLeft + 15; // 15: margin right
+
+ if (left > maxLeft) {
+ this.menuX = maxLeft;
+ } else {
+ this.menuX = left;
+ }
+ this.menuY = e.clientY - 60;
+ // 鏄剧ず鑿滃崟
+ this.selectedTarget = target;
+ this.showMenu = true;
+ },
+ //缂栬緫鎵规敞
+ updateAnnotation(operation) {
+ // 鐐瑰嚮鑿滃崟鍚庡叧闂彍鍗�
+ this.showMenu = false;
+ if (this.selectedTarget && !this.selectedTarget.shift) {
+ this.$message.warning("璇峰厛閫夋嫨鐝");
+ return;
+ }
+ if (operation && operation === "edit") {
+ this.$prompt("", "缂栬緫鎵规敞", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ inputType: "textarea",
+ inputPlaceholder: "濉啓鎵规敞鍐呭",
+ inputPattern: /^.{0,100}$/,
+ inputErrorMessage: "鏈�澶ц緭鍏�100涓瓧绗�",
+ })
+ .then(({ value }) => {
+ editAnnotationText({
+ id: this.selectedTarget.id,
+ annotationText: value,
+ }).then((res) => {
+ this.$message.success("鎻愪氦鎴愬姛");
+ this.refreshTable();
+ });
+ })
+ .catch(() => {});
+ } else if (operation && operation === "delete") {
+ this.$confirm("鏄惁鍒犻櫎鎵规敞鍐呭?", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ delAnnotationText(this.selectedTarget.id).then((res) => {
+ this.$message.success("鍒犻櫎鎴愬姛");
+ this.refreshTable();
+ });
+ })
+ .catch(() => {});
+ }
+ },
+ handleClickOutside() {
+ this.showMenu = false;
+ },
+ getDictTypeByShift(e) {
+ let obj = this.classType.find((m) => m.dictValue == e);
+ if (obj) {
+ return obj.listClass;
+ }
+ return "";
+ },
refresh() {
this.list = [];
this.yearList = [];
@@ -704,40 +838,6 @@
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();
@@ -746,120 +846,66 @@
: 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;
+ })
+ .then((res) => {
+ this.pageLoading = false;
+ this.list = res.data.page;
+ 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;
});
- 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;
- });
+ this.yearList = res.data;
});
},
- 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();
- })
- .catch((err) => {
- this.loading = false;
- });
+ this.$refs.schedulingQueryRef.validate((valid) => {
+ if (valid) {
+ this.loading = true;
+ add({
+ startTime: this.schedulingQuery.dateRange[0],
+ endTime: this.schedulingQuery.dateRange[1],
+ userIdList: this.schedulingQuery.userIdList,
+ shift: this.schedulingQuery.shift,
+ })
+ .then((res) => {
+ this.loading = false;
+ this.$message.success("鎿嶄綔鎴愬姛");
+ this.schedulingVisible = false;
+ this.schedulingQuery = {
+ week: "",
+ userIdList: [],
+ shift: "",
+ };
+ this.refresh();
+ })
+ .catch((err) => {
+ this.loading = false;
+ });
+ }
+ });
},
configTime() {
this.getDicts("sys_class_type").then((response) => {
@@ -872,7 +918,6 @@
this.configTimeVisibleLoading = true;
list()
.then((res) => {
- if (res.code == 201) return;
if (res.data.length > 0) {
res.data.forEach((item) => {
item.isEdit = false;
@@ -924,14 +969,12 @@
// 缂栬緫
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();
});
@@ -942,7 +985,6 @@
shiftRemove({
id: item.id,
}).then((res) => {
- if (res.code == 201) return;
this.$message.success("鎿嶄綔鎴愬姛");
this.getTimeList();
});
@@ -968,21 +1010,18 @@
time,
userName: this.query.userName,
laboratory: this.query.laboratory,
- isMonth: this.query.month ? true : false,
+ isMonth: !!this.query.month,
})
.then((res) => {
- this.$message.success("涓嬭浇鎴愬姛");
this.downLoading = false;
- const blob = new Blob([res], {
- type: "application/force-download",
- });
- let fileName = "";
+ let fileName = "涓ぉ鑰愪笣璐ㄩ噺閮�";
if (this.query.month) {
- fileName = year + "-" + this.query.month + " 鐝淇℃伅";
+ fileName += this.query.month + "鏈堢彮娆′俊鎭�";
} else {
- fileName = year + " 鐝姹囨��";
+ fileName += year + "骞寸彮娆℃眹鎬�";
}
- this.$download.saveAs(blob, fileName + ".xlsx");
+ transformExcel(res, fileName + ".xlsx");
+ this.$message.success("瀵煎嚭鎴愬姛");
})
.catch((err) => {
this.downLoading = false;
@@ -994,29 +1033,16 @@
});
},
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,
- });
+ obtainItemParameterList().then((res) => {
+ let data = [];
+ res.data.forEach((a) => {
+ data.push({
+ label: a.laboratoryName,
+ value: a.id,
});
- this.laboratory = data;
});
- }
+ this.laboratory = data;
+ });
},
handleCommand(e, m) {
if (e != m.shift) {
@@ -1024,26 +1050,15 @@
id: m.id,
shift: e,
}).then((res) => {
- if (res.code == 201) return;
this.$message.success("鎿嶄綔鎴愬姛");
m.shift = e;
});
}
},
getUsers() {
- selectUserCondition().then((res) => {
- if (res.code === 201) {
- return;
- }
- let arr = res.data;
- this.personList = arr;
+ selectUserListByPerformance().then((res) => {
+ this.personList = res.data;
});
- },
- 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);
@@ -1056,17 +1071,11 @@
};
</script>
-<style scoped>
+<style scoped lang="scss">
.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;
@@ -1085,16 +1094,19 @@
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);
@@ -1102,43 +1114,56 @@
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; /* 宸﹁竟鍖哄煙瀹藉害 */
+ width: 220px;
+ /* 宸﹁竟鍖哄煙瀹藉害 */
background-color: #fff;
- box-shadow: 2px -2px 5px rgba(51, 51, 51, 0.12); /* 宸﹁竟闃村奖 */
+ 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); /* 瑙嗗彛楂樺害 */
+ width: calc(100% - 220px);
+ /* 鍑忓幓宸﹁竟鍖哄煙瀹藉害 */
+ /*min-height: calc(100% - 10px);*/
+ /* 瑙嗗彛楂樺害 */
margin-left: 220px;
- overflow-x: scroll;
+ /*overflow-x: auto;*/
}
.content {
- min-height: calc(100% - 10px); /* 瑙嗗彛楂樺害 */
+ /* 瑙嗗彛楂樺害 */
+ /*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;
@@ -1151,6 +1176,7 @@
flex-direction: column;
position: relative;
}
+
.content-title-item .month {
font-size: 12px;
color: #3a7bfa;
@@ -1161,19 +1187,27 @@
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:nth-child(2) {
+ padding-top: 58px;
+}
+
.content-body-item {
height: 70px;
width: 50px;
@@ -1184,71 +1218,15 @@
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;
+ border-radius: 8px 8px 8px 8px;
+ font-size: 14px;
}
.content-user {
width: 100%;
@@ -1257,6 +1235,9 @@
border-bottom: 1px solid #eeeeee;
display: flex;
align-items: center;
+}
+.content-user:nth-child(2) {
+ margin-top: 58px;
}
.user-pic {
width: 50px;
@@ -1269,19 +1250,20 @@
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;
@@ -1292,9 +1274,11 @@
text-align: center;
line-height: 30px;
}
+
.year-table .content-title-item {
width: 100%;
}
+
.year-table .content-body-item {
width: 100%;
height: 70px;
@@ -1303,4 +1287,27 @@
flex-direction: column;
justify-content: center;
}
+
+/* 鑷畾涔夊彸閿彍鍗曟牱寮� */
+.contextmenu {
+ margin: 0;
+ background: #fff;
+ z-index: 3000;
+ position: absolute;
+ list-style-type: none;
+ padding: 5px 0;
+ border-radius: 4px;
+ font-size: 12px;
+ font-weight: 400;
+ color: #333;
+ box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+ li {
+ margin: 0;
+ padding: 7px 16px;
+ cursor: pointer;
+ &:hover {
+ background: #eee;
+ }
+ }
+}
</style>
--
Gitblit v1.9.3