From 9b47c9bed54972f0dff5796a0fdb9dcbe363a9a2 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 06 三月 2025 13:32:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/views/structural/capabilityAndLaboratory/capability/index.vue |  609 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 609 insertions(+), 0 deletions(-)

diff --git a/src/views/structural/capabilityAndLaboratory/capability/index.vue b/src/views/structural/capabilityAndLaboratory/capability/index.vue
new file mode 100644
index 0000000..5394e0b
--- /dev/null
+++ b/src/views/structural/capabilityAndLaboratory/capability/index.vue
@@ -0,0 +1,609 @@
+<template>
+  <div class="capacity-scope">
+    <div>
+      <el-row class="title">
+        <el-col :span="12" style="text-align: left">
+          <el-radio-group v-model="radio" size="medium" fill="#409EFF" @change="refreshTable">
+            <el-radio-button :label="0">妫�楠岄」鐩弬鏁�</el-radio-button>
+            <el-radio-button :label="1">妫�楠屽璞�</el-radio-button>
+          </el-radio-group>
+        </el-col>
+        <el-col :span="12" style="text-align: right;">
+          <el-upload v-if="radio === 0" ref='upload1'
+                     style="display: inline;margin-right: 8px"
+                     :action="uploadAction1"
+                     :before-upload="beforeUpload1" :headers="token" :on-error="onError1"
+                     :on-success="handleSuccessUp1" :show-file-list="false" accept='.doc,.docx,.xls,.xlsx'>
+            <el-button size="small" type="primary">瀵煎叆</el-button>
+          </el-upload>
+          <el-button size="small" type="primary" v-if="radio === 1" @click="uploadDia = true">瀵煎叆</el-button>
+          <el-button size="small" type="primary" @click="openAdd()">鏂板</el-button>
+        </el-col>
+      </el-row>
+    </div>
+    <div>
+      <el-form :model="itemParameterForm" ref="itemParameterForm" size="small" :inline="true">
+        <el-form-item label="妫�楠岄」" prop="inspectionItem" v-if="radio===0">
+          <el-input size="small" placeholder="璇疯緭鍏�" clearable
+                    v-model="itemParameterForm.inspectionItem" @keyup.enter.native="refreshTable()">
+          </el-input>
+        </el-form-item>
+        <el-form-item label="妫�楠屽瓙椤�" prop="inspectionItemSubclass" v-if="radio===0">
+          <el-input size="small" placeholder="璇疯緭鍏�" clearable
+                    v-model="itemParameterForm.inspectionItemSubclass" @keyup.enter.native="refreshTable()">
+          </el-input>
+        </el-form-item>
+        <el-form-item label="妫�楠屽璞�" prop="specimenName">
+          <el-input size="small" placeholder="璇疯緭鍏�" clearable
+                    v-model="itemParameterForm.specimenName" @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 class="table" v-if="radio===0">
+        <lims-table :tableData="tableData" :column="column" key="tableData"
+                    @pagination="pagination" :height="'calc(100vh - 290px)'"
+                    :page="page" :tableLoading="tableLoading"></lims-table>
+      </div>
+<!--      妫�楠屽璞¤〃鏍�-->
+      <div class="table" v-if="radio===1">
+        <lims-table :tableData="testObjectTableData" :column="testObjectColumn" key="testObjectTableData"
+                    @pagination="pagination" :height="'calc(100vh - 290px)'"
+                    :page="testObjectPage" :tableLoading="tableLoading"></lims-table>
+      </div>
+    </div>
+    <!--浜у搧缁存姢寮规-->
+    <el-dialog title="浜у搧缁存姢" :visible.sync="diaProduct" width="900px">
+      <lims-table :tableData="productData" :column="productColumn" height="460"
+                  :page="productPage" :tableLoading="productableLoading"></lims-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="diaProduct = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="editProduct('add')" :loading="productLoad">鏂� 澧�</el-button>
+      </span>
+    </el-dialog>
+    <!--浜у搧缁存姢缂栬緫-->
+    <el-dialog title="鎿嶄綔浜у搧缁存姢" :visible.sync="productEditDia" width="400px">
+      <el-form :model="productEditForm" ref="productEditForm" :rules="productRules" label-position="right" label-width="100px">
+        <el-form-item label="浜у搧鍚嶇О" prop="name">
+          <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="productEditForm.name"></el-input>
+        </el-form-item>
+        <el-form-item label="浜у搧鍚嶇ОEN" prop="nameEn">
+          <el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="productEditForm.nameEn">
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeProduct">鍙� 娑�</el-button>
+        <el-button :loading="uploading" type="primary" @click="submitProduct">纭� 璁�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="uploadDia" title="鏁版嵁瀵煎叆" width="500px">
+      <div style="margin: 0 auto;">
+        <el-upload ref="upload" :action="uploadAction"
+                   :auto-upload="false" :file-list="fileList"
+                   :headers="token" :limit="1"
+                   :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess" accept=".xlsx" drag
+                   name="file">
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        </el-upload>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="uploadDia = false">鍙� 娑�</el-button>
+        <el-button :loading="uploading" type="primary" @click="submitUpload()">涓� 浼�</el-button>
+      </span>
+    </el-dialog>
+    <!--妫�楠岄」鐩弬鏁�-缂栬緫寮规-->
+    <EditForm ref="editForm" @refreshList="refreshList1"></EditForm>
+    <testObjectEditForm ref="testObjectEditForm" @refreshList="refreshList"></testObjectEditForm>
+  </div>
+</template>
+
+<script>
+import {
+  addProduct,
+  delItemParameter, delProduct, delTestObject, selectItemParameterList, selectProductListByObjectId,
+  selectTestObjectList, upProduct,
+} from "@/api/structural/capability";
+import limsTable from "@/components/Table/lims-table.vue";
+import EditForm from "@/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue";
+import testObjectEditForm from "@/views/structural/capabilityAndLaboratory/capabilityComponents/testObjectEditForm.vue";
+import {getToken} from "@/utils/auth";
+import { obtainItemParameterList } from '@/api/structural/laboratoryScope'
+
+export default {
+  components: {limsTable, EditForm, testObjectEditForm},
+  data() {
+    return {
+      uploadAction: process.env.VUE_APP_BASE_API + '/capacityScope/importExcel',
+      uploadAction1: process.env.VUE_APP_BASE_API + '/capacityScope/importEquipData',
+      tableData: [],
+      tableLoading: false,
+      column: [
+        {label: '妫�楠岄」', prop: 'inspectionItem'},
+        {label: '妫�楠岄」EN', prop: 'inspectionItemEn'},
+        {label: '妫�楠屽瓙椤�', prop: 'inspectionItemSubclass'},
+        {label: '妫�楠屽瓙椤笶N', prop: 'inspectionItemSubclassEn'},
+        {label: '妫�楠岄」鍒嗙被', prop: 'inspectionItemClass'},
+        {label: '妫�楠岄」鍒嗙被EN', prop: 'inspectionItemClassEn'},
+        {label: '妫�楠屽璞�', prop: 'sample'},
+        {label: '鍗曚环(鍏�)', prop: 'price'},
+        {label: '璇曢獙瀹�', prop: 'sonLaboratory'},
+        {label: '瑕佹眰鎻忚堪', prop: 'askTell'},
+        {label: '瑕佹眰鍊�', prop: 'ask'},
+        {label: '璁¢噺鍗曚綅', prop: 'unit'},
+        {label: '宸ユ椂(H)', prop: 'manHour'},
+        {label: '棰勮鏃堕棿(H)', prop: 'manDay'},
+        {label: '宸ユ椂鍒嗙粍', prop: 'manHourGroup'},
+        {label: '鍒涘缓鏃堕棿', prop: 'createTime'},
+        {label: '淇敼鏃堕棿', prop: 'updateTime'},
+        {label: '鏉′欢', prop: 'radiusList'},
+        {
+          dataType: 'action',
+          fixed: 'right',
+          label: '鎿嶄綔',
+          width: '140px',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.editForm(row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              clickFun: (row) => {
+                this.delete(row);
+              },
+            },
+          ]
+        }
+      ],
+      page: {
+        total:0,
+        size:10,
+        current:1
+      },
+      testObjectTableData: [],
+      testObjectColumn: [
+        {
+          dataType: 'tag',
+          label: '鍦烘墍',
+          prop: 'laboratoryId',
+          minWidth: '130',
+          formatData: (params) => {
+            let index = this.laboratoryList.findIndex(item => item.value == params)
+            if(index > -1) {
+              return this.laboratoryList[index].label
+            }else {
+              return null
+            }
+            // if (params == 1) {
+            //   return '瑁呭鐢电紗璇曢獙瀹�'
+            // } else if (params == 5) {
+            //   return '閫氫俊浜у搧瀹為獙瀹�'
+            // } else if (params == 6) {
+            //   return '鐢靛姏浜у搧瀹為獙瀹�'
+            // } else if (params == 8) {
+            //   return '鍌ㄨ兘浜у搧瀹為獙瀹�'
+            // } else {
+            //   return '灏勯绾跨紗瀹為獙瀹�'
+            // }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success'
+            } else if (params == 5) {
+              return 'info'
+            } else if (params == 6) {
+              return 'warning'
+            } else if (params == 8) {
+              return 'danger'
+            } else {
+              return null
+            }
+          }
+        },
+        {label: '妫�楠屽璞�', prop: 'specimenName'},
+        {label: '妫�楠屽璞N', prop: 'specimenNameEn'},
+        {label: '浜у搧', prop: 'product'},
+        {label: '瀵硅薄浠e彿', prop: 'code'},
+        {label: '瀵硅薄绫诲瀷', prop: 'objectType',
+          dataType: 'tag',
+          formatData: (params) => {
+            if (params == 1) {
+              return '鍘熸潗鏂�'
+            } else if (params == 2) {
+              return '鎴愬搧'
+            } else {
+              return '杈呮潗'
+            }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success'
+            } else if (params == 2) {
+              return 'info'
+            } else {
+              return 'warning'
+            }
+          }},
+        {label: '鍒涘缓浜�', prop: 'createUserName'},
+        {label: '鏇存柊浜�', prop: 'updateUserName'},
+        {label: '鍒涘缓鏃堕棿', prop: 'createTime'},
+        {label: '鏇存柊鏃堕棿', prop: 'updateTime'},
+        {
+          dataType: 'action',
+          fixed: 'right',
+          label: '鎿嶄綔',
+          width: '240px',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.editTestObjectForm(row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              clickFun: (row) => {
+                this.deleteTest(row);
+              },
+            },
+            {
+              name: '浜у搧缁存姢',
+              type: 'text',
+              clickFun: (row) => {
+                this.upProduct(row);
+              },
+            },
+          ]
+        }
+      ],
+      testObjectPage: {
+        total:0,
+        size:10,
+        current:0
+      },
+      addOrUpdate: '',
+      tree: null,
+      loading: true,
+      itemParameterForm: {
+        inspectionItem: null,
+        inspectionItemSubclass: null,
+        specimenName: null
+      },
+      radio: 0,
+      productLoad: false,
+      diaProduct: false,
+      productColumn: [
+        {label: '浜у搧鍚嶇О', prop: 'name'},
+        {label: '浜у搧鍚嶇ОEN', prop: 'nameEn'},
+        {
+          dataType: 'action',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.editProduct('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              clickFun: (row) => {
+                this.deleteProduct(row);
+              },
+            },
+          ]
+        }
+      ],
+      productData: [],
+      productPage: {
+        total:0,
+        size:10,
+        current:0,
+        layout: 'total, prev, pager, next'
+      },
+      productableLoading: false,
+      productEditDia: false,
+      operationType: '',
+      productEditForm: {
+        objectId: '',
+        id: '',
+        name: '',
+        nameEn: ''
+      },
+      objectId: '',
+      productRules: {
+        name: [{ required: true, message: '璇峰~鍐欎骇鍝佸悕绉�', trigger: 'blur' }],
+        nameEn: [{ required: true, message: '璇峰~鍐欎骇鍝佸悕绉癊N', trigger: 'blur' }]
+      },
+      uploadDia: false,
+      fileList: [],
+      token: {Authorization: "Bearer " + getToken()},
+      uploading: false,
+      laboratoryList:[]
+    }
+  },
+  created() {
+    this.getItemParameterList()
+    this.refreshTable()
+  },
+  computed: {
+    title() {
+      return this.addOrUpdate === 1 ? '鏂板' : '缂栬緫'
+    }
+  },
+  methods: {
+    submitUpload() {
+      if (this.$refs.upload.uploadFiles.length === 0) {
+        this.$message.error('鏈�夋嫨鏂囦欢')
+        return
+      }
+      this.uploading = true
+      this.$refs.upload.submit();
+    },
+    onSuccess(response, file, fileList) {
+      this.$refs.upload.clearFiles()
+      this.uploadDia = false
+      this.uploading = false
+      if (response.code !== 200) {
+        this.$message.error(response.msg)
+        return
+      }
+      this.$message.success('涓婁紶鎴愬姛')
+      this.productList = []
+      this.refreshTable()
+    },
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+      this.uploading = false
+    },
+    beforeUpload(file, fileList) {
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        return false;
+      } else {
+        return true;
+      }
+    },
+    onError1(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload1.clearFiles()
+      this.uploading = false
+    },
+    beforeUpload1(file, fileList) {
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload1.clearFiles()
+        return false;
+      } else {
+        return true;
+      }
+    },
+    handleSuccessUp1 (response, file, fileList) {
+      this.$refs.upload1.clearFiles()
+      if (response.code !== 200) {
+        this.$message.error(response.msg)
+        return
+      }
+      this.$message.success('涓婁紶鎴愬姛')
+      this.refreshTable()
+    },
+    refreshList () {
+      this.refreshTable()
+    },
+    refreshList1 () {
+      this.refreshTable()
+    },
+    refreshTable() {
+      this.tableLoading = true
+      if (this.radio === 0) {
+        selectItemParameterList({...this.page, ...this.itemParameterForm}).then(res => {
+          this.tableLoading = false
+          if (res.code === 200) {
+            this.tableData = res.data.records
+            this.page.total = res.data.total
+          }
+        }).catch(err => {
+          this.tableLoading = false
+        })
+      } else {
+        selectTestObjectList({...this.testObjectPage, ...this.itemParameterForm}).then(res => {
+          this.tableLoading = false
+          if (res.code === 200) {
+            this.testObjectTableData = res.data.records
+            this.testObjectPage.total = res.data.total
+          }
+        }).catch(err => {
+          this.tableLoading = false
+        })
+      }
+    },
+    refresh() {
+      this.resetForm('itemParameterForm')
+      this.page.current = 1
+      this.refreshTable()
+    },
+    pagination (page) {
+      this.page.size = page.limit
+      this.refreshTable()
+    },
+    // 妫�楠岄」鐩弬鏁版柊澧�
+    openAdd() {
+      if (this.radio === 0) {
+        this.$refs.editForm.openDia('add')
+      } else {
+        this.$refs.testObjectEditForm.openDia('add')
+      }
+    },
+    // 妫�楠岄」鐩弬鏁�-鎵撳紑淇敼寮规
+    editForm (row) {
+      this.$refs.editForm.openDia('edit', row)
+    },
+    // 妫�楠岄」鐩弬鏁�-鍒犻櫎
+    delete (row) {
+      this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        delItemParameter({id:row.id}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.refreshTable();
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      })
+    },
+    // 妫�楠屽璞�-鎵撳紑淇敼寮规
+    editTestObjectForm (row) {
+      this.$refs.testObjectEditForm.openDia('edit', row)
+    },
+    // 妫�楠岄」鐩弬鏁�-鍒犻櫎
+    deleteTest (row) {
+      this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        delTestObject({id:row.id}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.refreshTable();
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      })
+    },
+    // 浜у搧缁存姢
+    upProduct(row) {
+      this.diaProduct = true
+      this.objectId = row.id
+      this.getProductList(row)
+    },
+    getProductList () {
+      const params = {
+        objectId: this.objectId,
+      }
+      this.productableLoading = true
+      selectProductListByObjectId({...params, ...this.productPage}).then(res => {
+        this.productableLoading = false
+        this.productData = res.data.records
+        this.productPage.total = res.data.total
+      }).catch(err => {
+        this.productableLoading = false
+      })
+    },
+    // 浜у搧缁存姢-鏂板-缂栬緫
+    editProduct (type, row) {
+      this.productEditDia = true
+      this.operationType = type
+      if (type === 'edit') {
+        this.productEditForm = this.HaveJson(row)
+      }
+    },
+    // 鎻愪氦浜у搧缁存姢淇敼
+    submitProduct () {
+      this.$refs['productEditForm'].validate((valid) => {
+        if (valid) {
+          this.uploading = true
+          this.productEditForm.objectId = this.objectId
+          if (this.operationType === 'add') {
+            addProduct(this.productEditForm).then(res => {
+              this.uploading = false
+              if (res.code === 200) {
+                this.$message.success('鏂板鎴愬姛')
+                this.closeProduct()
+                this.getProductList();
+              }
+            }).catch(err => {
+              this.uploading = false
+            })
+          } else {
+            upProduct(this.productEditForm).then(res => {
+              this.uploading = false
+              if (res.code === 200) {
+                this.$message.success('鏂板鎴愬姛')
+                this.closeProduct()
+                this.getProductList();
+              }
+            }).catch(err => {
+              this.uploading = false
+            })
+          }
+        }
+      })
+    },
+    closeProduct() {
+      this.resetForm('productEditForm')
+      this.productEditDia = false
+    },
+    // 浜у搧缁存姢-鍒犻櫎
+    deleteProduct (row) {
+      this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        delProduct({id:row.id}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.getProductList();
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      })
+    },
+    getItemParameterList(){
+      obtainItemParameterList().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.laboratoryName,
+            value: a.id
+          })
+        })
+        this.laboratoryList = data
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.capacity-scope {
+  padding: 20px;
+}
+.title {
+  height: 40px;
+  line-height: 40px;
+  margin-bottom: 10px;
+}
+</style>

--
Gitblit v1.9.3