|  | @@ -0,0 +1,178 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div class="mutiple-bind-dialog-wrap">
 | 
	
		
			
				|  |  | +    <el-dialog title="选择设备" v-model="isShowDialog" width="90%">
 | 
	
		
			
				|  |  | +      <el-form :model="ruleForm" ref="formRef" :rules="rules" size="small" label-width="110px">
 | 
	
		
			
				|  |  | +        <el-form-item label="设备名称" prop="name">
 | 
	
		
			
				|  |  | +          <el-input v-model="tableData.param.name" placeholder="请输入设备名称" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
 | 
	
		
			
				|  |  | +          <el-button style="margin-left: 20px;" type="primary" @click="getDeviceList()">查询</el-button>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          <el-button style="margin-left: 20px;" :disabled="!deviceKeyList.length" type="danger" @click="confirmBind()">确定选择</el-button>
 | 
	
		
			
				|  |  | +        </el-form-item>
 | 
	
		
			
				|  |  | +      </el-form>
 | 
	
		
			
				|  |  | +      <el-table ref="multipleTable" :data="tableData.data" style="width: 100%" @selection-change="handleSelectionChange" v-loading="tableData.loading">
 | 
	
		
			
				|  |  | +        <el-table-column type="selection" width="55" align="center" />
 | 
	
		
			
				|  |  | +        <el-table-column label="标识" prop="key" width="130" :show-overflow-tooltip="true" v-col="'key'" />
 | 
	
		
			
				|  |  | +        <el-table-column label="设备名称" prop="name" :show-overflow-tooltip="true" v-col="'name'" />
 | 
	
		
			
				|  |  | +        <el-table-column label="产品名称" prop="productName" :show-overflow-tooltip="true" v-col="'productName'" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
 | 
	
		
			
				|  |  | +          <template #default="scope">
 | 
	
		
			
				|  |  | +            <el-tag type="info" size="small" v-if="scope.row.status == 1">离线</el-tag>
 | 
	
		
			
				|  |  | +            <el-tag type="success" size="small" v-if="scope.row.status == 2">在线</el-tag>
 | 
	
		
			
				|  |  | +            <el-tag type="info" size="small" v-if="scope.row.status == 0">未启用</el-tag>
 | 
	
		
			
				|  |  | +          </template>
 | 
	
		
			
				|  |  | +        </el-table-column>
 | 
	
		
			
				|  |  | +        <el-table-column prop="registryTime" label="激活时间" align="center" width="150" v-col="'registryTime'"></el-table-column>
 | 
	
		
			
				|  |  | +        <el-table-column prop="desc" label="说明" v-col="'desc'"></el-table-column>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      </el-table>
 | 
	
		
			
				|  |  | +      <pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="getDeviceList" />
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    </el-dialog>
 | 
	
		
			
				|  |  | +  </div>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +<script lang="ts">
 | 
	
		
			
				|  |  | +import { toRefs, reactive, defineComponent, nextTick, getCurrentInstance } from 'vue'
 | 
	
		
			
				|  |  | +import { ElMessageBox, ElMessage } from 'element-plus'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import 'vue3-json-viewer/dist/index.css'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import { useRoute } from 'vue-router'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import api from '/@/api/device'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +interface TableDataState {
 | 
	
		
			
				|  |  | +  isShowDialog: boolean,
 | 
	
		
			
				|  |  | +  productData: object[],
 | 
	
		
			
				|  |  | +  deviceKeyList: string[];
 | 
	
		
			
				|  |  | +  deviceIdList: string[];
 | 
	
		
			
				|  |  | +  deviceNameList: string[];
 | 
	
		
			
				|  |  | +  checkIdList: string[];
 | 
	
		
			
				|  |  | +  tableData: {
 | 
	
		
			
				|  |  | +    data: []
 | 
	
		
			
				|  |  | +    total: number
 | 
	
		
			
				|  |  | +    loading: boolean
 | 
	
		
			
				|  |  | +    param: {
 | 
	
		
			
				|  |  | +      pageNum: number
 | 
	
		
			
				|  |  | +      pageSize: number
 | 
	
		
			
				|  |  | +      name: string
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  ruleForm: {
 | 
	
		
			
				|  |  | +    productId: string | number
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  rules: {}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'DeviceBindDialog',
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  setup(prop, { emit }) {
 | 
	
		
			
				|  |  | +    const { proxy } = getCurrentInstance() as any;
 | 
	
		
			
				|  |  | +    const route = useRoute()
 | 
	
		
			
				|  |  | +    const state = reactive<TableDataState>({
 | 
	
		
			
				|  |  | +      deviceKeyList: [],
 | 
	
		
			
				|  |  | +      deviceIdList: [],
 | 
	
		
			
				|  |  | +      deviceNameList: [],
 | 
	
		
			
				|  |  | +      isShowDialog: false,
 | 
	
		
			
				|  |  | +      productData: [],
 | 
	
		
			
				|  |  | +      checkIdList: [],
 | 
	
		
			
				|  |  | +      tableData: {
 | 
	
		
			
				|  |  | +        data: [],
 | 
	
		
			
				|  |  | +        total: 0,
 | 
	
		
			
				|  |  | +        loading: false,
 | 
	
		
			
				|  |  | +        param: {
 | 
	
		
			
				|  |  | +          pageNum: 1,
 | 
	
		
			
				|  |  | +          pageSize: 10,
 | 
	
		
			
				|  |  | +          name: '',
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      ruleForm: {
 | 
	
		
			
				|  |  | +        productId: ''
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      rules: {
 | 
	
		
			
				|  |  | +        productId: [{ required: true, message: '所属产品不能为空', trigger: 'blur' }],
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const getDeviceList = () => {
 | 
	
		
			
				|  |  | +      if (!state.ruleForm.productId) {
 | 
	
		
			
				|  |  | +        state.tableData.data = [];
 | 
	
		
			
				|  |  | +        state.tableData.total = 0;
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      state.tableData.loading = true;
 | 
	
		
			
				|  |  | +      api.instance.getList(state.tableData.param).then((res: any) => {
 | 
	
		
			
				|  |  | +        state.tableData.data = res.device;
 | 
	
		
			
				|  |  | +        state.tableData.total = res.total;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        changeSelect();
 | 
	
		
			
				|  |  | +      }).finally(() => (state.tableData.loading = false));
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const getProductList = () => {
 | 
	
		
			
				|  |  | +      api.product.getSubList().then((res: any) => {
 | 
	
		
			
				|  |  | +        let productDataList = res.product
 | 
	
		
			
				|  |  | +        state.productData = productDataList;
 | 
	
		
			
				|  |  | +        state.ruleForm.productId = state.productData[0].id
 | 
	
		
			
				|  |  | +        getDeviceList()
 | 
	
		
			
				|  |  | +        state.isShowDialog = true;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const openDialog = (checkIdData: any) => {
 | 
	
		
			
				|  |  | +      state.checkIdList = checkIdData;
 | 
	
		
			
				|  |  | +      getProductList()
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 多选框选中数据
 | 
	
		
			
				|  |  | +    const handleSelectionChange = (selection: any[]) => {
 | 
	
		
			
				|  |  | +      state.deviceKeyList = selection.map((item) => item.key);
 | 
	
		
			
				|  |  | +      state.deviceIdList = selection.map((item) => item.id);
 | 
	
		
			
				|  |  | +      state.deviceNameList = selection.map((item) => item.name);
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const confirmBind = () => {
 | 
	
		
			
				|  |  | +      let msg = '是否确定选择设备?';
 | 
	
		
			
				|  |  | +      if (state.deviceKeyList.length === 0) {
 | 
	
		
			
				|  |  | +        ElMessage.error('请选择要确定绑定的数据。');
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      ElMessageBox.confirm(msg, '提示', {
 | 
	
		
			
				|  |  | +        confirmButtonText: '确认',
 | 
	
		
			
				|  |  | +        cancelButtonText: '取消',
 | 
	
		
			
				|  |  | +        type: 'warning',
 | 
	
		
			
				|  |  | +      }).then(() => {
 | 
	
		
			
				|  |  | +        emit('bindSuccess', state.deviceIdList, state.deviceNameList)
 | 
	
		
			
				|  |  | +        state.isShowDialog = false;
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const handleChange = (productId: number) => {
 | 
	
		
			
				|  |  | +      state.ruleForm.productId = productId;
 | 
	
		
			
				|  |  | +      getDeviceList()
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const changeSelect = () => {
 | 
	
		
			
				|  |  | +      nextTick(() => {
 | 
	
		
			
				|  |  | +        state.tableData.data.forEach((item) => {
 | 
	
		
			
				|  |  | +          if (state.checkIdList.includes(item.id)) {
 | 
	
		
			
				|  |  | +            proxy.$refs.multipleTable.toggleRowSelection(item, true);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      openDialog,
 | 
	
		
			
				|  |  | +      getProductList,
 | 
	
		
			
				|  |  | +      confirmBind,
 | 
	
		
			
				|  |  | +      getDeviceList,
 | 
	
		
			
				|  |  | +      handleSelectionChange,
 | 
	
		
			
				|  |  | +      handleChange,
 | 
	
		
			
				|  |  | +      ...toRefs(state),
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 |