From 2f5d64825dbc81f9732893ee9f3de1a38725ae25 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 10 三月 2025 17:12:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev
---
src/views/CNAS/resourceDemand/device/component/resource-reservation.vue | 470 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 470 insertions(+), 0 deletions(-)
diff --git a/src/views/CNAS/resourceDemand/device/component/resource-reservation.vue b/src/views/CNAS/resourceDemand/device/component/resource-reservation.vue
new file mode 100644
index 0000000..b23611b
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/device/component/resource-reservation.vue
@@ -0,0 +1,470 @@
+<!-- 璧勬簮棰勫畾 -->
+<template>
+ <div class="role_manage">
+ <el-row class="title">
+ <el-col :span="8" style="text-align: left;">棰勫畾鎬昏</el-col>
+ <el-col :span="16" style="text-align: right;padding-bottom:10px">
+ <el-date-picker
+ v-model="startTime"
+ format="yyyy-MM-dd"
+ placeholder="閫夋嫨璧峰鏃ユ湡"
+ size="mini"
+ type="date"
+ value-format="yyyy-MM-dd"/>
+ 鑷�
+ <el-date-picker
+ v-model="endTime"
+ format="yyyy-MM-dd"
+ placeholder="閫夋嫨缁撴潫鏃ユ湡"
+ size="mini"
+ type="date"
+ value-format="yyyy-MM-dd"/>
+ <el-button size="mini" type="primary" @click="ValidateAndQuery">鏌� 璇�</el-button>
+ </el-col>
+ </el-row>
+ <div class="table-container">
+ <el-table v-loading="tableLoading" :data="tableData" border class="scrollable-table" style="width: 100%">
+ <el-table-column label="搴忓彿"
+ type="index"
+ width="60">
+ </el-table-column>
+ <el-table-column label="璁惧" min-width="60" prop="deviceName"/>
+ <el-table-column label="鏃堕棿" min-width="60" prop="time"/>
+ <el-table-column v-for="date in dates" :key="date" :label="date">
+ <template #default="{ row }">
+ <el-button v-if="!row[date]" size="mini" type="primary" @click="openModal(date, row)">
+ {{ getDisplayText(row, date) }}
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="showModal" title="棰勫畾淇℃伅"
+ top="5vh" width="70%">
+ <h4>
+ <el-button v-if="isBeforeDate()" size="small" @click="cancelReservation(selectedRow)">鍙栨秷棰勫畾</el-button>
+ <el-button v-if="isBeforeDate()" size="small" type="primary" @click="openAdd()">鏂板缓棰勫畾</el-button>
+ </h4>
+ <el-table ref="table" :data="tableData2" style="width: 100%" tooltip-effect="dark"
+ @close="ValidateAndQuery"
+ @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="55%">
+ </el-table-column>
+ <el-table-column label="搴忓彿" width="120">
+ <template #default="{ row, $index }">
+ <!-- 浣跨敤 $index 鏉ヨ幏鍙栬绱㈠紩锛岄�氬父浠�0寮�濮嬶紝鎵�浠�+1浠ョ鍚堝父瑙勫簭鍙蜂範鎯� -->
+ {{ $index + 1 }}
+ </template>
+ </el-table-column>
+ <el-table-column label="棰勫畾缂栧彿" prop="deviceNumber" width="120">
+ </el-table-column>
+ <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip>
+ </el-table-column>
+ <el-table-column label="鑱旂郴浜�" prop="linkPerson" show-overflow-tooltip>
+ </el-table-column>
+ <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" show-overflow-tooltip>
+ </el-table-column>
+ <el-table-column label="棰勫畾璇存槑" prop="reservationSpecification" show-overflow-tooltip>
+ </el-table-column>
+ <el-table-column label="鍒涘缓浜�" prop="name" show-overflow-tooltip>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" prop="createDate" show-overflow-tooltip>
+ </el-table-column>
+ </el-table>
+ </el-dialog>
+ <el-dialog :visible.sync="addVisiable" title="鏂板缓棰勫畾" top="5vh" width="40%">
+ <el-form ref="addReservationForm" :model="addReservation" :rules="rules" label-width="90px">
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="棰勫畾璁惧:">
+ <el-input v-model="addReservation.deviceName"></el-input>
+ </el-form-item>
+ <el-form-item label="瀹㈡埛鍚嶇О:">
+ <el-input v-model="addReservation.customerName"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="棰勫畾鏃堕棿:">
+ <el-input v-model="addReservation.reservationTime"></el-input>
+ </el-form-item>
+ <el-form-item label="娴佺▼缂栧彿:">
+ <el-input v-model="addReservation.deviceNumber"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鑱旂郴浜�:">
+ <el-input v-model="addReservation.linkPerson"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鑱旂郴鐢佃瘽:" prop="phone">
+ <el-input v-model="addReservation.phone"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="棰勫畾璇存槑:" required>
+ <el-input v-model="addReservation.reservationSpecification" type="textarea"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="addVisiable = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="addRecord">纭� 瀹�</el-button>
+ </span>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import {
+ reservationDelete,
+ reservationSave,
+ reservationSelectDevice,
+ selectReservationParameterPage
+} from "@/api/cnas/resourceDemand/device";
+
+export default {
+ props: {
+ clickNodeVal: {
+ type: Object,
+ default: () => {
+ return {};
+ }
+ }
+ },
+ data() {
+
+ return {
+ timeSlots: ['09:00-12:00', '13:00-18:00', '18:00-22:00'],
+ dates: [],
+ showModal: false,
+ selectedDate: '',
+ selectedTime: '',
+ selectedDevice: '',
+ tableData: [],
+ tableLoading: false,
+ tableData2: [],
+ selectedReservationId: null, // 鐢ㄤ簬瀛樺偍閫変腑鐨処D
+ selectedRow: null,
+ addVisiable: false,
+ laboratoryNameIsNull: false,
+ currentPage: 1, // 褰撳墠椤�
+ pageSize: -1, // 涓�椤�16鏉�
+ startTime: '',
+ endTime: '',
+ entity: {
+ deviceName: null,
+ laboratoryName: '',
+ storagePoint: '',
+ },
+ addReservation: {
+ deviceName: '',
+ reservationTime: '',
+ specificTime: '',
+ customerName: '',
+ deviceNumber: '',
+ linkPerson: '',
+ phone: '',
+ reservationSpecification: ''
+ },
+ total: '',
+ componentData: {
+ entity: {
+ largeCategory: null,
+ orderBy: {
+ field: 'id',
+ order: 'asc'
+ }
+ },
+ },
+ yuyue: null,
+ yuyuetime: '',
+ rules: {
+ phone: [
+ {
+ required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�',
+ trigger: 'blur'
+ },
+ {
+ pattern: /^1[3456789]\d{9}$/,
+ message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜',
+ trigger: ['blur', 'change']
+ }
+ ]
+ },
+ appointment: ''
+ }
+ },
+ watch: {
+ // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+ clickNodeVal(newVal) {
+ this.clickSidebar(newVal)
+ }
+ },
+
+ created() {
+ this.clickSidebar(this.clickNodeVal)
+ this.initDate();
+ },
+ mounted() {
+ this.getStartTimeAndEndTime();
+
+ },
+ methods: {
+ isBeforeDate() {
+ let currentDate = this.$moment().format('YYYY-MM-DD')
+ let currentTime = this.$moment().format('HH')
+ const appointment = this.appointment && this.appointment.split('-')
+ let appointment0 = ''
+ let appointment1 = ''
+ if (appointment !== '') {
+ appointment0 = appointment[0].slice(0, 2)
+ appointment1 = appointment[1].slice(0, 2)
+ }
+ if (currentDate < this.yuyuetime) {
+ // 鏈潵鐨勬棩鏈燂紝涓�瀹氳兘鏂板棰勭害
+ return true
+ } else if (currentDate === this.yuyuetime) {
+ // 褰撳ぉ鐨勬棩鏈燂紝宸茬粡杩囦簡鐨勬椂闂翠笉鍙彇娑堝拰鏂板
+ if (currentTime < appointment1) {
+ return true
+ } else if (currentTime > appointment1) {
+ return false
+ }
+ }
+ },
+ getDisplayText(row, date) {
+ if (!row || row.dateList === null || row.dateList === undefined || row.dateList === "") {
+ return '棰勭害';
+ }
+ var dateLst = row.dateList
+ for (const dateLstElement of dateLst) {
+ if (dateLstElement.date === date) {
+ if (dateLstElement.value === 0) {
+ return '棰勭害';
+ } else {
+ return dateLstElement.value;
+ }
+ }
+ }
+ return '棰勭害';
+ },
+
+ ValidateAndQuery() {
+ if (!this.startTime || !this.endTime) {
+ this.$message.error('璇烽�夋嫨鏃ユ湡鑼冨洿');
+ return;
+ }
+ if ((new Date(this.endTime) - new Date(this.startTime)) / (1000 * 60 * 60 * 24) >= 10) {
+ this.$message.error('鍙兘棰勭害10澶╀互鍐�');
+ return;
+ }
+ if (new Date(this.startTime) > new Date(this.endTime)) {
+ this.$message.error('寮�濮嬫棩鏈熶笉鑳藉ぇ浜庣粨鏉熸棩鏈�');
+ return;
+ }
+ this.query();
+ },
+ initDate() {
+ if (this.startTime == '' || this.endTime == '' || this.startTime == null || this.endTime == null) {
+ const daysAdd = 3;
+ const now = new Date();
+ this.startTime = now.getFullYear() + "-" +
+ String(now.getMonth() + 1).padStart(2, '0') + "-" +
+ String(now.getDate()).padStart(2, '0');
+ let endTime = new Date(now);
+ endTime.setDate(now.getDate() + daysAdd);
+ this.endTime = endTime.getFullYear() + "-" +
+ String(endTime.getMonth() + 1).padStart(2, '0') + "-" +
+ String(endTime.getDate()).padStart(2, '0');
+ const start = new Date(this.startTime);
+ const end = new Date(this.endTime);
+ const tempDates = [];
+ while (start <= end) {
+ const year = start.getFullYear();
+ const month = String(start.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮嬶紝鎵�浠ュ姞1锛屽苟浣跨敤padStart琛�0
+ const day = String(start.getDate()).padStart(2, '0'); // 浣跨敤padStart琛�0
+ tempDates.push(`${year}-${month}-${day}`);
+ start.setDate(start.getDate() + 1);
+ }
+ this.dates = tempDates;
+ this.getStartTimeAndEndTime();
+ }
+ },
+ query() {
+ if (this.startTime && this.endTime) {
+ const start = new Date(this.startTime);
+ const end = new Date(this.endTime);
+ const tempDates = [];
+ while (start <= end) {
+ const year = start.getFullYear();
+ const month = String(start.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮嬶紝鎵�浠ュ姞1锛屽苟浣跨敤padStart琛�0
+ const day = String(start.getDate()).padStart(2, '0'); // 浣跨敤padStart琛�0
+ tempDates.push(`${year}-${month}-${day}`);
+ start.setDate(start.getDate() + 1);
+ }
+ this.dates = tempDates;
+ this.getStartTimeAndEndTime();
+ }
+ },
+ //鏌ヨ鏃堕棿
+ getStartTimeAndEndTime() {
+ //鏌ヨ閫昏緫
+ this.tableLoading = true;
+ reservationSelectDevice({
+ current: this.currentPage,
+ size: this.pageSize,
+ ...this.entity,
+ laboratoryNameIsNull: this.laboratoryNameIsNull
+ }).then(res => {
+ this.tableLoading = false;
+ if (res.code === 200) {
+ this.tableData = res.data;
+ }
+ }).catch(err => {
+ this.tableLoading = false;
+ })
+ },
+ openModal(date, row) {
+ this.yuyue = row;
+ this.yuyuetime = date;
+ this.appointment = row.time
+ this.showModal = true;
+ this.getList();
+ },
+ openAdd() {
+ this.addVisiable = true;
+ this.addReservation.deviceId = this.yuyue.id;
+ // this.addReservation.deviceNumber = this.yuyue.deviceNumber;
+ this.addReservation.deviceName = this.yuyue.deviceName;
+ this.addReservation.reservationTime = this.yuyuetime + " " + this.yuyue.time;
+ this.addReservation.specificTime = this.yuyue.time;
+ this.addReservation.deviceNumber = 'TX-ABC-01' + Math.floor(Math.random() * 10 + 1);
+ },
+ handleSelectionChange(selected) {
+ this.selectedRow = selected.length > 0 ? selected : null;
+ },
+ async cancelReservation(selectedRow) {
+ if (!selectedRow || selectedRow.length == 0) {
+ this.$message.error('璇烽�夋嫨瑕佸垹闄ょ殑棰勭害');
+ return;
+ }
+ let ids = selectedRow.map(item => item.id).join(',');
+ try {
+ const res = await reservationDelete({ids: ids});
+ if (res.code === 200) {
+ this.$message.success({
+ message: '鍒犻櫎鎴愬姛',
+ type: 'success'
+ });
+ this.getList();
+ this.query();
+ this.showModal = false;
+ } else {
+ this.$message.error({
+ message: '鍒犻櫎澶辫触',
+ type: 'error'
+ });
+ }
+ } catch (error) {
+ this.$message.error({
+ message: '鍒犻櫎杩囩▼涓彂鐢熼敊璇紝璇风◢鍚庨噸璇�',
+ type: 'error'
+ });
+ }
+ },
+ addRecord() {
+ this.$refs.addReservationForm.validate((valid) => {
+ if (valid) {
+ this.addReservation.reservationTime = this.yuyuetime;
+ reservationSave(this.addReservation).then(res => {
+ if (res.code == 200) {
+ this.$message.success('淇濆瓨鎴愬姛')
+ this.addVisiable = false
+ this.getList();
+ this.query();
+ this.addReservation = {};
+ }
+ })
+ } else {
+ this.$message.error({message: '璇锋鏌ヨ〃鍗曞~鍐欐槸鍚︽纭�', type: 'error'});
+ return false;
+ }
+ });
+ },
+ getList() {
+ const params = {
+ selectReservationParameterPage: this.yuyue.id,
+ reservationTime: this.yuyuetime,
+ specificTime: this.yuyue.time,
+ }
+ selectReservationParameterPage(params).then(res => {
+ if (res.code == 200) {
+ this.tableData2 = res.data;
+ }
+ })
+ },
+ // 鐐瑰嚮渚ц竟鏍忓埛鏂�
+ clickSidebar(clickNodeVal) {
+ this.laboratoryNameIsNull = false
+ // 鏄惁瀛樺湪value锛屽瓨鍦╲alue浠h〃涓轰笁绾�
+ if (!clickNodeVal.value) {
+ this.finishLoding = false;
+ this.keyMap = {};
+ this.currentPage = 1;
+ this.list = [];
+ this.entity.laboratoryName = null
+ this.entity.storagePoint = null
+ // 绛変簬1浠h〃涓烘爲鐨勪竴绾э紝label涓洪儴闂�
+ if (clickNodeVal.label == '鍏朵粬') {
+ this.laboratoryNameIsNull = true
+ this.getStartTimeAndEndTime();
+ return
+ }
+ if (clickNodeVal.level == 1) {
+ this.entity.laboratoryName = clickNodeVal.label
+ // 绛変簬浜岀骇銆俵abel涓哄瓨鍌ㄥ湴鐐�
+ } else if (clickNodeVal.level == 2) {
+ // 鍏朵粬琛ㄧず娌℃湁閰嶇疆瀹為獙瀹わ紝鍙厤缃簡鍦扮偣
+ if (clickNodeVal.parent.label == '鍏朵粬') {
+ this.laboratoryNameIsNull = true
+ } else {
+ this.entity.laboratoryName = clickNodeVal.parent.label
+ }
+ this.entity.storagePoint = clickNodeVal.label
+ }
+ this.getStartTimeAndEndTime();
+ }
+ }
+ },
+
+}
+</script>
+
+<style scoped>
+.table-container {
+ overflow: auto;
+ height: calc(100vh - 15em);
+ /* 鍙互鏍规嵁闇�瑕佽皟鏁撮珮搴� */
+}
+
+.scrollable-table {
+ max-height: 100%;
+ overflow-y: auto;
+ /* overflow-x: auto; */
+}
+
+h4 {
+ font-weight: 400;
+ font-size: 16px;
+ display: flex;
+ justify-content: flex-end;
+ margin: 10px 0;
+}
+
+.form-row {
+ display: flex;
+ justify-content: space-between;
+}
+</style>
--
Gitblit v1.9.3