WXL
2026-09-17 3df460667d74868d0a54fce12d5e881bbd6c0c1a
src/views/business/ethicalReview/ethicalReviewInfo.vue
@@ -1,28 +1,24 @@
<template>
  <div class="ethics-review-detail">
    <case-basic-info :case-id="caseId" :show-attachment="true" />
    <case-basic-info :case-id="caseId" :show-attachment="true":column="3" />
    <el-card class="detail-card">
    <el-card class="detail-card paper-card">
      <!-- 伦理审查基本信息 -->
      <div slot="header" class="clearfix">
        <span class="detail-title">伦理审查基本信息</span>
      </div>
      <el-form :model="form" ref="form" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="发起主题" prop="initiateTheme">
              <el-input
                v-model="form.initiateTheme"
                placeholder="请输入发起主题"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="发起人" prop="initiatePerson">
              <el-input v-model="form.initiatePerson" />
            </el-form-item>
          </el-col>
      <el-form :model="form" ref="form" :rules="rules" label-width="120px" class="paper-form">
        <div class="form-row">
          <el-form-item label="发起主题" prop="initiateTheme" class="col-1-3">
            <el-input
              v-model="form.initiateTheme"
              placeholder="请输入发起主题"
            />
          </el-form-item>
          <el-form-item label="发起人" prop="initiatePerson" class="col-1-3">
            <el-input v-model="form.initiatePerson" />
          </el-form-item>
          <!-- <el-col :span="8">
            <el-form-item label="审查状态" prop="status">
              <el-select v-model="form.status" style="width: 100%">
@@ -35,57 +31,51 @@
              </el-select>
            </el-form-item>
          </el-col> -->
        </el-row>
        </div>
        <!-- 专家相关信息 -->
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="伦理审查结论" prop="expertConclusion">
              <el-select v-model="form.expertConclusion" style="width: 100%">
                <el-option label="同意" value="1" />
                <el-option label="审查中" value="2" />
                <el-option label="不同意" value="0" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="伦理审查结论时间" prop="expertTime">
              <el-date-picker
                v-model="form.expertTime"
                type="datetime"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <div class="form-row">
          <el-form-item label="伦理审查结论" prop="expertConclusion" class="col-1-3">
            <el-select v-model="form.expertConclusion" style="width: 100%">
              <el-option label="同意" value="1" />
              <el-option label="审查中" value="2" />
              <el-option label="不同意" value="0" />
              <el-option label="弃权" value="3" />
              <el-option label="修改后同意" value="4" />
            </el-select>
          </el-form-item>
          <el-form-item label="伦理审查结论时间" prop="expertTime" class="col-1-3">
            <el-date-picker
              v-model="form.expertTime"
              type="datetime"
              value-format="yyyy-MM-dd HH:mm:ss"
              style="width: 100%"
            />
          </el-form-item>
        </div>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="审查意见" prop="expertOpinion">
              <el-input
                type="textarea"
                :rows="2"
                v-model="form.expertOpinion"
                placeholder="请输入意见"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <div class="form-row">
          <el-form-item label="审查意见" prop="expertOpinion" class="col-full">
            <el-input
              type="textarea"
              :rows="2"
              v-model="form.expertOpinion"
              placeholder="请输入意见"
            />
          </el-form-item>
        </div>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="备注" prop="remark">
              <el-input
                type="textarea"
                :rows="3"
                v-model="form.remark"
                placeholder="请输入备注信息"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <div class="form-row">
          <el-form-item label="备注" prop="remark" class="col-full">
            <el-input
              type="textarea"
              :rows="3"
              v-model="form.remark"
              placeholder="请输入备注信息"
            />
          </el-form-item>
        </div>
      </el-form>
    </el-card>
@@ -737,7 +727,7 @@
          <el-row :gutter="20" style="margin-top: 20px;">
            <el-col :span="12">
              <div class="history-stat-item">
                <div class="history-stat-label">未接收数量</div>
                <div class="history-stat-label">已发送未接收数量</div>
                <div class="history-stat-value">
                  {{ expertHistoryData.notAcceptCount || 0 }}
                </div>
@@ -1163,7 +1153,7 @@
    },
    // 获取详情
    async getDetail(infoid, id) {
   async getDetail(infoid, id) {
      try {
        this.expertLoading = true;
        let response = {};
@@ -1171,7 +1161,12 @@
          response = await ethicalreviewInfo(id);
        } else if (infoid) {
          response = await reviewinitiateBaseInfoList({ infoid: infoid });
          if (response.data[0].id) {
            this.id = response.data[0].id;
            response = await ethicalreviewInfo(this.id);
          }
        }
        if (
          !response.data.status ||
          response.data.status == 0 ||
@@ -1182,7 +1177,7 @@
        if (response.code == 200) {
          let detailData = {};
          if (response.data && id) {
          if (response.data && this.id) {
            this.form = response.data;
            // 解析 filePatch 字段
            this.parseFilePatch(this.form.filePatch);
@@ -1191,7 +1186,7 @@
            if (!this.form.ethicalreviewopinionsList) {
              this.$set(this.form, "ethicalreviewopinionsList", []);
            }
          } else if (response.data && infoid) {
          } else if (response.data && this.infoid) {
            this.form = response.data[0];
            this.parseFilePatch(this.form.filePatch);
            this.initAttachmentFileList();
@@ -1340,7 +1335,9 @@
      console.log(file, "file");
      this.currentPreviewFile = {
        fileName: file,
        // 签名附件 URL 通常无扩展名(如 .../file-1787645145583),
        // 预览组件依赖文件名扩展名识别文件类型,这里补 .png 让其按图片预览
        fileName: "手写签名.png",
        fileUrl: file,
        fileType: "png"
      };
@@ -1430,8 +1427,8 @@
    // 审查状态过滤器
    getReviewStatusFilter(status) {
      const statusMap = {
        "0": "info", // 待接收
        "1": "warning", // 未接收
        "0": "info", // 待发送
        "1": "warning", // 已发送
        "2": "success", // 已接收
        "3": "danger", // 超时
        "4": "danger", // 中止
@@ -1442,8 +1439,8 @@
    getReviewStatusText(status) {
      const statusMap = {
        "0": "待接收",
        "1": "未接收",
        "0": "待发送",
        "1": "已发送",
        "2": "已接收",
        "3": "超时",
        "4": "中止",
@@ -1455,18 +1452,22 @@
    // 结论过滤器
    getConclusionFilter(conclusion) {
      const conclusionMap = {
        "0": "danger", // 不同意
        "1": "success", // 同意
        "2": "warning", // 审查中
        "0": "danger" // 不同意
        "3": "info", // 弃权
        "4": "success" // 修改后同意
      };
      return conclusionMap[conclusion] || "info";
    },
    getConclusionText(conclusion) {
      const conclusionMap = {
        "0": "不同意",
        "1": "同意",
        "2": "审查中",
        "0": "不同意"
        "3": "弃权",
        "4": "修改后同意"
      };
      return conclusionMap[conclusion] || "未知";
    },
@@ -1534,8 +1535,8 @@
              // 保存成功后更新原始数据
              this.saveOriginalData();
              this.isEdit = false;
              if (!this.form.id && response.data && response.data.id) {
                this.form.id = response.data.id;
              if (!this.form.id && response.data ) {
                this.form.id = response.data;
                this.id = this.form.id;
                // this.$router.replace({
                //   query: { ...this.$route.query, id: this.form.id }
@@ -2012,7 +2013,7 @@
          deptName: expert.unitname || "",
          title: expert.title || "",
          donorno: expert.telephone || "",
          receiveStatus: "0", // 待接收
          receiveStatus: "0", // 待发送
          expertconclusion: "",
          expertopinion: "",
          conclusionannex: "",
@@ -2211,6 +2212,7 @@
              if (index != -1) {
                this.form.ethicalreviewopinionsList[index].receiveStatus = "1"; // 已接收
                this.form.ethicalreviewopinionsList[index].expertconclusion = "2"; // 审查中
                this.form.ethicalreviewopinionsList[
                  index
                ].startTime = this.sendForm.startTime;
@@ -2748,4 +2750,103 @@
    margin-bottom: 10px;
  }
}
/* ===== 纸质表格网格样式 ===== */
.paper-card >>> .el-card__body {
  padding: 16px;
}
.paper-form {
  border-left: 1px solid #d0d3db;
  background: #fff;
}
.paper-form >>> .form-row {
  display: flex;
  width: 100%;
  border-top: 1px solid #d0d3db;
  /* 上移1px与上一行的border-bottom重叠,两行之间只显示一条1px细线 */
  margin-top: -1px;
}
.paper-form >>> .form-row:first-child {
  margin-top: 0;
}
/* 行尾空白填充:不满整行的右侧自动补一个空白格子,网格保持闭合(右侧适当留白) */
.paper-form >>> .form-row::after {
  content: "";
  flex: 1 1 0;
  min-height: 42px;
  background: linear-gradient(to left, #d0d3db 1px, transparent 1px),
    linear-gradient(to top, #d0d3db 1px, transparent 1px);
  background-color: #fff;
}
.paper-form >>> .el-form-item {
  flex: 0 0 33.3333%;
  display: flex;
  margin: 0;
  background: #fff;
  border-right: 1px solid #d0d3db;
  border-bottom: 1px solid #d0d3db;
}
.paper-form >>> .el-form-item::after,
.paper-form >>> .el-form-item::before {
  display: none;
}
.paper-form >>> .col-1-3 { flex: 0 0 33.3333%; }
.paper-form >>> .col-half { flex: 0 0 50%; }
.paper-form >>> .col-2-3 { flex: 0 0 66.6666%; }
.paper-form >>> .col-full { flex: 0 0 100%; }
.paper-form >>> .el-form-item__label {
  flex: 0 0 150px;
  width: 150px !important;
  float: none;
  padding: 0 8px !important;
  background: #ecf5ff;
  border-right: 1px solid #d0d3db;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 13px;
  font-weight: 600;
  color: #2c3038;
  line-height: 1.3;
  white-space: nowrap;
}
.paper-form >>> .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
  color: #f56c6c;
  margin-right: 2px;
}
.paper-form >>> .el-form-item__content {
  flex: 1;
  margin-left: 0 !important;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  padding: 6px 10px;
  background: #fff;
  min-height: 42px;
  line-height: 1.4;
}
/* 控件宽度适中,不铺满整格(内容短时输入框不再拉得很长) */
.paper-form >>> .el-form-item__content .el-input,
.paper-form >>> .el-form-item__content .el-select,
.paper-form >>> .el-form-item__content .el-cascader {
  width: 220px;
  max-width: 100%;
}
.paper-form >>> .el-form-item__content .el-date-editor {
  width: 240px;
  max-width: 100%;
}
.paper-form >>> .el-form-item__content .el-range-editor {
  width: 360px;
  max-width: 100%;
}
</style>