From a1fddf659da7d3ad8b5280cb76071eae50a86d46 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 25 二月 2025 15:05:58 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev

---
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-treatment.vue                                             |  202 +++
 src/views/CNAS/resourceDemand/facilitiesEnvironment/index.vue                                                                        |   50 
 src/views/business/productSamplingInfo/components/addQuarterItem.vue                                                                 |  290 ++++
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/lightning-protection-detection.vue |  288 ++++
 src/views/CNAS/resourceDemand/standardMaterial/index.vue                                                                             |    8 
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/power-supply-stability.vue         |  403 ++++++
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/illuminance-recording.vue          |  414 ++++++
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management.vue                                               |  261 ++++
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions.vue                                |   51 
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/temperature-humidity-record.vue    |  483 +++++++
 src/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes.js                                                                  |   56 
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management-dia.vue                                           |  211 +++
 src/api/business/productSamplingInfo.js                                                                                              |  101 +
 src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-dialog.vue                                                |  189 +++
 src/views/business/productSamplingInfo/index.vue                                                                                     |  647 ++++++++++
 15 files changed, 3,646 insertions(+), 8 deletions(-)

diff --git a/src/api/business/productSamplingInfo.js b/src/api/business/productSamplingInfo.js
new file mode 100644
index 0000000..b954bfe
--- /dev/null
+++ b/src/api/business/productSamplingInfo.js
@@ -0,0 +1,101 @@
+// 鎶芥牱淇℃伅璇︽儏椤甸潰鐩稿叧鎺ュ彛
+import request from '@/utils/request'
+
+// 鎶芥牱淇℃伅-瀛e害鏌ヨ
+export function getQuarterPage(query) {
+  return request({
+    url: '/finishProductSpotCheck/getQuarterPage',
+    method: 'get',
+    params: query
+  })
+}
+// 鎶芥牱淇℃伅-骞村害鏌ヨ
+export function getSpotCheckYearPage(query) {
+  return request({
+    url: '/finishProductSpotCheck/getSpotCheckYearPage',
+    method: 'get',
+    params: query
+  })
+}
+// 鍒犻櫎瀛e害鎶芥
+export function deleteQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/deleteQuarter',
+    method: 'delete',
+    params: query
+  })
+}
+// 鐢熸垚瀛e害鎶ュ憡
+export function finalReportQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/finalReportQuarter',
+    method: 'get',
+    params: query,
+    responseType: "blob"
+  })
+}
+// 鐢熸垚骞村害鎶ュ憡
+export function finalReportSpotCheckYear(query) {
+  return request({
+    url: '/finishProductSpotCheck/finalReportSpotCheckYear',
+    method: 'get',
+    params: query,
+    responseType: "blob"
+  })
+}
+// 鍒犻櫎骞村害鎶芥
+export function deleteSpotCheckYear(query) {
+  return request({
+    url: '/finishProductSpotCheck/deleteSpotCheckYear',
+    method: 'delete',
+    params: query,
+  })
+}
+// 骞村害鎶芥鏌ョ湅璇︽儏
+export function getSpotCheckYear(query) {
+  return request({
+    url: '/finishProductSpotCheck/getSpotCheckYear',
+    method: 'get',
+    params: query,
+  })
+}
+// 鎻愪氦骞村害鎶芥牱
+export function addSpotCheckYear(query) {
+  return request({
+    url: '/finishProductSpotCheck/addSpotCheckYear',
+    method: 'post',
+    data: query,
+  })
+}
+// 缂栬緫骞村害鎶芥牱
+export function updateSpotCheckYear(query) {
+  return request({
+    url: '/finishProductSpotCheck/updateSpotCheckYear',
+    method: 'post',
+    data: query,
+  })
+}
+// 瀛e害鎶芥鏌ョ湅璇︽儏
+export function getQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/getQuarter',
+    method: 'get',
+    params: query,
+  })
+}
+// 鎻愪氦瀛e害鎶芥牱
+export function addQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/addQuarter',
+    method: 'post',
+    data : query,
+  })
+}
+// 缂栬緫瀛e害妫�楠�
+export function updateQuarterOnOrder(query) {
+  return request({
+    url: '/finishProductSpotCheck/updateQuarterOnOrder',
+    method: 'post',
+    data : query,
+  })
+}
diff --git a/src/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes.js b/src/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes.js
new file mode 100644
index 0000000..e9a5915
--- /dev/null
+++ b/src/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes.js
@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+// 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒嗛〉鏌ヨ
+export function pageInternalWastes(query) {
+  return request({
+    url: '/internalWastes/pageInternalWastes',
+    method: 'get',
+    params: query
+  })
+}
+
+// 瀹夊叏鍐呭姟涓夊簾澶勭悊鏌ョ湅璇︽儏
+export function getInternalWastesOne(query) {
+  return request({
+    url: '/internalWastes/getInternalWastesOne',
+    method: 'get',
+    params: query
+  })
+}
+
+// 瀹夊叏鍐呭姟涓夊簾澶勭悊鏂板
+export function addInternalWastes(query) {
+  return request({
+    url: '/internalWastes/addInternalWastes',
+    method: 'post',
+    data: query
+  })
+}
+
+// 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒嗛〉淇敼
+export function updateInternalWastes(query) {
+  return request({
+    url: '/internalWastes/updateInternalWastes',
+    method: 'post',
+    data: query
+  })
+}
+
+// 瀵煎嚭涓夊簾澶勭悊
+export function exportInternalWastes(query) {
+  return request({
+    url: "/internalWastes/exportInternalWastes",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//瀹夊叏鍐呭姟涓夊簾澶勭悊鍒犻櫎
+export function removeStandardSubstance(query) {
+  return request({
+    url: '/internalWastes/delInternalWastes',
+    method: 'delete',
+    params: query
+  })
+}
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management-dia.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management-dia.vue
new file mode 100644
index 0000000..14d2b3b
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management-dia.vue
@@ -0,0 +1,211 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false"
+               :close-on-press-escape="false"
+               :visible.sync="formDia"
+               title="澶栨潵浜哄憳绠$悊淇℃伅"
+               width="80%" @close="closeThreeWastesDia">
+      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
+        <el-col :span="12">
+          <el-form-item label="鏃ユ湡" prop="registerDate">
+            <el-date-picker v-model="form.registerDate"
+                            clearable
+                            format="yyyy-MM-dd"
+                            placeholder="閫夋嫨鏃ユ湡"
+                            size="small"
+                            type="date"
+                            value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="杩涘叆鍖哄煙" prop="area">
+            <el-input v-model="form.area" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="杩涘叆浜哄憳" prop="personnel">
+            <el-input v-model="form.personnel" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="杩涘叆鍘熷洜" prop="reason">
+            <el-input v-model="form.reason" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="闄悓浜哄憳" prop="accompanyingId">
+            <el-select v-model="form.accompanyingId" clearable filterable
+                       placeholder="璇烽�夋嫨闄悓浜哄憳" size="small">
+              <el-option v-for="(item,i) in personList" :key="i" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鎵瑰噯浜虹鍚�" prop="approveId">
+            <el-select v-model="form.approveId" clearable filterable
+                       placeholder="璇烽�夋嫨鎵瑰噯浜�" size="small">
+              <el-option v-for="(item,i) in personList" :key="i" :label="item.label" :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="淇濆瘑鍙婂叾瀹冩儏鍐�" prop="confidentiality">
+            <el-input v-model="form.confidentiality" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="澶囨敞" prop="remark">
+            <el-input v-model="form.remark" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeThreeWastesDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Personnel-management-dia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        registerDate: '',
+        area: '',
+        personnel: '',
+        reason: '',
+        accompanyingId: '',
+        accompanyingName: '',
+        approveId: '',
+        approveName: '',
+        confidentiality: '',
+        remark: '',
+      },
+      rules: {
+        registerDate: [{required: true, message: '璇烽�夋嫨鏃ユ湡',trigger: 'change'}],
+        area: [{required: true, message: '璇峰~鍐欒繘鍏ュ尯鍩�',trigger: 'blur'}],
+        personnel: [{required: true, message: '璇峰~鍐欒繘鍏ヤ汉鍛�',trigger: 'blur'}],
+        reason: [{required: true, message: '璇峰~鍐欒繘鍏ュ師鍥�',trigger: 'blur'}],
+        accompanyingId: [{required: true, message: '璇烽�夋嫨闄悓浜哄憳',trigger: 'change'}],
+        approveId: [{required: true, message: '璇烽�夋嫨鎵瑰噯浜�',trigger: 'change'}],
+        confidentiality: [{required: true, message: '璇峰~鍐欎繚瀵嗗強鍏朵粬鎯呭喌',trigger: 'blur'}],
+        remark: [{required: false, message: '璇峰~鍐欏娉�',trigger: 'blur'}],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia (type, row) {
+      this.getAuthorizedPerson()
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      } else {
+        this.form.accompanyingId = JSON.parse(localStorage.getItem("user")).userId
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo (row) {
+      this.diaLoading = true
+      this.$axios(this.$api.foreignRegister.getForeignRegisterOne + '?registerId=' + row.registerId).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit () {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalImplementDto = this.HaveJson(this.form)
+          const index = this.personList.findIndex(item => item.value === internalImplementDto.accompanyingId)
+          if (index > -1) {
+            internalImplementDto.accompanyingName = this.personList[index].label
+          }
+          const index1 = this.personList.findIndex(item => item.value === internalImplementDto.approveId)
+          if (index1 > -1) {
+            internalImplementDto.approveName = this.personList[index].label
+          }
+          if (this.operationType === 'add') {
+            this.$axios.post(this.$api.foreignRegister.addForeignRegister, internalImplementDto, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeThreeWastesDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            this.$axios.post(this.$api.foreignRegister.updateForeignRegister, internalImplementDto, {
+              headers: {
+                "Content-Type": "application/json"
+              },
+              noQs: true
+            }).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeThreeWastesDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    closeThreeWastesDia () {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeThreeWastesDia')
+    },
+    getAuthorizedPerson() {
+      this.$axios.get(this.$api.user.getUserMenu).then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management.vue
new file mode 100644
index 0000000..b15fbc2
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/Personnel-management.vue
@@ -0,0 +1,261 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鏃ユ湡锛�</span>
+        <el-date-picker v-model="searchForm.registerDate"
+                        clearable
+                        format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡"
+                        size="small"
+                        style="width: 100%"
+                        type="date"
+                        value-format="yyyy-MM-dd">
+            </el-date-picker>
+        <el-button size="medium"  style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" @click="handleDown">瀵� 鍑�</el-button>
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <ZTTable
+        :column="tableColumn"
+        :height="'calc(100vh - 20em)'"
+        :table-data="tableData"
+        :table-loading="tableLoading"
+        style="padding: 0 10px;margin-bottom: 16px">
+      </ZTTable>
+      <el-pagination :current-page="1" :page-size="page.size" :page-sizes="[10, 20, 30, 50, 100]"
+                     :total="total" layout="->,total, sizes, prev, pager, next, jumper"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <personnel-management-dia v-if="threeWastesDia" ref="threeWastesDia" @closeThreeWastesDia="closeThreeWastesDia"></personnel-management-dia>
+  </div>
+</template>
+
+<script>
+// import ZTTable from '../../caorui/ZTTable/index.vue';
+// import PersonnelManagementDia from './Personnel-management-dia.vue';
+import PersonnelManagementDia from '../component/Personnel-management-dia.vue';
+
+export default {
+  name: 'Personnel-management',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { PersonnelManagementDia},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        registerDate: '',
+      },
+      tableColumn: [
+        {
+          label: '鏃ユ湡',
+          prop: 'registerDate',
+          minWidth: '100'
+        },
+        {
+          label: '杩涘叆鍖哄煙',
+          prop: 'area',
+          minWidth: '100'
+        },
+        {
+          label: '杩涘叆浜哄憳',
+          prop: 'personnel',
+          minWidth: '100'
+        },
+        {
+          label: '杩涘叆鍘熷洜',
+          prop: 'reason',
+          minWidth: '100'
+        },
+        {
+          label: '闄悓浜哄憳',
+          prop: 'accompanyingName',
+          minWidth: '100'
+        },
+        {
+          label: '鎵瑰噯浜虹鍚�',
+          prop: 'approveName',
+          minWidth: '100'
+        },
+        {
+          label: '淇濆瘑鍙婂叾浠栨儏鍐�',
+          prop: 'confidentiality',
+          minWidth: '100'
+        },
+        {
+          label: '澶囨敞',
+          prop: 'remark',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          fixed: 'right',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+      },
+      total: 0,
+      threeWastesDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      this.$axios.post(this.$api.foreignRegister.pageForeignRegister, {entity, page}, {
+        headers: {
+          "Content-Type": "application/json"
+        },
+        noQs: true
+      }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鍒犻櫎
+    delPlan (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        this.$axios.get(this.$api.foreignRegister.delForeignRegister + '?registerId=' + row.registerId).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia (type, row) {
+      this.threeWastesDia = true
+      this.$nextTick(() => {
+        this.$refs.threeWastesDia.openDia(type, row)
+      })
+    },
+    // 瀵煎嚭
+    handleDown (row) {
+      const entity = this.searchForm
+      this.$axios.post(this.$api.foreignRegister.exportForeignRegister,{entity},{
+        responseType: "blob",
+        headers: {
+          "Content-Type": "application/json"
+        },
+        noQs: true}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '澶栨潵浜哄憳鐧昏' + '.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '澶栨潵浜哄憳鐧昏' + '.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    closeThreeWastesDia () {
+      this.threeWastesDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm () {
+      this.searchForm.registerDate = '';
+      this.searchList()
+    },
+    // 鍒嗛〉
+    handleSizeChange(val) {
+      this.page.size = val;
+      this.searchList();
+    },
+    handleCurrentChange(val) {
+      this.page.current = val;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions.vue
new file mode 100644
index 0000000..38db4fc
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions.vue
@@ -0,0 +1,51 @@
+<template>
+  <el-row>
+    <el-col :span="2">
+      <el-menu style="height: 100vh;" @select="clickSelect" :default-active="activeName">
+        <el-menu-item index="鐢垫簮绋冲畾鎬�">
+          <span slot="title">鐢垫簮绋冲畾鎬�</span>
+        </el-menu-item>
+        <el-menu-item index="闃查浄妫�娴�">
+          <span slot="title">闃查浄妫�娴�</span>
+        </el-menu-item>
+        <el-menu-item index="鐓у害璁板綍">
+          <span slot="title">鐓у害璁板綍</span>
+        </el-menu-item>
+        <el-menu-item index="娓╂箍搴﹁褰�">
+          <span slot="title">娓╂箍搴﹁褰�</span>
+        </el-menu-item>
+      </el-menu>
+    </el-col>
+    <el-col :span="22" style="padding: 10px">
+      <power-supply-stability v-if="activeName === '鐢垫簮绋冲畾鎬�'"/>
+      <lightning-protection-detection v-if="activeName === '闃查浄妫�娴�'" />
+      <illuminance-recording v-if="activeName === '鐓у害璁板綍'"/>
+      <temperature-humidity-record v-if="activeName === '娓╂箍搴﹁褰�'"/>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+// 鐢垫簮绋冲畾鎬�
+import PowerSupplyStability from "./facilities-environmental-conditions/power-supply-stability.vue";
+// 闃查浄妫�娴�
+import LightningProtectionDetection from "./facilities-environmental-conditions/lightning-protection-detection.vue";
+// 鐓у害璁板綍
+import IlluminanceRecording from "./facilities-environmental-conditions/illuminance-recording.vue";
+// 娓╂箍搴﹁褰�
+import TemperatureHumidityRecord from "./facilities-environmental-conditions/temperature-humidity-record.vue";
+
+export default {
+  components: {TemperatureHumidityRecord, IlluminanceRecording, LightningProtectionDetection, PowerSupplyStability},
+  data() {
+    return {
+      activeName: "鐢垫簮绋冲畾鎬�"
+    }
+  },
+  methods: {
+    clickSelect(index) {
+      this.activeName = index;
+    }
+  }
+}
+</script>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/illuminance-recording.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/illuminance-recording.vue
new file mode 100644
index 0000000..165feb1
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/illuminance-recording.vue
@@ -0,0 +1,414 @@
+<template>
+  <div>
+    <div class="header">
+      <div>鐓у害璁板綍</div>
+      <div>
+        <el-button size="small" type="primary" @click="clickAdd">鏂� 澧�</el-button>
+      </div>
+    </div>
+    <el-table
+      :data="tableData"
+      height="calc(100vh - 18em)"
+      style="width: 100%">
+      <el-table-column label="搴忓彿" type="index" width="120">
+        <template v-slot="scope">
+          <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="缁撹" min-width="180" prop="conclusion"></el-table-column>
+      <el-table-column label="娴嬭瘯鏃ユ湡" min-width="180" prop="testDate" width="testDate"></el-table-column>
+      <el-table-column label="妫�娴嬭��" min-width="180" prop="testerUser"></el-table-column>
+      <el-table-column label="鏍告煡浜�" min-width="180" prop="checkerUser"></el-table-column>
+      <el-table-column label="璁惧鍚嶇О" min-width="180" prop="deviceName"></el-table-column>
+      <el-table-column label="璁惧缂栧彿" min-width="180" prop="managementNumber"></el-table-column>
+      <el-table-column label="鏍″噯鏃ユ湡" min-width="180" prop="lastCalibrationDate"></el-table-column>
+      <el-table-column label="涓嬫鏍″噯鏃ユ湡" min-width="180" prop="nextCalibrationDate"></el-table-column>
+      <el-table-column label="鍒涘缓鏃堕棿" min-width="180" prop="createTime"></el-table-column>
+      <el-table-column fixed="right" label="鎿嶄綔" min-width="140">
+        <template v-slot="scope">
+          <el-button size="small" type="text" @click="downLoadPost(scope.row)">瀵煎嚭</el-button>
+          <el-button size="small" type="text" @click="edit(scope.row)">缂栬緫</el-button>
+          <el-button size="small" type="text" @click="deleteRowFun(scope.row)">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                   :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange">
+    </el-pagination>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="鏂板"
+      width="50%"
+      @open="openDialog">
+      <div style="height: 50vh; overflow-y: auto">
+        <el-form ref="form" :model="form" label-width="120px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曞湴鐐�', trigger: 'change' }]" label="娴嬭瘯鏃ユ湡"
+                            prop="testDate">
+                <el-date-picker
+                  v-model="form.testDate"
+                  format="yyyy-MM-dd"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  size="small"
+                  style="width: 100%"
+                  type="date"
+                  value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'change' }]" label="璁惧鍚嶇О"
+                            prop="deviceId">
+                <el-select v-model="form.deviceId"
+                           class="table_input"
+                           clearable
+                           filterable
+                           placeholder="璁惧鍚嶇О"
+                           size="small" @change="getCalibrationDateFun">
+                  <el-option v-for="item in equipOptions" :key="item.id"  :label="item.deviceName" :value="item.id">
+                    {{item.deviceName + item.managementNumber}}
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="璁惧缂栧彿">
+                <el-input v-model="form.managementNumber" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏈�杩戞牎鍑嗘棩鏈�">
+                <el-input v-model="form.lastCalibrationDate" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬫鏍″噯鏃ユ湡">
+                <el-input v-model="form.nextCalibrationDate" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬭��" prop="recipientUser">
+                <el-select v-model="form.testerId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏍告煡浜�" prop="recipientUser">
+                <el-select v-model="form.checkerId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="缁撹">
+                <el-input
+                  v-model="form.conclusion"
+                  :rows="2"
+                  placeholder="璇疯緭鍏ュ唴瀹�"
+                  type="textarea">
+                </el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <div>
+            <div style="display: flex; justify-content: flex-end; margin-bottom: 0.5em">
+              <el-button size="small" type="primary" @click="feMeasuredQuantityListAdd">鏂板</el-button>
+            </div>
+            <div>
+              <el-table
+                :data="form.illuminationDetectionAreaList"
+                height="40vh"
+                style="width: 100%; margin: auto">
+                <el-table-column label="搴忓彿" type="index" width="80"></el-table-column>
+                <el-table-column
+                  align="center"
+                  label="妫�娴嬪尯鍩熷悕绉�"
+                  min-width="180"
+                  prop="detectionAreaLabel">
+                  <template #default="{ row }">
+                    <el-input v-model="row.detectionAreaLabel" :rows="1" type="textarea"></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  label="妫�娴嬪��"
+                  min-width="300"
+                  prop="name">
+                  <template>
+                    <el-table-column align="center" label="绗竴娆�" min-width="100" prop="valueOne">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueOne" :rows="1" @blur="getAverage(row)"></el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="绗簩娆�" min-width="100" prop="valueTwo">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueTwo" :rows="1" @blur="getAverage(row)"></el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="绗笁娆�" min-width="100" prop="valueThree">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueThree" :rows="1" @blur="getAverage(row)"></el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="骞冲潎鍊�" min-width="100" prop="average">
+                      <template #default="{ row }">
+                        <el-input v-model="row.average" :rows="1"></el-input>
+                      </template>
+                    </el-table-column>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  label="澶囨敞"
+                  min-width="180"
+                  prop="detectionAreaLabel">
+                  <template #default="{ row }">
+                    <el-input v-model="row.remark" :rows="1" type="textarea"></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  fixed="right"
+                  label="鎿嶄綔"
+                  width="100">
+                  <template slot-scope="scope">
+                    <el-button size="small" type="text" @click="feMeasuredQuantityListDelete(scope.row, scope.$index)">
+                      鍒犻櫎
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+    <el-button type="primary" :loading="submitLoading" @click="addPowerSupplyStability">纭� 瀹�</el-button>
+  </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+      dialogVisible: false,
+      submitLoading: false,
+      form: {
+        testDate: '',
+        deviceId: '',
+        managementNumber: '',
+        lastCalibrationDate: '',
+        nextCalibrationDate: '',
+        testerId: '',
+        checkerId: '',
+        conclusion: '',
+        illuminationDetectionAreaList: []
+      },
+      cascaderList: [],
+      responsibleOptions: [],
+      equipOptions: [],
+    }
+  },
+  mounted() {
+    this.initData()
+  },
+  watch: {
+    dialogVisible(newVal) {
+      if (!newVal) {
+        this.form = {
+          deviceId: null,
+          illuminationDetectionAreaList: []
+        }
+      }
+    }
+  },
+  methods: {
+    getAverage(row) {
+      if (row.valueOne && row.valueTwo && row.valueThree) {
+        if (!isNaN(row.valueOne) && !isNaN(row.valueTwo) && !isNaN(row.valueThree)) {
+          const avg = Number(row.valueOne) + Number(row.valueTwo) + Number(row.valueThree)
+          console.log(avg)
+          row.average = Math.round(avg/3);
+        } else {
+          this.$message.warning("蹇呴』涓烘暟瀛楋紒")
+        }
+      }
+    },
+    edit(row) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getFeIlluminationDetectionArea + "?intensityIlluminationId=" + row.intensityIlluminationId).then(res => {
+        this.form = {...row}
+        this.form.illuminationDetectionAreaList = res.data;
+        this.dialogVisible = true
+      });
+    },
+    initData() {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getFeLightningProtection + '?size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    deleteRowFun(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteFeLightningProtection + '?intensityIlluminationId=' + row.intensityIlluminationId).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.initData()
+        })
+      })
+    },
+    feMeasuredQuantityListDelete(row, index) {
+      if (row.detectionAreaId) {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteFeIlluminationDetectionArea + '?detectionAreaId=' + row.detectionAreaId).then(res => {
+          if (res.code === 201) return
+          this.form.illuminationDetectionAreaList.splice(index, 1)
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+        })
+      } else {
+        this.form.illuminationDetectionAreaList.splice(index, 1)
+        this.$message.success('鍒犻櫎鎴愬姛锛�')
+      }
+    },
+    openDialog() {
+      this.$axios.get(this.$api.deviceScope.treeDevice).then(res => {
+        this.cascaderList = res.data;
+      });
+      this.$nextTick(() => {
+        this.$refs['form'].clearValidate()
+      })
+      this.getUserList()
+    },
+    clickAdd() {
+      this.dialogVisible = true
+      this.getEquipOptions()
+    },
+    // 鑾峰彇鎵�鏈夎澶�
+    getEquipOptions() {
+      this.equipOptions = []
+      this.$axios.get(this.$api.deviceScope.deviceScopeSearch+'?status=0').then(res => {
+        if (res.code === 200 && res.data) {
+          this.equipOptions = res.data
+        }
+      }).catch(error => {
+        console.error(error)
+      })
+    },
+    feMeasuredQuantityListAdd() {
+      const obj = {
+        detectionAreaLabel: null,
+        valueOne: null,
+        valueTwo: null,
+        valueThree: null,
+        average: null,
+        remark: null,
+      }
+      this.form.illuminationDetectionAreaList.push(obj)
+    },
+    addPowerSupplyStability() {
+      this.submitLoading = true
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.$axios.post(this.$api.facilitiesAndEnvironment.addFeLightningProtection, this.form, {
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          }).then(res => {
+            this.submitLoading = false
+            if (res.code === 200) {
+              this.initData()
+              this.dialogVisible = false
+            }
+          }).catch(error => {
+            this.submitLoading = false
+          })
+        }
+      });
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+    getCalibrationDateFun(val) {
+      const index = this.equipOptions.findIndex(item => item.id === val)
+      if (index > -1) {
+        this.form.managementNumber = this.equipOptions[index].managementNumber
+        this.form.lastCalibrationDate = this.equipOptions[index].lastCalibrationDate
+        this.form.nextCalibrationDate = this.equipOptions[index].nextCalibrationDate
+      }
+    },
+    // 瀵煎嚭
+    downLoadPost(row) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.exportFeIllumination + '?intensityIlluminationId=' + row.intensityIlluminationId,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '鐓у害璁板綍' + '.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '鐓у害璁板綍' + '.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+  }
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/lightning-protection-detection.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/lightning-protection-detection.vue
new file mode 100644
index 0000000..57a7704
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/lightning-protection-detection.vue
@@ -0,0 +1,288 @@
+<template>
+  <div>
+    <div class="header">
+      <div>闃查浄妫�娴�</div>
+      <div>
+        <el-button size="small" type="primary" @click="clickAdd">瀵� 鍏�</el-button>
+        <el-button size="small" type="primary" @click="downLoadPost">瀵� 鍑�</el-button>
+      </div>
+    </div>
+    <el-table
+      :data="tableData"
+      height="calc(100vh - 18em)"
+      style="width: 100%">
+      <el-table-column label="搴忓彿" type="index" width="120">
+        <template v-slot="scope">
+          <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="鍘熸枃浠跺悕"
+        min-width="180"
+        prop="fileName">
+      </el-table-column>
+      <el-table-column
+        label="妫�娴嬫棩鏈�"
+        min-width="180"
+        prop="detectionDate">
+      </el-table-column>
+      <el-table-column
+        label="鏈夋晥鏈�"
+        min-width="180"
+        prop="termValidity">
+      </el-table-column>
+      <el-table-column
+        label="妫�娴嬪崟浣�"
+        min-width="180"
+        prop="detectionUnit">
+      </el-table-column>
+      <el-table-column fixed="right" label="鎿嶄綔" min-width="100">
+        <template v-slot="scope">
+          <el-button size="small" type="text" @click="edit(scope.row)">缂栬緫</el-button>
+          <el-button size="small" type="text" @click="deleteRowFun(scope.row)">鍒犻櫎</el-button>
+          <el-button size="small" type="text" @click="download(scope.row)">涓嬭浇</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                   :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange">
+    </el-pagination>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="鏂� 澧�"
+      width="50%">
+      <div style="height: 50vh;">
+        <el-form ref="form" :model="form" label-width="80px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曞湴鐐�', trigger: 'blur' }]" label="妫�娴嬫棩鏈�"
+                            prop="detectionDate">
+                <el-date-picker
+                  v-model="form.detectionDate"
+                  format="yyyy-MM-dd"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  size="small"
+                  style="width: 100%"
+                  type="date"
+                  value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曞湴鐐�', trigger: 'blur' }]" label="鏈夋晥鏈�"
+                            prop="termValidity">
+                <el-date-picker
+                  v-model="form.termValidity"
+                  format="yyyy-MM-dd"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  size="small"
+                  style="width: 100%"
+                  type="date"
+                  value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曞湴鐐�', trigger: 'blur' }]" label="妫�娴嬪崟浣�"
+                            prop="detectionUnit">
+                <el-input v-model="form.detectionUnit" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣�" >
+                <el-upload
+                  :file-list="form.fileList"
+                  :http-request="httpRequest"
+                  :limit="1"
+                  :on-exceed="handleExceed"
+                  :on-remove="handleRemove"
+                  action="#"
+                  class="upload-demo"
+                  drag
+                  multiple>
+                  <i class="el-icon-upload"></i>
+                  <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+                </el-upload>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+    <el-button type="primary" @click="addImport">纭� 瀹�</el-button>
+  </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+export default {
+  data() {
+    return {
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+      dialogVisible: false,
+      form: {
+        fileList: [],
+        fileData: []
+      },
+    }
+  },
+  mounted() {
+    this.initData()
+  },
+  watch: {
+    dialogVisible(newVal) {
+      if (!newVal) {
+        this.form = {
+          fileList: [],
+          fileData: []
+        }
+      }
+    }
+  },
+  methods: {
+    // 瀵煎嚭
+    downLoadPost() {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.exportOfLightningProtectionDetection,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '闃查浄妫�娴嬪鍑�' + '.xlsx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '闃查浄妫�娴嬪鍑�' + '.xlsx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    initData() {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getLightningProtectionDetection + '?size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    clickAdd() {
+      this.dialogVisible = true
+    },
+    // 鏂囦欢鏁伴噺杩囧鏃舵彁閱�
+    handleExceed() {
+      this.$message({type: 'error', message: '鏈�澶氭敮鎸�1涓檮浠朵笂浼�'})
+    },
+    // 瑕嗙洊榛樿鐨勪笂浼犺涓猴紝鍙互鑷畾涔変笂浼犵殑瀹炵幇锛屽皢涓婁紶鐨勬枃浠朵緷娆℃坊鍔犲埌fileList鏁扮粍涓�,鏀寔澶氫釜鏂囦欢
+    httpRequest(option) {
+      this.form.fileData.push(option)
+    },
+    addImport() {
+      console.log(this.form)
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          let params = new FormData()
+          if (this.form.lightningProtectionId) {
+            params.append("lightningProtectionId", this.form.lightningProtectionId)
+          }
+          params.append("termValidity", this.form.termValidity)
+          params.append("detectionUnit", this.form.detectionUnit)
+          params.append("detectionDate", this.form.detectionDate)
+          if (this.form.fileData.length > 0) {
+            params.append("file", this.form.fileData[0].file)
+          }
+          this.$axios.post(this.$api.facilitiesAndEnvironment.addLightningProtectionDetection, params, {
+            headers: {'Content-Type': 'multipart/form-data;'},
+            noQs: true
+          }).then(res => {
+            if (res.code === 201) return;
+            this.dialogVisible = false
+            this.initData()
+          });
+        }
+      });
+    },
+    edit(row) {
+      this.dialogVisible = true
+      this.form = {...row}
+      this.form.fileList = []
+      this.form.fileData = []
+      this.form.fileList.push({name: row.systemFileName, url: "123434"})
+      console.log(this.form)
+    },
+    deleteRowFun(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteLightningProtectionDetection + '?lightningProtectionId=' + row.lightningProtectionId).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.initData()
+        })
+      })
+    },
+    handleRemove(file) {
+      this.$axios.delete(this.$api.personnel.deleteCNASFile + "?fileName=" + file.name).then(res => {
+        if (res.code === 201) return;
+        this.$message.success('鍒犻櫎鎴愬姛锛�')
+        let index = this.form.fileList.indexOf(fileName)
+        if (index != -1) {
+          this.successFileList.splice(index, 1)
+        }
+      })
+    },
+    download(row) {
+      let url = '';
+
+      // fileDownload.downloadIamge(url, row.fileName)
+      url = this.javaApi + 'img/' + row.systemFileName
+      const link = document.createElement('a');
+      link.href = url;
+      link.download = row.fileName;
+      link.click();
+    }
+  }
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/power-supply-stability.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/power-supply-stability.vue
new file mode 100644
index 0000000..0cd9c6d
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/power-supply-stability.vue
@@ -0,0 +1,403 @@
+<template>
+  <div>
+    <div class="header">
+      <div>鐢垫簮绋冲畾鎬�</div>
+      <div>
+        <el-button size="small" type="primary" @click="openAddDia">鏂� 澧�</el-button>
+      </div>
+    </div>
+    <el-table
+      :data="tableData"
+      height="calc(100vh - 18em)"
+      style="width: 100%">
+      <el-table-column label="搴忓彿" type="index" width="120">
+        <template v-slot="scope">
+          <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="娴嬭瘯鍦扮偣" min-width="180" prop="testLocation"></el-table-column>
+      <el-table-column label="娴嬭瘯鏃ユ湡" min-width="180" prop="testDate" width="testDate"></el-table-column>
+      <el-table-column label="缁撹" min-width="180" prop="conclusion"></el-table-column>
+      <el-table-column label="妫�娴嬭��" min-width="180" prop="testerUser"></el-table-column>
+      <el-table-column label="鏍告煡浜�" min-width="180" prop="checkerUser"></el-table-column>
+      <el-table-column label="璁惧鍚嶇О" min-width="180" prop="deviceName"></el-table-column>
+      <el-table-column label="璁惧缂栧彿" min-width="180" prop="managementNumber"></el-table-column>
+      <el-table-column label="鏍″噯鏃ユ湡" min-width="180" prop="lastCalibrationDate"></el-table-column>
+      <el-table-column label="涓嬫鏍″噯鏃ユ湡" min-width="180" prop="nextCalibrationDate"></el-table-column>
+      <el-table-column label="鍒涘缓鏃堕棿" min-width="180" prop="createTime"></el-table-column>
+      <el-table-column fixed="right" label="鎿嶄綔" min-width="140">
+        <template v-slot="scope">
+          <el-button size="small" type="text" @click="downLoadPost(scope.row)">瀵煎嚭</el-button>
+          <el-button size="small" type="text" @click="edit(scope.row)">缂栬緫</el-button>
+          <el-button size="small" type="text" @click="deleteRowFun(scope.row)">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                   :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                   @size-change="handleSizeChange"
+                   @current-change="handleCurrentChange">
+    </el-pagination>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="鏂板"
+      width="50%"
+      @open="openDialog">
+      <div style="height: 50vh; overflow-y: auto">
+        <el-form ref="form" :model="form" label-width="120px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曞湴鐐�', trigger: 'blur' }]" label="娴嬭瘯鍦扮偣"
+                            prop="testLocation">
+                <el-input v-model="form.testLocation" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ祴璇曟棩鏈�', trigger: 'change' }]" label="娴嬭瘯鏃ユ湡"
+                            prop="testDate">
+                <el-date-picker
+                  v-model="form.testDate"
+                  format="yyyy-MM-dd"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  size="small"
+                  style="width: 100%"
+                  type="date"
+                  value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'change' }]" label="璁惧鍚嶇О"
+                            prop="deviceId">
+                <el-select v-model="form.deviceId"
+                           class="table_input"
+                           clearable
+                           filterable
+                           placeholder="璁惧鍚嶇О"
+                           size="small" @change="getCalibrationDateFun">
+                  <el-option v-for="item in equipOptions" :key="item.id"  :label="item.deviceName" :value="item.id">
+                    {{item.deviceName + item.managementNumber}}
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="璁惧缂栧彿">
+                <el-input v-model="form.managementNumber" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏈�杩戞牎鍑嗘棩鏈�">
+                <el-input v-model="form.lastCalibrationDate" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬫鏍″噯鏃ユ湡">
+                <el-input v-model="form.nextCalibrationDate" disabled size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬭��" prop="recipientUser">
+                <el-select v-model="form.testerId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏍告煡浜�" prop="recipientUser">
+                <el-select v-model="form.checkerId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="缁撹">
+                <el-input
+                  v-model="form.conclusion"
+                  :rows="2"
+                  placeholder="璇疯緭鍏ュ唴瀹�"
+                  type="textarea">
+                </el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <div>
+            <div style="display: flex; justify-content: flex-end; margin-bottom: 0.5em">
+              <el-button size="small" type="primary" @click="feMeasuredQuantityListAdd">鏂板</el-button>
+            </div>
+            <div>
+              <el-table
+                :data="form.feMeasuredQuantityList"
+                height="40vh"
+                style="width: 100%; margin: auto">
+                <el-table-column label="搴忓彿" type="index" width="80"></el-table-column>
+                <el-table-column
+                  align="center"
+                  label="娴嬪畾閲忓悕绉�"
+                  min-width="180"
+                  prop="measuredQuantityLabel">
+                  <template #default="{ row }">
+                    <el-input v-model="row.measuredQuantityLabel" :rows="1" type="textarea"></el-input>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  label="鍊�"
+                  min-width="300"
+                  prop="name">
+                  <template>
+                    <el-table-column align="center" label="A" min-width="100" prop="valueA">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueA" :rows="1"></el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="B" min-width="100" prop="valueB">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueB" :rows="1"></el-input>
+                      </template>
+                    </el-table-column>
+                    <el-table-column align="center" label="C" min-width="100" prop="valueC">
+                      <template #default="{ row }">
+                        <el-input v-model="row.valueC" :rows="1"></el-input>
+                      </template>
+                    </el-table-column>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  fixed="right"
+                  label="鎿嶄綔"
+                  width="100">
+                  <template slot-scope="scope">
+                    <el-button size="small" type="text" @click="feMeasuredQuantityListDelete(scope.row, scope.$index)">
+                      鍒犻櫎
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" :loading="submitLoading" @click="addPowerSupplyStability">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+      dialogVisible: false,
+      submitLoading: false,
+      form: {
+        testLocation: '',
+        testDate: '',
+        deviceId: '',
+        managementNumber: '',
+        lastCalibrationDate: '',
+        nextCalibrationDate: '',
+        testerId: '',
+        checkerId: '',
+        conclusion: '',
+        feMeasuredQuantityList: []
+      },
+      equipOptions: [],
+      cascaderList: [],
+      responsibleOptions: []
+    }
+  },
+  mounted() {
+    this.initData()
+  },
+  watch: {
+    dialogVisible(newVal) {
+      if (!newVal) {
+        this.form = {
+          deviceId: null,
+          feMeasuredQuantityList: []
+        }
+      }
+    }
+  },
+  methods: {
+    // 鍒濆鍖栬皟鐢�
+    initData() {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getLaboratoryFacilityPowerStablePage + '?size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    // 鐢垫簮绋冲畾鎬� 琛ㄦ牸涓殑琛屽垹闄ゆ寜閽�
+    deleteRowFun(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteLaboratoryFacilityPowerStable + '?powerStableId=' + row.powerStableId).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.initData()
+        })
+      })
+    },
+    openAddDia () {
+      this.dialogVisible = true
+      this.getEquipOptions()
+    },
+    // 鑾峰彇鎵�鏈夎澶�
+    getEquipOptions() {
+      this.equipOptions = []
+      this.$axios.get(this.$api.deviceScope.deviceScopeSearch+'?status=0').then(res => {
+        if (res.code === 200 && res.data) {
+          this.equipOptions = res.data
+        }
+      }).catch(error => {
+        console.error(error)
+      })
+    },
+    // 鐢垫簮绋冲畾鎬�-鎵撳紑寮规璋冪敤璁惧鎺ュ彛锛屾煡璇娇鐢ㄧ殑璁惧
+    openDialog() {
+      this.$axios.get(this.$api.deviceScope.treeDevice).then(res => {
+        this.cascaderList = res.data;
+      });
+      this.$nextTick(() => {
+        this.$refs['form'].clearValidate()
+      })
+      this.getUserList()
+    },
+    //
+    getCalibrationDateFun(val) {
+      const index = this.equipOptions.findIndex(item => item.id === val)
+      if (index > -1) {
+        this.form.managementNumber = this.equipOptions[index].managementNumber
+        this.form.lastCalibrationDate = this.equipOptions[index].lastCalibrationDate
+        this.form.nextCalibrationDate = this.equipOptions[index].nextCalibrationDate
+      }
+    },
+    // 鐢垫簮绋冲畾鎬�-娴嬪畾閲忓脊妗嗕腑琛ㄦ牸鐨勫垹闄よ
+    feMeasuredQuantityListDelete(row, index) {
+      if (row.measuredQuantityId) {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteFeMeasuredQuantity + '?measuredQuantityId=' + row.measuredQuantityId).then(res => {
+          if (res.code === 201) return
+          this.form.feMeasuredQuantityList.splice(index, 1)
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+        })
+      } else {
+        this.form.feMeasuredQuantityList.splice(index, 1)
+        this.$message.success('鍒犻櫎鎴愬姛锛�')
+      }
+    },
+    // 鐢垫簮绋冲畾鎬�-娴嬪畾閲忚〃鏍兼柊澧炶
+    feMeasuredQuantityListAdd() {
+      const obj = {
+        measuredQuantityLabel: null,
+        valueA: null,
+        valueB: null,
+        valueC: null,
+      }
+      this.form.feMeasuredQuantityList.push(obj)
+    },
+    // 鐢垫簮绋冲畾鎬� 鏂板
+    addPowerSupplyStability() {
+      this.submitLoading = true
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.$axios.post(this.$api.facilitiesAndEnvironment.addLaboratoryFacilityPowerStable, this.form, {
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          }).then(res => {
+            this.submitLoading = false
+            if (res.code === 200) {
+              this.initData()
+              this.dialogVisible = false
+            }
+          }).catch(error => {
+            this.submitLoading = false
+          })
+        }
+      });
+    },
+    // 瀵煎嚭
+    downLoadPost(row) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.exportFePowerStable + '?powerStableId=' + row.powerStableId,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '鐢垫簮绋冲畾鎬�' + '.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '鐢垫簮绋冲畾鎬�' + '.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    // 鐢垫簮绋冲畾鎬� 鐐瑰嚮琛岀紪杈戣Е鍙�
+    edit(row) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getFeMeasuredQuantityService + "?powerStableId=" + row.powerStableId).then(res => {
+        this.form = {...row}
+        this.form.feMeasuredQuantityList = res.data;
+        this.dialogVisible = true
+      });
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+  }
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/temperature-humidity-record.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/temperature-humidity-record.vue
new file mode 100644
index 0000000..f848a42
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/facilities-environmental-conditions/temperature-humidity-record.vue
@@ -0,0 +1,483 @@
+<template>
+  <div>
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <div class="header">
+          <div>璇曢獙鍖哄煙</div>
+          <div>
+            鍚嶇О锛�
+            <el-input v-model="search.testAreaName" clearable size="small" style="width: 120px"></el-input>
+            <el-button size="small" type="primary" @click="initData">鏌ヨ</el-button>
+            <el-button size="small" type="primary" @click="clickAdd">鏂� 澧�</el-button>
+          </div>
+        </div>
+        <el-table
+            :data="tableData"
+            height="calc(100vh - 18em)"
+            highlight-current-row
+            style="width: 100%"
+            @row-click="clickRow">
+          <el-table-column label="搴忓彿" type="index" width="60" align="center"></el-table-column>
+          <el-table-column label="鏈堝害鏃堕棿" min-width="180" prop="monthDate"></el-table-column>
+          <el-table-column label="璇曢獙鍖哄煙鍚嶇О" min-width="180" prop="testAreaName"></el-table-column>
+          <el-table-column label="纭鐘舵��" min-width="180" prop="isAffirm">
+            <template slot-scope="scope">
+              <el-tag type="danger" v-if="scope.row.isAffirm == 0">鏈‘璁�</el-tag>
+              <el-tag type="success" v-if="scope.row.isAffirm == 1">宸茬‘璁�</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="澧炶ˉ淇℃伅" min-width="180" prop="subjoin"></el-table-column>
+          <el-table-column fixed="right" label="鎿嶄綔" min-width="180" align="center">
+            <template v-slot="scope">
+              <el-button size="small" type="text" @click="downLoadPost(scope.row)">瀵煎嚭</el-button>
+              <el-button size="small" type="text" @click="edit(scope.row)">缂栬緫</el-button>
+              <el-button :disabled="scope.row.isAffirm === '1'" size="small" type="text" @click="openApprovalDialog(scope.row)">纭</el-button>
+              <el-button size="small" type="text" @click="deleteRowFun(scope.row)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+                       :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
+                       @size-change="handleSizeChange"
+                       @current-change="handleCurrentChange">
+        </el-pagination>
+      </el-col>
+      <el-col :span="12">
+        <div class="header">
+          <div>娓╂箍搴﹁褰曪細{{ saveRow.monthDate }}</div>
+          <div>
+            <el-button v-if="saveRow.monthDate" size="small" type="primary" @click="dialogVisible1 = true">鏂� 澧�</el-button>
+          </div>
+        </div>
+        <el-table
+            :data="tableData1"
+            height="calc(100vh - 18em)"
+            style="width: 100%">
+          <el-table-column label="搴忓彿" type="index" width="60" align="center"></el-table-column>
+          <el-table-column label="鏃ユ湡" min-width="100" prop="recordDate"></el-table-column>
+          <el-table-column align="center" label="涓婂崍" min-width="200">
+            <template>
+              <el-table-column label="鏃堕棿" min-width="110" prop="morningTestTime" show-overflow-tooltip></el-table-column>
+              <el-table-column label="娓╁害" min-width="80" prop="morningTemp" show-overflow-tooltip></el-table-column>
+              <el-table-column label="婀垮害" min-width="80" prop="morningHum" show-overflow-tooltip></el-table-column>
+            </template>
+          </el-table-column>
+          <el-table-column label="璁板綍鍛�" min-width="100" prop="morningRecorderUser"></el-table-column>
+          <el-table-column align="center" label="涓嬪崍" min-width="200">
+            <template>
+              <el-table-column label="鏃堕棿" min-width="110" prop="afternoonTime" show-overflow-tooltip></el-table-column>
+              <el-table-column label="娓╁害" min-width="80" prop="afternoonTemp" show-overflow-tooltip></el-table-column>
+              <el-table-column label="婀垮害" min-width="80" prop="afternoonHum" show-overflow-tooltip></el-table-column>
+            </template>
+          </el-table-column>
+          <el-table-column label="璁板綍鍛�" min-width="100" prop="afternoonRecorderUser"></el-table-column>
+          <el-table-column label="澶囨敞" min-width="100" prop="note" show-overflow-tooltip></el-table-column>
+          <el-table-column fixed="right" label="鎿嶄綔" min-width="100">
+            <template v-slot="scope">
+              <el-button size="small" type="text" @click="edit1(scope.row)">缂栬緫</el-button>
+              <el-button size="small" type="text" @click="deleteRowFun1(scope.row)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination :current-page="1" :page-size="search1.size" :page-sizes="[10, 20, 30, 50, 100]"
+                       :total="search1.total" layout="->,total, sizes, prev, pager, next, jumper"
+                       @size-change="handleSizeChange1"
+                       @current-change="handleCurrentChange1">
+        </el-pagination>
+      </el-col>
+    </el-row>
+    <el-dialog
+        :visible.sync="dialogVisible"
+        title="鎻愮ず"
+        width="50%">
+      <div style="height: 20vh;">
+        <el-form ref="form" :model="form" label-width="80px">
+          <el-row>
+            <el-col :span="24">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ユ湀搴︽椂闂�', trigger: 'blur' }]" label="鏈堝害鏃堕棿"
+                            prop="monthDate">
+                <el-date-picker
+                    v-model="form.monthDate"
+                    format="yyyy-MM"
+                    placeholder="閫夋嫨鏈堜唤"
+                    size="small"
+                    style="width: 100%"
+                    type="month"
+                    value-format="yyyy-MM">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item :rules="[{ required: true, message: '璇疯緭鍏ヨ瘯楠屽尯鍩�', trigger: 'blur' }]" label="璇曢獙鍖哄煙"
+                            prop="testAreaName">
+                <el-input v-model="form.testAreaName"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+    <el-button type="primary" :loading="submitLoading" @click="addPowerSupplyStability">纭� 瀹�</el-button>
+  </span>
+    </el-dialog>
+    <el-dialog
+        :visible.sync="dialogVisible1"
+        title="鎻愮ず"
+        width="50%"
+        @open="openDialog">
+      <div style="height: 40vh;">
+        <el-form ref="form1" :model="form1" label-width="120px">
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="鏃ユ湡">
+                <el-date-picker
+                  v-model="form1.recordDate"
+                  format="yyyy-MM-dd"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  size="small"
+                  style="width: 50%"
+                  type="date"
+                  value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婂崍鏃堕棿">
+                <el-time-picker
+                  v-model="form1.morningTestTime"
+                  size="small"
+                  value-format="HH:mm:ss"
+                  format="HH:mm:ss"
+                  style="width: 100%"
+                  placeholder="璇烽�夋嫨鏃堕棿">
+                </el-time-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婂崍娓╁害">
+                <el-input v-model="form1.morningTemp" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婂崍婀垮害">
+                <el-input v-model="form1.morningHum" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓婂崍璁板綍鍛�">
+                <el-select v-model="form1.morningRecorderId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬪崍鏃堕棿">
+                <el-time-picker
+                  v-model="form1.afternoonTime"
+                  size="small"
+                  value-format="HH:mm:ss"
+                  format="HH:mm:ss"
+                  style="width: 100%"
+                  placeholder="璇烽�夋嫨鏃堕棿">
+                </el-time-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬪崍娓╁害">
+                <el-input v-model="form1.afternoonTemp" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬪崍婀垮害">
+                <el-input v-model="form1.afternoonHum" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嬪崍璁板綍鍛�">
+                <el-select v-model="form1.afternoonRecorderId" clearable filterable 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>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="澶囨敞">
+                <el-input
+                    v-model="form1.note"
+                    :rows="2"
+                    placeholder="璇疯緭鍏ュ唴瀹�"
+                    type="textarea">
+                </el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible1 = false">鍙� 娑�</el-button>
+    <el-button type="primary" :loading="submitLoading" @click="addPowerSupplyStability1">纭� 瀹�</el-button>
+  </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="纭" width="30%" @close="subjoin = ''">
+      <span>
+        澧炶ˉ淇℃伅锛�
+        <el-input v-model="subjoin" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="subjoin = '', approvalDialog = false">涓嶇‘璁�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval">纭� 璁�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      search: {
+        size: 20,
+        current: 1,
+        total: 0,
+        testAreaName: ''
+      },
+      search1: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      tableData: [],
+      tableData1: [],
+      dialogVisible: false,
+      submitLoading: false,
+      dialogVisible1: false,
+      form: {},
+      form1: {},
+      saveRow: {},
+      responsibleOptions: [],
+      approvalDialog: false,
+      approvalLoading: false,
+      subjoin: '',
+      approvalRow: {},
+    }
+  },
+  mounted() {
+    this.initData()
+  },
+  watch: {
+    dialogVisible(newVal) {
+      if (!newVal) {
+        this.form = {
+        }
+      }
+    },
+    dialogVisible1(newVal) {
+      if (!newVal) {
+        this.form1 = {
+        }
+      }
+    }
+  },
+  methods: {
+    openApprovalDialog (row) {
+      this.approvalDialog = true
+      this.approvalRow = row
+    },
+    handleApproval () {
+      this.approvalLoading = true
+      const params = {
+        dateId: this.approvalRow.dateId,
+        subjoin: this.subjoin,
+      }
+      this.$axios.post(this.$api.facilitiesAndEnvironment.affirmFeTempHumDate, params, {
+        headers: {
+          'Content-Type': 'application/json'
+        },
+        noQs: true
+      }).then(res => {
+        this.approvalLoading = false
+        if (res.code === 200) {
+          this.$message.success('纭鎴愬姛锛�')
+          this.approvalDialog = false
+          this.initData()
+        }
+      }).catch(err => {
+        this.approvalDialog = false
+      })
+    },
+    openDialog() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+    addPowerSupplyStability() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.submitLoading = true
+          this.$axios.post(this.$api.facilitiesAndEnvironment.addFeTempHumDate, this.form, {
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          }).then(res => {
+            if (res.code === 200) {
+              this.$message.success('鏂板鎴愬姛!')
+              this.submitLoading = false
+              this.initData()
+              this.dialogVisible = false
+            }
+          }).catch(err => {
+            this.submitLoading = false
+          })
+        }
+      });
+    },
+    addPowerSupplyStability1() {
+      if (!this.saveRow) {
+        this.$message.warning("璇烽�夋嫨璇曢獙鍖哄煙锛�")
+        return
+      }
+      this.$refs.form1.validate((valid) => {
+        this.submitLoading = true
+        if (valid) {
+          this.form1.dateId = this.saveRow.dateId
+          this.$axios.post(this.$api.facilitiesAndEnvironment.addFeTempHumRecord, this.form1, {
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          }).then(res => {
+            if (res.code === 200) {
+              this.$message.success('鏂板鎴愬姛!')
+              this.submitLoading = false
+              this.initData1(this.saveRow.dateId)
+              this.dialogVisible1 = false
+            }
+          }).catch(err => {
+            this.submitLoading = false
+          })
+        }
+      });
+    },
+    clickRow(row) {
+      this.saveRow = row
+      this.initData1(row.dateId)
+    },
+    edit(row) {
+      this.form = {...row}
+      this.dialogVisible = true
+    },
+    deleteRowFun(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteFeTempHumDate + '?dateId=' + row.dateId).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.initData()
+        })
+      })
+    },
+    edit1(row) {
+      this.form1 = {...row}
+      this.dialogVisible1 = true
+    },
+    // 瀵煎嚭
+    downLoadPost(row) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.exportTemperatureAndHumidityRecords + '?dateId=' + row.dateId,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '娓╂箍搴﹁褰�' + '.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '娓╂箍搴﹁褰�' + '.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    deleteRowFun1(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.facilitiesAndEnvironment.deleteFeTempHumRecord + '?tempHumId=' + row.tempHumId).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.initData1(this.saveRow.dateId)
+        })
+      })
+    },
+    initData() {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getFeTempHumDate + '?size=' + this.search.size + '&current=' + this.search.current + '&testAreaName=' + this.search.testAreaName).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+        if (res.data.records.length === 0) {
+          this.tableData1 = []
+          this.saveRow.monthDate = ''
+        }
+      });
+    },
+    initData1(dateId) {
+      this.$axios.get(this.$api.facilitiesAndEnvironment.getFeTempHumRecordPage + '?size=' + this.search1.size + '&current=' + this.search1.current + '&dateId=' + dateId).then(res => {
+        if (res.code === 201) return;
+        this.tableData1 = res.data.records;
+        this.search1.total = res.data.total;
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.initData();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.initData();
+    },
+    handleSizeChange1(val) {
+      this.search1.size = val;
+      this.initData1();
+    },
+    handleCurrentChange1(val) {
+      this.search1.current = val;
+      this.initData1();
+    },
+    clickAdd() {
+      this.dialogVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped>
+.header {
+  height: 3em;
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-dialog.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-dialog.vue
new file mode 100644
index 0000000..510bbc2
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-dialog.vue
@@ -0,0 +1,189 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false"
+               :close-on-press-escape="false"
+               :visible.sync="formDia"
+               title="涓夊簾澶勭悊淇℃伅"
+               width="80%" @close="closeThreeWastesDia">
+      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
+        <el-col :span="24">
+          <el-form-item label="澶囨敞" prop="purposes">
+            <el-input v-model="form.remark" clearable size="small"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <div style="text-align: right;margin-bottom: 10px">
+        <el-button size="small" type="primary" @click="addRow">娣诲姞</el-button>
+        <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+      </div>
+      <el-table :data="wastesDetailList" border height="300" style="width: 100%">
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column header-align="center" label="鎺ユ敹浜�" prop="acceptor">
+          <template slot-scope="{row}">
+            <el-input v-model="row.acceptor" size="small"/>
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="鎺ユ敹鍗曚綅" prop="receivingUnit">
+          <template slot-scope="{row}">
+            <el-input v-model="row.receivingUnit" size="small"/>
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="鍚嶇О" prop="designation">
+          <template slot-scope="{row}">
+            <el-input v-model="row.designation" size="small"/>
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="绉讳氦浜�" prop="transferPeople" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.transferPeople" size="small"/>
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="浣撶Н" prop="volume" width="180">
+          <template slot-scope="{row}">
+            <el-input v-model="row.volume" size="small"/>
+          </template>
+        </el-table-column>
+        <el-table-column header-align="center" label="閫佸鐞嗘棩鏈�" prop="deliveryDate" width="180">
+          <template slot-scope="{row}">
+            <!-- <el-input v-model="row.deliveryDate" size="small"/> -->
+            <el-date-picker
+                value-format="yyyy-MM-dd"
+                style="width: 100%"
+                format="yyyy-MM-dd"
+                size="small"
+                v-model="row.deliveryDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeThreeWastesDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInternalWastesOne,
+  addInternalWastes,
+  updateInternalWastes
+} from '@/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes'
+
+export default {
+  name: 'three-wastes-dialog',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        remark: '',
+        wastesId: '',
+      },
+      rules: {
+        remark: [{required: false, message: '璇峰~鍐欏娉�',trigger: 'blur'}],
+      },
+      wastesDetailList: [],
+      operationType: '',
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia (type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo (row) {
+      this.diaLoading = true
+      getInternalWastesOne({wastesId: row.wastesId}).then(res => {
+        this.diaLoading = false
+        if (res.code === 200){
+          this.form = res.data
+          this.wastesDetailList = this.form.wastesDetailList
+        }
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit () {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.wastesDetailList.length === 0) {
+            this.$message.warning('璇锋坊鍔犺〃鏍兼暟鎹�')
+            return
+          }
+          this.loading = true
+          const internalImplementDto = this.HaveJson(this.form)
+          internalImplementDto.wastesDetailList = this.HaveJson(this.wastesDetailList)
+          if (this.operationType === 'add') {
+            addInternalWastes(internalImplementDto).then(res => {
+              this.loading = false
+              if (res.code === 200){
+                this.$message.success('鎿嶄綔鎴愬姛')
+                this.closeThreeWastesDia()
+              }
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            updateInternalWastes(internalImplementDto).then(res => {
+              this.loading = false
+              if (res.code === 200){
+                this.$message.success('鎿嶄綔鎴愬姛')
+                this.closeThreeWastesDia()
+              }
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 澧炲姞琛ㄦ牸琛屾暟鎹�
+    addRow () {
+      this.wastesDetailList.push({
+        acceptor: '',
+        receivingUnit: '',
+        designation: '',
+        transferPeople: '',
+        volume: '',
+        deliveryDate: '',
+      })
+    },
+    // 娓呯┖琛ㄦ牸鏁版嵁
+    clearTable () {
+      this.wastesDetailList = []
+    },
+    closeThreeWastesDia () {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeThreeWastesDia')
+    },
+  }
+};
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-treatment.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-treatment.vue
new file mode 100644
index 0000000..81ead8f
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/component/three-wastes-treatment.vue
@@ -0,0 +1,202 @@
+<template>
+  <div class="capacity-scope">
+    <div class="search">
+      <div>
+        <el-form :model="searchForm" ref="searchForm" size="small" :inline="true">
+          <el-form-item label="澶囨敞" prop="remark">
+              <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="searchForm.remark">
+              </el-input>
+          </el-form-item>
+          <el-form-item>
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="searchList">鏌� 璇�</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetSearchForm">閲� 缃�</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </div>
+
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="tableColumn" :height="'calc(100vh - 250px)'" @pagination="pagination"
+                  :page="page" :tableLoading="tableLoading"></lims-table>
+    </div>
+    <three-wastes-dialog v-if="threeWastesDia" ref="threeWastesDia" @closeThreeWastesDia="closeThreeWastesDia"></three-wastes-dialog>
+  </div>
+</template>
+
+<script>
+import ThreeWastesDialog from './three-wastes-dialog.vue';
+import limsTable from '@/components/Table/lims-table.vue'
+import {
+  pageInternalWastes,
+  removeStandardSubstance,
+  exportInternalWastes
+} from '@/api/cnas/resourceDemand/facilitiesEnvironment/internalWastes'
+export default {
+  name: 'a6-three-wastes-treatment',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {
+    ThreeWastesDialog,
+    limsTable
+  },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        remark: '',
+      },
+      tableColumn: [
+        {
+          label: '鍒涘缓鏃堕棿',
+          prop: 'createTime',
+          minWidth: '100'
+        },
+        {
+          label: '鍒涘缓浜�',
+          prop: 'createUserName',
+          minWidth: '100'
+        },
+        {
+          label: '澶囨敞',
+          prop: 'remark',
+          minWidth: '100'
+        },
+        {
+          label: '淇敼鏃堕棿',
+          prop: 'updateTime',
+          minWidth: '100'
+        },
+        {
+          label: '淇敼浜�',
+          prop: 'updateUserName',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          fixed: 'right',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        total: 0,
+        size: 10,
+        current: 1
+      },
+      total: 0,
+      threeWastesDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      this.tableLoading = true
+      pageInternalWastes({...this.page,...this.searchForm}).then(res => {
+        this.tableLoading = false
+        if (res.code === 200){
+          this.tableData = res.data.records
+          this.page.total = res.data.total
+        }
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鍒犻櫎
+    delPlan (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        removeStandardSubstance({wastesId:row.wastesId}).then(res => {
+          this.tableLoading = false
+          if (res.code === 200){
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.searchList()
+          }
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia (type, row) {
+      this.threeWastesDia = true
+      this.$nextTick(() => {
+        this.$refs.threeWastesDia.openDia(type, row)
+      })
+    },
+    // 瀵煎嚭
+    handleDown (row) {
+      exportInternalWastes({wastesId:row.wastesId}).then(res =>{
+        this.outLoading = false
+        const blob = new Blob([res],{ type: 'application/msword' });
+        this.$download.saveAs(blob, '涓夊簾澶勭悊瀵煎嚭.docx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    closeThreeWastesDia () {
+      this.threeWastesDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm () {
+      this.searchForm.remark = '';
+      this.searchList()
+    },
+    // 鍒嗛〉鍒囨崲
+    pagination(page) {
+      this.page.size = page.limit
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search {
+  height: 46px;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/facilitiesEnvironment/index.vue b/src/views/CNAS/resourceDemand/facilitiesEnvironment/index.vue
new file mode 100644
index 0000000..9705d3d
--- /dev/null
+++ b/src/views/CNAS/resourceDemand/facilitiesEnvironment/index.vue
@@ -0,0 +1,50 @@
+<template>
+    <div class="main">
+      <el-tabs v-model="activeName" :lazy="true" type="border-card">
+        <el-tab-pane label="璁炬柦鍜岀幆澧冩潯浠惰姹�" name="璁炬柦鍜岀幆澧冩潯浠惰姹�">
+          <FacilitiesEnvironmentalConditions v-if="activeName === '璁炬柦鍜岀幆澧冩潯浠惰姹�'"/>
+        </el-tab-pane>
+
+        <el-tab-pane label="涓夊簾澶勭悊" name="涓夊簾澶勭悊">
+          <a6-three-wastes-treatment v-if="activeName === '涓夊簾澶勭悊'"></a6-three-wastes-treatment>
+        </el-tab-pane>
+        <el-tab-pane label="杩涘嚭浜哄憳绠$悊" name="杩涘嚭浜哄憳绠$悊">
+          <personnel-management v-if="activeName === '杩涘嚭浜哄憳绠$悊'"></personnel-management>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </template>
+
+  <script>
+  import FacilitiesEnvironmentalConditions from "../facilitiesEnvironment/component/facilities-environmental-conditions.vue";
+//   // 澶栨潵浜哄憳绠$悊
+  import ExternalPersonnelManagement from "../facilitiesEnvironment/component/Personnel-management.vue";
+  import A6ThreeWastesTreatment from '../facilitiesEnvironment/component/three-wastes-treatment.vue';
+//   import PersonnelManagement from '../do/a6-facilities-environment/Personnel-management.vue';
+
+  export default {
+    components: {
+    //   PersonnelManagement,
+      A6ThreeWastesTreatment,
+      ExternalPersonnelManagement,
+      FacilitiesEnvironmentalConditions
+    },
+    data() {
+      return {
+        activeName: '璁炬柦鍜岀幆澧冩潯浠惰姹�',
+      }
+    }
+  }
+  </script>
+
+  <style scoped>
+  .main {
+    padding: 15px 0;
+    width: 100%;
+    border-radius: 15px;
+  }
+  v-deep .el-tabs--border-card>.el-tabs__content {
+    height: calc(100vh - 9em);
+    padding: 0;
+  }
+  </style>
diff --git a/src/views/CNAS/resourceDemand/standardMaterial/index.vue b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
index e75f44f..c23d9f9 100644
--- a/src/views/CNAS/resourceDemand/standardMaterial/index.vue
+++ b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
@@ -35,9 +35,6 @@
 
 <script>
 
-// import FormDia from '../do/a6-standard-material-list/formDia.vue';
-// import BorrowDia from '../do/a6-standard-material-list/borrowDia.vue';
-// import ReturnDia from '../do/a6-standard-material-list/returnDia.vue';
 import limsTable from '@/components/Table/lims-table.vue'
 import {
   getPageStandardSubstance,
@@ -121,11 +118,6 @@
           prop: 'remark',
           minWidth: '100'
         },
-        // {
-        //   label: '鍒涘缓浜�',
-        //   prop: 'createUser',
-        //   minWidth: '100'
-        // },
         {
           label: '鍒涘缓鏃堕棿',
           prop: 'createTime',
diff --git a/src/views/business/productSamplingInfo/components/addQuarterItem.vue b/src/views/business/productSamplingInfo/components/addQuarterItem.vue
new file mode 100644
index 0000000..765ed43
--- /dev/null
+++ b/src/views/business/productSamplingInfo/components/addQuarterItem.vue
@@ -0,0 +1,290 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="quarterSampleDia" title="瀛e害鎶芥牱" width="90%" @close="quarterSampleDia = false">
+      <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
+        <div style="width: 30%;display: flex;align-items: center;" >
+          <span style="width: 50px">缂栧彿锛�</span>
+          <el-input v-model="quarterSampleForm.quarterNo" :disabled="operationType !== 'add'" size="small"></el-input>
+        </div>
+        <div v-if="operationType === 'add'">
+          <el-button size="small" type="primary" @click="addQuarter">娣诲姞</el-button>
+          <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+        </div>
+      </div>
+      <div>
+        <el-table v-loading="tableLoading" :data="quarterItems" border height="400" style="width: 100%">
+          <el-table-column label="浜у搧绫诲瀷" prop="productType" width="200">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.productType" size="small"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="璐d换浜�" prop="dutyUser" width="100"></el-table-column>
+          <el-table-column label="鍨嬪彿" prop="productModel" width="120">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.productModel" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎶芥牱鏁伴噺" min-width="340" prop="spotCheckNumber">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.spotCheckNumber" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType === 'add'" label="鏁伴噺" min-width="120" prop="number">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.number" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="鎶芥牱鏃堕棿" prop="spotCheckTime" width="160">
+            <template slot-scope="{row}">
+              <template>
+                <el-date-picker v-model="row.spotCheckTime"
+                                format="yyyy-MM-dd"
+                                :disabled="operationType === 'view'"
+                                placeholder="閫夋嫨鏃ユ湡"
+                                size="small"
+                                clearable
+                                style="width:100%"
+                                type="date"
+                                value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="璇曟牱缁撹" prop="result" width="130">
+            <template v-slot="scope">
+              <el-select v-model="scope.row.result" placeholder="璇烽�夋嫨" size="small" clearable :disabled="operationType === 'view'">
+                <el-option label="鍚堟牸" value="鍚堟牸"></el-option>
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="鍙栨牱浜哄憳" prop="samplingUser" width="120">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.samplingUser" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="澶囨敞" prop="itemRemark" width="200">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.itemRemark" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'view'" fixed="right" label="鎿嶄綔" width="100">
+            <template slot-scope="scope">
+              <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div style="display: flex;align-items: center;margin: 10px 0">
+        <span style="width: 70px">澶囨敞锛�</span>
+        <el-input v-model="quarterSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 43%" type="textarea"></el-input>
+      </div>
+      <div v-if="operationType !== 'add'">
+        <el-form ref="form" :model="editForm" label-width="70px">
+          <el-col :span="12">
+            <el-form-item label="缂栧埗浜猴細">
+              <el-select v-model="editForm.writeUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浼氱浜猴細">
+              <el-select v-model="editForm.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳浜猴細">
+              <el-select v-model="editForm.examineUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵瑰噯浜猴細">
+              <el-select v-model="editForm.ratifyUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="quarterSampleDia = false">鍙� 娑�</el-button>
+        <el-button v-if="operationType === 'add'" @click="quarterSampleDia = false">淇� 瀛�</el-button>
+        <el-button v-if="operationType !== 'add' && operationType !== 'view'" type="primary" @click="handleSample">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addQuarter, getQuarter, updateQuarterOnOrder} from "@/api/business/productSamplingInfo";
+import {selectUserCondition} from "@/api/performance/class";
+
+export default {
+  name: "addQuarterItem",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      tableLoading: false,
+      quarterSampleDia: false, // 瀛e害鎶芥牱寮规
+      quarterSampleForm: {
+        quarterNo: '', // 缂栧彿
+      },
+      quarterItems: [],
+      quarterTemItems: [],
+      operationType: '',
+      editForm: {
+        quarterId: '',
+        writeUser: '', // 缂栧埗浜�
+        countersignUser: [], // 浼氱浜�
+        examineUser: '', // 瀹℃牳浜�
+        ratifyUser: '', // 鎵瑰噯浜�
+      },
+      userList: [],
+      quarterRow: {},
+    }
+  },
+  mounted() {
+    this.getUserList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia (quarterTemItems, type) {
+      this.quarterSampleDia = true
+      this.operationType = type
+      if (type === 'add') {
+        if (quarterTemItems.length > 0) {
+          this.quarterItems = quarterTemItems
+        }
+        this.quarterSampleForm.quarterNo = getCurrentMonthTwoDigits()
+      } else {
+        this.tableLoading = true
+        this.quarterRow = quarterTemItems
+        getQuarter({quarterId: quarterTemItems.quarterId}).then(res => {
+          this.tableLoading = false
+          if (res.code === 200) {
+            this.quarterItems = res.data.quarterItems
+            this.quarterSampleForm.quarterNo = res.data.quarterNo
+            this.quarterSampleForm.remark = res.data.remark
+            this.editForm.quarterId = res.data.quarterId
+            this.editForm.writeUser = res.data.writeUser
+            this.editForm.examineUser = res.data.examineUser
+            this.editForm.ratifyUser = res.data.ratifyUser
+            if (res.data.countersignUser) {
+              this.editForm.countersignUser = res.data.countersignUser.split(",").map(Number)
+            }
+          }
+        })
+      }
+    },
+    // 鎵嬪姩娣诲姞
+    addQuarter () {
+      this.quarterItems.push({
+        productType: '',
+        dutyUser: JSON.parse(localStorage.getItem("user")).name,
+        productModel: '',
+        spotCheckNumber: '',
+        number: '',
+        spotCheckTime: '',
+        result: '',
+        samplingUser: '',
+        itemRemark: '',
+      })
+    },
+    // 鎻愪氦瀛e害鎶芥牱
+    handleSample () {
+      this.$confirm('鏄惁鎻愪氦璇ユ暟鎹�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        if (this.operationType === 'add') {
+          this.quarterSampleForm.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
+          this.quarterSampleForm.quarterItems.forEach(item => {
+            item.spotCheckNumber = item.spotCheckNumber + ' ' + (item.number == null ? "" : item.number)
+          })
+          addQuarter(this.quarterSampleForm).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛')
+              this.quarterItems = []
+              this.$parent.quarterTemItems = []
+              this.closeQuarterSampleDia()
+            }
+          })
+        } else {
+          const params = {...this.editForm}
+          if (params.countersignUser.length > 0) {
+            params.countersignUser = params.countersignUser.join(',')
+          } else {
+            params.countersignUser = ''
+          }
+          params.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
+          updateQuarterOnOrder(params).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛')
+              this.quarterItems = []
+              this.closeQuarterSampleDia()
+            }
+          })
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑�'
+        });
+      });
+
+    },
+    // 娓呯┖鎶芥牱璁″垝
+    clearTable () {
+      this.quarterItems = []
+      this.$parent.quarterTemItems = []
+    },
+    // 鎵嬪姩鍒犻櫎
+    deleteScope (index) {
+      this.quarterItems.splice(index, 1)
+    },
+    // 鍏抽棴瀛e害鎶芥牱寮规
+    closeQuarterSampleDia () {
+      this.quarterSampleDia = false
+      if (this.operationType === 'add') {
+        this.$parent.handleStockList()
+      } else {
+        this.$parent.refreshTable()
+      }
+    },
+    getUserList(){
+      selectUserCondition({ type: 0 }).then((res) => {
+        this.userList = res.data;
+      })
+    },
+  },
+}
+function getCurrentMonthTwoDigits() {
+  const currentDate = new Date();
+  const year = currentDate.getFullYear();
+  const currentMonth = currentDate.getMonth() + 1;
+  return year + currentMonth.toString().padStart(2, '0');
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/business/productSamplingInfo/index.vue b/src/views/business/productSamplingInfo/index.vue
new file mode 100644
index 0000000..a7c2831
--- /dev/null
+++ b/src/views/business/productSamplingInfo/index.vue
@@ -0,0 +1,647 @@
+<template>
+  <div class="capacity-scope">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :model="entity" ref="entity" size="small" :inline="true">
+        <el-form-item label="缂栧彿" prop="quarterNo" v-show="tabIndex === 0">
+          <el-input v-model="entity.quarterNo" clearable placeholder="璇疯緭鍏�"
+                    size="small"
+                    @keyup.enter.native="refreshTable">
+          </el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="refreshTable">鏌� 璇�</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="refresh">閲� 缃�</el-button>
+        </el-form-item>
+      </el-form>
+      <div>
+        <el-button v-if="tabIndex === 1" size="small" type="primary" @click="yearSample('add')">骞村害鎶芥牱</el-button>
+      </div>
+    </div>
+    <div>
+      <div class="table">
+        <ul class="tab">
+          <li v-for="(m,i) in tabList" :key="i" :class="{active:i===tabIndex}" @click="handleTab(m,i)">{{m.label}}</li>
+        </ul>
+        <!--瀛e害-->
+        <lims-table :tableData="tableData" :column="column" v-if="tabIndex === 0"
+                    @pagination="pagination" :height="'calc(100vh - 290px)'"
+                    :page="page" :tableLoading="tableLoading"></lims-table>
+        <!--骞村害-->
+        <lims-table :tableData="tableData1" :column="column1" v-if="tabIndex === 1"
+                    @pagination="pagination1" :height="'calc(100vh - 290px)'"
+                    key="tableData1" :page="page1" :tableLoading="tableLoading1"></lims-table>
+      </div>
+    </div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="yearSampleDia" title="骞村害鎶芥牱" width="70%"
+               @close="closeYearSampleDia">
+      <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
+        <div style="width: 30%;display: flex;align-items: center;" >
+          <el-input v-if="operationType !=='view'" v-model="currentYear" size="small"/>
+          <span v-if="operationType ==='view'" style="width: 160px;font-size: 18px;font-weight: 600">{{currentYear}}</span>
+        </div>
+        <div  v-if="operationType !== 'view'">
+          <el-button size="small" type="primary" @click="addQuarter">娣诲姞</el-button>
+          <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+        </div>
+      </div>
+      <div>
+        <el-table :data="yearItems" border height="450" style="width: 100%">
+          <el-table-column label="绫诲埆" prop="yearType" width="240">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.yearType" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.yearType}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="1" prop="january" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.january" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.january}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="2" prop="february" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.february" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.february}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="3" prop="march" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.march" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.march}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="4" prop="april" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.april" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.april}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="5" prop="may" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.may" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.may}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="6" prop="june" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.june" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.june}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="7" prop="july" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.july" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.july}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="8" prop="august" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.august" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.august}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="9" prop="september" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.september" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.september}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="10" prop="october" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.october" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.october}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="11" prop="november" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.november" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.november}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column header-align="center" label="12" prop="december" width="160">
+            <template slot-scope="{row}">
+              <template v-if="operationType !== 'view'">
+                <el-input v-model="row.december" size="small" type="textarea" :rows="4"/>
+              </template>
+              <template v-else>
+                <span size="small">{{row.december}}</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'view'" fixed="right" label="鎿嶄綔"  width="100">
+            <template slot-scope="scope">
+              <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div style="display: flex;align-items: center;margin-top: 10px">
+        <span style="width: 70px">娉ㄦ剰浜嬮」锛�</span>
+        <el-input v-model="yearSampleForm.tableRemark" :disabled="operationType === 'view'" size="small" style="width: 50%" type="textarea"></el-input>
+      </div>
+      <div style="display: flex;align-items: center;margin-top: 10px">
+        <span style="width: 70px">澶囨敞锛�</span>
+        <el-input v-model="yearSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 50%" type="textarea"></el-input>
+      </div>
+      <div v-if="operationType !== 'add'">
+        <el-form ref="form" :model="editYearFormRow" label-width="70px">
+          <el-col :span="12">
+            <el-form-item label="缂栧埗浜猴細">
+              <el-select v-model="editYearFormRow.writeUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浼氱浜猴細">
+              <el-select v-model="editYearFormRow.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳浜猴細">
+              <el-select v-model="editYearFormRow.examineUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵瑰噯浜猴細">
+              <el-select v-model="editYearFormRow.ratifyUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeYearSampleDia">鍙� 娑�</el-button>
+        <el-button v-if="operationType !== 'view'" type="primary" @click="handleSample">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <add-quarter-item ref="addQuarterItem"></add-quarter-item>
+  </div>
+</template>
+
+<script>
+import AddQuarterItem from "./components/addQuarterItem.vue";
+import limsTable from "@/components/Table/lims-table.vue";
+import {
+  addSpotCheckYear,
+  deleteQuarter, deleteSpotCheckYear,
+  finalReportQuarter,
+  finalReportSpotCheckYear,
+  getQuarterPage, getSpotCheckYear, getSpotCheckYearPage, updateSpotCheckYear
+} from "@/api/business/productSamplingInfo";
+import {selectUserCondition} from "@/api/performance/class";
+
+export default {
+  name: "b1-product-sampling-info",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {limsTable, AddQuarterItem},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      upIndex: 0,
+      tabIndex: 0,
+      tabList: [
+        {
+          label: '瀛e害',
+          value: 0
+        },
+        {
+          label: '骞村害',
+          value: 1
+        },
+      ],
+      entity: {
+        quarterNo: null,
+      },
+      tableData: [],
+      tableLoading: false,
+      column: [
+        {label: '缂栧彿', prop: 'quarterNo'},
+        {label: '澶囨敞', prop: 'remark'},
+        {label: '鍒涘缓浜�', prop: 'createUserName'},
+        {label: '鍒涘缓鏃堕棿', prop: 'createTime'},
+        {
+          dataType: 'action',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.editForm(row);
+              },
+            },
+            {
+              name: '鏌ョ湅',
+              type: 'text',
+              clickFun: (row) => {
+                this.viewQuarterInfo(row);
+              },
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              clickFun: (row) => {
+                this.deleteQuarterInfo(row);
+              },
+            }
+          ]
+        }
+      ],
+      page: {
+        total:0,
+        size:10,
+        current:1
+      },
+      tableData1: [],
+      tableLoading1: false,
+      column1: [
+        { label: '鍚嶇О', prop: 'yearHead' },
+        { label: '鍒涘缓浜�', prop: 'createUserName' },
+        { label: '鍒涘缓鏃堕棿', prop: 'createTime' },
+        {
+          dataType: 'action',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.editYearForm(row);
+              },
+            },
+            {
+              name: '鏌ョ湅',
+              type: 'text',
+              clickFun: (row) => {
+                this.viewYearInfo(row);
+              },
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.download(row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              clickFun: (row) => {
+                this.deleteYearInfo(row);
+              },
+            },
+          ]
+        }
+      ],
+      page1: {
+        total: 0,
+        size: 10,
+        current: 1
+      },
+      yearSampleDia: false, // 骞村害鎶芥牱
+      yearSampleForm: {
+        tableRemark: '',
+        remark: ''
+      },
+      yearItems: [],
+      currentYear: '',
+      operationType: '',
+      userList: [],
+      yearRow: {},
+      editYearFormRow: {
+        yearId: '',
+        writeUser: '', // 缂栧埗浜�
+        countersignUser: null, // 浼氱浜�
+        examineUser: '', // 瀹℃牳浜�
+        ratifyUser: '', // 鎵瑰噯浜�
+      }
+    }
+  },
+  mounted() {
+    this.refreshTable()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍥炶皟
+    refreshTable(e) {
+      if (this.tabIndex === 0) {
+        this.getQuarterPageList()
+      } else if (this.tabIndex === 1) {
+        this.getSpotCheckYearPageList()
+      }
+    },
+    getQuarterPageList () {
+      this.tableLoading = true
+      getQuarterPage({
+        ...this.page,...this.entity
+      }).then(res => {
+        this.tableLoading = false
+        this.page.total = res.data.total
+        this.tableData = res.data.records
+      }).catch(err => {
+        this.tableLoading = false
+      })
+    },
+    getSpotCheckYearPageList () {
+      this.tableLoading1 = true
+      getSpotCheckYearPage({
+        ...this.page1
+      }).then(res => {
+        this.tableLoading1 = false
+        this.page1.total = res.data.total
+        this.tableData1 = res.data.records
+      }).catch(err => {
+        this.tableLoading1 = false
+      })
+    },
+    // 閲嶇疆
+    refresh() {
+      this.resetForm('entity')
+      this.refreshTable()
+    },
+    pagination (page) {
+      this.page.size = page.limit
+      this.refreshTable()
+    },
+    pagination1 (page) {
+      this.page1.size = page.limit
+      this.refreshTable()
+    },
+    // 缂栬緫瀛e害鎶芥牱
+    editForm (row) {
+      this.$refs.addQuarterItem.openDia(row, 'edit')
+    },
+    // 鏌ョ湅瀛e害鎶芥牱
+    viewQuarterInfo (row) {
+      this.$refs.addQuarterItem.openDia(row, 'view')
+    },
+    // 鍒犻櫎瀛e害鎶芥牱
+    deleteQuarterInfo (row) {
+      this.$confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(() => {
+        deleteQuarter({quarterId: row.quarterId}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.refreshTable()
+          }
+        })
+      }).catch(() => {})
+    },
+    // 瀵煎嚭
+    handleDown (row) {
+      let randomNum = Math.random();
+      finalReportQuarter({quarterId: row.quarterId, random: randomNum}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        this.$download.saveAs(blob, '瀛e害鎶芥牱淇℃伅瀵煎嚭.docx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    // 骞村害涓嬭浇
+    download(row) {
+      finalReportSpotCheckYear({yearId: row.yearId}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        this.$download.saveAs(blob, row.yearHead + '.docx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    // 鍒犻櫎骞村害鎶芥牱
+    deleteYearInfo (row) {
+      this.$confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(() => {
+        deleteSpotCheckYear({yearId: row.yearId}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.refreshTable()
+          }
+        })
+      }).catch(() => {})
+    },
+    // 鏌ョ湅骞村害璇︽儏
+    viewYearInfo (row) {
+      this.operationType = 'view'
+      this.getUserList()
+      this.yearSampleDia = true
+      this.yearRow = row
+      getSpotCheckYear({yearId: row.yearId}).then(res => {
+        if (res.code === 200) {
+          this.currentYear = res.data.yearHead
+          this.yearItems = res.data.yearItems
+          this.yearSampleForm.tableRemark = res.data.tableRemark
+          this.yearSampleForm.remark = res.data.remark
+          this.editYearFormRow.yearId = res.data.yearId
+          this.editYearFormRow.writeUser = res.data.writeUser
+          this.editYearFormRow.examineUser = res.data.examineUser
+          this.editYearFormRow.ratifyUser = res.data.ratifyUser
+          if (res.data.countersignUser) {
+            this.editYearFormRow.countersignUser = res.data.countersignUser.split(",").map(Number)
+          }
+        }
+      })
+    },
+    // 缂栬緫骞村害鎶芥牱
+    editYearForm (row) {
+      this.operationType = 'edit'
+      this.getUserList()
+      this.yearSampleDia = true
+      getSpotCheckYear({yearId: row.yearId}).then(res => {
+        if (res.code === 200) {
+          this.currentYear = res.data.yearHead
+          this.yearItems = res.data.yearItems
+          this.yearSampleForm.tableRemark = res.data.tableRemark
+          this.yearSampleForm.remark = res.data.remark
+          this.editYearFormRow.yearId = res.data.yearId
+          this.editYearFormRow.writeUser = res.data.writeUser
+          this.editYearFormRow.examineUser = res.data.examineUser
+          this.editYearFormRow.ratifyUser = res.data.ratifyUser
+          if (res.data.countersignUser) {
+            this.editYearFormRow.countersignUser = res.data.countersignUser.split(",").map(Number)
+          }
+        }
+      })
+    },
+    // 鎻愪氦骞村害璁″垝
+    handleSample () {
+      if (this.operationType === 'add') {
+        this.yearSampleForm.yearItems = JSON.parse(JSON.stringify(this.yearItems))
+        this.yearSampleForm.yearHead = this.currentYear
+        addSpotCheckYear(this.yearSampleForm).then(res => {
+          if (res.code == 200) {
+            this.$message.success('鎻愪氦鎴愬姛')
+            this.yearSampleForm = {}
+            this.yearItems = []
+            this.closeYearSampleDia()
+            this.refreshTable()
+          }
+        })
+      } else {
+        const params = {...this.editYearFormRow}
+        if (params.countersignUser != null) {
+          params.countersignUser = params.countersignUser.join(',')
+        }
+        params.yearItems = JSON.parse(JSON.stringify(this.yearItems))
+        params.tableRemark = this.yearSampleForm.tableRemark
+        params.remark = this.yearSampleForm.remark
+        updateSpotCheckYear(params).then(res => {
+          if (res.code == 200) {
+            this.$message.success('淇敼鎴愬姛')
+            this.yearSampleForm = {}
+            this.editYearFormRow = {
+              yearId: '',
+              writeUser: '', // 缂栧埗浜�
+              countersignUser: [], // 浼氱浜�
+              examineUser: '', // 瀹℃牳浜�
+              ratifyUser: '', // 鎵瑰噯浜�
+            }
+            this.yearItems = []
+            this.closeYearSampleDia()
+            this.refreshTable()
+          }
+        })
+      }
+    },
+    yearSample (type) {
+      this.operationType = type
+      const currentDate = new Date();
+      this.yearSampleDia = true
+      this.currentYear = currentDate.getFullYear() + '骞村勾搴︽娊妫�璁″垝'
+    },
+    // 娣诲姞骞村害璁″垝
+    addQuarter () {
+      this.yearItems.push({})
+    },
+    // 娓呯┖鎶芥牱璁″垝
+    clearTable () {
+      this.yearItems = []
+    },
+    // 鎵嬪姩鍒犻櫎
+    deleteScope (index) {
+      this.yearItems.splice(index, 1)
+    },
+    // 鍒囨崲涓嬪崟tab琛ㄦ牸
+    handleTab(m, i) {
+      this.tabIndex = i;
+      if (this.tabIndex === 0) {
+        this.componentData.entity.quarterNo = this.entity.quarterNo
+      }
+      this.refreshTable()
+    },
+    closeYearSampleDia () {
+      this.yearSampleForm = {
+        tableRemark: '',
+        remark: ''
+      }
+      this.yearItems = []
+      this.yearSampleDia = false
+    },
+    getStyle(){
+      return 'height: calc(100% - '+'44'+'px)'
+    },
+    getUserList(){
+      selectUserCondition({ type: 0 }).then((res) => {
+        this.userList = res.data;
+      })
+    },
+  },
+}
+</script>
+
+<style scoped>
+.tab {
+  list-style-type: none;
+  display: flex;
+  margin-bottom: 12px;
+  margin-top: 0;
+  padding-left: 0;
+}
+
+.tab li {
+  line-height: 24px;
+  padding: 6px 14px;
+  font-size: 14px;
+  color: #333333;
+  border: 1px solid #EEEEEE;
+  cursor: pointer;
+}
+
+.tab li:nth-child(1) {
+  border-radius: 8px 0 0 8px;
+}
+
+.tab li:nth-child(2) {
+  border-radius: 0 8px 8px 0;
+}
+
+.tab li.active {
+  border-color: #3A7BFA;
+  color: #3A7BFA;
+}
+</style>

--
Gitblit v1.9.3