| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- èµæºé¢å® --> |
| | | <template> |
| | | <div class="role_manage"> |
| | | <el-row class="title"> |
| | | <el-col :span="24" style="text-align: right;padding:10px 0"> |
| | | <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" style="margin-left: 10px">æ¥ è¯¢</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, // ç¨äºåå¨éä¸çID |
| | | selectedRow: null, |
| | | addVisiable: false, |
| | | laboratoryNameIsNull: false, |
| | | currentPage: 1, // å½å页 |
| | | pageSize: -1, // ä¸é¡µ16æ¡ |
| | | startTime: '', |
| | | endTime: '', |
| | | entity: { |
| | | laboratoryName: '', |
| | | storagePoint: '', |
| | | }, |
| | | addReservation: { |
| | | deviceName: '', |
| | | reservationTime: '', |
| | | specificTime: '', |
| | | customerName: '', |
| | | deviceNumber: '', |
| | | linkPerson: '', |
| | | phone: '', |
| | | reservationSpecification: '' |
| | | }, |
| | | total: '', |
| | | 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 'é¢çº¦'; |
| | | } |
| | | const 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; |
| | | const params = { |
| | | current: this.currentPage, |
| | | size: this.pageSize, |
| | | starttime: this.startTime, |
| | | endtime: this.endTime, |
| | | laboratoryNameIsNull: this.laboratoryNameIsNull, |
| | | laboratoryName: this.entity.laboratoryName, |
| | | storagePoint: this.entity.storagePoint, |
| | | } |
| | | reservationSelectDevice(params).then(res => { |
| | | this.tableLoading = false; |
| | | if (res.code === 200) { |
| | | this.tableData = res.data; |
| | | } |
| | | }).catch(err => { |
| | | this.tableLoading = false; |
| | | }) |
| | | }, |
| | | // æå¼é¢çº¦å¼¹æ¡ |
| | | openModal(date, row) { |
| | | console.log('date', date); |
| | | console.log('row', 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.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 = { |
| | | deviceId: 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ï¼åå¨value代表为ä¸çº§ |
| | | if (!clickNodeVal.value) { |
| | | this.finishLoding = false; |
| | | this.keyMap = {}; |
| | | this.currentPage = 1; |
| | | this.list = []; |
| | | this.entity.laboratoryName = null |
| | | this.entity.storagePoint = null |
| | | // çäº1代表为æ çä¸çº§ï¼label为é¨é¨ |
| | | if (clickNodeVal.label == 'å
¶ä»') { |
| | | this.laboratoryNameIsNull = true |
| | | this.getStartTimeAndEndTime(); |
| | | return |
| | | } |
| | | if (clickNodeVal.level == 1) { |
| | | this.entity.laboratoryName = clickNodeVal.label |
| | | // çäºäºçº§ãlabel为åå¨å°ç¹ |
| | | } 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> |