wwl
3 天以前 5821664d8e34973ec0e0123228c3591da51cdd2f
src/views/doctor/inspectCheck/index.vue
@@ -17,13 +17,13 @@
        </el-button>
      </el-form-item>
    </el-form>
    <div class="box">
      <div class="table-header">
        检验记录
      </div>
      <div class="table-header">检验记录</div>
      <div>
        <el-table :data="exaLists" border style="width: 100%" @selection-change="handleSelectionChange"
          :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }" height="350" ref="firstTable">
          @select-all="handleSelectAll" :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }"
          height="350" ref="firstTable">
          <el-table-column fixed type="selection" align="center" label="选择" width="50" />
          <el-table-column label="姓名" align="center" prop="name" width="80" />
          <el-table-column label="性别" align="center" prop="gender" width="80" />
@@ -49,14 +49,26 @@
        </el-table>
      </div>
    </div>
    <div class="table-title">
  <h3>
    体检记录:
    <span class="highlight">姓名:{{ infoList.tjCustomerName || "暂无" }}</span>
    <span class="highlight">性别:{{ infoList.tjCustomerSex == 0 ? "男" : infoList.tjCustomerSex == 1 ? "女" : "暂无" }}</span>
    <span class="highlight">年龄:{{ infoList.tjCustomerAge || "暂无" }}</span>
  </h3>
</div>
      <h3>
        体检记录:
        <span class="highlight">姓名:{{ infoList.tjCustomerName || "暂无" }}</span>
        <span class="highlight">
          性别:
          {{
            infoList.tjCustomerSex == 0
              ? "男"
              : infoList.tjCustomerSex == 1
                ? "女"
                : "暂无"
          }}
        </span>
        <span class="highlight">年龄:{{ infoList.tjCustomerAge || "暂无" }}</span>
        <span class="highlight">门诊号:{{ infoList.cardId || "暂无" }}</span>
      </h3>
    </div>
    <el-table border height="350" ref="tab1" :data="checkList" v-loading="loading" style="width: 100%"
      @selection-change="handleSelectionChangeSecond"
      :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }">
@@ -81,320 +93,148 @@
<script>
import { getlisList, getJyTjList, asyncPacs } from "@/api/doctor/pacsCheck";
import { getOrderList } from "@/api/hosp/order";
import moment from "moment";
export default {
  dicts: ["dict_tj_status"],
  data() {
    return {
        isProcessing: false, // 防止死循环
    isDeselection: false, // 标记是否为取消选中
      infoList: {},
      dis: false,
      code: null,
      createTimeList: "",
      total: 0,
      loading: false,
      isSyncing: false,
      isFetchingRightTableData: false,
      queryParams: {
        name: null,
        start: null,
        end: null,
        tjNum: null,
      },
      checkStatus: "0",
      exaLists: [],
      selectedFirstTable: null,
      selectedSecondTable: [],
      form: {},
      clearTimeSet: null,
      tjNumbers: "",
      multipleSelection: "",
      tjnum: "",
      xiangmuList: [],
      checkList: [],
      tg: true,
      bh: true,
      pickerOptions: {
        shortcuts: [
          {
            text: "最近一周",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近一个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近三个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
              picker.$emit("pick", [start, end]);
            },
          },
        ],
      },
      infoList: {},
      selectedFirstTable: [],
      selectedSecondTable: [],
      loading: false,
      isProcessingSelection: false,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.$refs.inputName.focus();
    });
  },
  methods: {
    handleDateChange(val) {
      if (val && val.length === 2) {
        this.queryParams.start = val[0];
        this.queryParams.end = val[1];
      } else {
        this.queryParams.start = null;
        this.queryParams.end = null;
      }
      console.log("Query Params:", this.queryParams);
    },
    tableRowClassName({ row }) {
      return !row.brid ? "row-disabled" : "";
    },
handleSelectionChange(val) {
  // 防止重复触发
  if (this.isProcessingSelection) {
    console.log('正在处理选择,跳过重复触发');
    return;
  }
  this.isProcessingSelection = true;
  // 如果没有选中行,清空所有选择并跳过接口调用
  if (val.length === 0) {
    console.log('检测到取消选中,清空所有选择');
    this.$refs.firstTable.clearSelection();
    this.selectedFirstTable = null;
    this.checkList = [];
    this.isDeselection = true;
    this.$nextTick(() => {
      this.isProcessingSelection = false;
      this.$refs.firstTable.$forceUpdate(); // 强制刷新表格
    });
    return;
  }
  // 检查是否点击了全选按钮(val 长度等于表格总行数)
  if (val.length === this.exaLists.length) {
    console.log('检测到全选,选中所有行');
    this.selectedFirstTable = [...this.exaLists]; // 选中所有行
    this.$refs.firstTable.clearSelection();
    this.exaLists.forEach(row => {
      if (!row.brid) {
        console.warn(`名称为 ${row.name} 的行没有申请单号,跳过选择`);
        return;
      }
      this.$refs.firstTable.toggleRowSelection(row, true, false);
    });
  } else {
    // 获取最新选中的行
    const latestSelectedRow = val[val.length - 1];
    // 检查是否点击了已选中的行(取消所有选中)
    const isTogglingSelectedRow = this.selectedFirstTable && this.selectedFirstTable.some(row => row.tempId === latestSelectedRow.tempId);
    if (isTogglingSelectedRow) {
      console.log('点击已选中行,取消所有选中');
      this.$refs.firstTable.clearSelection();
      this.selectedFirstTable = null;
      this.checkList = [];
      this.isDeselection = true;
      this.$nextTick(() => {
        this.isProcessingSelection = false;
        this.$refs.firstTable.$forceUpdate(); // 强制刷新表格
      });
      return;
    }
    // 正常选中逻辑:根据 brid 筛选
    const filterKey = 'brid';
    const filterValue = latestSelectedRow.brid;
    console.log(`按 ${filterKey} 筛选: ${filterValue}`);
    // 清空所有选中状态
    this.$refs.firstTable.clearSelection();
    // 选中与 brid 匹配的行
    const rowsToSelect = this.exaLists.filter(row => row.brid === filterValue);
    rowsToSelect.forEach(row => {
      if (!row.brid) {
        console.warn(`名称为 ${row.name} 的行没有申请单号,跳过选择`);
        return;
      }
      this.$refs.firstTable.toggleRowSelection(row, true, false);
    });
    // 更新 selectedFirstTable 为 brid 匹配的行
    this.selectedFirstTable = rowsToSelect;
  }
  // 调用右侧表格数据
  if (!this.isFetchingRightTableData && this.selectedFirstTable.length > 0) {
    this.isFetchingRightTableData = true;
    this.fetchRightTableData().finally(() => {
      this.isFetchingRightTableData = false;
      this.$nextTick(() => {
        // 仅更新样式,不触发新事件
        this.$refs.firstTable.$forceUpdate();
        this.isProcessingSelection = false;
      });
    });
  } else {
    this.isProcessingSelection = false;
  }
  // 重置 isDeselection 状态
  this.isDeselection = false;
},
    fetchRightTableData() {
      const code = this.queryParams.tjNum;
      if (!code) {
        console.warn('未提供体检号,跳过 fetchRightTableData');
        this.checkList = [];
        this.loading = false;
        return Promise.resolve();
      }
      this.loading = true;
      return getJyTjList(code)
        .then((response) => {
          this.checkList = response.data || [];
          this.loading = false;
        })
        .catch((error) => {
          console.error('获取 checkList 失败:', error);
          this.checkList = [];
          this.loading = false;
          throw error;
        });
    },
    handleSelectionChangeSecond(selectedRows) {
      this.selectedSecondTable = selectedRows;
      if (selectedRows.length > 1) {
        let del_row = selectedRows.shift();
        this.$refs.tab1.toggleRowSelection(del_row, false);
      }
      console.log("当前选中的行数据:", this.selectedSecondTable);
    },
    async handleQuery() {
      if (!this.queryParams.tjNum) {
        this.$message.error("体检号不能为空");
        return;
      }
      this.loading = true;
      try {
        // 并行执行两个查询
        const [orderResponse, lisResponse] = await Promise.all([
          getOrderList(this.queryParams).catch((error) => {
            console.error('获取 orderList 失败:', error);
            return { data: { list: [] } }; // 返回空数据以继续执行
          }),
          getOrderList(this.queryParams).catch(() => ({ data: { list: [] } })),
          getlisList(this.queryParams),
        ]);
        // 处理 getOrderList 结果
        if (orderResponse.data?.list?.length > 0) {
          this.infoList = orderResponse.data.list[0];
        } else {
          this.infoList = {};
          console.warn('getOrderList 返回空列表');
        }
        // 处理 getlisList 结果
        if (lisResponse.code === 200) {
          this.exaLists = lisResponse.data.map((item, index) => ({
            ...item,
            brid: item.brid?.trim(), // 清理空格
            mzh: item.mzh?.trim(),
            tempId: index,
          }));
          console.log('Loaded exaLists:', this.exaLists);
          // 获取右侧表格数据
          await this.fetchRightTableData();
        } else {
          this.exaLists = [];
          this.$message.error(lisResponse.msg || "查询检验记录失败");
        }
      } catch (error) {
        console.error('查询失败:', error);
        this.$message.error(error?.msg || "查询失败,请稍后重试");
        this.exaLists = [];
        this.checkList = [];
        this.infoList = {};
        this.infoList = orderResponse.data.list?.[0] || {};
        this.exaLists = lisResponse.data.map((item, index) => ({
          ...item,
          brid: item.brid?.trim(),
          tempId: index,
        }));
        await this.fetchRightTableData();
      } catch (e) {
        console.error(e);
      } finally {
        this.loading = false;
      }
      // 处理时间范围
      if (this.createTimeList) {
        this.queryParams.start = this.createTimeList[0];
        this.queryParams.end = this.createTimeList[1];
      } else {
        this.queryParams.start = null;
        this.queryParams.end = null;
      }
    },
    resetQuery() {
      this.createTimeList = [];
      this.resetForm("queryForm");
      this.queryParams = {
        name: null,
        start: null,
        end: null,
        tjNum: null,
      };
      this.checkList = [];
      this.queryParams.tjNum = null;
      this.exaLists = [];
      this.checkList = [];
      this.infoList = {};
      this.selectedFirstTable = [];
      this.selectedSecondTable = [];
    },
    handleCurrentChange(row) {
      this.currentRow = row;
    // ✅ 分组多选稳固版
    handleSelectionChange(selection) {
      if (this.isProcessingSelection) return;
      this.isProcessingSelection = true;
      // 计算所有被选中的分组 brid
      const allBrids = new Set();
      selection.forEach(row => allBrids.add(row.brid));
      // 清空后重选
      this.$refs.firstTable.clearSelection();
      this.$nextTick(() => {
        const newSelection = this.exaLists.filter(row => allBrids.has(row.brid));
        newSelection.forEach(row => {
          this.$refs.firstTable.toggleRowSelection(row, true);
        });
        this.selectedFirstTable = newSelection;
        this.isProcessingSelection = false;
        this.fetchRightTableData();
      });
    },
    setTime() {
      this.clearTimeSet = setInterval(() => {
        this.$modal.closeLoading();
      }, 300000);
    handleSelectAll(selection) {
      if (this.isProcessingSelection) return;
      this.isProcessingSelection = true;
      if (selection.length === 0) {
        // 取消全选
        this.$refs.firstTable.clearSelection();
        this.selectedFirstTable = [];
        this.isProcessingSelection = false;
        this.fetchRightTableData();
      } else {
        // 全选所有分组
        const allBrids = new Set(this.exaLists.map(row => row.brid));
        this.$refs.firstTable.clearSelection();
        this.$nextTick(() => {
          const newSelection = this.exaLists.filter(row => allBrids.has(row.brid));
          newSelection.forEach(row => {
            this.$refs.firstTable.toggleRowSelection(row, true);
          });
          this.selectedFirstTable = newSelection;
          this.isProcessingSelection = false;
          this.fetchRightTableData();
        });
      }
    },
    // 第二个表格只允许单选
    handleSelectionChangeSecond(selected) {
      this.selectedSecondTable = selected.slice(0, 1);
    },
    fetchRightTableData() {
      if (!this.queryParams.tjNum) return;
      this.loading = true;
      return getJyTjList(this.queryParams.tjNum)
        .then(res => {
          this.checkList = res.data || [];
        })
        .finally(() => {
          this.loading = false;
        });
    },
    tongbu() {
      this.$modal.loading("正在同步,请稍候...");
      this.setTime();
      const requestData = {
        lis: this.selectedFirstTable ? this.selectedFirstTable.map((item) => ({
          ...item,
          tjNum: this.queryParams.tjNum,
        })) : [],
        jcxmid: this.selectedFirstTable && this.selectedFirstTable.length > 0 ? this.selectedFirstTable[0].jcxmid : null,
        shys: this.selectedFirstTable && this.selectedFirstTable.length > 0 ? this.selectedFirstTable[0].shys : null,
        lis: this.selectedFirstTable
          ? this.selectedFirstTable.map(item => ({
              ...item,
              tjNum: this.queryParams.tjNum,
            }))
          : [],
        jcxmid:
          this.selectedFirstTable && this.selectedFirstTable.length > 0
            ? this.selectedFirstTable[0].jcxmid
            : null,
        shys:
          this.selectedFirstTable && this.selectedFirstTable.length > 0
            ? this.selectedFirstTable[0].shys
            : null,
        tj: this.selectedSecondTable[0],
      };
      asyncPacs(requestData)
        .then((res) => {
        .then(res => {
          if (res.code === 200) {
            this.fetchRightTableData();
            clearInterval(this.clearTimeSet);
@@ -405,14 +245,17 @@
            this.$message.error(res.message || "同步失败,请稍后重试");
          }
        })
        .catch((error) => {
        .catch(() => {
          clearInterval(this.clearTimeSet);
          this.clearTimeSet = null;
          this.$modal.closeLoading();
        });
    },
  },
};</script>
};
</script>
<style lang="scss" scoped>
.app-container {
  padding: 20px;
@@ -456,17 +299,4 @@
  border-radius: 4px;
  font-size: 14px;
}
.el-table .warning-row {
  background: #e5f3ff !important;
}
::v-deep .el-table__body tr.current-row > td {
  background: #edf2fa !important;
}
.row-disabled {
  color: #999;
  background-color: #f5f5f5;
}
</style>
</style>