董国庆
2025-06-16 fa60bfa07970c192c85a437e7db784eccdae2839
修改bug
1个文件已添加
26个文件已修改
662 ■■■■ 已修改文件
culture/src/components/SelectMember/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/App.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/assets/login/img1111.png 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/AddComponentDialog/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/DynamicComponent/index.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/SelectMember/index.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/SelectMemberSimple/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/Table/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/approvalProcess/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/main.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/approvalPlan/addPlan.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/approvalPlan/components/approvalDialog.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/approvalPlan/list.vue 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/confirmation-sheet/components/add.vue 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/confirmation-sheet/index.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/confirmation-sheet/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/dispatching/addDispatch.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/dispatching/components/AddGroupDialog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/dispatching/components/AddTaskDialog.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/dispatching/editDispatch.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/dispatching/list.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/addPlan.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/components/experimental-scheduling.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/list.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/middleground/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/components/SelectMember/index.vue
@@ -124,15 +124,19 @@
            if (this.projectId) {
                params.projectId = this.projectId;
                // TODO: 这里需要替换为新的接口调用
                // const res = await getProjectUserList(params);
            } else {
                const res = await getUserList(params);
                this.tableData = res.records;
            }
            const res = await getUserList(params);
            this.tableData = res.records;
            // 数据加载完成后重新应用选中状态
            this.setSelection(this.selectData)
            this.$nextTick(() => {
                this.tableData.forEach(row => {
                    if (this.selectData.some(i => i.userId === row.userId)) {
                        this.$refs.memberTable.toggleRowSelection(row, true)
                    }
                })
            })
        },
        searchRole() {
            this.search = ''
laboratory/src/App.vue
@@ -55,6 +55,7 @@
::-webkit-scrollbar {
  display: none;
}
.table-container {
  ::-webkit-scrollbar {
    display: block !important;
@@ -76,6 +77,7 @@
    background: #00796b;
  }
}
html,
body,
#app {
@@ -93,6 +95,7 @@
  background-color: #009688 !important;
  border-color: #009688 !important;
}
.el-radio-button--small.is-active {
  .el-radio-button__inner {
    background-color: #009688 !important;
@@ -125,7 +128,11 @@
      border-radius: 6px;
      border: 1px solid rgba(0, 0, 0, 0.15);
    }
    .el-date-editor{
      .el-range-separator{
        width: 22px;
      }
      .el-input__inner {
        width: 260px;
@@ -145,11 +152,14 @@
    .el-input__inner {
      width: 200px;
    }
    .el-pagination__sizes{
      .el-input__inner {
      width: 100px;
    }
    }
    .el-pagination__jump{
      .el-input__inner {
      width: 50px;
@@ -176,6 +186,7 @@
    overflow: hidden;
  }
}
//  .pagination{
//   .el-input__inner {
//     width: unset !important;
laboratory/src/assets/login/img1111.png
laboratory/src/components/AddComponentDialog/index.vue
@@ -68,7 +68,7 @@
          type: 'imageUpload',
          title: '图片上传',
          icon: require('@/assets/public/modalImg4.png'),
          description: '富文本组件可以支持文本格式化(如字体、颜色、大小等)、图片插入、链接添加等多种功能。'
          description: '支持上传.png\.jpg文件,上传之后可点击放大预览。'
        }
      ]
    }
laboratory/src/components/DynamicComponent/index.vue
@@ -72,14 +72,22 @@
          <div class="image-upload-container">
            <el-upload v-if="editable" action="#" :file-list="item.data.imageList"
              :on-change="(file, fileList) => handleImageChange(idx, fileList)"
              :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, idx)" :auto-upload="true"
              :http-request="() => { }" :before-upload="beforeImageUpload" list-type="picture-card"
              :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, idx)"
              :auto-upload="true"
              :http-request="() => { }"
              :before-upload="beforeImageUpload"
              list-type="picture-card"
              :on-preview="(file) => handlePreview(file, idx)"
              class="image-uploader">
              <i class="el-icon-plus"></i>
              <div class="upload-text">上传图片</div>
            </el-upload>
            <div v-else class="image-preview">
              <img v-for="image in item.data.imageList" :key="image.uid" :src="image.url" class="preview-image" />
              <el-image v-for="image in item.data.imageList"
                :key="image.uid"
                :src="image.url"
                :preview-src-list="item.data.imageList.map(img => img.url)"
                class="preview-image" />
            </div>
            <div class="uploaf-notice">支持.jpg .png格式</div>
          </div>
@@ -95,6 +103,10 @@
    <addTableData  :visible.sync="rowDialog.visible" :headerList="rowDialog.headers"
      :editData="rowDialog.form" :isEdit="rowDialog.isEdit" @success="confirmAddRow">
    </addTableData>
    <el-dialog :visible.sync="imagePreviewVisible" width="auto" top="10vh" :show-close="true" v-if="imagePreviewUrl">
      <img :src="imagePreviewUrl" style="max-width:80vw;max-height:70vh;display:block;margin:auto;" />
    </el-dialog>
  </div>
</template>
@@ -155,6 +167,8 @@
      },
      headerList: [],
      defaultImageUrl: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg', // 默认图片地址
      imagePreviewVisible: false,
      imagePreviewUrl: '',
    };
  },
  watch: {
@@ -469,6 +483,13 @@
      }
      return true;
    },
    handlePreview(file, idx) {
      // 使用el-image的preview-src-list实现预览
      // 这里直接用Element的图片预览能力,实际上el-upload会自动处理
      // 但如果你想自定义弹窗,可以用如下代码:
      this.imagePreviewUrl = file.url;
      this.imagePreviewVisible = true;
    },
    emitUpdate() {
      // 先创建新对象,这有助于触发更新
      const updatedComponents = JSON.parse(JSON.stringify(this.components));
laboratory/src/components/SelectMember/index.vue
@@ -36,15 +36,28 @@
                        <div class="select-member-content-right-header">
                            <div class="select-member-content-right-header-text">人员列表</div>
                            <div class="select-member-content-right-header-search">
                                <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名/手机号" />
                                <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名" />
                                <el-button type="primary">搜索</el-button>
                            </div>
                        </div>
                        <Table ref="memberTable" :height="null" :row-key="row => row.userId" :data="tableData"
                            :total="0" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
                            <el-table-column type="selection" width="55" />
                            <el-table-column label="角色" prop="roleName" />
                            <el-table-column label="角色" prop="roleType" >
                                <template #default="scope">
                                    <span v-if="scope.row.roleType == 1">超级管理员</span>
                                    <span v-if="scope.row.roleType == 2">审批人</span>
                                    <span v-if="scope.row.roleType == 3">工艺工程师</span>
                                    <span v-if="scope.row.roleType == 4">化验师</span>
                                    <span v-if="scope.row.roleType == 5">实验员</span>
                                </template>
                            </el-table-column>
                            <el-table-column label="姓名" prop="nickName" />
                            <el-table-column label="头像" prop="avatar" >
                                <template #default="scope">
                                    <img :src="scope.row.avatar || require('../../assets/login/img1111.png')" style="width: 50px;height: 50px;border-radius: 50%;" />
                                </template>
                            </el-table-column>
                            <el-table-column label="创建时间" prop="createTime" />
                        </Table>
                    </div>
@@ -80,17 +93,17 @@
    },
    methods: {
        setSelection(selected) {
            this.selectData = selected
            this.$nextTick(() => {
            this.selectData = selected;
                // 确保 tableData 和 memberTable 都存在
                if (this.tableData && this.$refs.memberTable) {
                this.$nextTick(() => {
                    // 设置新的选中状态
                    this.tableData.forEach(row => {
                        if (selected.some(i => i.userId === row.userId)) {
                            this.$refs.memberTable.toggleRowSelection(row, true)
                        const isSelected = selected.some(i => i.userId === row.userId);
                        this.$refs.memberTable.toggleRowSelection(row, isSelected);
                    });
                });
                        }
                    })
                }
            })
        },
        openDialog() {
            // 获取角色列表并根据项目组ID进行过滤
laboratory/src/components/SelectMemberSimple/index.vue
@@ -9,7 +9,7 @@
                <div class="select-member-content-right-header">
                    <div class="select-member-content-right-header-text">人员列表</div>
                    <div class="select-member-content-right-header-search">
                        <el-input clearable v-model="searchKeyword" placeholder="请输入姓名/手机号" />
                        <el-input clearable v-model="searchKeyword" placeholder="请输入姓名" />
                    </div>
                </div>
                <Table ref="memberTable" :height="null" :row-key="row => row.userId" :data="filteredTableData"
@@ -23,7 +23,7 @@
                    <el-table-column label="姓名" prop="nickName" />
                    <el-table-column label="头像" prop="avatar" width="80">
                        <template #default="{ row }">
                            <el-avatar :size="32" :src="row.avatar" />
                            <el-avatar :size="32" :src="row.avatar || require('../../assets/login/img1111.png')" />
                        </template>
                    </el-table-column>
                    <el-table-column label="创建时间" prop="signTime" />
laboratory/src/components/Table/index.vue
@@ -42,14 +42,14 @@
        }
    },
    methods: {
        // toggleRowSelection(row, selected) {
        //     this.$refs.elTable.toggleRowSelection(row, selected)
        //     this.$forceUpdate()
        // },
        // clearSelection() {
        //     this.$refs.elTable.clearSelection()
        //     this.$forceUpdate()
        // },
        toggleRowSelection(row, selected) {
            this.$refs.elTable.toggleRowSelection(row, selected)
            this.$forceUpdate()
        },
        clearSelection() {
            this.$refs.elTable.clearSelection()
            this.$forceUpdate()
        },
        handleCurrentChange(page) {
            this.$emit('handleCurrentChange', page)
        },
laboratory/src/components/approvalProcess/index.vue
@@ -11,7 +11,7 @@
              <div class="flex-over">
                <div class="people-list" v-for="(member, memberIndex) in group.members" :key="memberIndex">
                  <div class="people-item">
                    <img :src="member.avatar" alt="" class="people-img" />
                    <img :src="member.avatar|| require('../../assets/login/img1111.png')" alt="" class="people-img" />
                    <div class="member-name">{{ member.name }}</div>
                  </div>
                  <div class="member-status">
@@ -169,6 +169,9 @@
    left: -10px;
    top: -8px;
  }
  .el-timeline-item__tail{
    left: 0 !important;
  }
  .el-timeline-item__node--primary {
    width: 20px !important;
laboratory/src/main.js
@@ -1,7 +1,7 @@
import Vue from "vue";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import Antd from 'ant-design-vue';
import {Calendar} from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
import '@/assets/font/font.css'
import App from "./App.vue";
@@ -21,13 +21,14 @@
Vue.config.productionTip = false;
Vue.use(ElementUI, { size: 'small' })
Vue.use(Antd)
Vue.use('Calendar',Calendar)
Vue.component('Table', Table)
Vue.component('TableCustom', TableCustom)
Vue.component('Card', Card)
Vue.component('ShowDelConfirm', ShowDelConfirm)
Vue.component('SelectMember', SelectMember)
Vue.component('EvaluateTable', EvaluateTable)
// app.use(Button).mount('#app');
Vue.prototype.msgsuccess = function (msg) {
  this.$message({
laboratory/src/views/dataManagement/approvalPlan/addPlan.vue
@@ -298,8 +298,8 @@
        console.log('获取详情参数:', { id: this.id })
        getDetailById({ id: this.id }).then(res => {
          console.log('详情接口返回:', res)
          if (res.code === 200 && res.data) {
            const data = res.data
          if (res) {
            const data = res
            // 设置表单数据
            this.form = {
              projectName: data.projectName,
laboratory/src/views/dataManagement/approvalPlan/components/approvalDialog.vue
@@ -26,6 +26,9 @@
              style="margin-top: 38px"
            >
              <el-form-item prop="projectName" label="项目课题方案名称">
                <template slot="label">
                  <span class="required-label">项目课题方案名称</span>
                </template>
                <el-input
                  v-model="form.projectName"
                  placeholder="请输入"
@@ -33,6 +36,9 @@
                />
              </el-form-item>
              <el-form-item prop="projectStage" label="项目阶段">
                <template slot="label">
                  <span class="required-label">项目阶段</span>
                </template>
                <el-select
                  v-model="form.projectStage"
                  placeholder="请选择"
@@ -44,6 +50,9 @@
                </el-select>
              </el-form-item>
              <el-form-item prop="projectCode" label="项目课题方案编号">
                <template slot="label">
                  <span class="required-label">项目课题方案编号</span>
                </template>
                <el-input
                  v-model="form.projectCode"
                  placeholder="请输入"
@@ -151,7 +160,7 @@
        </Card>
      </div>
      <!-- 右侧审批流程 -->
      <div class="approval-flow">
      <div class="approval-flow" v-if="form.auditStatus!=4">
        <div class="flow-content">
          <approval-process :processData="form.processData" />
        </div>
@@ -180,6 +189,7 @@
      <div class="remark">
        <div class="remark-title">审批意见</div>
        <el-input
        style="width: 400px;"
          type="textarea"
          v-model="remark"
          placeholder="请输入审批意见"
@@ -193,7 +203,7 @@
        style="margin-left: 20px"
        @click="handleApprove"
        v-if="type === 'approve'"
        >通过</el-button
        >确认</el-button
      >
    </div>
  </el-dialog>
@@ -251,7 +261,7 @@
  },
  computed: {
    dialogTitle() {
      return this.type === "approve" ? "审批" : "审批详情";
      return this.type === "approve" ? "审批" :this.form.auditStatus!=4 ? "审批详情" : "详情";
    },
  },
  watch: {
@@ -352,7 +362,7 @@
          if (res.code === 200) {
            this.$message.success("审批成功");
            this.$emit("update:visible", false);
            this.$emit("success");
            this.$emit("approve");
          } else {
            this.$message.error(res.msg || "审批失败");
          }
@@ -554,4 +564,12 @@
  border-radius: 4px;
  margin: 10px 0;
}
.required-label {
  &::before {
    content: "*";
    color: #f56c6c;
    margin-right: 4px;
  }
}
</style>
laboratory/src/views/dataManagement/approvalPlan/list.vue
@@ -1,6 +1,6 @@
<template>
  <div class="list">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total" :height="null">
      <template #search>
        <el-form :model="form" labelWidth="auto" inline>
          <el-form-item label="项目课题方案名称:">
@@ -28,7 +28,7 @@
      <template #setting>
        <div class="table-setting">
          <div class="flex a-center">
            <div class="table-title" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')">
            <div class="table-tit" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')">
              项目课题方案列表
            </div>
            <div v-if="isProcessEngineer" class="table-tit drafts" :class="{ active: currentType === 'draft' }"
@@ -61,6 +61,13 @@
        <el-table-column prop="auditTime" label="审批时间"></el-table-column>
        <el-table-column label="操作" width="250">
          <template slot-scope="scope">
            <!-- 草稿箱的按钮 -->
            <template v-if="currentType === 'draft'">
              <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
              <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
            </template>
            <!-- 列表的按钮 -->
            <template v-else>
            <!-- 工艺工程师的按钮 -->
            <template v-if="isProcessEngineer">
              <el-button v-if="scope.row.auditStatus === 1" type="text"
@@ -73,6 +80,7 @@
            <template v-else>
              <el-button v-if="scope.row.auditStatus === 1" type="text" @click="handleApprove(scope.row)">审批</el-button>
              <el-button v-if="scope.row.auditStatus !== 1" type="text" @click="handleDetail(scope.row)">详情</el-button>
              </template>
            </template>
          </template>
        </el-table-column>
@@ -114,64 +122,9 @@
      },
      tableData: [],
      total: 0,
      // 模拟数据
      mockListData: [
        {
          planCode: "PLAN-2024-001",
          planName: "2024年度实验室设备升级方案",
          stage: "规划阶段",
          creator: "张三",
          createTime: "2024-03-15",
          status: "pending",
          approver: "李四",
          approveTime: "2024-03-16",
        },
        {
          planCode: "PLAN-2024-002",
          planName: "实验室安全管理制度更新方案",
          stage: "实施阶段",
          creator: "王五",
          createTime: "2024-03-14",
          status: "approved",
          approver: "赵六",
          approveTime: "2024-03-15",
        },
        {
          planCode: "PLAN-2024-003",
          planName: "实验室人员培训计划",
          stage: "准备阶段",
          creator: "孙七",
          createTime: "2024-03-13",
          status: "rejected",
          approver: "周八",
          approveTime: "2024-03-14",
        },
      ],
      mockDraftData: [
        {
          planCode: "DRAFT-2024-001",
          planName: "实验室设备采购计划(草稿)",
          stage: "规划阶段",
          creator: "张三",
          createTime: "2024-03-16",
          status: "draft",
          approver: "",
          approveTime: "",
        },
        {
          planCode: "DRAFT-2024-002",
          planName: "实验室改造方案(草稿)",
          stage: "准备阶段",
          creator: "李四",
          createTime: "2024-03-15",
          status: "draft",
          approver: "",
          approveTime: "",
        },
      ],
      approvalDialogVisible: false,
      approvalDialogType: "approve",
      currentApprovalData: [],
      currentApprovalData: {}, // 修改为对象类型
      // 确认弹窗相关数据
      changeStatus: false,
      changeStatusTitle: "",
@@ -206,14 +159,16 @@
      this.getTableData();
    },
    handleSearch() {
      if (this.form.createTime && this.form.createTime.length === 2) {
        this.form.startTime = this.form.createTime[0];
        this.form.endTime = this.form.createTime[1];
      this.updateTimeRange();
      this.getTableData();
    },
    updateTimeRange() {
      if (this.form.createTime?.length === 2) {
        [this.form.startTime, this.form.endTime] = this.form.createTime;
      } else {
        this.form.startTime = "";
        this.form.endTime = "";
      }
      this.getTableData();
    },
    getStatusType(status) {
      const statusMap = {
@@ -256,15 +211,10 @@
      this.approvalDialogVisible = true;
    },
    handleApproveSubmit(data) {
      // 处理审批通过
      console.log("审批通过:", data);
      this.approvalDialogVisible = false;
      this.$message.success("审批通过成功");
      this.getTableData();
    },
    handleRejectSubmit(data) {
      // 处理审批驳回
      console.log("审批驳回:", data);
      this.approvalDialogVisible = false;
      this.$message.success("审批驳回成功");
      this.getTableData();
@@ -273,22 +223,20 @@
      this.currentOperationType = "revoke";
      this.currentOperationRow = row;
      this.changeStatusTitle = "确认要撤销这条审批吗?";
      this.changeStatusTip = "撤销后,审批人将无法收到此条审批信息"; // 这里可以根据实际需求修改提示文案
      this.changeStatusTip = "撤销后,审批人将无法收到此条审批信息";
      this.changeStatus = true;
    },
    handleEdit(row) {
      this.$router.push({
        path: "/dataManagement/addPlan",
        query: {
          id: row.id
        }
        query: { id: row.id }
      });
    },
    handleDelete(row) {
      this.currentOperationType = "delete";
      this.currentOperationRow = row;
      this.changeStatusTitle = "确认要删除这条信息吗?";
      this.changeStatusTip = "删除后信息无法找回"; // 这里可以根据实际需求修改提示文案
      this.changeStatusTip = "删除后信息无法找回";
      this.changeStatus = true;
    },
    handleDetail(row) {
@@ -299,49 +247,44 @@
    handleTypeChange(type) {
      this.currentType = type;
      this.form.auditStatus = type === "draft" ? -1 : "";
      this.form.pageNum = 1; // 切换时重置页码
      this.getTableData();
    },
    getTableData() {
      if (this.form.createTime && this.form.createTime.length === 2) {
        this.form.startTime = this.form.createTime[0];
        this.form.endTime = this.form.createTime[1];
      } else {
        this.form.startTime = "";
        this.form.endTime = "";
      }
      // 创建新的请求参数对象,排除createTime
      this.updateTimeRange();
      const { createTime, ...requestParams } = this.form;
      console.log(requestParams, "requestParams");
      getProposalList(requestParams).then((res) => {
        console.log(res, "请求回来的数据");
        this.tableData = res.data.records;
        this.total = res.data.total;
      });
    },
    handleChangeStatusConfirm() {
      if (this.currentOperationType === "revoke") {
        // 处理撤销审批逻辑
        upAndDown({
          id: this.currentOperationRow.id,
          status: 4 // 已撤销状态
        }).then(() => {
          this.$message.success("撤销审批成功");
      const operationMap = {
        revoke: {
          api: upAndDown,
          params: { id: this.currentOperationRow.id, status: -1 },
          successMsg: "撤销审批成功",
          errorMsg: "撤销审批失败"
        },
        delete: {
          api: deleteById,
          params: { id: this.currentOperationRow.id },
          successMsg: "删除成功",
          errorMsg: "删除失败"
        }
      };
      const operation = operationMap[this.currentOperationType];
      if (operation) {
        operation.api(operation.params)
          .then(() => {
            this.$message.success(operation.successMsg);
          this.changeStatus = false;
          this.getTableData();
        }).catch(error => {
          this.$message.error("撤销审批失败");
        });
      } else if (this.currentOperationType === "delete") {
        // 处理删除逻辑
        deleteById({
          id: this.currentOperationRow.id
        }).then(() => {
          this.$message.success("删除成功");
          this.changeStatus = false;
          this.getTableData();
        }).catch(error => {
          this.$message.error("删除失败");
          })
          .catch(() => {
            this.$message.error(operation.errorMsg);
        });
      }
    },
@@ -381,6 +324,13 @@
  color: #049c9a;
  line-height: 27px;
  cursor: pointer;
  transition: all 0.3s ease;
  &.active {
    color: #049c9a;
    background: #ffffff;
    border: 1px solid #049c9a;
  }
}
.table-tit {
@@ -393,19 +343,21 @@
  align-items: center;
  justify-content: center;
  font-family: SourceHanSansCN, SourceHanSansCN;
  font-weight: bold;
  font-size: 18px;
  color: #606266;
  line-height: 27px;
  margin-left: 16px;
  cursor: pointer;
}
  transition: all 0.3s ease;
.active {
  &.active {
  color: #049c9a;
    font-weight: bold;
  background: #ffffff;
  border: 1px solid #049c9a;
}
}
.el-icon-plus {
  margin-bottom: 20px;
laboratory/src/views/dataManagement/confirmation-sheet/components/add.vue
@@ -51,18 +51,10 @@
      <el-button @click="handleSaveDraft">存草稿</el-button>
    </div>
    <experimentalScheduling :show="showScheduling" @close="showScheduling = false" @submit="setSelectedScheduling"/>
    <add-test-item
      :dialogVisible="testItemDialogVisible"
      :editData="currentTestItem"
      @close="handleTestItemDialogClose"
      @confirm="handleTestItemConfirm"
    />
    <confirm-dialog
      :visible.sync="confirmDialogVisible"
      :formData="confirmFormData"
      :sampleData="testItems"
      @confirm="handleConfirmSubmit"
    />
    <add-test-item :dialogVisible="testItemDialogVisible" :editData="currentTestItem" @close="handleTestItemDialogClose"
      @confirm="handleTestItemConfirm" />
    <confirm-dialog :visible.sync="confirmDialogVisible" :formData="confirmFormData" :sampleData="testItems"
      @confirm="handleConfirmSubmit" />
  </Card>
</template>
@@ -450,26 +442,41 @@
    async getDetailData(id) {
      try {
        const res = await getDetail({ id })
        if (res.data) {
        if (res) {
          // 设置实验调度数据
          this.selectedScheduling = {
            id: res.data.dispatchId,
            // ... 其他调度相关字段
            id: res.dispatchId,
          }
          this.tableData = [{
            // planCode: res.projectName,
            // planName: res.experimentCode,
            // testName: res.experimentName,
            // notifyTime: res.experimentDate,
            planCode: res.projectName || '', // 所属项目课题方案
            planName: res.experimentCode || '', // 实验编号
            testName: res.experimentName || '', // 实验名称
            notifyTime: res.experimentDate || '', // 通知时间
            startTime: res.experimentStartTime || '', // 实验开始时间
            endTime: res.experimentEndTime || '', // 实验结束时间
            participants: res.participantsName || '', // 参加人员
            status: this.getStatusText(res.status) // 状态
          }]
          
          // 设置检测项数据
          this.testItems = res.data.testMethodConfirmSheetTerms.map(item => ({
          this.testItems = res.testMethodConfirmSheetTerms.map(item => ({
            ...item,
            id: item.id // 使用后端返回的ID
          }))
          // 设置表单数据
          this.formData = {
            id: res.data.id,
            dispatchId: res.data.dispatchId,
            auditStatus: res.data.auditStatus,
            confirmSign: res.data.confirmSign,
            signTime: res.data.signTime
            id: res.id,
            dispatchId: res.dispatchId,
            auditStatus: res.auditStatus,
            confirmSign: res.confirmSign,
            signTime: res.signTime
          }
        }
      } catch (error) {
laboratory/src/views/dataManagement/confirmation-sheet/index.vue
@@ -21,7 +21,7 @@
                    <el-form-item label="状态:">
                        <el-select v-model="form.auditStatus" placeholder="请选择">
                            <el-option label="待确认" :value="1"></el-option>
                            <el-option label="已通过" :value="2"></el-option>
                            <el-option label="已确认" :value="2"></el-option>
                            <el-option label="已驳回" :value="3"></el-option>
                            <el-option label="已撤回" :value="4"></el-option>
                            <el-option label="已封存" :value="5"></el-option>
@@ -38,10 +38,10 @@
                    <div class="flex a-center" style="gap: 16px;">
                        <div class="title pointer" :class="{ active: !isDrafts }" @click="switchToDrafts(false)">
                            检验方法确认单列表</div>
                        <div class="drafts pointer" :class="{ active: isDrafts }" @click="switchToDrafts(true)">草稿箱
                        <div class="drafts pointer" v-if="userRole == '4'" :class="{ active: isDrafts }" @click="switchToDrafts(true)">草稿箱
                        </div>
                    </div>
                    <el-button @click="handleAddPlan" class="el-icon-plus" type="primary">
                    <el-button v-if="userRole == '4'" @click="handleAddPlan" class="el-icon-plus" type="primary">
                        新增检测方法确认单</el-button>
                </div>
            </template>
@@ -60,6 +60,14 @@
                </el-table-column>
                <el-table-column label="操作" width="200">
                    <template slot-scope="scope">
                        <!-- 草稿箱状态下的操作 -->
                        <template v-if="isDrafts">
                            <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
                            <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
                        </template>
                        <!-- 非草稿箱状态下的操作 -->
                        <template v-else>
                        <!-- 超级管理员(1)和审批人(2) -->
                        <template v-if="userRole == '1' || userRole == '2'">
                            <el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
@@ -78,11 +86,12 @@
                            <el-button type="text" @click="handleRevoke(scope.row)"
                                v-if="scope.row.auditStatus == 1">撤销</el-button>
                            <el-button type="text" @click="handleDetail(scope.row)"
                                v-if="scope.row.auditStatus === 2 || scope.row.auditStatus === 3">详情</el-button>
                                    v-if="scope.row.auditStatus == 2 || scope.row.auditStatus == 3">详情</el-button>
                            <el-button type="text" @click="handleEdit(scope.row)"
                                v-if="scope.row.auditStatus === 3">编辑</el-button>
                                    v-if="scope.row.auditStatus == 3">编辑</el-button>
                            <el-button type="text" @click="handleDelete(scope.row)"
                                v-if="scope.row.auditStatus === 3">删除</el-button>
                                    v-if="scope.row.auditStatus == 3">删除</el-button>
                            </template>
                        </template>
                    </template>
                </el-table-column>
@@ -160,7 +169,7 @@
                    auditStatus: this.isDrafts ? -1 : Number(this.form.auditStatus) || ''
                };
                const res = await getList(params);
                if (res.code === 200) {
                if (res.code == 200) {
                    this.tableData = res.data.records || [];
                    this.total = res.data.total || 0;
                }
@@ -170,7 +179,7 @@
            }
        },
        handleDateChange(val) {
            if (val && val.length === 2) {
            if (val && val.length == 2) {
                this.form.startTime = val[0];
                this.form.endTime = val[1];
            } else {
@@ -251,8 +260,11 @@
        },
        handleEdit(row) {
            this.$router.push({
                path: "/dataManagement/confirmation-sheet/edit",
                query: { id: row.id }
                path: "/dataManagement/confirmation-sheet/add",
                query: {
                    id: row.id,
                    type: 'edit'
                }
            });
        },
        handleDelete(row) {
@@ -320,7 +332,6 @@
        background: #ffffff;
        border-radius: 8px 8px 0px 0px;
        padding: 16px 29px;
        font-weight: bold;
        font-size: 18px;
        background: #fafafc;
        border: 1px solid #dcdfe6;
@@ -331,6 +342,8 @@
            background: #ffffff;
            border: 1px solid #049c9a !important;
            color: #049c9a;
        font-weight: bold;
        }
    }
laboratory/src/views/dataManagement/confirmation-sheet/service.js
@@ -30,7 +30,7 @@
}
// 获取实验调度列表
export const getDispatchList = (data) => {
  return axios.get('/open/t-experiment-dispatch/chemistSignList', { params:data })
  return axios.get('/open/t-experiment-dispatch/chemistSignList', { ...data })
}
// 撤销
export const revokedSheet = (data) => {
laboratory/src/views/dataManagement/dispatching/addDispatch.vue
@@ -225,7 +225,7 @@
import AddGroupDialog from './components/AddGroupDialog'
import AddTaskDialog from './components/AddTaskDialog'
import AIEditor from '@/components/AiEditor'
import { getProposalList, addDispatch, updateDispatch } from './service'
import { getProposalList, addDispatch, updateDispatch,getDetailById } from './service'
export default {
  name: "AddProject",
@@ -484,7 +484,8 @@
      }).catch(() => {})
    },
    handleGroupSubmit(form) {
      const index = this.groupTableData.findIndex(item => item.groupName === form.groupName)
      console.log('11111111',form ,'2222222',this.groupTableData)
      const index = this.groupTableData.findIndex(item => item.id === form.id)
      if (index > -1) {
        this.groupTableData.splice(index, 1, form)
      } else {
@@ -742,8 +743,8 @@
    getDetail() {
      if (this.id) {
        getDetailById({ id: this.id }).then(res => {
          if (res.code === 200 && res.data) {
            const data = res.data
          if (res) {
            const data = res
            // 设置表单数据
            this.form = {
              projectName: data.projectName,
@@ -762,6 +763,20 @@
            // 设置表格数据
            this.groupTableData = data.experimentDispatchGroups || []
            this.taskTableData = data.experimentDispatchTasks || []
            // 处理参与人员数据
            this.members = {
              processEngineer: data.experimentDispatchParticipants.filter(p => p.roleType === 3) || [],
              experimenter: data.experimentDispatchParticipants.filter(p => p.roleType === 5) || [],
              analyst: data.experimentDispatchParticipants.filter(p => p.roleType === 4) || []
            };
            // 更新selectMemberData
            this.selectMemberData = [
              ...this.members.processEngineer,
              ...this.members.experimenter,
              ...this.members.analyst
            ];
          }
        }).catch(err => {
          console.error('获取详情失败:', err)
laboratory/src/views/dataManagement/dispatching/components/AddGroupDialog.vue
@@ -101,7 +101,8 @@
    handleSubmit() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          const eventName = this.isEdit ? "update" : "submit";
          const eventName = "submit";
          console.log('this.form',this.form)
          this.$emit(eventName, {...this.form});
          this.handleClose();
        }
laboratory/src/views/dataManagement/dispatching/components/AddTaskDialog.vue
@@ -6,7 +6,8 @@
          <el-input v-model="form.taskName" placeholder="请输入任务名称" class="custom-input"></el-input>
        </el-form-item>
        <el-form-item label="负责人" prop="leader">
        <el-form-item label="负责人" prop="leader" required>
          <!-- <div class="required-label">负责人</div> -->
          <Table 
            ref="table"
            :data="tableData" 
@@ -209,6 +210,17 @@
  .custom-input {
    width: 100%;
  }
  .required-label {
    font-size: 14px;
    color: #333;
    margin-bottom: 8px;
    &::before {
      content: "*";
      color: #f56c6c;
      margin-right: 4px;
    }
  }
}
.rwuTable {
laboratory/src/views/dataManagement/dispatching/editDispatch.vue
@@ -432,7 +432,7 @@
                    name: item.nickName || "",
                    status: item.status === 2 ? "已确认" : "待确认",
                    approveTime: item.status === 2 ? item.signTime : "",
                    avatar: item.avatar || "",
                    avatar: item.avatar,
                  })),
                },
                {
@@ -441,7 +441,7 @@
                    name: item.nickName || "",
                    status: item.status === 2 ? "已确认" : "待确认",
                    approveTime: item.status === 2 ? item.signTime : "",
                    avatar: item.avatar || "",
                    avatar: item.avatar,
                  })),
                },
              ],
@@ -474,15 +474,21 @@
      this.imgSrc = '';
    },
    handleApprove() {
      if(!this.imgSrc){
        this.$message.error('请先签字在提交');
        return
      }
      // 组装签名数据
      const params = {
        dispatchId: this.data.id, // 传递当前调度id
        confirmSign: this.imgSrc, // 签名图片
      };
      console.log('params',params)
      sign(params).then(res => {
        if (res && res.code === 200) {
          this.$message.success('签字成功');
          this.handleClose();
          this.$emit('update:data')
        } else {
          this.$message.error(res.msg || '签字失败');
        }
laboratory/src/views/dataManagement/dispatching/list.vue
@@ -110,12 +110,18 @@
          <template slot-scope="scope">
            <!-- 工艺工程师(3) -->
            <template v-if="userRole == '3'">
              <template v-if="currentType === 'draft'">
                <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
                <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
              </template>
              <template v-else>
              <el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
              <el-button 
                v-if="scope.row.status == 1" 
                type="text" 
                @click="handleDelete(scope.row)"
              >删除</el-button>
              </template>
            </template>
            
            <!-- 化验师(4)和实验员(5) -->
@@ -241,6 +247,15 @@
        path: "/dataManagement/addDispatch",
      });
    },
    handleEdit(row) {
      this.$router.push({
        path: "/dataManagement/addDispatch",
        query: {
          id: row.id,
          type: 'edit'
        }
      });
    },
    handleConfirm(row) {
      this.currentApprovalData = row;
      this.approvalDialogType = "approve";
@@ -325,7 +340,7 @@
    border-radius: 8px 8px 0px 0px;
    border: 1px solid #dcdfe6;
    padding: 16px 29px;
    font-weight: bold;
    // font-weight: bold;
    font-size: 18px;
    color: #606266;
    width: unset;
@@ -336,7 +351,7 @@
    background: #fafafc;
    border-radius: 8px 8px 0px 0px;
    border: 1px solid #dcdfe6;
    font-weight: 400;
    // font-weight: 400;
    font-size: 18px;
    color: #606266;
    margin-left: 16px;
@@ -347,6 +362,7 @@
    background: #ffffff;
    border-radius: 8px 8px 0px 0px;
    border: 1px solid #049c9a;
    font-weight: bold
  }
}
</style>
laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
@@ -174,13 +174,13 @@
              </div>
            </div>
          </div>
          <DynamicComponent :ref="'stepContent' + idx" @submit="(content) => handleStepContentSubmit(idx, content)"
          <DynamicComponent :participants="participantsData" :ref="'stepContent' + idx" @submit="(content) => handleStepContentSubmit(idx, content)"
            :dataSource="item.content" :editable="!isEdit" />
        </div>
        <div class="add-project-footer">
          <el-button type="primary" class="save-btn" @click="handleSave">发送</el-button>
          <el-button @click="handleSaveDraft">存草稿</el-button>
          <el-button type="primary" class="save-btn" @click="handleSave">{{userRole == 3 ? '发送' : '提交'}}</el-button>
          <el-button @click="handleSaveDraft" v-if="userRole == 3">存草稿</el-button>
        </div>
      </el-form>
    </template>
laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue
@@ -1,32 +1,20 @@
<template>
  <div>
    <el-dialog
      title="实验方案详情"
      :visible="dialogVisible"
      width="80%"
      :close-on-click-modal="false"
      @close="handleClose"
    >
    <el-dialog title="实验方案详情" :visible="dialogVisible" width="80%" :close-on-click-modal="false" @close="handleClose">
      <div class="approval-dialog">
        <!-- 左侧审批内容 -->
        <div class="approval-content">
          <Card class="approval-content-card">
            <template style="position: relative">
              <el-form
                ref="form"
                :model="form"
                :rules="rules"
                inline
                label-position="top"
              >
              <el-form ref="form" :model="form" :rules="rules" inline label-position="top">
                <div class="header-title" style="margin-bottom: 38px">
                  <div style="display: flex; align-items: center; gap: 13px">
                    <div class="header-title-left">
                      <img src="@/assets/public/headercard.png" />
                      <div>所属实验调度</div>
                    </div>
                    <el-button @click="handleStopExperiment" type="danger" v-if='form.status != 2 && form.status != 3 && form.status != 4'>
                    <el-button @click="handleStopExperiment" type="danger"
                      v-if='form.status != 2 && form.status != 3 && form.status != 4 && userRole == 3'>
                      申请终止实验</el-button>
                  </div>
                </div>
@@ -98,13 +86,8 @@
                  </div>
                </div>
                <div class="content-box">
                  <AiEditor
                    ref="purposeEditor"
                    :readOnly="true"
                    :value="form.experimentObjective"
                    height="200px"
                    placeholder="请输入实验目的..."
                  />
                  <AiEditor ref="purposeEditor" :readOnly="true" :value="form.experimentObjective" height="200px"
                    placeholder="请输入实验目的..." />
                </div>
                <div class="header-title" style="margin-bottom: 38px">
@@ -114,13 +97,8 @@
                  </div>
                </div>
                <div class="content-box">
                  <AiEditor
                    ref="processEditor"
                    :readOnly="true"
                    :value="form.experimentParamRoute"
                    height="200px"
                    placeholder="请输入工艺参数及路线..."
                  />
                  <AiEditor ref="processEditor" :readOnly="true" :value="form.experimentParamRoute" height="200px"
                    placeholder="请输入工艺参数及路线..." />
                </div>
                <div class="header-title" style="margin-bottom: 38px">
@@ -129,20 +107,10 @@
                    <div>三、实验材料及设备</div>
                  </div>
                </div>
                <DynamicComponent
                  ref="materialComponent"
                  title="实验材料"
                  :dialogCanEdit="false"
                  :dataSource="form.experimentMaterial"
                  :editable="false"
                />
                <DynamicComponent
                  ref="equipmentComponent"
                  title="实验所用设备"
                  :dialogCanEdit="false"
                  :dataSource="form.experimentDevice"
                  :editable="false"
                />
                <DynamicComponent ref="materialComponent" title="实验材料" :dialogCanEdit="false"
                  :dataSource="form.experimentMaterial" :editable="false" />
                <DynamicComponent ref="equipmentComponent" title="实验所用设备" :dialogCanEdit="false"
                  :dataSource="form.experimentDevice" :editable="false" />
                <div class="header-title" style="margin-bottom: 38px">
                  <div class="header-title-left">
@@ -157,12 +125,8 @@
                      步骤{{ idx + 1 }}:{{ item.stepName }}
                    </div>
                  </div>
                  <DynamicComponent
                  :dialogCanEdit="false"
                    :ref="'stepContent' + idx"
                    :dataSource="item.content"
                    :editable="false"
                  />
                  <DynamicComponent :dialogCanEdit="false" :ref="'stepContent' + idx" :dataSource="item.content"
                    :editable="false" />
                </div>
              </el-form>
            </template>
@@ -171,17 +135,12 @@
        <!-- 右侧审批流程 -->
        <div class="approval-flow" v-if="showApprovalFlow">
          <div class="flow-content">
            <approval-process
              :processData="approvalProcessData"
            />
            <approval-process :processData="approvalProcessData" />
          </div>
        </div>
      </div>
    </el-dialog>
    <SignatureCanvas
      :visible="signatureDialogVisible"
      @confirm="handleSignatureConfirm"
    />
    <SignatureCanvas :visible="signatureDialogVisible" @confirm="handleSignatureConfirm" />
  </div>
</template>
@@ -247,6 +206,7 @@
      selectedParticipants: [], // 实验参与人员
      showApprovalFlow: false,
      approvalProcessData: [],
      userRole: '',
    };
  },
  watch: {
@@ -256,6 +216,8 @@
        if (val && this.data && this.data.id) {
          // 弹窗打开时,确保数据已获取
          this.getPlanDetail(this.data.id);
          const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
          this.userRole = userInfo.roleType || '';
        }
      },
      immediate: true,
@@ -540,7 +502,8 @@
    flex-direction: column;
    height: auto;
    
    .approval-content, .approval-flow {
    .approval-content,
    .approval-flow {
      width: 100%;
      margin-right: 0;
      margin-bottom: 20px;
@@ -718,35 +681,27 @@
    border: 1px solid #dcdfe6;
    &:nth-child(1) {
      background: linear-gradient(
        to bottom,
      background: linear-gradient(to bottom,
        rgba(4, 156, 154, 0.2) 0%,
        rgba(5, 242, 194, 0) 70%
      );
          rgba(5, 242, 194, 0) 70%);
    }
    &:nth-child(2) {
      background: linear-gradient(
        to bottom,
      background: linear-gradient(to bottom,
        rgba(5, 160, 193, 0.2) 0%,
        rgba(5, 242, 194, 0) 70%
      );
          rgba(5, 242, 194, 0) 70%);
    }
    &:nth-child(3) {
      background: linear-gradient(
        to bottom,
      background: linear-gradient(to bottom,
        rgba(255, 77, 79, 0.2) 0%,
        rgba(255, 242, 194, 0) 70%
      );
          rgba(255, 242, 194, 0) 70%);
    }
    &:nth-child(4) {
      background: linear-gradient(
        to bottom,
      background: linear-gradient(to bottom,
        rgba(250, 199, 20, 0.21) 0%,
        rgba(255, 242, 194, 0) 70%
      );
          rgba(255, 242, 194, 0) 70%);
    }
    .member-item {
@@ -850,6 +805,7 @@
  
  .content-box-left {
    flex: 1;
    div {
      padding: 10px 0;
    }
@@ -857,6 +813,7 @@
  
  .content-box-right {
    flex: 1;
    div {
      padding: 10px 0;
    }
laboratory/src/views/dataManagement/schemeManagement/components/experimental-scheduling.vue
@@ -21,7 +21,7 @@
                        <el-form-item label="通知时间:">
                            <el-date-picker v-model="form.createTime" type="daterange" range-separator="至"
                                start-placeholder="开始日期" end-placeholder="结束日期"
                                value-format="yyyy-MM-dd" @change="handleDateChange"></el-date-picker>
                                value-format="yyyy-MM-dd" @change="handleDateChange" style="width: 260px;"></el-date-picker>
                        </el-form-item>
                        <el-form-item label="状态:">
                            <el-select v-model="form.status" placeholder="请选择">
@@ -146,6 +146,7 @@
            const params = {
                ...this.form
            };
            console.log('params',params)
            getDispatchList(params).then(res => {
                console.log('222222222222',res)
                if (res.code==200) {
laboratory/src/views/dataManagement/schemeManagement/list.vue
@@ -1,6 +1,7 @@
<template>
  <div class="list">
    <TableCustom :queryForm="form" :tableData="tableData" :height="null" :total="total" @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange">
    <TableCustom :queryForm="form" :tableData="tableData" :height="null" :total="total"
      @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange">
      <template #search>
        <el-form :model="form" labelWidth="auto" inline>
          <el-form-item label="项目课题方案名称:">
@@ -10,15 +11,8 @@
            <el-input v-model="form.experimentCode" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="创建时间:">
            <el-date-picker
              v-model="form.createTime"
              type="daterange"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              value-format="yyyy-MM-dd"
              @change="handleDateChange"
            ></el-date-picker>
            <el-date-picker v-model="form.createTime" type="daterange" range-separator="至" start-placeholder="开始日期"
              end-placeholder="结束日期" value-format="yyyy-MM-dd" @change="handleDateChange"></el-date-picker>
          </el-form-item>
          <el-form-item label="状态:">
            <el-select v-model="form.status" placeholder="请选择">
@@ -40,35 +34,17 @@
      <template #setting>
        <div class="tableTitle">
          <div class="flex a-center flex-wrap">
            <div
              class="title"
              :class="{active:currentType === 'list'}"
              @click="handleTypeChange('list')"
            >项目课题方案列表</div>
            <div
              v-if="userRole == '3'"
              class="drafts"
              :class="{active:currentType === 'draft'}"
              @click="handleTypeChange('draft')"
            >草稿箱</div>
            <div class="title" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')">项目课题方案列表</div>
            <div v-if="userRole == '3'" class="drafts" :class="{ active: currentType === 'draft' }"
              @click="handleTypeChange('draft')">草稿箱</div>
          </div>
          <el-button
            v-if="userRole == '3'"
            @click="handleAddPlan"
            class="el-icon-plus"
            type="primary"
          >新增实验方案</el-button>
          <el-button v-if="userRole == '3'" @click="handleAddPlan" class="el-icon-plus"
            type="primary">新增实验方案</el-button>
        </div>
      </template>
      <template #table>
        <el-table-column
          prop="projectName"
          label="项目课题方案名称"
        ></el-table-column>
        <el-table-column
          prop="experimentCode"
          label="实验编号"
        ></el-table-column>
        <el-table-column prop="projectName" label="项目课题方案名称"></el-table-column>
        <el-table-column prop="experimentCode" label="实验编号"></el-table-column>
        <el-table-column prop="experimentName" label="实验名称"></el-table-column>
        <el-table-column prop="experimentDate" label="实验日期"></el-table-column>
        <el-table-column prop="schemePersonName" label="实验员"></el-table-column>
@@ -104,11 +80,7 @@
      </template>
    </TableCustom>
    <!-- 审批弹窗 -->
    <approval-dialog
      :visible.sync="approvalDialogVisible"
      :type="approvalDialogType"
      :data="currentApprovalData"
    />
    <approval-dialog :visible.sync="approvalDialogVisible" :type="approvalDialogType" :data="currentApprovalData" />
  </div>
</template>
@@ -146,10 +118,10 @@
    const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
    this.userRole = userInfo.roleType || '';
    
    if (this.userRole == '4') {
      this.$router.push('/403');
      return;
    }
    // if (this.userRole == '4') {
    //   this.$router.push('/403');
    //   return;
    // }
    
    this.getTableData();
  },
@@ -209,6 +181,18 @@
      return statusMap[status] || "info";
    },
    getStatusText(status) {
      if (this.userRole == 5) {
        const statusMap = {
          '-1': "草稿",
          '1': "待提交",
          '2': "申请中止待审核",
          '3': "申请中止已通过",
          '4': "申请中止已驳回",
          '5': "已封存",
          '6': '已提交'
        };
        return statusMap[status] || "未知";
      }
      const statusMap = {
        '-1': "草稿",
        '1': "已发送",
@@ -285,15 +269,18 @@
.list {
  height: 100%;
}
.flex {
  display: flex;
  align-items: center;
}
.tableTitle {
  display: flex;
  padding-bottom: 20px;
  justify-content: space-between;
  align-items: center;
  .title {
    background: #fafafc;
    border-radius: 8px 8px 0px 0px;
@@ -305,6 +292,7 @@
    width: unset;
    cursor: pointer;
  }
  .drafts {
    padding: 16px 65px;
    background: #fafafc;
@@ -316,6 +304,7 @@
    margin-left: 16px;
    cursor: pointer;
  }
  .active{
    color: #049c9a;
    background: #ffffff;
laboratory/src/views/dataManagement/schemeManagement/service.js
@@ -42,5 +42,5 @@
}
// 获取实验调度列表
export const getDispatchList = (data) => {
  return axios.post('/api/t-experiment-dispatch/pageList', { params:data })
  return axios.post('/api/t-experiment-dispatch/pageList', {...data })
}
laboratory/src/views/middleground/index.vue
@@ -64,6 +64,7 @@
  </div>
</template>
<script>
import { Calendar } from 'ant-design-vue';
import { loginReq } from './service'
import HeaderNav from '../../layouts/components/HeaderNav.vue'
// 引入 Element UI 的日历组件
@@ -72,6 +73,7 @@
  name: 'Login',
  components: {
    HeaderNav,
    ACalendar: Calendar,
    // ElCalendar // 注册 ElCalendar 组件
  },