XiaoRuby
2023-08-11 0747a32003b83a155466496d18f7dddf6f800436
src/components/view/laboratoryManagement.vue
@@ -12,89 +12,140 @@
          <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="130px" class="demo-ruleForm">
            <el-row>
              <el-col :span="12">
                <el-form-item label="仪器设备编号" prop="name">
                <el-form-item label="设备名称" prop="name">
                  <el-input placeholder="请输入仪器设备编号" style="width: 206px" clearable v-model="ruleForm.name"></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="保管人" prop="region">
                  <el-select v-model="ruleForm.region" placeholder="请选择保管人">
                    <el-option label="区域一" value="shanghai"></el-option>
                    <el-option label="区域二" value="beijing"></el-option>
                <el-form-item label="设备用途" prop="type">
                  <el-select v-model="ruleForm.type" placeholder="请选择设备用途">
                    <el-option label="生产设备" value="1"></el-option>
                    <el-option label="检测设备" value="2"></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="计量截至有效期" required>
                  <el-form-item prop="date1">
                    <el-date-picker style="width: 206px" type="date" placeholder="请选择计量截至有效期" v-model="ruleForm.date1"></el-date-picker>
                  </el-form-item>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="设备状态" prop="region">
                  <el-select v-model="ruleForm.region" placeholder="请选择设备状态">
                    <el-option label="1" value="运行"></el-option>
                    <el-option label="2" value="报废"></el-option>
                <el-form-item label="父级分类">
                  <el-select v-model="value" @blur="productSelect" filterable allow-create placeholder="请选择父级分类">
                    <el-option
                      v-for="list in parentClassificationList"
                      :key="list.index"
                      :label="list.father"
                      :value="list.father"
                    >
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="厂家" prop="region">
                  <el-input style="width: 206px" placeholder="请输入厂家" clearable v-model="ruleForm.name"></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="检测项目" required>
                  <el-form-item prop="inspectionList">
                    <el-select v-model="ruleForm.rawInsProductId" placeholder="请选择检测项目">
                      <el-option v-for="item in inspectionList"
                                 :key="item.index"
                                 :label="item.name"
                                 :value="item.id">
                      </el-option>
                    </el-select>
                  </el-form-item>
                <el-form-item label="仪器设备编号" prop="name">
                  <el-input placeholder="请输入仪器设备编号" style="width: 206px" clearable v-model="ruleForm.code"></el-input>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="保管人" prop="keeper">
                  <el-select v-model="ruleForm.keeper" placeholder="请选择保管人">
                    <el-option
                      v-for="list in keeperList"
                      :key="list.index"
                      :label="list.name"
                      :value="list.id"
                    >
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="计量截至有效期" prop="endMeasure">
                  <el-date-picker
                    style="width: 206px"
                    type="date"
                    placeholder="请选择计量截至有效期"
                    v-model="ruleForm.endMeasure"
                    :picker-options="pickerOptions"
                  ></el-date-picker>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="设备状态" prop="deviceStatus" required>
                  <el-select v-model="ruleForm.deviceStatus" placeholder="请选择设备状态">
                    <el-option label="运行" style="color: #66c03b" value="1"></el-option>
                    <el-option label="报废" style="color: #ac9299" value="2"></el-option>
                    <el-option label="检修" style="color: #52d6c0" value="3"></el-option>
                    <el-option label="故障" style="color: #f36b6c" value="4"></el-option>
                    <el-option label="空闲" style="color: #fcb642" value="5"></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="厂家" prop="factory" required>
                  <el-input style="width: 206px" placeholder="请输入厂家" clearable v-model="ruleForm.factory"></el-input>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="检测项目" prop="rawInsProductId" required>
                  <el-select v-model="ruleForm.rawInsProductId" placeholder="请选择检测项目">
                    <el-option v-for="item in inspectionList"
                               :key="item.index"
                               :label="item.name"
                               :value="item.id">
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="检测样品" required>
                  <el-form-item prop="date1">
                    <el-input placeholder="请输入仪器设备编号" style="width: 206px" clearable v-model="ruleForm.name"></el-input>
                  <el-form-item>
                    <el-input
                      placeholder="检测样品"
                      :disabled="true"
                      style="width: 206px"
                      v-model="showCodeNameModel.name">
                    </el-input>
                  </el-form-item>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="规格型号" prop="region">
                  <el-input placeholder="请输入仪器设备编号" style="width: 206px" clearable v-model="ruleForm.name"></el-input>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="检测人" required>
                  <el-input placeholder="请输入仪器设备编号" style="width: 206px" clearable v-model="ruleForm.name"></el-input>
                <el-form-item label="规格型号">
                  <el-input
                    placeholder="规格型号"
                    :disabled="true"
                    style="width: 206px"
                    v-model="showCodeNameModel.specifications">
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="检测人">
                  <el-input
                    placeholder="检测人"
                    :disabled="true"
                    style="width: 206px"
                    v-model="showCodeNameModel.user_name">
                  </el-input>
                </el-form-item>
              </el-col>
            </el-row>
          </el-form>
          <span slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
            <el-button type="primary" @click="submitForm">确 定</el-button>
          </span>
        </el-dialog>
      </el-col>
    </el-row>
    <el-row class="left_row">
      <div :style="`width: ${isCollapse?300:0}px;transition: 1s;`" class="class_sidebar">
      <div :style="`width: ${isCollapse?300:0}px;transition: 1s;opacity: ${isCollapse?1:0};`" class="class_sidebar">
        <el-radio-group class="ai-tab-change" style="width: 270px; margin-top: 5px" v-model="radio1">
          <el-radio-button size="small" label="true">
            <div class="el_radio_button_div">生产设备</div>
@@ -104,25 +155,23 @@
          </el-radio-button>
        </el-radio-group>
        <el-input
          v-model="search"
          class="frame_input"
          :style="`opacity: ${isCollapse?1:0};`"
          suffix-icon="el-icon-search"
          v-model="search_class"
          placeholder="请输入分类名称"
          size="small" clearable>
          size="small"
        >
          <i slot="suffix" class="el-icon-search" style="font-size: 23px; padding: 5px 0;cursor:pointer;" @click="handlerDeptList"></i>
        </el-input>
        <el-tree
          :data="list" ref="tree"
          :props="{children: 'children',label: 'label'}"
          :data="towTree" ref="tree"
          :props="{children: 'children',label: 'father'}"
          node-key="id"
          default-expand-all
          :filter-node-method="filterNode"
          @node-click="handleNodeClick"
          highlight-current @node-expand="nodeOpen"
          @node-collapse="nodeClose">
          >
            <div class="custom-tree-node" slot-scope="{ node, data }">
              <span><i :class="`node_i ${data.code != '[4]'?'el-icon-folder-opened':'el-icon-tickets'}`"></i>
                {{data.code}}{{ data.label }}</span>
                {{ data.name }}</span>
              <el-button type="text" size="mini" @click.stop="remove(node, data)">
                <i class="el-icon-delete"></i>
              </el-button>
@@ -142,17 +191,20 @@
          <div class="table_top_div">
            <el-input
              class="table_top_input"
              v-model="searchName"
              size="small"
              v-model="codeNameModel"
              prefix-icon="el-icon-search"
              placeholder="请输入编号/设备名称/型号规格"
              clearable>
            </el-input>
            <el-button size="mini" @click="()=>{searchName='';selectProductTableData()}"><span>重 置</span></el-button>
            <el-button size="mini" type="primary" style="background: #004EA2;" @click="selectProductTableData"><span>查 询</span></el-button>
            <el-select v-model="tableType" size="small" placeholder="请选择" class="table_top">
              <el-option :value="0" label="工艺文件"></el-option>
              <el-option :value="1" label="技术指标"></el-option>
            <el-button size="mini" @click="reset"><span>重 置</span></el-button>
            <el-button size="mini" type="primary" @click="selectSearch" style="background: #004EA2;"><span>查 询</span></el-button>
            <el-select v-model="value" size="small" placeholder="请选择设备状态" class="table_top">
              <el-option label="运行" style="color: #66c03b" value="1"></el-option>
              <el-option label="报废" style="color: #ac9299" value="2"></el-option>
              <el-option label="检修" style="color: #52d6c0" value="3"></el-option>
              <el-option label="故障" style="color: #f36b6c" value="4"></el-option>
              <el-option label="空闲" style="color: #fcb642" value="5"></el-option>
            </el-select>
          </div>
          <el-table
@@ -162,17 +214,65 @@
            style="padding: 10px;">
            <el-table-column
              prop="date"
              label="日期"
              width="180">
              label="序号"
              width="60">
              <template v-slot="scope">
                {{ scope.$index + 1 }}
              </template>
            </el-table-column>
            <el-table-column
              prop="code"
              label="仪器设备编号"
              width="125">
            </el-table-column>
            <el-table-column
              prop="name"
              label="姓名"
              width="180">
              label="仪器设备名称"
              width="125">
            </el-table-column>
            <el-table-column
              prop="address"
              label="地址">
              prop="keeper"
              label="保管人">
            </el-table-column>
            <el-table-column
              prop="end_measure"
              label="计量截至有效期"
              width="147">
            </el-table-column>
            <el-table-column
              prop="device_status"
              label="使用状态">
              <template slot-scope="scope">
                <el-tag v-if="scope.row.device_status==1" disable-transitions type="success">运行</el-tag>
                <el-tag v-else-if="scope.row.device_status==2" disable-transitions type="info">报废</el-tag>
                <el-tag v-else-if="scope.row.device_status==3" style="color: #52d6c0" disable-transitions type="info">检修</el-tag>
                <el-tag v-else-if="scope.row.device_status==4" disable-transitions type="danger">故障</el-tag>
                <el-tag v-else-if="scope.row.device_status==5" style="color: #fcb642" disable-transitions type="info">空闲</el-tag>
              </template>
            </el-table-column>
            <el-table-column
              prop="factory"
              label="厂家"
              :show-overflow-tooltip="true">
            </el-table-column>
            <el-table-column
              prop="inspectProject"
              label="检测项目">
            </el-table-column>
            <el-table-column
              prop="testSample"
              label="检验样品">
            </el-table-column>
            <el-table-column
              prop="user_name"
              label="检测人">
            </el-table-column>
            <el-table-column
              prop="name"
              label="操作">
              <template v-slot="scope">
                <el-button @click="handleClick(scope.$index, tableData, scope.row)" type="text" size="small">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
        </div>
@@ -186,15 +286,22 @@
  name: "LaboratoryManagement",
  data() {
    return {
      value: '',
      dialogVisible: false,
      isCollapse: true, //默认为展开
      radio1: 'true',
      radio1: 'true', // 分类切换
      tableData: [],
      inspectionList: [], //检验项目下拉框列表
      showCodeNameModel: {}, // 新增仪器展示禁止框
      keeperList: [], // 新增设备保管人下拉框
      parentClassificationList: [], // 新增设备父级分类下拉框
      search_class: '', // 分类搜索框内容
      codeNameModel: '', // 编码名称型号模糊查询
      // BOM树数据结构
      list: [],
      towTree: [],
      ruleForm: {
        code: '',
        father: '',
        deviceStatus: '',
        endMeasure: '',
        factory: '',
@@ -205,28 +312,36 @@
      },
      rules: {
        name: [
          { required: true, message: '请输入活动名称', trigger: 'blur' },
          { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
          { required: true, message: '请输入仪器设备编号', trigger: 'blur' },
          { min: 2, max: 25, message: '长度在 2 到 25 个字符', trigger: 'blur' }
        ],
        region: [
          { required: true, message: '请选择活动区域', trigger: 'change' }
        keeper: [
          { required: true, message: '请选择保管人', trigger: 'change' }
        ],
        date1: [
          { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
        endMeasure: [
          { type: 'date', required: true, message: '请选择计量截至有效期', trigger: 'change' }
        ],
        date2: [
          { type: 'date', required: true, message: '请选择时间', trigger: 'change' }
        deviceStatus: [
          { required: true, message: '请选择设备状态', trigger: 'change' }
        ],
        factory: [
          { required: true, message: '请输入厂家', trigger: 'blur' },
          { min: 2, max: 25, message: '长度在 2 到 50 个字符', trigger: 'blur' }
        ],
        rawInsProductId: [
          { required: true, message: '请选择检测项目', trigger: 'change' }
        ],
        type: [
          { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
        ],
        resource: [
          { required: true, message: '请选择活动资源', trigger: 'change' }
        ],
        desc: [
          { required: true, message: '请填写活动形式', trigger: 'blur' }
          { required: true, message: '请选择设备用途', trigger: 'change' }
        ]
      }
      },
      pickerOptions:{
        //禁用当前日期之前的日期
        disabledDate(time) {
          //Date.now()是javascript中的内置函数,它返回自1970年1月1日00:00:00 UTC以来经过的毫秒数。
          return time.getTime() < Date.now() - 8.64e7;
        }
      },
    }
  },
  methods: {
@@ -234,18 +349,30 @@
    isC() {
      this.isCollapse = !this.isCollapse;
    },
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
    productSelect(e) {
      let value = e.target.value; // 输入框值
      if(value) { // 你输入才有这个值 不为空,如果你下拉框选择的话 这个值为空
        this.value = value
      }
    },
    submitForm() {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!');
          this.ruleForm.father = this.value
          this.$axios.post(this.$api.url.addDeviceInstrument, this.ruleForm,{
            headers: {
              'Content-Type': 'application/json'
            }
          }).then(res => {
            this.keeperList = res.data
            // 成功关闭新增弹出框
            this.dialogVisible = false
          })
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    handleClose(done) {
      this.$confirm('确认关闭?')
@@ -256,18 +383,183 @@
    },
    testItem() {
      this.dialogVisible = true
      this.$axios.get(this.$api.url.addDeviceKeeper).then(res => {
        this.keeperList = res.data
      })
      this.$axios.get(this.$api.url.addDeviceInspectDownBox).then(res => {
        this.inspectionList = res.data
      })
      this.$axios.get(this.$api.url.addDeviceParentClassification).then(res => {
        this.parentClassificationList = res.data
      })
    },
    twoTreeApi() {
      this.$axios.get(this.$api.url.towTree).then(res => {
        let list = res.data
        list.forEach(i => {
          if (i.name === undefined){
            i.name = i.children[0].name
            i.children = undefined
          }
        })
        this.towTree = res.data
      })
    },
    tableDataApi() {
      this.$axios.get(this.$api.url.tableDeviceList).then(res => {
        this.tableData = res.data
      })
    },
    reset() {
      this.tableDataApi()
      this.radio1 = 'true'
      this.codeNameModel = ''
    },
    handleNodeClick(data) {
      if (data.id === undefined) {
        this.$axios.get(this.$api.url.tableDeviceList, {params: {fatherName: data.name}}).then(res => {
          this.tableData = res.data
        })
      } else if (data.id !== undefined){
        this.$axios.get(this.$api.url.tableDeviceList, {params: {deviceId: data.id}}).then(res => {
          this.tableData = res.data
        })
      }
    },
    handlerDeptList() {
      this.towTree = []
      let val = 1
      if (this.radio1 === "false"){
        val = 2
      }
      this.$axios.get(this.$api.url.towTree, {params: {type: val, search_class: this.search_class}}).then(res => {
        this.towTree = res.data
      })
    },
    selectSearch() {
      this.tableData = []
      if (this.radio1 === 'false'){
        this.$axios.get(this.$api.url.tableDeviceList, {params: {type: 1, codeNameModel: this.codeNameModel}}).then(res => {
          this.tableData = res.data
        })
      } else if (this.radio1 === 'true') {
        this.$axios.get(this.$api.url.tableDeviceList, {params: {type: 2, codeNameModel: this.codeNameModel}}).then(res => {
          this.tableData = res.data
        })
      }
    },
    handleClick(index, datas, row) {
      this.$confirm('此操作将永久删除该设备, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$axios.delete(this.$api.url.deleteDevice,{params: {deviceId: row.id}}).then(res => {
          this.$message({
            message: res.message,
            type: 'success'
          });
          datas.splice(index, 1);
        }).catch(err => {
          this.$message({
            message: err.message,
            type: 'warning'
          });
        })
      })
    },
    remove(node, data) {
      this.$confirm('此操作将永久删除该设备, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        console.log(data)
        let val = '';
        if(data.id === undefined && data.children === undefined ) {
          this.$axios.delete(this.$api.url.deleteIdorFather,{params: {deviceFather: data.name}}).then(res => {
            if (res.code === 200){
              this.$message({
                message: res.message,
                type: 'success'
              });
              this.handlerDeptList()
              this.selectSearch()
            } else {
              this.$message({
                message: res.message,
                type: 'warning'
              });
            }
          })
        } else if (data.id !== undefined){
          this.$axios.delete(this.$api.url.deleteIdorFather,{params: {id: data.id}}).then(res => {
            if (res.code === 200){
              this.$message({
                message: res.message,
                type: 'success'
              });
              this.handlerDeptList()
              this.selectSearch()
            } else {
              this.$message({
                message: res.message,
                type: 'warning'
              });
            }
          })
        }
      })
    }
  },
  mounted() {
    // 初始化调用二级树
    this.twoTreeApi()
    // 初始化调用表格数据
    this.tableDataApi()
  },
  watch: {
    'ruleForm.rawInsProductId': { //监听banner
    'ruleForm.rawInsProductId': { //监听ruleForm.rawInsProductId
      handler: function (newVal, oldVal) {
        if (newVal != null && newVal !== ''){
          console.log("1222222222222")
          this.$axios.get(this.$api.url.selectDeviceInspectMessage,{params: {inspectId: newVal}}).then(res => {
            this.showCodeNameModel = res.data
          })
        }
      }
    },
    dialogVisible: {
      handler: function (newVal, oldVal) {
        if (newVal){
          // 成功清空输入内容
          this.ruleForm = {}
          this.value = ''
          this.showCodeNameModel = {}
          this.$refs.ruleForm.resetFields()
        }
      }
    },
    radio1: {
      handler: function (newVal, oldVal) {
        this.towTree = []
        this.tableData = []
        if (newVal === "true"){
          this.twoTreeApi()
          this.tableDataApi()
        } else if (newVal === "false") {
          this.$axios.get(this.$api.url.towTree, {params: {type: 2}}).then(res => {
            let list = res.data
            list.forEach(i => {
              if (i.name === undefined){
                i.name = i.children[0].name
                i.children = undefined
              }
            })
            this.towTree = res.data
          })
          this.$axios.get(this.$api.url.tableDeviceList, {params: {type: 2}}).then(res => {
            this.tableData = res.data
          })
        }
      }
    }
@@ -276,6 +568,33 @@
</script>
<style scoped>
.el-tag.el-tag {
  border-color: transparent;
  background-color: transparent;
}
.el-tag.el-tag:hover {
  border-color: transparent;
  background-color: transparent;
}
.el-form-item >>> .el-form-item__error {
  color: #F56C6C;
  font-size: 12px;
  line-height: 1;
  padding-top: 6px;
  position: absolute;
  top: 100%;
  left: 18px;
}
/deep/ .el-icon-arrow-left{
  display: flex;
  line-height: 60px !important;
  justify-content: center;
}
/deep/ .el-icon-arrow-right{
  display: flex;
  line-height: 60px !important;
  justify-content: center;
}
.top_left_name{
  padding-left: 20px;
  line-height: 32px;
@@ -330,6 +649,14 @@
  justify-content: space-between;
  font-size: 14px;
  padding-right: 8px;
  width: 250px;
}
.el-tree{
  width: 280px;
  margin: 0 10px;
}
.custom-tree-node span{
  font-size: 14px!important;
}
.el-icon-delete {
  display: none;