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