pyt
3 天以前 91ba7212f27528ee44b538e2a150f844e257b9f6
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
4个文件已修改
1个文件已添加
554 ■■■■■ 已修改文件
laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/list.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/suspendExperiment/list.vue 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/suspendExperiment/service.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue
@@ -2,7 +2,7 @@
  <div>
    <el-dialog
      title="实验方案详情"
      :visible.sync="visible"
      :visible="dialogVisible"
      width="80%"
      :close-on-click-modal="false"
      @close="handleClose"
@@ -26,7 +26,7 @@
                      <img src="@/assets/public/headercard.png" />
                      <div>所属实验调度</div>
                    </div>
                    <el-button @click="handleStopExperiment" type="danger">
                    <el-button @click="handleStopExperiment" type="danger" v-if='form.status != 2 && form.status != 3 && form.status != 4'>
                      申请终止实验</el-button>
                  </div>
                </div>
@@ -216,6 +216,7 @@
  },
  data() {
    return {
      dialogVisible: false,
      form: {
        projectName: "", // 项目课题方案名称
        projectCode: "", // 项目课题方案编号
@@ -249,6 +250,16 @@
    };
  },
  watch: {
    visible: {
      handler(val) {
        this.dialogVisible = val;
        if (val && this.data && this.data.id) {
          // 弹窗打开时,确保数据已获取
          this.getPlanDetail(this.data.id);
        }
      },
      immediate: true,
    },
    data: {
      handler(val) {
        if (val && val.id) {
@@ -258,15 +269,6 @@
      },
      immediate: true,
      deep: true,
    },
    visible: {
      handler(val) {
        if (val && this.data && this.data.id) {
          // 弹窗打开时,确保数据已获取
          this.getPlanDetail(this.data.id);
        }
      },
      immediate: true,
    },
  },
  methods: {
@@ -292,8 +294,7 @@
      return statusMap[status] || "未知";
    },
    handleClose() {
      this.$emit("update:visible", false);
      this.form.approvalComment = "";
      this.$emit('update:visible', false);
    },
    handleApprove() {
      if (!this.form.approvalComment) {
@@ -346,20 +347,15 @@
            });
            if(res.status==4||res.status==3){
              processData.push({
                type:
                  res.auditStatus === 2
                    ? "primary"
                    : res.auditStatus === 3
                    ? "danger"
                    : "warning",
                type:'primary',
                mode: "list",
                fields: [
                  {
                    label: "审核结果:",
                    value:
                      res.auditStatus === 2
                      res.status ==3
                        ? "通过"
                        : res.auditStatus === 3
                        : res.status ==4
                        ? "驳回"
                        : "待审批",
                  },
laboratory/src/views/dataManagement/schemeManagement/list.vue
@@ -71,7 +71,7 @@
        ></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="experimentSchemePersons" label="实验员"></el-table-column>
        <el-table-column prop="schemePersonName" label="实验员"></el-table-column>
        <el-table-column prop="createTime" label="创建日期"></el-table-column>
        <el-table-column prop="createBy" label="创建人"></el-table-column>
        <el-table-column prop="status" label="当前状态">
@@ -107,8 +107,6 @@
      :visible.sync="approvalDialogVisible"
      :type="approvalDialogType"
      :data="currentApprovalData"
      @approve="handleApproveSubmit"
      @reject="handleRejectSubmit"
    />
  </div>
</template>
@@ -271,7 +269,6 @@
    },
    handleApproveSubmit(data) {
      this.approvalDialogVisible = false;
      this.$message.success('审批通过成功');
      this.getTableData();
    },
    handleRejectSubmit(data) {
laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue
@@ -1,5 +1,5 @@
<template>
  <el-dialog :title="dialogTitle" :visible.sync="visible" width="80%" :close-on-click-modal="false"
  <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="80%" :close-on-click-modal="false"
    @close="handleClose">
    <div class="approval-dialog">
      <!-- 左侧审批内容 -->
@@ -13,15 +13,21 @@
              </div>
            </div>
            <Table :data="groupTableData" :total="0" :height="null" class="groupTable">
              <el-table-column type="index" label="所属项目课题方案" width="80"></el-table-column>
              <el-table-column prop="groupName" label="实验编号"></el-table-column>
              <el-table-column prop="stage" label="实验名称"></el-table-column>
              <el-table-column prop="creator" label="通知时间"></el-table-column>
              <el-table-column prop="createTime" label="实验开始时间"></el-table-column>
              <el-table-column prop="approver" label="实验结束时间"></el-table-column>
              <el-table-column prop="approveTime" label="参加人员"></el-table-column>
              <el-table-column prop="status" label="状态">
              </el-table-column>
              <el-table-column type="index" label="序号" width="80"></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="experimentStartTime" label="实验开始时间"></el-table-column>
                  <el-table-column prop="experimentEndTime" label="实验结束时间"></el-table-column>
                  <el-table-column prop="participantsName" label="参加人员"></el-table-column>
                  <el-table-column prop="status" label="状态">
                    <template slot-scope="scope">
                      <el-tag :type="getStatusType(scope.row.status)">
                        {{ getStatusText(scope.row.status) }}
                      </el-tag>
                    </template>
                  </el-table-column>
            </Table>
            <div class="header-title">
@@ -30,7 +36,7 @@
                <div>中止原因说明</div>
              </div>
            </div>
            <AiEditor ref="purposeEditor" v-model="form.purpose" height="200px" placeholder="请输入文字" />
            <AiEditor ref="purposeEditor" :readOnly="true" :value="form.stopReason" height="200px" placeholder="请输入文字" />
          </template>
        </Card>
@@ -38,12 +44,11 @@
      <!-- 右侧审批流程 -->
      <div class="approval-flow">
        <div class="flow-content">
          <approval-process :status="form.status" :submit-time="form.createTime" :approver="form.approver"
            :approve-time="form.approveTime" />
          <approval-process :processData="approvalProcessData" />
        </div>
      </div>
    </div>
    <div class="approval-dialog-approve">
    <div class="approval-dialog-approve" v-if="type === 'approve'">
      <div class="status">
        <div class="status-title">审批结果</div>
        <div class="status-content">
@@ -55,7 +60,7 @@
          </div>
        </div>
      </div>
      <div class="remark">
      <div class="remark" style="flex:1">
        <div class="remark-title">审批意见</div>
        <el-input type="textarea" v-model="remark" placeholder="请输入审批意见" />
      </div>
@@ -71,6 +76,7 @@
<script>
import ApprovalProcess from '@/components/approvalProcess'
import AiEditor from '@/components/AiEditor'
import { audit, getDetail } from '../service'
export default {
  name: "ApprovalDialog",
  components: {
@@ -90,6 +96,30 @@
      default: () => ({}),
    },
  },
  computed: {
    dialogVisible: {
      get() {
        return this.visible;
      },
      set(val) {
        this.$emit('update:visible', val);
      }
    },
    dialogTitle() {
      return this.type === "approve" ? "审批实验中止申请" : "实验中止申请审批详情";
    },
  },
  watch: {
    visible: {
      handler(val) {
        if (val && this.data && this.data.id) {
          // this.form = { ...val };
          this.getDialogDetail(this.data.id)
        }
      },
      immediate: true,
    },
  },
  data() {
    return {
      form: {
@@ -103,51 +133,130 @@
        approver: "",
        approveTime: ""
      },
      groupTableData: [],
      approvalProcessData: [],
      radio1: 1,
      rules: {},
      status: "1",
      remark: "",
    };
  },
  computed: {
    dialogTitle() {
      return this.type === "approve" ? "审批实验中止申请" : "实验中止申请审批详情";
    },
  },
  watch: {
    data: {
      handler(val) {
        if (val) {
          this.form = { ...val };
        }
      },
      immediate: true,
    },
  },
  methods: {
    async getDialogDetail(id) {
      try {
        const res = await getDetail({ id });
        if (!res) {
          this.$message.error('获取方案详情失败');
          this.handleClose();
          return;
        }
        if(res.stopReason){
          this.showApprovalFlow = true;
          //中止实验申请
          let processData = [];
          processData.push({
              type: "primary",
              mode: "list",
              fields: [
                { label: "提交人:", value: res.updateBy || "" },
                { label: "提交时间:", value: res.createTime || "" },
              ],
            });
            if(res.status==4||res.status==3){
              processData.push({
                type:'primary',
                mode: "list",
                fields: [
                  {
                    label: "审核结果:",
                    value:
                      res.status ==3
                        ? "通过"
                        : res.status ==4
                        ? "驳回"
                        : "待审批",
                  },
                  { label: "审批意见:", value: res.auditRemark || "" },
                  { label: "审核人:", value: res.auditPersonName || "" },
                  { label: "审核时间:", value: res.auditTime || "" },
                ],
              });
            }else{
              processData.push({
                type: "warning",
                mode: "list",
                fields: [
                  { label: "等待审核"},
                ],
              });
            }
            this.approvalProcessData = processData;
        }
        // 填充基本表单数据
        this.form = {
          ...this.form,
          stopReason: res.stopReason,
        };
        // 构建实验调度数据
        if (res.experimentDispatch) {
          this.groupTableData = [res.experimentDispatch];
        }
      } catch (error) {
        console.error("获取方案详情失败:", error);
        this.$message.error("获取方案详情失败");
        this.handleClose();
      }
    },
    getStatusType(status) {
      const statusMap = {
        "-1": "info",
        "1": "warning",
        "2": "success",
        "3": "info"
      };
      return statusMap[status] || "info";
    },
    getStatusText(status) {
      const statusMap = {
        "-1": "草稿箱",
        "1": "待确认",
        "2": "已确认",
        "3": "已封存"
      };
      return statusMap[status] || "未知";
    },
    handleClose() {
      this.$emit("update:visible", false);
      this.form.approvalComment = "";
      this.$emit('update:visible', false);
      this.remark = "";
    },
    handleApprove() {
      if (!this.form.approvalComment) {
      if (!this.remark) {
        this.$message.warning("请输入审批意见");
        return;
      }
      this.$emit("approve", {
        ...this.form,
        status: "approved",
      });
      this.handleSubmit();
    },
    handleReject() {
      if (!this.form.approvalComment) {
        this.$message.warning("请输入审批意见");
        return;
    async handleSubmit() {
      try {
        const params = {
          id: this.data.id,
          auditRemark: this.remark,
          status: this.status === '1' ? 3 : 4  // 1表示通过(status=3),2表示拒绝(status=4)
        };
        console.log('params params',params)
        const res = await audit(params);
        console.log('res res',res)
        if (res) {
          this.$message.success('审批成功');
          this.handleClose();
        }
      } catch (error) {
        console.error('审批失败:', error);
        this.$message.error('审批失败');
      }
      this.$emit("reject", {
        ...this.form,
        status: "rejected",
      });
    },
  },
};
laboratory/src/views/dataManagement/suspendExperiment/list.vue
@@ -1,43 +1,64 @@
<template>
  <div class="list">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total" @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange">
      <template #search>
        <el-form :model="form" labelWidth="auto" inline>
          <el-form-item label="所属项目课题方案:">
            <el-input v-model="form.planName" placeholder="请输入"></el-input>
          <el-form-item label="项目课题方案名称:">
            <el-input v-model="form.projectName" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="实验编号:">
            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
            <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"></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-input v-model="form.approver" placeholder="请输入"></el-input>
          <el-form-item label="状态:">
            <el-select v-model="form.status" placeholder="请选择">
              <el-option label="全部" value=""></el-option>
              <el-option label="待审核" :value="2"></el-option>
              <el-option label="已通过" :value="3"></el-option>
              <el-option label="已驳回" :value="4"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="">
            <el-button type="default" @click="resetForm">重置</el-button>
            <el-button type="primary" @click="handleSearch" style="margin-left: 20px;">查询</el-button>
            <el-button type="primary" @click="handleSearch" style="margin-left: 10px;">查询</el-button>
          </el-form-item>
        </el-form>
      </template>
      <template #setting>
        <div class="tableTitle">
          <div class="flex a-center">
            <div class="title" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')">申请中止试验方案列表
            </div>
          <div class="flex a-center flex-wrap">
            <div
              class="title"
              :class="{active:currentType == 'list'}"
              @click="handleTypeChange('list')"
            >申请中止试验方案列表</div>
          </div>
        </div>
      </template>
      <template #table>
        <el-table-column prop="planCode" label="所属项目课题方案"></el-table-column>
        <el-table-column prop="planName" label="实验编号"></el-table-column>
        <el-table-column prop="stage" label="实验名称"></el-table-column>
        <el-table-column prop="creator" label="试验日期"></el-table-column>
        <el-table-column prop="createTime" label="实验员"></el-table-column>
        <el-table-column prop="approver" label="提交时间"></el-table-column>
        <el-table-column prop="approveTime" 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>
        <el-table-column prop="createTime" label="创建日期"></el-table-column>
        <el-table-column prop="createBy" label="创建人"></el-table-column>
        <el-table-column prop="status" label="当前状态">
          <template slot-scope="scope">
            <el-tag :type="getStatusType(scope.row.status)">
@@ -45,25 +66,39 @@
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column label="操作" width="250">
          <template slot-scope="scope">
            <el-button v-if="scope.row.status === 'pending'" type="text"
              @click="handleApprove(scope.row)">审批</el-button>
            <el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
            <!-- 超级管理员(1) -->
            <template v-if="userRole == '1'">
              <el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
            </template>
            <!-- 审批人(2) -->
            <template v-if="userRole == '2'">
              <el-button
                v-if="scope.row.status == 2"
                type="text"
                @click="handleApprove(scope.row)"
              >审批</el-button>
              <el-button v-else type="text" @click="handleDetail(scope.row)">详情</el-button>
            </template>
          </template>
        </el-table-column>
      </template>
    </TableCustom>
    <!-- 审批弹窗 -->
    <approval-dialog :visible.sync="approvalDialogVisible" :type="approvalDialogType" :data="currentApprovalData"
      @approve="handleApproveSubmit" @reject="handleRejectSubmit" />
    <approval-dialog
      :visible.sync="approvalDialogVisible"
      :type="approvalDialogType"
      :data="currentApprovalData"
      @close="handleClose"
    />
  </div>
</template>
<script>
import ApprovalDialog from './components/approvalDialog.vue'
import {getList} from './service'
export default {
  name: "ProjectList",
@@ -72,170 +107,128 @@
  },
  data() {
    return {
      currentType: 'list', // 当前显示类型:list-列表,draft-草稿箱
      currentType: 'list',
      form: {
        planName: "",
        planCode: "",
        creator: "",
        projectName: "",
        experimentCode: "",
        createTime: [],
        approver: "",
        status: "",
        startTime: "",
        endTime: "",
        pageNum: 1,
        pageSize: 10
      },
      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',
      approvalDialogType: 'view',
      currentApprovalData: null,
      userRole: '',
    };
  },
  created() {
    const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
    this.userRole = userInfo.roleType || '';
    this.getTableData();
  },
  methods: {
    handlePageChange(page) {
      this.form.pageNum = page;
      this.getTableData();
    },
    handleSizeChange(size) {
      this.form.pageSize = size;
      this.form.pageNum = 1;
      this.getTableData();
    },
    resetForm() {
      this.form = {
        planName: "",
        planCode: "",
        creator: "",
        projectName: "",
        experimentCode: "",
        createTime: [],
        approver: "",
        status: "",
        startTime: "",
        endTime: "",
        pageNum: 1,
        pageSize: 10
      };
      this.getTableData();
    },
    handleSearch() {
      // 实现查询逻辑
      console.log("查询条件:", this.form);
      this.form.pageNum = 1;
      this.getTableData();
    },
    getStatusType(status) {
      const statusMap = {
        pending: "warning",
        rejected: "danger",
        approved: "success",
        archived: "info",
        draft: "info"
        '-1': "info",
        '1': "warning",
        '2': "warning",
        '3': "success",
        '4': "danger",
        '5': "info",
        '6':'success'
      };
      return statusMap[status] || "info";
    },
    getStatusText(status) {
      const statusMap = {
        pending: "待审批",
        rejected: "已驳回",
        approved: "已通过",
        archived: "已封存",
        draft: "草稿"
        '-1': "草稿",
        '1': "已发送",
        '2': "待审核",
        '3': "已通过",
        '4': "已驳回",
        '5': "已封存",
        '6':'实验员已提交'
      };
      return statusMap[status] || "未知";
    },
    handleAddPlan() {
      this.$router.push({
        path: "/dataManagement/addPlan",
      });
    },
    handleApprove(row) {
      this.currentApprovalData = row;
      this.approvalDialogType = 'approve';
      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();
    },
    handleRevokeApprove(row) {
      // 实现撤销审批逻辑
      console.log("撤销审批数据:", row);
    },
    handleEdit(row) {
      // 实现编辑逻辑
      console.log("编辑数据:", row);
    },
    handleDelete(row) {
      // 实现删除逻辑
      console.log("删除数据:", row);
    },
    handleDetail(row) {
      this.currentApprovalData = row;
      this.approvalDialogType = 'view';
      this.approvalDialogVisible = true;
    handleDateChange(val) {
      if (val) {
        this.form.startTime = val[0];
        this.form.endTime = val[1];
      } else {
        this.form.startTime = '';
        this.form.endTime = '';
      }
    },
    handleTypeChange(type) {
      this.currentType = type;
      this.form.pageNum = 1;
      this.getTableData();
    },
    getTableData() {
      // 根据currentType请求不同的数据
      if (this.currentType === 'list') {
        this.tableData = this.mockListData;
        this.total = this.mockListData.length;
      } else {
        this.tableData = this.mockDraftData;
        this.total = this.mockDraftData.length;
    async getTableData() {
      try {
        const { data } = await getList(this.form);
        this.tableData = data.records || [];
        this.total = data.total || 0;
      } catch (error) {
        console.error('获取列表数据失败:', error);
        this.$message.error('获取列表数据失败');
      }
    },
    handleApprove(row) {
      this.approvalDialogType = 'approve';
      this.approvalDialogVisible = true;
      this.currentApprovalData = {
        id: row.id
      };
    },
    handleDetail(row) {
      this.approvalDialogType = 'view';
      this.approvalDialogVisible = true;
      this.currentApprovalData = {
        id: row.id
      };
    },
    handleClose(data) {
      this.approvalDialogVisible = false;
      this.getTableData();
    },
    handleRejectSubmit(data) {
      this.approvalDialogVisible = false;
      this.$message.success('审批驳回成功');
      this.getTableData();
    }
  },
};
</script>
@@ -287,4 +280,5 @@
    border: 1px solid #049c9a;
  }
}
</style>
</style>
laboratory/src/views/dataManagement/suspendExperiment/service.js
New file
@@ -0,0 +1,16 @@
import axios from '@/utils/request';
// 列表
export const getList = (data) => {
  return axios.post('/api/t-experiment-scheme/auditPageList', { ...data })
}
// 详情
export const getDetail = (data) => {
  return axios.get('/open/t-experiment-scheme/getDetailById', { params:data })
}
// 审批
export const audit = (data) => {
  return axios.post('/api/t-experiment-scheme/audit', { ...data })
}