liding
10 天以前 bf0d5e47a21816c440a2850299c8af60d58d1f25
lims模块
已添加10个文件
2917 ■■■■■ 文件已修改
src/api/lims/dataCollection.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lims/dataInterface.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lims/experiment.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lims/realtimeMonitor.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lims/sample.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/lims/dataCollection/index.vue 561 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/lims/dataInterfaceManagement/index.vue 479 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/lims/experimentManagement/index.vue 526 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/lims/realtimeMonitor/index.vue 582 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/lims/sampleManagement/index.vue 539 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lims/dataCollection.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
// æ•°æ®é‡‡é›†ä¸Žå¤„理页面接口
import request from '@/utils/request'
// åˆ†é¡µæŸ¥è¯¢æ•°æ®é‡‡é›†
export function listDataCollection(query) {
    return request({
        url: '/lims/dataCollection/listPage',
        method: 'get',
        params: query
    })
}
// æŸ¥è¯¢æ•°æ®é‡‡é›†è¯¦ç»†
export function getDataCollection(id) {
    return request({
        url: '/lims/dataCollection/' + id,
        method: 'get'
    })
}
// æ–°å¢žæ•°æ®é‡‡é›†
export function addDataCollection(data) {
    return request({
        url: '/lims/dataCollection/add',
        method: 'post',
        data: data
    })
}
// ä¿®æ”¹æ•°æ®é‡‡é›†
export function updateDataCollection(data) {
    return request({
        url: '/lims/dataCollection/update',
        method: 'post',
        data: data
    })
}
// åˆ é™¤æ•°æ®é‡‡é›†
export function delDataCollection(ids) {
    return request({
        url: '/lims/dataCollection/delete',
        method: 'delete',
        data: ids
    })
}
src/api/lims/dataInterface.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
// æ•°æ®æŽ¥å£ç®¡ç†é¡µé¢æŽ¥å£
import request from '@/utils/request'
// åˆ†é¡µæŸ¥è¯¢æ•°æ®æŽ¥å£
export function listDataInterface(query) {
    return request({
        url: '/lims/dataInterface/listPage',
        method: 'get',
        params: query
    })
}
// æŸ¥è¯¢æ•°æ®æŽ¥å£è¯¦ç»†
export function getDataInterface(id) {
    return request({
        url: '/lims/dataInterface/' + id,
        method: 'get'
    })
}
// æ–°å¢žæ•°æ®æŽ¥å£
export function addDataInterface(data) {
    return request({
        url: '/lims/dataInterface/add',
        method: 'post',
        data: data
    })
}
// ä¿®æ”¹æ•°æ®æŽ¥å£
export function updateDataInterface(data) {
    return request({
        url: '/lims/dataInterface/update',
        method: 'post',
        data: data
    })
}
// åˆ é™¤æ•°æ®æŽ¥å£
export function delDataInterface(ids) {
    return request({
        url: '/lims/dataInterface/delete',
        method: 'delete',
        data: ids
    })
}
src/api/lims/experiment.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
// å®žéªŒç®¡ç†é¡µé¢æŽ¥å£
import request from '@/utils/request'
// åˆ†é¡µæŸ¥è¯¢å®žéªŒ
export function listExperiment(query) {
    return request({
        url: '/lims/experiment/listPage',
        method: 'get',
        params: query
    })
}
// æŸ¥è¯¢å®žéªŒè¯¦ç»†
export function getExperiment(id) {
    return request({
        url: '/lims/experiment/' + id,
        method: 'get'
    })
}
// æ–°å¢žå®žéªŒ
export function addExperiment(data) {
    return request({
        url: '/lims/experiment/add',
        method: 'post',
        data: data
    })
}
// ä¿®æ”¹å®žéªŒ
export function updateExperiment(data) {
    return request({
        url: '/lims/experiment/update',
        method: 'post',
        data: data
    })
}
// åˆ é™¤å®žéªŒ
export function delExperiment(ids) {
    return request({
        url: '/lims/experiment/delete',
        method: 'delete',
        data: ids
    })
}
src/api/lims/realtimeMonitor.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
// å®žæ—¶ç›‘控与预警页面接口
import request from '@/utils/request'
// åˆ†é¡µæŸ¥è¯¢ç›‘控数据
export function listRealtimeMonitor(query) {
    return request({
        url: '/lims/realtimeMonitor/listPage',
        method: 'get',
        params: query
    })
}
// æŸ¥è¯¢ç›‘控数据详细
export function getRealtimeMonitor(id) {
    return request({
        url: '/lims/realtimeMonitor/' + id,
        method: 'get'
    })
}
// æ–°å¢žç›‘控数据
export function addRealtimeMonitor(data) {
    return request({
        url: '/lims/realtimeMonitor/add',
        method: 'post',
        data: data
    })
}
// ä¿®æ”¹ç›‘控数据
export function updateRealtimeMonitor(data) {
    return request({
        url: '/lims/realtimeMonitor/update',
        method: 'post',
        data: data
    })
}
// åˆ é™¤ç›‘控数据
export function delRealtimeMonitor(ids) {
    return request({
        url: '/lims/realtimeMonitor/delete',
        method: 'delete',
        data: ids
    })
}
src/api/lims/sample.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
// æ ·å“ç®¡ç†é¡µé¢æŽ¥å£
import request from '@/utils/request'
// åˆ†é¡µæŸ¥è¯¢æ ·å“
export function listSample(query) {
    return request({
        url: '/lims/sample/listPage',
        method: 'get',
        params: query
    })
}
// æŸ¥è¯¢æ ·å“è¯¦ç»†
export function getSample(id) {
    return request({
        url: '/lims/sample/' + id,
        method: 'get'
    })
}
// æ–°å¢žæ ·å“
export function addSample(data) {
    return request({
        url: '/lims/sample/add',
        method: 'post',
        data: data
    })
}
// ä¿®æ”¹æ ·å“
export function updateSample(data) {
    return request({
        url: '/lims/sample/update',
        method: 'post',
        data: data
    })
}
// åˆ é™¤æ ·å“
export function delSample(ids) {
    return request({
        url: '/lims/sample/delete',
        method: 'delete',
        data: ids
    })
}
src/views/lims/dataCollection/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,561 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">采集编号:</span>
        <el-input
          v-model="searchForm.collectionCode"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 20px">设备名称:</span>
        <el-input
          v-model="searchForm.deviceName"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
        />
        <span class="search_title" style="margin-left: 20px">采集状态:</span>
        <el-select
          v-model="searchForm.collectionStatus"
          style="width: 150px"
          placeholder="请选择"
          clearable
          @change="handleQuery"
        >
          <el-option label="采集中" value="collecting" />
          <el-option label="处理中" value="processing" />
          <el-option label="已完成" value="completed" />
          <el-option label="失败" value="failed" />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增采集</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
        @selection-change="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
      ></PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增数据采集' : '编辑数据采集'"
      width="70%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="采集编号:" prop="collectionCode">
              <el-input
                v-model="form.collectionCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备名称:" prop="deviceName">
              <el-input
                v-model="form.deviceName"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="设备编号:" prop="deviceCode">
              <el-input
                v-model="form.deviceCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="数据类型:" prop="dataType">
              <el-select
                v-model="form.dataType"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="温度" value="temperature" />
                <el-option label="湿度" value="humidity" />
                <el-option label="压力" value="pressure" />
                <el-option label="流量" value="flow" />
                <el-option label="浓度" value="concentration" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="采集数值:" prop="collectionValue">
              <el-input
                v-model="form.collectionValue"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计量单位:" prop="unit">
              <el-select
                v-model="form.unit"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="摄氏度(°C)" value="celsius" />
                <el-option label="百分比(%)" value="percent" />
                <el-option label="帕斯卡(Pa)" value="pa" />
                <el-option label="升/分钟(L/min)" value="lmin" />
                <el-option label="毫克/升(mg/L)" value="mgl" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="采集时间:" prop="collectionTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.collectionTime"
                value-format="YYYY-MM-DD HH:mm:ss"
                format="YYYY-MM-DD HH:mm:ss"
                type="datetime"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="采集状态:" prop="collectionStatus">
              <el-select
                v-model="form.collectionStatus"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="采集中" value="collecting" />
                <el-option label="处理中" value="processing" />
                <el-option label="已完成" value="completed" />
                <el-option label="失败" value="failed" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="数据质量:" prop="dataQuality">
              <el-select
                v-model="form.dataQuality"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="合格" value="qualified" />
                <el-option label="异常" value="abnormal" />
                <el-option label="待校验" value="pending" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="处理方式:" prop="processMethod">
              <el-select
                v-model="form.processMethod"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="自动清洗" value="autoClean" />
                <el-option label="人工校验" value="manualVerify" />
                <el-option label="数据转换" value="dataTransform" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="原始数据:" prop="rawData">
              <el-input
                v-model="form.rawData"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="处理后数据:" prop="processedData">
              <el-input
                v-model="form.processedData"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="备注:" prop="remark">
              <el-input
                v-model="form.remark"
                type="textarea"
                :rows="2"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="维护人:" prop="maintainer">
              <el-select
                v-model="form.maintainer"
                placeholder="请选择"
                clearable
                disabled
              >
                <el-option
                  v-for="item in userList"
                  :key="item.nickName"
                  :label="item.nickName"
                  :value="item.nickName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="维护时间:" prop="maintenanceTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.maintenanceTime"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { onMounted, ref, reactive } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  addDataCollection,
  delDataCollection,
  getDataCollection,
  listDataCollection,
  updateDataCollection,
} from "@/api/lims/dataCollection.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const tableColumn = ref([
  {
    label: "采集编号",
    prop: "collectionCode",
    width: 150,
  },
  {
    label: "设备名称",
    prop: "deviceName",
    width: 180,
  },
  {
    label: "设备编号",
    prop: "deviceCode",
    width: 150,
  },
  {
    label: "数据类型",
    prop: "dataType",
    width: 120,
  },
  {
    label: "采集数值",
    prop: "collectionValue",
    width: 120,
  },
  {
    label: "单位",
    prop: "unit",
    width: 80,
  },
  {
    label: "采集时间",
    prop: "collectionTime",
    width: 180,
  },
  {
    label: "采集状态",
    prop: "collectionStatus",
    width: 100,
  },
  {
    label: "数据质量",
    prop: "dataQuality",
    width: 100,
  },
  {
    label: "处理方式",
    prop: "processMethod",
    width: 120,
  },
  {
    label: "维护人",
    prop: "maintainer",
  },
  {
    label: "维护时间",
    prop: "maintenanceTime",
    width: 100,
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
        name: "编辑",
        type: "text",
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => {
          return row.maintainer !== userStore.nickName
        }
      },
    ],
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
  total: 0,
});
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    collectionCode: "",
    deviceName: "",
    collectionStatus: "",
  },
  form: {
    collectionCode: "",
    deviceName: "",
    deviceCode: "",
    dataType: "",
    collectionValue: "",
    unit: "",
    collectionTime: "",
    collectionStatus: "collecting",
    dataQuality: "",
    processMethod: "",
    rawData: "",
    processedData: "",
    remark: "",
    maintainer: "",
    maintenanceTime: "",
  },
  rules: {
    collectionCode: [{ required: true, message: "请输入", trigger: "blur" }],
    deviceName: [{ required: true, message: "请输入", trigger: "blur" }],
    deviceCode: [{ required: true, message: "请输入", trigger: "blur" }],
    dataType: [{ required: true, message: "请选择", trigger: "change" }],
    collectionValue: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请选择", trigger: "change" }],
    collectionTime: [{ required: true, message: "请选择", trigger: "change" }],
    collectionStatus: [{ required: true, message: "请选择", trigger: "change" }],
    dataQuality: [{ required: true, message: "请选择", trigger: "change" }],
    processMethod: [{ required: true, message: "请选择", trigger: "change" }],
    maintainer: [{ required: false, message: "请选择", trigger: "change" }],
    maintenanceTime: [
      { required: false, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm, form, rules } = toRefs(data);
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  listDataCollection({ ...searchForm.value, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    page.total = res.data.total;
  });
};
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
const openForm = (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainer = userStore.nickName;
  form.value.collectionStatus = "collecting";
  form.value.maintenanceTime = getCurrentDate();
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    getDataCollection(row.id).then((res) => {
      form.value = { ...res.data };
    });
  }
  dialogFormVisible.value = true;
};
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
const submitAdd = () => {
  addDataCollection(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
const submitEdit = () => {
  updateDataCollection(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/lims/dataCollection/export", {}, "数据采集与处理.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
    if (unauthorizedData.length > 0) {
      proxy.$modal.msgWarning("不可删除他人维护的数据");
      return;
    }
    ids = selectedRows.value.map((item) => item.id);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delDataCollection(ids)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
src/views/lims/dataInterfaceManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,479 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">接口名称:</span>
        <el-input
          v-model="searchForm.interfaceName"
          style="width: 240px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 20px">设备类型:</span>
        <el-select
          v-model="searchForm.deviceType"
          style="width: 200px"
          placeholder="请选择"
          clearable
          @change="handleQuery"
        >
          <el-option label="仪器仪表" value="instrument" />
          <el-option label="软件系统" value="software" />
          <el-option label="传感器" value="sensor" />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增接口</el-button>
        <!-- <el-button @click="handleOut">导出</el-button> -->
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
        @selection-change="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
      ></PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增数据接口' : '编辑数据接口'"
      width="70%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="接口名称:" prop="interfaceName">
              <el-input
                v-model="form.interfaceName"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="接口编码:" prop="interfaceCode">
              <el-input
                v-model="form.interfaceCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="设备类型:" prop="deviceType">
              <el-select
                v-model="form.deviceType"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="仪器仪表" value="instrument" />
                <el-option label="软件系统" value="software" />
                <el-option label="传感器" value="sensor" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备名称:" prop="deviceName">
              <el-input
                v-model="form.deviceName"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="连接协议:" prop="protocol">
              <el-select
                v-model="form.protocol"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="HTTP" value="http" />
                <el-option label="TCP" value="tcp" />
                <el-option label="MQTT" value="mqtt" />
                <el-option label="Modbus" value="modbus" />
                <el-option label="OPC UA" value="opcua" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="连接地址:" prop="connectionUrl">
              <el-input
                v-model="form.connectionUrl"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="端口号:" prop="port">
              <el-input
                v-model="form.port"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="接口状态:" prop="status">
              <el-radio-group v-model="form.status">
                <el-radio label="1">启用</el-radio>
                <el-radio label="0">禁用</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="接口描述:" prop="description">
              <el-input
                v-model="form.description"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="维护人:" prop="maintainer">
              <el-select
                v-model="form.maintainer"
                placeholder="请选择"
                clearable
                disabled
              >
                <el-option
                  v-for="item in userList"
                  :key="item.nickName"
                  :label="item.nickName"
                  :value="item.nickName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="维护时间:" prop="maintenanceTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.maintenanceTime"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { onMounted, ref, reactive } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  addDataInterface,
  delDataInterface,
  getDataInterface,
  listDataInterface,
  updateDataInterface,
} from "@/api/lims/dataInterface.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const tableColumn = ref([
  {
    label: "接口名称",
    prop: "interfaceName",
    width: 200,
  },
  {
    label: "接口编码",
    prop: "interfaceCode",
    width: 150,
  },
  {
    label: "设备类型",
    prop: "deviceType",
    width: 120,
  },
  {
    label: "设备名称",
    prop: "deviceName",
    width: 180,
  },
  {
    label: "连接协议",
    prop: "protocol",
    width: 120,
  },
  {
    label: "连接地址",
    prop: "connectionUrl",
    width: 220,
  },
  {
    label: "端口号",
    prop: "port",
    width: 100,
  },
  {
    label: "接口状态",
    prop: "status",
    width: 100,
  },
  {
    label: "维护人",
    prop: "maintainer",
  },
  {
    label: "维护时间",
    prop: "maintenanceTime",
    width: 100,
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
        name: "编辑",
        type: "text",
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => {
          return row.maintainer !== userStore.nickName
        }
      },
    ],
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
  total: 0,
});
// æ•°æ®æŽ¥å£è¡¨å•弹框数据
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    interfaceName: "",
    deviceType: "",
  },
  form: {
    interfaceName: "",
    interfaceCode: "",
    deviceType: "",
    deviceName: "",
    protocol: "",
    connectionUrl: "",
    port: "",
    status: "1",
    description: "",
    maintainer: "",
    maintenanceTime: "",
  },
  rules: {
    interfaceName: [{ required: true, message: "请输入", trigger: "blur" }],
    interfaceCode: [{ required: true, message: "请输入", trigger: "blur" }],
    deviceType: [{ required: true, message: "请选择", trigger: "change" }],
    deviceName: [{ required: true, message: "请输入", trigger: "blur" }],
    protocol: [{ required: true, message: "请选择", trigger: "change" }],
    connectionUrl: [{ required: true, message: "请输入", trigger: "blur" }],
    port: [{ required: true, message: "请输入", trigger: "blur" }],
    status: [{ required: true, message: "请选择", trigger: "change" }],
    maintainer: [{ required: false, message: "请选择", trigger: "change" }],
    maintenanceTime: [
      { required: false, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm, form, rules } = toRefs(data);
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  listDataInterface({ ...searchForm.value, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    page.total = res.data.total;
  });
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
// æ‰“开弹框
const openForm = (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainer = userStore.nickName;
  form.value.status = "1";
  form.value.maintenanceTime = getCurrentDate();
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    getDataInterface(row.id).then((res) => {
      form.value = { ...res.data };
    });
  }
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
// æäº¤æ–°å¢ž
const submitAdd = () => {
  addDataInterface(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// æäº¤ä¿®æ”¹
const submitEdit = () => {
  updateDataInterface(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
// å¯¼å‡º
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/lims/dataInterface/export", {}, "数据接口管理.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// åˆ é™¤
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    // æ£€æŸ¥æ˜¯å¦æœ‰ä»–人维护的数据
    const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
    if (unauthorizedData.length > 0) {
      proxy.$modal.msgWarning("不可删除他人维护的数据");
      return;
    }
    ids = selectedRows.value.map((item) => item.id);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delDataInterface(ids)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// èŽ·å–å½“å‰æ—¥æœŸå¹¶æ ¼å¼åŒ–ä¸º YYYY-MM-DD
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
src/views/lims/experimentManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,526 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">实验编号:</span>
        <el-input
          v-model="searchForm.experimentCode"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 20px">实验名称:</span>
        <el-input
          v-model="searchForm.experimentName"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
        />
        <span class="search_title" style="margin-left: 20px">实验状态:</span>
        <el-select
          v-model="searchForm.experimentStatus"
          style="width: 150px"
          placeholder="请选择"
          clearable
          @change="handleQuery"
        >
          <el-option label="计划中" value="planned" />
          <el-option label="进行中" value="inProgress" />
          <el-option label="已完成" value="completed" />
          <el-option label="已取消" value="cancelled" />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增实验</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
        @selection-change="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
      ></PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增实验' : '编辑实验'"
      width="70%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="实验编号:" prop="experimentCode">
              <el-input
                v-model="form.experimentCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="实验名称:" prop="experimentName">
              <el-input
                v-model="form.experimentName"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="实验类型:" prop="experimentType">
              <el-select
                v-model="form.experimentType"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="化学分析" value="chemicalAnalysis" />
                <el-option label="物理测试" value="physicalTest" />
                <el-option label="微生物检测" value="microbialTest" />
                <el-option label="性能测试" value="performanceTest" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="实验标准:" prop="experimentStandard">
              <el-input
                v-model="form.experimentStandard"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="计划开始日期:" prop="planStartDate">
              <el-date-picker
                style="width: 100%"
                v-model="form.planStartDate"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划结束日期:" prop="planEndDate">
              <el-date-picker
                style="width: 100%"
                v-model="form.planEndDate"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="实验负责人:" prop="responsiblePerson">
              <el-input
                v-model="form.responsiblePerson"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="实验状态:" prop="experimentStatus">
              <el-select
                v-model="form.experimentStatus"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="计划中" value="planned" />
                <el-option label="进行中" value="inProgress" />
                <el-option label="已完成" value="completed" />
                <el-option label="已取消" value="cancelled" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="实验目的:" prop="experimentPurpose">
              <el-input
                v-model="form.experimentPurpose"
                type="textarea"
                :rows="2"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="实验过程:" prop="experimentProcess">
              <el-input
                v-model="form.experimentProcess"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="实验结果:" prop="experimentResult">
              <el-input
                v-model="form.experimentResult"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="维护人:" prop="maintainer">
              <el-select
                v-model="form.maintainer"
                placeholder="请选择"
                clearable
                disabled
              >
                <el-option
                  v-for="item in userList"
                  :key="item.nickName"
                  :label="item.nickName"
                  :value="item.nickName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="维护时间:" prop="maintenanceTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.maintenanceTime"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { onMounted, ref, reactive } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  addExperiment,
  delExperiment,
  getExperiment,
  listExperiment,
  updateExperiment,
} from "@/api/lims/experiment.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const tableColumn = ref([
  {
    label: "实验编号",
    prop: "experimentCode",
    width: 150,
  },
  {
    label: "实验名称",
    prop: "experimentName",
    width: 180,
  },
  {
    label: "实验类型",
    prop: "experimentType",
    width: 120,
  },
  {
    label: "实验标准",
    prop: "experimentStandard",
    width: 150,
  },
  {
    label: "计划开始日期",
    prop: "planStartDate",
    width: 120,
  },
  {
    label: "计划结束日期",
    prop: "planEndDate",
    width: 120,
  },
  {
    label: "实验负责人",
    prop: "responsiblePerson",
    width: 120,
  },
  {
    label: "实验状态",
    prop: "experimentStatus",
    width: 100,
  },
  {
    label: "维护人",
    prop: "maintainer",
  },
  {
    label: "维护时间",
    prop: "maintenanceTime",
    width: 100,
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
        name: "编辑",
        type: "text",
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => {
          return row.maintainer !== userStore.nickName
        }
      },
    ],
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
  total: 0,
});
// å®žéªŒè¡¨å•弹框数据
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    experimentCode: "",
    experimentName: "",
    experimentStatus: "",
  },
  form: {
    experimentCode: "",
    experimentName: "",
    experimentType: "",
    experimentStandard: "",
    planStartDate: "",
    planEndDate: "",
    responsiblePerson: "",
    experimentStatus: "planned",
    experimentPurpose: "",
    experimentProcess: "",
    experimentResult: "",
    maintainer: "",
    maintenanceTime: "",
  },
  rules: {
    experimentCode: [{ required: true, message: "请输入", trigger: "blur" }],
    experimentName: [{ required: true, message: "请输入", trigger: "blur" }],
    experimentType: [{ required: true, message: "请选择", trigger: "change" }],
    experimentStandard: [{ required: true, message: "请输入", trigger: "blur" }],
    planStartDate: [{ required: true, message: "请选择", trigger: "change" }],
    planEndDate: [{ required: true, message: "请选择", trigger: "change" }],
    responsiblePerson: [{ required: true, message: "请输入", trigger: "blur" }],
    experimentStatus: [{ required: true, message: "请选择", trigger: "change" }],
    maintainer: [{ required: false, message: "请选择", trigger: "change" }],
    maintenanceTime: [
      { required: false, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm, form, rules } = toRefs(data);
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  listExperiment({ ...searchForm.value, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    page.total = res.data.total;
  });
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
// æ‰“开弹框
const openForm = (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainer = userStore.nickName;
  form.value.experimentStatus = "planned";
  form.value.maintenanceTime = getCurrentDate();
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    getExperiment(row.id).then((res) => {
      form.value = { ...res.data };
    });
  }
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
// æäº¤æ–°å¢ž
const submitAdd = () => {
  addExperiment(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// æäº¤ä¿®æ”¹
const submitEdit = () => {
  updateExperiment(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
// å¯¼å‡º
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/lims/experiment/export", {}, "实验管理.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// åˆ é™¤
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    // æ£€æŸ¥æ˜¯å¦æœ‰ä»–人维护的数据
    const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
    if (unauthorizedData.length > 0) {
      proxy.$modal.msgWarning("不可删除他人维护的数据");
      return;
    }
    ids = selectedRows.value.map((item) => item.id);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delExperiment(ids)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// èŽ·å–å½“å‰æ—¥æœŸå¹¶æ ¼å¼åŒ–ä¸º YYYY-MM-DD
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
src/views/lims/realtimeMonitor/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,582 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">监控编号:</span>
        <el-input
          v-model="searchForm.monitorCode"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 20px">监控对象:</span>
        <el-input
          v-model="searchForm.monitorTarget"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
        />
        <span class="search_title" style="margin-left: 20px">预警状态:</span>
        <el-select
          v-model="searchForm.alertStatus"
          style="width: 150px"
          placeholder="请选择"
          clearable
          @change="handleQuery"
        >
          <el-option label="正常" value="normal" />
          <el-option label="预警" value="warning" />
          <el-option label="告警" value="alert" />
          <el-option label="已处理" value="resolved" />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增监控</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
        @selection-change="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
      ></PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增实时监控' : '编辑实时监控'"
      width="70%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="监控编号:" prop="monitorCode">
              <el-input
                v-model="form.monitorCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="监控对象:" prop="monitorTarget">
              <el-input
                v-model="form.monitorTarget"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="监控类型:" prop="monitorType">
              <el-select
                v-model="form.monitorType"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="温度监控" value="temperature" />
                <el-option label="湿度监控" value="humidity" />
                <el-option label="压力监控" value="pressure" />
                <el-option label="设备状态" value="equipment" />
                <el-option label="实验过程" value="experiment" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="监控指标:" prop="monitorIndicator">
              <el-input
                v-model="form.monitorIndicator"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="当前数值:" prop="currentValue">
              <el-input
                v-model="form.currentValue"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计量单位:" prop="unit">
              <el-select
                v-model="form.unit"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="摄氏度(°C)" value="celsius" />
                <el-option label="百分比(%)" value="percent" />
                <el-option label="帕斯卡(Pa)" value="pa" />
                <el-option label="转/分钟(rpm)" value="rpm" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="上限阈值:" prop="upperLimit">
              <el-input
                v-model="form.upperLimit"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="下限阈值:" prop="lowerLimit">
              <el-input
                v-model="form.lowerLimit"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="预警状态:" prop="alertStatus">
              <el-select
                v-model="form.alertStatus"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="正常" value="normal" />
                <el-option label="预警" value="warning" />
                <el-option label="告警" value="alert" />
                <el-option label="已处理" value="resolved" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="预警级别:" prop="alertLevel">
              <el-select
                v-model="form.alertLevel"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="一般" value="low" />
                <el-option label="重要" value="medium" />
                <el-option label="紧急" value="high" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="监控时间:" prop="monitorTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.monitorTime"
                value-format="YYYY-MM-DD HH:mm:ss"
                format="YYYY-MM-DD HH:mm:ss"
                type="datetime"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="处理人:" prop="handler">
              <el-input
                v-model="form.handler"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="预警描述:" prop="alertDescription">
              <el-input
                v-model="form.alertDescription"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="处理措施:" prop="handleMeasure">
              <el-input
                v-model="form.handleMeasure"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="备注:" prop="remark">
              <el-input
                v-model="form.remark"
                type="textarea"
                :rows="2"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="维护人:" prop="maintainer">
              <el-select
                v-model="form.maintainer"
                placeholder="请选择"
                clearable
                disabled
              >
                <el-option
                  v-for="item in userList"
                  :key="item.nickName"
                  :label="item.nickName"
                  :value="item.nickName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="维护时间:" prop="maintenanceTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.maintenanceTime"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { onMounted, ref, reactive } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  addRealtimeMonitor,
  delRealtimeMonitor,
  getRealtimeMonitor,
  listRealtimeMonitor,
  updateRealtimeMonitor,
} from "@/api/lims/realtimeMonitor.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const tableColumn = ref([
  {
    label: "监控编号",
    prop: "monitorCode",
    width: 150,
  },
  {
    label: "监控对象",
    prop: "monitorTarget",
    width: 180,
  },
  {
    label: "监控类型",
    prop: "monitorType",
    width: 120,
  },
  {
    label: "监控指标",
    prop: "monitorIndicator",
    width: 150,
  },
  {
    label: "当前数值",
    prop: "currentValue",
    width: 100,
  },
  {
    label: "单位",
    prop: "unit",
    width: 80,
  },
  {
    label: "上限阈值",
    prop: "upperLimit",
    width: 100,
  },
  {
    label: "下限阈值",
    prop: "lowerLimit",
    width: 100,
  },
  {
    label: "预警状态",
    prop: "alertStatus",
    width: 100,
  },
  {
    label: "预警级别",
    prop: "alertLevel",
    width: 100,
  },
  {
    label: "监控时间",
    prop: "monitorTime",
    width: 180,
  },
  {
    label: "维护人",
    prop: "maintainer",
  },
  {
    label: "维护时间",
    prop: "maintenanceTime",
    width: 100,
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
        name: "编辑",
        type: "text",
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => {
          return row.maintainer !== userStore.nickName
        }
      },
    ],
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
  total: 0,
});
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    monitorCode: "",
    monitorTarget: "",
    alertStatus: "",
  },
  form: {
    monitorCode: "",
    monitorTarget: "",
    monitorType: "",
    monitorIndicator: "",
    currentValue: "",
    unit: "",
    upperLimit: "",
    lowerLimit: "",
    alertStatus: "normal",
    alertLevel: "",
    monitorTime: "",
    alertDescription: "",
    handler: "",
    handleMeasure: "",
    remark: "",
    maintainer: "",
    maintenanceTime: "",
  },
  rules: {
    monitorCode: [{ required: true, message: "请输入", trigger: "blur" }],
    monitorTarget: [{ required: true, message: "请输入", trigger: "blur" }],
    monitorType: [{ required: true, message: "请选择", trigger: "change" }],
    monitorIndicator: [{ required: true, message: "请输入", trigger: "blur" }],
    currentValue: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请选择", trigger: "change" }],
    upperLimit: [{ required: true, message: "请输入", trigger: "blur" }],
    lowerLimit: [{ required: true, message: "请输入", trigger: "blur" }],
    alertStatus: [{ required: true, message: "请选择", trigger: "change" }],
    monitorTime: [{ required: true, message: "请选择", trigger: "change" }],
    maintainer: [{ required: false, message: "请选择", trigger: "change" }],
    maintenanceTime: [
      { required: false, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm, form, rules } = toRefs(data);
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  listRealtimeMonitor({ ...searchForm.value, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    page.total = res.data.total;
  });
};
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
const openForm = (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainer = userStore.nickName;
  form.value.alertStatus = "normal";
  form.value.maintenanceTime = getCurrentDate();
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    getRealtimeMonitor(row.id).then((res) => {
      form.value = { ...res.data };
    });
  }
  dialogFormVisible.value = true;
};
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
const submitAdd = () => {
  addRealtimeMonitor(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
const submitEdit = () => {
  updateRealtimeMonitor(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/lims/realtimeMonitor/export", {}, "实时监控与预警.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
    if (unauthorizedData.length > 0) {
      proxy.$modal.msgWarning("不可删除他人维护的数据");
      return;
    }
    ids = selectedRows.value.map((item) => item.id);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delRealtimeMonitor(ids)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>
src/views/lims/sampleManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,539 @@
<template>
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title">样品编号:</span>
        <el-input
          v-model="searchForm.sampleCode"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
        <span class="search_title" style="margin-left: 20px">样品名称:</span>
        <el-input
          v-model="searchForm.sampleName"
          style="width: 200px"
          placeholder="请输入"
          @change="handleQuery"
          clearable
        />
        <span class="search_title" style="margin-left: 20px">样品状态:</span>
        <el-select
          v-model="searchForm.sampleStatus"
          style="width: 150px"
          placeholder="请选择"
          clearable
          @change="handleQuery"
        >
          <el-option label="在库" value="inStock" />
          <el-option label="出库" value="outStock" />
          <el-option label="检测中" value="testing" />
          <el-option label="已销毁" value="destroyed" />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增样品</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
    </div>
    <div class="table_list">
      <PIMTable
        rowKey="id"
        :column="tableColumn"
        :tableData="tableData"
        :page="page"
        :isSelection="true"
        @selection-change="handleSelectionChange"
        :tableLoading="tableLoading"
        @pagination="pagination"
      ></PIMTable>
    </div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增样品' : '编辑样品'"
      width="70%"
      @close="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="样品编号:" prop="sampleCode">
              <el-input
                v-model="form.sampleCode"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="样品名称:" prop="sampleName">
              <el-input
                v-model="form.sampleName"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="样品类型:" prop="sampleType">
              <el-select
                v-model="form.sampleType"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="原料" value="rawMaterial" />
                <el-option label="半成品" value="semiFinished" />
                <el-option label="成品" value="finishedProduct" />
                <el-option label="留样" value="retainedSample" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="样品规格:" prop="specification">
              <el-input
                v-model="form.specification"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="入库日期:" prop="inStockDate">
              <el-date-picker
                style="width: 100%"
                v-model="form.inStockDate"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="存储位置:" prop="storageLocation">
              <el-input
                v-model="form.storageLocation"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="样品数量:" prop="quantity">
              <el-input
                v-model="form.quantity"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计量单位:" prop="unit">
              <el-select
                v-model="form.unit"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="克(g)" value="g" />
                <el-option label="千克(kg)" value="kg" />
                <el-option label="毫升(ml)" value="ml" />
                <el-option label="升(L)" value="L" />
                <el-option label="个" value="piece" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="样品状态:" prop="sampleStatus">
              <el-select
                v-model="form.sampleStatus"
                placeholder="请选择"
                clearable
                style="width: 100%"
              >
                <el-option label="在库" value="inStock" />
                <el-option label="出库" value="outStock" />
                <el-option label="检测中" value="testing" />
                <el-option label="已销毁" value="destroyed" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="有效期至:" prop="validityDate">
              <el-date-picker
                style="width: 100%"
                v-model="form.validityDate"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="备注:" prop="remark">
              <el-input
                v-model="form.remark"
                type="textarea"
                :rows="3"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="维护人:" prop="maintainer">
              <el-select
                v-model="form.maintainer"
                placeholder="请选择"
                clearable
                disabled
              >
                <el-option
                  v-for="item in userList"
                  :key="item.nickName"
                  :label="item.nickName"
                  :value="item.nickName"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="维护时间:" prop="maintenanceTime">
              <el-date-picker
                style="width: 100%"
                v-model="form.maintenanceTime"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                type="date"
                placeholder="请选择"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确认</el-button>
          <el-button @click="closeDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { onMounted, ref, reactive } from "vue";
import { Search } from "@element-plus/icons-vue";
import {
  addSample,
  delSample,
  getSample,
  listSample,
  updateSample,
} from "@/api/lims/sample.js";
import { ElMessageBox } from "element-plus";
import { userListNoPage } from "@/api/system/user.js";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const tableColumn = ref([
  {
    label: "样品编号",
    prop: "sampleCode",
    width: 150,
  },
  {
    label: "样品名称",
    prop: "sampleName",
    width: 180,
  },
  {
    label: "样品类型",
    prop: "sampleType",
    width: 120,
  },
  {
    label: "样品规格",
    prop: "specification",
    width: 150,
  },
  {
    label: "入库日期",
    prop: "inStockDate",
    width: 120,
  },
  {
    label: "存储位置",
    prop: "storageLocation",
    width: 150,
  },
  {
    label: "数量",
    prop: "quantity",
    width: 100,
  },
  {
    label: "单位",
    prop: "unit",
    width: 80,
  },
  {
    label: "样品状态",
    prop: "sampleStatus",
    width: 100,
  },
  {
    label: "有效期至",
    prop: "validityDate",
    width: 120,
  },
  {
    label: "维护人",
    prop: "maintainer",
  },
  {
    label: "维护时间",
    prop: "maintenanceTime",
    width: 100,
  },
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
        name: "编辑",
        type: "text",
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => {
          return row.maintainer !== userStore.nickName
        }
      },
    ],
  },
]);
const tableData = ref([]);
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const page = reactive({
  current: 1,
  size: 100,
  total: 0,
});
// æ ·å“è¡¨å•弹框数据
const operationType = ref("");
const dialogFormVisible = ref(false);
const data = reactive({
  searchForm: {
    sampleCode: "",
    sampleName: "",
    sampleStatus: "",
  },
  form: {
    sampleCode: "",
    sampleName: "",
    sampleType: "",
    specification: "",
    inStockDate: "",
    storageLocation: "",
    quantity: "",
    unit: "",
    sampleStatus: "inStock",
    validityDate: "",
    remark: "",
    maintainer: "",
    maintenanceTime: "",
  },
  rules: {
    sampleCode: [{ required: true, message: "请输入", trigger: "blur" }],
    sampleName: [{ required: true, message: "请输入", trigger: "blur" }],
    sampleType: [{ required: true, message: "请选择", trigger: "change" }],
    specification: [{ required: true, message: "请输入", trigger: "blur" }],
    inStockDate: [{ required: true, message: "请选择", trigger: "change" }],
    storageLocation: [{ required: true, message: "请输入", trigger: "blur" }],
    quantity: [{ required: true, message: "请输入", trigger: "blur" }],
    unit: [{ required: true, message: "请选择", trigger: "change" }],
    sampleStatus: [{ required: true, message: "请选择", trigger: "change" }],
    validityDate: [{ required: true, message: "请选择", trigger: "change" }],
    maintainer: [{ required: false, message: "请选择", trigger: "change" }],
    maintenanceTime: [
      { required: false, message: "请选择", trigger: "change" },
    ],
  },
});
const { searchForm, form, rules } = toRefs(data);
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  page.current = 1;
  getList();
};
const pagination = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
  getList();
};
const getList = () => {
  tableLoading.value = true;
  listSample({ ...searchForm.value, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    page.total = res.data.total;
  });
};
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  selectedRows.value = selection;
};
// æ‰“开弹框
const openForm = (type, row) => {
  operationType.value = type;
  form.value = {};
  form.value.maintainer = userStore.nickName;
  form.value.sampleStatus = "inStock";
  form.value.maintenanceTime = getCurrentDate();
  userListNoPage().then((res) => {
    userList.value = res.data;
  });
  if (type === "edit") {
    getSample(row.id).then((res) => {
      form.value = { ...res.data };
    });
  }
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
      }
    }
  });
};
// æäº¤æ–°å¢ž
const submitAdd = () => {
  addSample(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// æäº¤ä¿®æ”¹
const submitEdit = () => {
  updateSample(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
};
// å¯¼å‡º
const handleOut = () => {
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      proxy.download("/lims/sample/export", {}, "样品管理.xlsx");
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// åˆ é™¤
const handleDelete = () => {
  let ids = [];
  if (selectedRows.value.length > 0) {
    // æ£€æŸ¥æ˜¯å¦æœ‰ä»–人维护的数据
    const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
    if (unauthorizedData.length > 0) {
      proxy.$modal.msgWarning("不可删除他人维护的数据");
      return;
    }
    ids = selectedRows.value.map((item) => item.id);
  } else {
    proxy.$modal.msgWarning("请选择数据");
    return;
  }
  ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      tableLoading.value = true;
      delSample(ids)
        .then((res) => {
          proxy.$modal.msgSuccess("删除成功");
          getList();
        })
        .finally(() => {
          tableLoading.value = false;
        });
    })
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// èŽ·å–å½“å‰æ—¥æœŸå¹¶æ ¼å¼åŒ–ä¸º YYYY-MM-DD
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  return `${year}-${month}-${day}`;
}
onMounted(() => {
  getList();
});
</script>
<style scoped lang="scss"></style>