WXL
12 小时以前 0c03027d7f238bf5beb98e85463f53f0bd92bbaa
src/views/business/transfer/index.vue
@@ -281,11 +281,120 @@
        @close="detailOpen = false"
      />
    </el-dialog>
    <!-- 案例选择对话框 -->
    <el-dialog
      title="选择转运案例"
      :visible.sync="selectCaseOpen"
      width="900px"
      append-to-body
      :close-on-click-modal="false"
    >
      <div class="case-select-container">
        <el-card class="search-card">
          <el-form :model="caseQueryParams" inline>
            <el-form-item label="案例编号">
              <el-input
                v-model="caseQueryParams.caseNo"
                placeholder="请输入案例编号"
                clearable
                style="width: 180px"
              />
            </el-form-item>
            <el-form-item label="患者姓名">
              <el-input
                v-model="caseQueryParams.patName"
                placeholder="请输入患者姓名"
                clearable
                style="width: 150px"
              />
            </el-form-item>
            <el-form-item>
              <el-button type="primary" icon="el-icon-search" @click="searchCaseList"
                >搜索</el-button
              >
              <el-button icon="el-icon-refresh" @click="resetCaseSearch"
                >重置</el-button
              >
            </el-form-item>
          </el-form>
        </el-card>
        <el-card>
          <el-table
            v-loading="caseLoading"
            :data="availableCaseList"
            @row-click="handleCaseSelect"
            highlight-current-row
            style="width: 100%"
          >
            <el-table-column label="案例编号" prop="caseNo" width="150" align="center" />
            <el-table-column label="患者姓名" prop="name" width="120" align="center" />
            <el-table-column label="性别" width="80" align="center">
              <template slot-scope="scope">
                <dict-tag
                  :options="dict.type.sys_user_sex"
                  :value="scope.row.sex"
                />
              </template>
            </el-table-column>
            <el-table-column label="年龄" prop="age" width="80" align="center" />
            <el-table-column label="血型" width="80" align="center">
              <template slot-scope="scope">
                <dict-tag
                  :options="dict.type.sys_BloodType"
                  :value="scope.row.bloodType"
                />
              </template>
            </el-table-column>
            <el-table-column label="疾病诊断" prop="diagnosisname" min-width="200" show-overflow-tooltip />
            <el-table-column label="治疗医院" prop="treatmenthospitalname" width="150" />
            <el-table-column label="是否已转运" width="100" align="center">
              <template slot-scope="scope">
                <el-tag
                  :type="hasTransport(scope.row) ? 'danger' : 'success'"
                  size="small"
                >
                  {{ hasTransport(scope.row) ? '已转运' : '可转运' }}
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column label="操作" width="80" align="center">
              <template slot-scope="scope">
                <el-button
                  type="text"
                  size="mini"
                  @click="selectCase(scope.row)"
                  :disabled="hasTransport(scope.row)"
                >
                  选择
                </el-button>
              </template>
            </el-table-column>
          </el-table>
          <!-- 分页 -->
          <pagination
            v-show="caseTotal > 0"
            :total="caseTotal"
            :page.sync="caseQueryParams.pageNum"
            :limit.sync="caseQueryParams.pageSize"
            @pagination="searchCaseList"
          />
        </el-card>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="selectCaseOpen = false">取消</el-button>
      </div>
    </el-dialog>
    <!-- 新增:修改弹框 -->
    <transport-edit
      :edit-open="editOpen"
      :transport-data="currentTransport"
      :is-edit="isEditing"
      :selected-case="selectedCase"
      @update:edit-open="editOpen = $event"
      @close="handleEditClose"
      @save-success="handleSaveSuccess"
@@ -318,7 +427,8 @@
  transportAdd,
  transportEdit,
  transportDelete,
  transportInfo
  transportInfo,
  donateList
} from "@/api/businessApi/index";
import TransportDetail from "./transportDetail";
import TransportEdit from "./TransportEdit";
@@ -329,6 +439,7 @@
  dicts: ["sys_user_sex", "sys_BloodType"],
  data() {
    return {
      // 遮罩层
      loading: false,
      // 选中数组
@@ -341,10 +452,12 @@
      showSearch: true,
      // 总条数
      total: 0,
      // 转运单表格数据 - 直接使用后端返回的数据结构
      // 转运单表格数据
      transportList: [],
      // 详情弹框是否显示
      detailOpen: false,
      // 案例选择弹框是否显示
      selectCaseOpen: false,
      // 操作确认弹框是否显示
      actionOpen: false,
      // 新增:修改弹框相关数据
@@ -366,28 +479,42 @@
        pendingTransports: 0,
        completedTransports: 0
      },
      // 查询参数(完全适配后端接口)
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined, // 案例编号
        patName: undefined, // 患者姓名
        transitStatus: undefined, // 转运状态:1待转运 2转运中 3转运完成 4转运取消 5暂存
        searchValue: undefined, // 搜索值
        params: {} // 其他参数对象
        caseNo: undefined,
        patName: undefined,
        transitStatus: undefined,
        searchValue: undefined,
        params: {}
      },
      // 案例选择相关
      caseLoading: false,
      availableCaseList: [],
      caseTotal: 0,
      selectedCase: null,
      caseQueryParams: {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined,
        patName: undefined,
        // 只查询已同意且需要转运的案例
        // reportStatus: "3", // 已同意
        isTransport: "2"   // 需要转运
      }
    };
  },
  created() {
    this.getList();
     this.checkAutoCreate();
  },
  methods: {
    /** 查询转运单列表 - 直接使用后端数据结构 */
    /** 查询转运单列表 */
    async getList() {
      this.loading = true;
      try {
        // 构建符合后端接口的请求参数 [1,2](@ref)
        const requestParams = {
          pageNum: this.queryParams.pageNum,
          pageSize: this.queryParams.pageSize,
@@ -397,20 +524,15 @@
          searchValue: this.queryParams.searchValue
        };
        // 处理时间范围参数 [5](@ref)
        if (this.dateRange && this.dateRange.length === 2) {
          requestParams.transportStartTime = this.dateRange.join(",");
        }
        // 调用正式接口 [3](@ref)
        const response = await transportList(requestParams);
        if (response.code === 200) {
          // 直接使用后端返回的数据结构,不进行转换 [8](@ref)
          this.transportList = response.rows || response.data || [];
          this.total = response.total || 0;
          // 更新统计数据
          this.updateStats();
        } else {
          this.$modal.msgError(response.msg || "获取转运单列表失败");
@@ -421,6 +543,109 @@
      } finally {
        this.loading = false;
      }
    },
  checkAutoCreate() {
    const query = this.$route.query;
    if (query.autoCreate === 'true') {
      // 自动打开案例选择弹框
      this.selectCaseOpen = true;
      this.resetCaseSearch();
      // 如果有特定的案例编号,可以预先搜索
      if (query.caseNo) {
        this.caseQueryParams.caseNo = query.caseNo;
        this.searchCaseList();
      }
    }
  },
    /** 搜索可用案例 */
    async searchCaseList() {
      this.caseLoading = true;
      try {
        const response = await donateList(this.caseQueryParams);
        if (response.code === 200) {
          this.availableCaseList = response.rows || response.data || [];
          this.caseTotal = response.total || 0;
        } else {
          this.$modal.msgError(response.msg || "获取案例列表失败");
        }
      } catch (error) {
        console.error("获取案例列表失败:", error);
        this.$modal.msgError("获取案例列表失败");
      } finally {
        this.caseLoading = false;
      }
    },
    /** 重置案例搜索 */
    resetCaseSearch() {
      this.caseQueryParams = {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined,
        patName: undefined,
        // reportStatus: "3",
        isTransport: "2"
      };
      this.searchCaseList();
    },
    /** 判断案例是否已有转运单 */
    hasTransport(caseData) {
      // 检查案例是否有转运信息
      if (caseData.serviceTransport &&
          Array.isArray(caseData.serviceTransport) &&
          caseData.serviceTransport.length > 0) {
        return true;
      }
      return false;
    },
    /** 选择案例 */
    selectCase(caseData) {
      if (this.hasTransport(caseData)) {
        this.$message.warning("该案例已有转运单,请选择其他案例");
        return;
      }
      this.selectedCase = caseData;
      this.selectCaseOpen = false;
      // 打开转运单编辑页面,并传入选中的案例
      this.currentTransport = this.convertCaseToTransport(caseData);
      this.isEditing = false;
      this.editOpen = true;
    },
    /** 将案例信息转换为转运单格式 */
    convertCaseToTransport(caseData) {
      return {
        caseNo: caseData.caseNo,
        patName: caseData.name,
        sex: caseData.sex,
        age: caseData.age,
        diagnosisname: caseData.diagnosisname,
        treatmentHospitalName: caseData.treatmenthospitalname,
        treatmentDeptName: caseData.treatmentdeptname,
        // 其他字段可以根据需要从案例中获取
        transportStartPlace: caseData.treatmenthospitalname || '',
        contactPerson: caseData.coordinatorName || '',
        transitStatus: 1, // 默认待转运
        // 清空其他字段
        id: undefined,
        reportId: undefined,
        transportStartTime: undefined,
        doctor: undefined,
        doctorPhone: undefined,
        nurse: undefined,
        nursePhone: undefined,
        driver: undefined,
        driverPhone: undefined,
        icuDoctor: undefined,
        icuDoctorPhone: undefined,
        annexfilesList: [],
        remark: undefined
      };
    },
    /** 获取状态标签类型 */
@@ -496,20 +721,24 @@
    handleUpdate(row) {
      this.currentTransport = row || {};
      this.isEditing = true;
      this.selectedCase = null; // 编辑时不传入案例信息
      this.editOpen = true;
    },
    /** 新建转运单 */
    handleAdd() {
      // 打开案例选择弹框
      this.selectCaseOpen = true;
      this.selectedCase = null;
      this.currentTransport = {};
      this.isEditing = false;
      this.editOpen = true;
      this.resetCaseSearch(); // 重置并搜索案例
    },
    /** 修改弹框关闭处理 */
    handleEditClose() {
      this.editOpen = false;
      this.currentTransport = {};
      this.selectedCase = null;
    },
    /** 保存成功处理 */
@@ -533,7 +762,7 @@
      this.actionOpen = true;
    },
    /** 确认操作 - 使用后端原始数据结构 [4](@ref) */
    /** 确认操作 */
    async confirmAction() {
      try {
        let requestData = {
@@ -546,12 +775,11 @@
          requestData.transitStatus = 3; // 设置为转运完成
        }
        // 直接传递后端需要的参数 [8](@ref)
        const response = await transportEdit(requestData);
        if (response.code === 200) {
          this.$modal.msgSuccess(`${this.actionText}转运成功`);
          this.getList(); // 刷新列表
          this.getList();
        } else {
          this.$modal.msgError(response.msg || `${this.actionText}转运失败`);
        }
@@ -562,7 +790,7 @@
      this.actionOpen = false;
    },
    /** 删除按钮操作 - 使用后端原始ID [1](@ref) */
    /** 删除按钮操作 */
    async handleDelete(row) {
      const ids = row.reportId || row.id || this.ids;
@@ -575,7 +803,7 @@
        if (response.code === 200) {
          this.$modal.msgSuccess("删除成功");
          this.getList(); // 刷新列表
          this.getList();
        } else {
          this.$modal.msgError(response.msg || "删除失败");
        }
@@ -589,7 +817,6 @@
    /** 导出按钮操作 */
    handleExport() {
      // 直接使用后端参数结构进行导出 [5](@ref)
      this.download(
        "system/transport/export",
        {
@@ -597,12 +824,25 @@
        },
        `transport_${new Date().getTime()}.xlsx`
      );
    },
    // 点击行选择案例
    handleCaseSelect(row) {
      this.selectCase(row);
    }
  }
};
</script>
<style scoped>
.case-select-container {
  max-height: 600px;
  overflow: auto;
}
.search-card {
  margin-bottom: 20px;
}
.filter-card {
  margin-bottom: 20px;
}