WXL
2026-03-11 c441e5f3cb734b5db5e893536f267b13814796f5
src/views/business/ethicalReview/index.vue
@@ -8,37 +8,47 @@
        :inline="true"
        label-width="100px"
      >
        <el-form-item label="住院号" prop="hospitalNo">
        <el-form-item label="住院号" prop="inpatientno">
          <el-input
            v-model="queryParams.hospitalNo"
            v-model="queryParams.inpatientno"
            placeholder="请输入住院号"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="捐献者姓名" prop="donorName">
        <el-form-item label="捐献者姓名" prop="name">
          <el-input
            v-model="queryParams.donorName"
            v-model="queryParams.name"
            placeholder="请输入捐献者姓名"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="伦理结论" prop="ethicsConclusion">
        <el-form-item label="案例编号" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入案例编号"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="伦理状态" prop="status">
          <el-select
            v-model="queryParams.ethicsConclusion"
            placeholder="请选择伦理结论"
            v-model="queryParams.status"
            placeholder="请选择伦理状态"
            clearable
            style="width: 200px"
          >
            <el-option label="审查中" value="reviewing" />
            <el-option label="同意" value="approved" />
            <el-option label="修改后同意" value="approved_with_modifications" />
            <el-option label="修改后重审" value="re-review" />
            <el-option label="不同意" value="disapproved" />
            <el-option label="终止审查" value="terminated" />
            <el-option label="全部" value="" />
            <el-option
              v-for="dict in dict.type.sys_ethical"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="审查时间范围" prop="reviewTimeRange">
@@ -76,13 +86,6 @@
            >修改</el-button
          >
          <el-button
            type="danger"
            icon="el-icon-delete"
            :disabled="multiple"
            @click="handleDelete"
            >删除</el-button
          >
          <el-button
            type="warning"
            icon="el-icon-download"
            @click="handleExport"
@@ -91,7 +94,7 @@
          <el-button
            type="info"
            icon="el-icon-check"
            :disabled="multiple"
            :disabled="single"
            @click="handleEndReview"
            >结束审查</el-button
          >
@@ -113,90 +116,115 @@
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column
          label="住院号"
          label="案例编号"
          align="center"
          prop="hospitalNo"
          prop="caseNo"
          width="120"
        />
        <el-table-column
          label="捐献者姓名"
          label="捐献者编号"
          align="center"
          prop="donorName"
          prop="donorno"
          width="120"
        />
        <el-table-column label="性别" align="center" prop="gender" width="80">
        <el-table-column
          label="姓名"
          align="center"
          prop="name"
          width="100"
        />
        <el-table-column
          label="住院号"
          align="center"
          prop="inpatientno"
          width="120"
        />
        <el-table-column label="性别" align="center" prop="sex" width="80">
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_user_sex"
              :value="parseInt(scope.row.gender)"
              :value="scope.row.sex"
            />
          </template>
        </el-table-column>
        <el-table-column label="年龄" align="center" prop="age" width="80" />
        <el-table-column
          label="血型"
          align="center"
          prop="bloodtype"
          width="80"
        />
        <el-table-column
          label="证件号码"
          align="center"
          prop="idcardno"
          width="180"
        />
        <el-table-column
          label="疾病诊断"
          align="center"
          prop="diagnosis"
          prop="diagnosisname"
          min-width="180"
          show-overflow-tooltip
        />
        <el-table-column
          label="伦理结论"
          label="医疗机构"
          align="center"
          prop="ethicsConclusion"
          width="120"
        >
          <template slot-scope="scope">
            <el-tag :type="conclusionFilter(scope.row.ethicsConclusion)">
              {{ conclusionTextFilter(scope.row.ethicsConclusion) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column
          label="伦理意见"
          align="center"
          prop="ethicsOpinion"
          min-width="200"
          prop="treatmenthospitalname"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="审查时间"
          label="伦理状态"
          align="center"
          prop="reviewTime"
          width="160"
          prop="status"
          width="100"
        >
          <template slot-scope="scope">
            <span>{{
              scope.row.reviewTime
                ? parseTime(scope.row.reviewTime, "{y}-{m}-{d} {h}:{i}")
                : "-"
            }}</span>
            <dict-tag
              :options="dict.type.sys_ethical"
              :value="scope.row.status"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="登记时间"
          label="专家结论"
          align="center"
          prop="registrationTime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{
              scope.row.registrationTime
                ? parseTime(scope.row.registrationTime, "{y}-{m}-{d} {h}:{i}")
                : "-"
            }}</span>
          </template>
        </el-table-column>
          prop="expertConclusion"
          width="120"
        />
        <el-table-column
          label="登记人"
          label="专家意见"
          align="center"
          prop="registrant"
          prop="expertOpinion"
          min-width="150"
          show-overflow-tooltip
        />
        <el-table-column
          label="专家姓名"
          align="center"
          prop="expertName"
          width="100"
        />
        <el-table-column
          label="结论时间"
          align="center"
          prop="expertTime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{
              scope.row.expertTime
                ? parseTime(scope.row.expertTime, "{y}-{m}-{d} {h}:{i}")
                : "-"
            }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          width="260"
          width="180"
          fixed="right"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
@@ -219,16 +247,8 @@
              type="text"
              icon="el-icon-check"
              @click="handleEndReview(scope.row)"
              :disabled="scope.row.ethicsConclusion === 'terminated'"
              :disabled="scope.row.status === '2'"
              >结束</el-button
            >
            <el-button
              size="mini"
              type="text"
              icon="el-icon-delete"
              style="color: #F56C6C"
              @click="handleDelete(scope.row)"
              >删除</el-button
            >
          </template>
        </el-table-column>
@@ -247,19 +267,21 @@
</template>
<script>
import { listEthicsReview, delEthicsReview, exportEthicsReview, endEthicsReview } from "./ethicsReview";
import { reviewinitiateBaseInfoList, ethicalreviewedit,  } from "@/api/businessApi";
import Pagination from "@/components/Pagination";
export default {
  name: "EthicsReviewList",
  components: { Pagination },
  dicts: ["sys_user_sex"],
  dicts: ["sys_user_sex", "sys_ethical"],
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 选中的行数据
      selectedRows: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
@@ -272,9 +294,10 @@
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        hospitalNo: undefined,
        donorName: undefined,
        ethicsConclusion: undefined,
        inpatientno: undefined,
        name: undefined,
        caseNo: undefined,
        status: undefined,
        reviewTimeRange: []
      }
    };
@@ -283,39 +306,31 @@
    this.getList();
  },
  methods: {
    // 伦理结论过滤器
    conclusionFilter(conclusion) {
      const conclusionMap = {
        "reviewing": "warning", // 审查中
        "approved": "success", // 同意
        "approved_with_modifications": "primary", // 修改后同意
        "re-review": "info", // 修改后重审
        "disapproved": "danger", // 不同意
        "terminated": "info" // 终止审查
      };
      return conclusionMap[conclusion] || "info";
    },
    conclusionTextFilter(conclusion) {
      const conclusionMap = {
        "reviewing": "审查中",
        "approved": "同意",
        "approved_with_modifications": "修改后同意",
        "re-review": "修改后重审",
        "disapproved": "不同意",
        "terminated": "终止审查"
      };
      return conclusionMap[conclusion] || "未知";
    },
    // 查询伦理审查列表
    getList() {
      this.loading = true;
      listEthicsReview(this.queryParams)
      // 处理查询参数
      const params = {
        ...this.queryParams
      };
      // 移除分页参数以外的额外参数
      delete params.reviewTimeRange;
      // 如果有时间范围参数
      if (this.queryParams.reviewTimeRange && this.queryParams.reviewTimeRange.length === 2) {
        params.expertTimeStart = this.queryParams.reviewTimeRange[0] + ' 00:00:00';
        params.expertTimeEnd = this.queryParams.reviewTimeRange[1] + ' 23:59:59';
      }
      reviewinitiateBaseInfoList(params)
        .then(response => {
          if (response.code === 200) {
            this.ethicsReviewList = response.data.rows;
            this.total = response.data.total;
            this.ethicsReviewList = response.data || [];
            this.total = response.total || 0;
          } else {
            this.$message.error("获取数据失败");
            this.$message.error(response.msg || "获取数据失败");
          }
          this.loading = false;
        })
@@ -337,7 +352,8 @@
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.ids = selection.map(item => item.infoid);
      this.selectedRows = selection;
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
@@ -345,7 +361,7 @@
    handleView(row) {
      this.$router.push({
        path: "/case/ethicalReviewInfo",
        query: { id: row.id }
        query: { id: row.infoid }
      });
    },
    // 新增按钮操作
@@ -354,53 +370,62 @@
    },
    // 修改按钮操作
    handleUpdate(row) {
      const id = row.id || this.ids[0];
      const id = row.infoid || this.ids[0];
      this.$router.push({
        path: "/case/ethicalReviewInfo",
        query: { id: id }
      });
    },
    // 删除按钮操作
    handleDelete(row) {
      const ids = row.id ? [row.id] : this.ids;
      this.$confirm("是否确认删除选中的数据项?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return delEthicsReview(ids);
        })
        .then(response => {
          if (response.code === 200) {
            this.$message.success("删除成功");
            this.getList();
          }
        })
        .catch(() => {});
    },
    // 结束审查操作
    handleEndReview(row) {
      const ids = row.id ? [row.id] : this.ids;
      const selectedRow = row || (this.selectedRows.length === 1 ? this.selectedRows[0] : null);
      if (!selectedRow) {
        this.$message.warning("请选择一条记录");
        return;
      }
      this.$confirm("是否确认结束选中的审查项目?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return endEthicsReview(ids);
          // 调用修改接口,将状态改为结束(status: '2')
          const updateData = {
            infoid: selectedRow.infoid,
            status: '2',
            // 可以保留原有数据
            expertName: selectedRow.expertName,
            expertConclusion: selectedRow.expertConclusion,
            expertOpinion: selectedRow.expertOpinion,
            expertTime: selectedRow.expertTime
          };
          return ethicalreviewedit(updateData);
        })
        .then(response => {
          if (response.code === 200) {
            this.$message.success("审查已结束");
            this.getList();
          } else {
            this.$message.error(response.msg || "操作失败");
          }
        })
        .catch(() => {});
    },
    // 导出按钮操作
    handleExport() {
      const queryParams = this.queryParams;
      const queryParams = { ...this.queryParams };
      delete queryParams.pageNum;
      delete queryParams.pageSize;
      // 处理时间范围参数
      if (queryParams.reviewTimeRange && queryParams.reviewTimeRange.length === 2) {
        queryParams.expertTimeStart = queryParams.reviewTimeRange[0] + ' 00:00:00';
        queryParams.expertTimeEnd = queryParams.reviewTimeRange[1] + ' 23:59:59';
      }
      delete queryParams.reviewTimeRange;
      this.$confirm("是否确认导出所有伦理审查数据?", "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
@@ -408,11 +433,25 @@
      })
        .then(() => {
          this.loading = true;
          return exportEthicsReview(queryParams);
          // return ethicalreviewexport(queryParams);
        })
        .then(response => {
          if (response.code === 200) {
            this.$message.success("导出成功");
            // 处理导出文件下载
            if (response.data) {
              const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' });
              const downloadElement = document.createElement('a');
              const href = window.URL.createObjectURL(blob);
              downloadElement.href = href;
              downloadElement.download = '伦理审查列表.xlsx';
              document.body.appendChild(downloadElement);
              downloadElement.click();
              document.body.removeChild(downloadElement);
              window.URL.revokeObjectURL(href);
            }
          } else {
            this.$message.error(response.msg || "导出失败");
          }
          this.loading = false;
        })