From e5454b769d44a34af423bf87ac8a740bf8c20341 Mon Sep 17 00:00:00 2001 From: Crunchy <3114200645@qq.com> Date: 星期二, 29 四月 2025 13:25:29 +0800 Subject: [PATCH] Merge branch 'dev' into dev_tides --- src/views/CNAS/resourceDemand/device/component/usageAuthorization.vue | 478 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 478 insertions(+), 0 deletions(-) diff --git a/src/views/CNAS/resourceDemand/device/component/usageAuthorization.vue b/src/views/CNAS/resourceDemand/device/component/usageAuthorization.vue new file mode 100644 index 0000000..d316543 --- /dev/null +++ b/src/views/CNAS/resourceDemand/device/component/usageAuthorization.vue @@ -0,0 +1,478 @@ +<template> + <div> + <div class="search"> + <el-button size="small" type="primary" @click="refreshTableList">鍒� 鏂�</el-button> + <el-button size="small" type="primary" @click="openDia('add')">鏂� 澧�</el-button> + </div> + <div> + <lims-table :tableData="tableData" :column="column" + height="calc(100vh - 20em)" @pagination="pagination" + :page="page" :tableLoading="tableLoading"></lims-table> + </div> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="usageTableDia" + title="璁惧淇濆吇璁″垝琛�" width="80%" @close="closeDialog"> + <div style="display: flex;align-items: center;"> + <el-button size="small" type="primary" @click="addTableRow" v-if="operationType !== 'check'">娣诲姞</el-button> + <span style="width: 60px;margin-left: 10px">骞翠唤锛�</span> + <el-date-picker v-model="form.impowerYear" type="year" value-format="yyyy" clearable size="small" format="yyyy" + placeholder="閫夋嫨骞�" :disabled="operationType === 'check'"> + </el-date-picker> + </div> + <div style="margin: 10px 0"> + <el-table ref="deviceImpowerDetails" :data="deviceImpowerDetails" id="templateParamTable" row-key="deviceId" + :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }" border + height="560px" style="width: 100% ;"> + <el-table-column align="center" header-align="center" label="搴忓彿" type="index" width="60"></el-table-column> + <el-table-column label="璁惧鍚嶇О" min-width="170" prop="deviceName"> + <template slot-scope="scope"> + <el-input v-model="scope.row.deviceName" clearable + size="small" :disabled="operationType === 'check'"></el-input> + </template> + </el-table-column> + <el-table-column label="璁惧缂栧彿" min-width="140" prop="managementNumber"> + <template slot-scope="scope"> + <el-input v-model="scope.row.managementNumber" clearable + size="small" :disabled="operationType === 'check'"></el-input> + </template> + </el-table-column> + <el-table-column label="瑙勬牸鍨嬪彿" min-width="120" prop="specificationModel"> + <template slot-scope="scope"> + <el-input v-model="scope.row.specificationModel" clearable + size="small" :disabled="operationType === 'check'"></el-input> + </template> + </el-table-column> + <el-table-column label="妫�娴嬮」鐩�" min-width="120" prop="inspectionItem<"> + <template slot-scope="scope"> + <el-input v-model="scope.row.inspectionItem" clearable size="small" + :disabled="operationType === 'check'"></el-input> + </template> + </el-table-column> + <el-table-column label="琚巿鏉冧汉" min-width="160" prop="delegatee"> + <template slot-scope="scope"> + <el-select v-model="scope.row.delegatedUserArr" + clearable filterable multiple + :disabled="operationType === 'check'" + placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="80" align="center" v-if="operationType !== 'check'"> + <template slot-scope="scope"> + <el-button style="color: #f56c6c" type="text" @click="deleteRow(scope.$index)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeDialog">鍙� 娑�</el-button> + <el-button v-if="operationType !== 'check'" :loading="submitFormLoading" type="primary" @click="submitForm">纭</el-button> + <el-button v-if="operationType === 'check'" :loading="submitFormLoading" type="primary" + @click="checkStatus(0)">涓嶉�氳繃</el-button> + <el-button v-if="operationType === 'check'" :loading="submitFormLoading" type="primary" + @click="checkStatus(1)">閫氳繃</el-button> + </span> + </el-dialog> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="addEquipDia" title="娣诲姞璁惧" + width="50%"> + <div style="display: flex;align-items: center;"> + <span style="width: 90px;margin-left: 10px">琚巿鏉冧汉锛�</span> + <el-select v-model="delegatedUser" clearable filterable multiple + placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.name" :label="item.name" :value="item.name"> + </el-option> + </el-select> + </div> + <el-table ref="multipleTable" :data="equipOptions" tooltip-effect="dark" height="500" style="width: 100%" + :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }" border + @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55"></el-table-column> + <el-table-column label="璁惧鍚嶇О" prop="label" width="190"></el-table-column> + <el-table-column prop="value" label="璁惧缂栧彿" width="130"></el-table-column> + <el-table-column prop="storagePoint" label="褰掑睘瀹為獙瀹�"></el-table-column> + </el-table> + <span slot="footer" class="dialog-footer"> + <el-button @click="addEquipDia = false">鍙� 娑�</el-button> + <el-button :loading="submitFormLoading" type="primary" @click="changeMachineName">纭</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="notificationDia" title="鎻愪氦瀹℃牳" width="30%" @close="closeNotificationDia"> + <span style="margin-top: 10px;display: inline-block"> + 璇烽�夋嫨瀹℃牳浜猴細 + <el-select v-model="auditId" clearable filterable size="small" style="width: 90%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="notificationLoading" @click="closeNotificationDia">鍙� 娑�</el-button> + <el-button :loading="notificationLoading" type="primary" @click="notification">鎻� 浜�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import { + addImpower, + deleteImpower, deviceScopeSearch, getImpowerDetail, reviewImpowerStatus, + selectDeviceImpowerByPage, submitReviewImpowerStatus, updateImpower, exportDeviceImpower +} from "@/api/cnas/resourceDemand/device"; +import {selectUserCondition} from "@/api/system/user"; +import {mapGetters} from "vuex"; + +export default { + name: '', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {limsTable}, + props: { + clickNodeVal: { + type: Object, + default: () => { + } + } + }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + outLoading: false, + tableData: [], + tableLoading: false, + page: { + total: 0, + size: 20, + current: 1 + }, + column: [ + { label: '璁″垝骞翠唤', prop: 'impowerYear' }, + { label: '缂栧埗浜�', prop: 'compiler' }, + { label: '缂栧埗鏃堕棿', prop: 'datePreparation' }, + { label: '鎺堟潈浜�', prop: 'audit' }, + { label: '鎺堟潈鏃ユ湡', prop: 'auditDate' }, + { + dataType: 'tag', + label: '鎺堟潈鐘舵��', + prop: 'status', + formatData: (params) => { + if (params === 1) { + return '宸叉巿鏉�' + } else if (params == 0) { + return '鏈巿鏉�' + } else { + return null + } + }, + formatType: (params) => { + if (params == 1) { + return 'success' + } else if (params === 0) { + return 'danger' + } else { + return null + } + } + }, + { + dataType: 'action', + label: '鎿嶄綔', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openDia('edit', row); + }, + disabled: (row) => { + return row.status === 1; + }, + }, + { + name: '瀹℃牳閫氱煡', + type: 'text', + clickFun: (row) => { + this.tellApprove(row.impowerId); + }, + disabled: (row) => { + return row.status === 1; + }, + }, + { + name: '瀹℃牳', + type: 'text', + clickFun: (row) => { + this.openDia('check', row); + }, + disabled: (row) => { + return row.status === 1 || this.userId !== row.auditId; + }, + }, + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.openHandleOut(row); + } + }, + { + name: '鍒犻櫎', + type: 'text', + clickFun: (row) => { + this.handleDeleteClick(row); + }, + disabled: (row) => { + return row.status === 1; + }, + }, + ] + } + ], + responsibleOptions: [], + operationType: '', + usageTableDia: false, + deviceImpowerDetails: [], + submitFormLoading: false, + addEquipDia: false, + equipOptions: [], + selectionRows: [], + form: { + impowerYear: '' + }, + delegatedUser: [], + impowerId: '', + notificationDia: false, + auditId: '', + notificationLoading: false, + }; + }, + mounted() { + this.refreshTableList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鐐瑰嚮鍒锋柊 + refreshTableList () { + this.page.current = 1; + this.getTableList() + }, + // 鍒嗛〉鍒囨崲 + pagination(page) { + this.page.size = page.limit + this.getTableList() + }, + getTableList () { + this.tableLoading = true + selectDeviceImpowerByPage({ + ...this.page + }).then(res => { + this.tableLoading = false + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + this.tableLoading = false + }) + }, + // 鎵撳紑鎻愪氦鎵瑰噯寮规 + tellApprove(impowerId) { + this.getUserList() + this.notificationDia = true + this.impowerId = impowerId + }, + // 鎻愪氦鎵瑰噯閫氱煡 + notification() { + if (!this.auditId) { + this.$message.warning('璇烽�夋嫨瀹℃牳浜�') + return + } + this.notificationLoading = true + submitReviewImpowerStatus({ + auditId: this.auditId, + impowerId: this.impowerId, + }).then(res => { + this.notificationLoading = false + if (res.code == 200) { + this.closeNotificationDia() + this.refreshTableList() + } + }).catch(err => { + this.notificationLoading = false + }) + }, + // 鍏抽棴鎻愪氦鎵瑰噯寮规 + closeNotificationDia() { + this.notificationDia = false + this.auditId = '' + }, + // 鎵撳紑鎿嶄綔寮规 + openDia (type, row) { + this.operationType = type + this.usageTableDia = true + this.form = { + impowerYear: '', + deviceImpowerDetails: [], + } + this.deviceImpowerDetails = [] + if (row) { + this.impowerId = row.impowerId + getImpowerDetail({ impowerId: this.impowerId }).then(res => { + if (res.code === 200) { + this.form = res.data + this.deviceImpowerDetails = this.form.deviceImpowerDetails + this.deviceImpowerDetails.forEach(item => { + this.$set(item, 'delegatedUserArr', item.delegatedUser.split(',')) + }) + } + }).catch(error => { + console.error(error) + }) + } + this.getEquipOptions() + this.getUserList() + }, + closeDialog () { + this.usageTableDia = false + this.getTableList() + }, + // 娣诲姞璁惧 + addTableRow() { + this.addEquipDia = true + this.delegatedUser = this.responsibleOptions.map((item) => item.name); + this.getEquipOptions() + }, + // 鍒犻櫎琛ㄦ牸琛� + deleteRow(index) { + this.deviceImpowerDetails.splice(index, 1) + }, + // 鎻愪氦鏂板鍜屼慨鏀� + submitForm() { + this.form.deviceImpowerDetails = this.HaveJson(this.deviceImpowerDetails) + this.form.deviceImpowerDetails.forEach((item) => { + item.delegatedUser = item.delegatedUserArr.join(',') + }) + this.submitFormLoading = true + if (this.operationType === 'add') { + addImpower(this.form).then(res => { + if (res.code == 200) { + this.$message.success('鏂板鎴愬姛') + this.usageTableDia = false + this.refreshTableList() + } + this.submitFormLoading = false + }).catch(err => { + this.submitFormLoading = false + }) + } else { + updateImpower(this.form).then(res => { + if (res.code == 200) { + this.$message.success('淇敼鎴愬姛') + this.usageTableDia = false + this.refreshTableList() + } + this.submitFormLoading = false + }).catch(err => { + this.submitFormLoading = false + }) + } + }, + // 鎻愪氦瀹℃牳 + checkStatus(status) { + const params = { + status: status, + impowerId: this.impowerId + } + reviewImpowerStatus(params).then(res => { + if (res.code == 200) { + this.$message.success('瀹℃牳鎴愬姛') + this.usageTableDia = false + this.refreshTableList() + } + this.submitFormLoading = false + }).catch(err => { + this.submitFormLoading = false + }) + }, + handleSelectionChange(selection) { + this.selectionRows = selection + }, + // 璧嬪�间华鍣ㄧ紪鍙� + changeMachineName() { + this.deviceMaintenancePlanDetails = [] + this.selectionRows.map(val => { + this.deviceImpowerDetails.push({ deviceId: val.id, deviceName: val.label, managementNumber: val.value, specificationModel: val.specificationModel, delegatedUserArr: this.delegatedUser }) + }) + this.addEquipDia = false + }, + // 鑾峰彇鎵�鏈夎澶� + getEquipOptions() { + this.equipOptions = [] + deviceScopeSearch({ status: 0 }).then(res => { + if (res.code === 200 && res.data) { + this.equipOptions = res.data.map(m => { + m.value = m.managementNumber + m.label = m.deviceName + m.storagePoint = m.storagePoint + return m + }) + } + }).catch(error => { + console.error(error) + }) + }, + openHandleOut (row) { + exportDeviceImpower({ impowerId: row.impowerId }).then(res => { + this.outLoading = false + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '璁惧浣跨敤鎺堟潈琛�' + '.docx') + }) + }, + handleDeleteClick(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + deleteImpower({ impowerId: row.impowerId }).then(res => { + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }); + this.refreshTableList() + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 鑾峰彇璐熻矗浜轰俊鎭帴鍙� + getUserList() { + selectUserCondition({type: 2}).then(res => { + if (res.code == 200) { + this.responsibleOptions = res.data + } + }) + }, + }, + watch: { + // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊 + clickNodeVal(newVal) { + if (newVal.value) { + this.refreshTableList(); + } + }, + }, + computed: { + ...mapGetters(["userId"]), + }, +}; +</script> + +<style scoped> +.search { + height: 46px; + text-align: right; + margin-top: 10px; +} +</style> -- Gitblit v1.9.3