WXL
12 小时以前 0c03027d7f238bf5beb98e85463f53f0bd92bbaa
src/views/business/transfer/index.vue
@@ -8,45 +8,37 @@
        :inline="true"
        label-width="80px"
      >
        <el-form-item label="转运单号" prop="transportNo">
          <el-input
            v-model="queryParams.transportNo"
            placeholder="请输入转运单号"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="住院号" prop="caseNo">
        <el-form-item label="案例编号" prop="caseNo">
          <el-input
            v-model="queryParams.caseNo"
            placeholder="请输入住院号"
            placeholder="请输入案例编号"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="捐献者姓名" prop="donorName">
        <el-form-item label="患者姓名" prop="patName">
          <el-input
            v-model="queryParams.donorName"
            placeholder="请输入捐献者姓名"
            v-model="queryParams.patName"
            placeholder="请输入患者姓名"
            clearable
            style="width: 200px"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="转运状态" prop="status">
        <el-form-item label="转运状态" prop="transitStatus">
          <el-select
            v-model="queryParams.status"
            v-model="queryParams.transitStatus"
            placeholder="转运状态"
            clearable
            style="width: 200px"
          >
            <el-option label="全部" value="" />
            <el-option label="待出发" value="pending" />
            <el-option label="转运中" value="transporting" />
            <el-option label="已完成" value="completed" />
            <el-option label="已取消" value="cancelled" />
            <el-option label="待转运" :value="1" />
            <el-option label="转运中" :value="2" />
            <el-option label="转运完成" :value="3" />
            <el-option label="转运取消" :value="4" />
            <el-option label="暂存" :value="5" />
          </el-select>
        </el-form-item>
        <el-form-item label="创建时间">
@@ -148,7 +140,7 @@
      ></right-toolbar>
    </el-row>
    <!-- 数据表格 -->
    <!-- 数据表格 - 直接使用后端返回的数据结构 -->
    <el-table
      v-loading="loading"
      :data="transportList"
@@ -156,19 +148,28 @@
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="序号" type="index" width="60" align="center" />
      <el-table-column label="转运单号" align="center" prop="id" width="140" />
      <el-table-column
        label="住院号"
        label="转运单号"
        align="center"
        prop="reportId"
        width="140"
      />
      <el-table-column
        label="案例编号"
        align="center"
        prop="caseNo"
        width="140"
      />
      <el-table-column label="捐献者信息" align="center" width="180">
      <el-table-column label="患者信息" align="center" width="260">
        <template slot-scope="scope">
          <div class="donor-info">
            <div class="donor-name">{{ scope.row.donorName }}</div>
            <div class="donor-name">{{ scope.row.patName }}</div>
            <div class="donor-details">
              {{ scope.row.gender }} | {{ scope.row.age }}岁
              <dict-tag
                :options="dict.type.sys_user_sex"
                :value="parseInt(scope.row.sex)"
              />
              | {{ scope.row.age }}岁
            </div>
          </div>
        </template>
@@ -176,37 +177,37 @@
      <el-table-column
        label="疾病诊断"
        align="center"
        prop="diagnosis"
        prop="diagnosisname"
        min-width="200"
        show-overflow-tooltip
      />
      <el-table-column
        label="医疗机构"
        label="治疗医院"
        align="center"
        prop="hospitalName"
        prop="treatmentHospitalName"
        width="150"
      />
      <el-table-column
        label="计划转运时间"
        align="center"
        prop="transportTime"
        prop="transportStartTime"
        width="160"
      />
      <el-table-column
        label="负责协调员"
        align="center"
        prop="coordinator"
        prop="contactPerson"
        width="100"
      />
      <el-table-column
        label="转运状态"
        align="center"
        prop="status"
        prop="transitStatus"
        width="100"
      >
        <template slot-scope="scope">
          <el-tag :type="scope.row.status | statusFilter">
            {{ scope.row.statusText }}
          <el-tag :type="getStatusTagType(scope.row.transitStatus)">
            {{ getStatusText(scope.row.transitStatus) }}
          </el-tag>
        </template>
      </el-table-column>
@@ -219,6 +220,7 @@
      <el-table-column
        label="操作"
        align="center"
        fixed="right"
        class-name="small-padding fixed-width"
        width="220"
      >
@@ -242,7 +244,7 @@
            type="text"
            icon="el-icon-video-play"
            @click="handleStartTransport(scope.row)"
            v-if="scope.row.status === 'pending'"
            v-if="scope.row.transitStatus === 1"
            >开始转运</el-button
          >
          <el-button
@@ -250,7 +252,7 @@
            type="text"
            icon="el-icon-check"
            @click="handleCompleteTransport(scope.row)"
            v-if="scope.row.status === 'transporting'"
            v-if="scope.row.transitStatus === 2"
            >完成转运</el-button
          >
        </template>
@@ -279,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"
@@ -296,7 +407,11 @@
      append-to-body
    >
      <div class="action-confirm">
        <p>确定要{{ actionText }}转运单 "{{ currentTransport.id }}" 吗?</p>
        <p>
          确定要{{ actionText }}转运单 "{{
            currentTransport.reportId || currentTransport.id
          }}" 吗?
        </p>
      </div>
      <div slot="footer" class="dialog-footer">
        <el-button @click="actionOpen = false">取 消</el-button>
@@ -308,19 +423,23 @@
<script>
import {
  listTransport,
  getTransport,
  delTransport,
  updateTransportStatus
} from "@/api/system/business";
  transportList,
  transportAdd,
  transportEdit,
  transportDelete,
  transportInfo,
  donateList
} from "@/api/businessApi/index";
import TransportDetail from "./transportDetail";
import TransportEdit from "./TransportEdit";
export default {
  name: "TransportList",
  components: { TransportDetail, TransportEdit },
  dicts: ["sys_user_sex", "sys_BloodType"],
  data() {
    return {
      // 遮罩层
      loading: false,
      // 选中数组
@@ -337,6 +456,8 @@
      transportList: [],
      // 详情弹框是否显示
      detailOpen: false,
      // 案例选择弹框是否显示
      selectCaseOpen: false,
      // 操作确认弹框是否显示
      actionOpen: false,
      // 新增:修改弹框相关数据
@@ -362,139 +483,209 @@
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        transportNo: undefined,
        caseNo: undefined,
        donorName: undefined,
        status: 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"   // 需要转运
      }
    };
  },
  filters: {
    statusFilter(status) {
      const statusMap = {
        pending: "warning",
        transporting: "primary",
        completed: "success",
        cancelled: "danger"
      };
      return statusMap[status];
    }
  },
  created() {
    this.getList();
     this.checkAutoCreate();
  },
  methods: {
    /** 查询转运单列表 */
    getList() {
    async getList() {
      this.loading = true;
      // 模拟API调用延迟
      setTimeout(() => {
        // 测试数据
        this.transportList = [
          {
            id: "T20241217001",
            caseNo: "DON20241216001",
            donorName: "张三",
            gender: "男",
            age: 38,
            diagnosis:
              "脑外伤导致脑死亡,经抢救无效宣布脑死亡。家属同意器官捐献。",
            hospitalName: "青岛镜湖医院",
            transportTime: "2024-12-17 14:30:00",
            coordinator: "张医生",
            createTime: "2024-12-16 09:30:00",
            status: "pending",
            statusText: "待出发",
            departureLocation: "青岛市立医院急诊科",
            destinationHospital: "青岛镜湖医院",
            emergencyDoctor: "王医生",
            nurse: "李护士",
            driver: "刘师傅",
            icuDoctor: "赵医生",
            contacts: [
              { role: "协调员电话", phone: "13800138000" },
              { role: "急诊医生电话", phone: "13800138001" },
              { role: "护士电话", phone: "13800138002" },
              { role: "司机电话", phone: "13800138003" },
              { role: "ICU医生电话", phone: "13800138004" }
            ],
            remarks: "需要准备呼吸机等急救设备"
          },
          {
            id: "T20241217002",
            caseNo: "DON20241216002",
            donorName: "李四",
            gender: "女",
            age: 45,
            diagnosis: "脑梗死,脑干功能丧失",
            hospitalName: "青岛大学附属医院",
            transportTime: "2024-12-17 16:00:00",
            coordinator: "李医生",
            createTime: "2024-12-16 11:20:00",
            status: "transporting",
            statusText: "转运中",
            departureLocation: "青岛大学附属医院ICU",
            destinationHospital: "青岛器官移植中心",
            currentLocation: "青岛市南区香港中路",
            estimatedTime: "30分钟"
          },
          {
            id: "T20241216003",
            caseNo: "DON20241215001",
            donorName: "王五",
            gender: "男",
            age: 52,
            diagnosis: "心脏骤停,多器官功能衰竭",
            hospitalName: "青岛市立医院",
            transportTime: "2024-12-16 10:15:00",
            coordinator: "王医生",
            createTime: "2024-12-15 14:45:00",
            status: "completed",
            statusText: "已完成",
            departureLocation: "青岛市立医院心内科",
            destinationHospital: "青岛器官移植中心",
            completedTime: "2024-12-16 12:30:00",
            distance: "15公里",
            duration: "2小时15分钟"
          },
          {
            id: "T20241216004",
            caseNo: "DON20241214001",
            donorName: "赵六",
            gender: "女",
            age: 29,
            diagnosis: "急性肝衰竭",
            hospitalName: "青岛科大医院",
            transportTime: "2024-12-16 08:30:00",
            coordinator: "赵医生",
            createTime: "2024-12-14 16:20:00",
            status: "cancelled",
            statusText: "已取消",
            cancelReason: "家属临时改变决定"
          }
        ];
        // 更新统计数据
        this.updateStats();
        this.total = this.transportList.length;
      try {
        const requestParams = {
          pageNum: this.queryParams.pageNum,
          pageSize: this.queryParams.pageSize,
          caseNo: this.queryParams.caseNo,
          patName: this.queryParams.patName,
          transitStatus: this.queryParams.transitStatus,
          searchValue: this.queryParams.searchValue
        };
        if (this.dateRange && this.dateRange.length === 2) {
          requestParams.transportStartTime = this.dateRange.join(",");
        }
        const response = await transportList(requestParams);
        if (response.code === 200) {
          this.transportList = response.rows || response.data || [];
          this.total = response.total || 0;
          this.updateStats();
        } else {
          this.$modal.msgError(response.msg || "获取转运单列表失败");
        }
      } catch (error) {
        console.error("获取转运单列表失败:", error);
        this.$modal.msgError("网络请求失败,请稍后重试");
      } finally {
        this.loading = false;
      }, 500);
      }
    },
  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
      };
    },
    /** 获取状态标签类型 */
    getStatusTagType(transitStatus) {
      const statusMap = {
        1: "warning", // 待转运
        2: "primary", // 转运中
        3: "success", // 转运完成
        4: "danger", // 转运取消
        5: "info" // 暂存
      };
      return statusMap[transitStatus] || "info";
    },
    /** 获取状态文本 */
    getStatusText(transitStatus) {
      const statusMap = {
        1: "待转运",
        2: "转运中",
        3: "转运完成",
        4: "转运取消",
        5: "暂存"
      };
      return statusMap[transitStatus] || "未知状态";
    },
    // 更新统计数据
    updateStats() {
      this.stats.totalTransports = this.transportList.length;
      this.stats.pendingTransports = this.transportList.filter(
        item => item.status === "pending"
        item => item.transitStatus === 1
      ).length;
      this.stats.completedTransports = this.transportList.filter(
        item => item.status === "completed"
        item => item.transitStatus === 3
      ).length;
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id);
      this.ids = selection.map(item => item.reportId || item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
    },
@@ -504,46 +695,59 @@
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.queryParams = {
        pageNum: 1,
        pageSize: 10,
        caseNo: undefined,
        patName: undefined,
        transitStatus: undefined,
        searchValue: undefined
      };
      this.getList();
    },
    /** 详情按钮操作 */
    handleDetail(row) {
      this.currentTransport = row;
      this.detailTitle = `转运单详情 - ${row.reportId || row.id}`;
      this.detailOpen = true;
    },
    /** 修改按钮操作 */
    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;
    },
    /** 保存成功处理 */
    handleSaveSuccess() {
      this.getList(); // 重新加载列表
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** 详情按钮操作 */
    handleDetail(row) {
      this.currentTransport = row;
      this.detailTitle = `转运单详情 - ${row.id}`;
      this.detailOpen = true;
    },
    /** 开始转运操作 */
    handleStartTransport(row) {
    async handleStartTransport(row) {
      this.currentTransport = row;
      this.actionTitle = "开始转运";
      this.actionText = "开始";
@@ -551,7 +755,7 @@
    },
    /** 完成转运操作 */
    handleCompleteTransport(row) {
    async handleCompleteTransport(row) {
      this.currentTransport = row;
      this.actionTitle = "完成转运";
      this.actionText = "完成";
@@ -559,47 +763,56 @@
    },
    /** 确认操作 */
    confirmAction() {
      const index = this.transportList.findIndex(
        item => item.id === this.currentTransport.id
      );
      if (index !== -1) {
    async confirmAction() {
      try {
        let requestData = {
          id: this.currentTransport.id || this.currentTransport.reportId
        };
        if (this.actionText === "开始") {
          this.transportList[index].status = "transporting";
          this.transportList[index].statusText = "转运中";
          requestData.transitStatus = 2; // 设置为转运中
        } else if (this.actionText === "完成") {
          this.transportList[index].status = "completed";
          this.transportList[index].statusText = "已完成";
          this.transportList[index].completedTime = new Date().toLocaleString();
          requestData.transitStatus = 3; // 设置为转运完成
        }
        // 更新统计数据
        this.updateStats();
        const response = await transportEdit(requestData);
        this.$modal.msgSuccess(`${this.actionText}成功`);
        if (response.code === 200) {
          this.$modal.msgSuccess(`${this.actionText}转运成功`);
          this.getList();
        } else {
          this.$modal.msgError(response.msg || `${this.actionText}转运失败`);
        }
      } catch (error) {
        console.error(`${this.actionText}转运失败:`, error);
        this.$modal.msgError("操作失败,请稍后重试");
      }
      this.actionOpen = false;
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal
        .confirm('是否确认删除转运单编号为"' + ids + '"的数据项?')
        .then(() => {
          // 模拟删除操作
          this.transportList = this.transportList.filter(
            item => !ids.includes(item.id)
          );
          this.total = this.transportList.length;
          this.updateStats();
    async handleDelete(row) {
      const ids = row.reportId || row.id || this.ids;
      try {
        await this.$modal.confirm(
          '是否确认删除转运单编号为"' + ids + '"的数据项?'
        );
        const response = await transportDelete(ids);
        if (response.code === 200) {
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
          this.getList();
        } else {
          this.$modal.msgError(response.msg || "删除失败");
        }
      } catch (error) {
        if (error !== "cancel") {
          console.error("删除失败:", error);
          this.$modal.msgError("删除失败,请稍后重试");
        }
      }
    },
    /** 导出按钮操作 */
@@ -611,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;
}
@@ -675,7 +901,9 @@
}
.donor-info {
  text-align: left;
  text-align: center;
  display: flex;
  justify-content: center
}
.donor-name {
@@ -684,8 +912,10 @@
}
.donor-details {
  font-size: 12px;
  color: #909399;
  margin-left: 5px;
  font-size: 16px;
  color: #093ca4;
  display: flex;
}
.mb8 {