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