liusheng
13 小时以前 9903954c85f651dd5cc6d4b538cfe66b17fc5baa
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -12,7 +12,7 @@
        <el-form-item label="满意度类型" prop="satisfactionScope">
          <el-select
            v-model="satisfactionScope"
            placeholder="默认离院"
            placeholder="默认在院"
            clearable
            style="width: 150px"
            @change="handleSatisfactionScopeChange"
@@ -150,33 +150,67 @@
        @selection-change="handleSelectionChange"
        :row-key="getRowKey"
      >
        <!-- 病区列:住院满意度统计在院病区,其余统计出院病区 -->
        <!-- 病区统计:在院病区 + 离院病区 -->
        <el-table-column
          v-if="queryParams.statisticaltype == 1"
          :label="wardColumnLabel"
          label="在院病区"
          align="center"
          sortable
          key="hospitaldistrictname"
          prop="hospitaldistrictname"
          :show-overflow-tooltip="true"
          :sort-method="sortHospitalWard"
          min-width="120"
        >
          <template slot-scope="scope">
            {{ scope.row.hospitaldistrictname || "-" }}
          </template>
        </el-table-column>
        <el-table-column
          v-if="queryParams.statisticaltype == 1"
          label="离院病区"
          align="center"
          sortable
          key="leavehospitaldistrictname"
          prop="leavehospitaldistrictname"
          :show-overflow-tooltip="true"
          :sort-method="sortChineseNumber"
          :sort-method="sortLeaveWard"
          min-width="120"
        >
          <template slot-scope="scope">
            {{ getWardName(scope.row) || "-" }}
            {{ scope.row.leavehospitaldistrictname || "-" }}
          </template>
        </el-table-column>
        <!-- 科室列 -->
        <!-- 科室统计:在院科室 + 离院科室 -->
        <el-table-column
          v-if="queryParams.statisticaltype == 2"
          label="科室"
          label="在院科室"
          align="center"
          key="hospitaldeptname"
          prop="hospitaldeptname"
          :show-overflow-tooltip="true"
          min-width="120"
        >
          <template slot-scope="scope">
            {{ scope.row.hospitaldeptname || "-" }}
          </template>
        </el-table-column>
        <el-table-column
          v-if="queryParams.statisticaltype == 2"
          label="离院科室"
          align="center"
          key="deptname"
          prop="deptname"
          :show-overflow-tooltip="true"
          min-width="120"
        />
        >
          <template slot-scope="scope">
            {{ scope.row.deptname || "-" }}
          </template>
        </el-table-column>
        <el-table-column
          label="出院人次"
@@ -367,14 +401,16 @@
  data() {
    return {
      // 满意度类型:leave=离院满意度(按出院病区统计),hospital=在院满意度(按在院病区统计)
      satisfactionScope: "leave",
      // 默认在院满意度
      satisfactionScope: "hospital",
      // 查询参数
      queryParams: {
        statisticaltype: 1,
        leavehospitaldistrictcodes: ["all"],
        deptcodes: [],
        serviceType: [2],
        // 默认服务类型:6=住院满意度(出入院满意度)
        serviceType: [6],
        dateRange: [],
        pageNum: 1,
        pageSize: 20,
@@ -480,15 +516,11 @@
  },
  computed: {
    // 是否按「在院满意度」口径统计:在院患者按在院病区(hospitaldistrictcodes)统计,
    // 离院满意度仍按出院病区(leavehospitaldistrictcodes)统计
    // 是否按「在院满意度」口径统计:在院用 hospitaldistrictcodes / hospitaldeptcodes,
    // 离院用 leavehospitaldistrictcodes / leaveldeptcodes
    // 默认在院,所以清空下拉时仍按在院口径处理
    isInHospitalSatisfaction() {
      return this.satisfactionScope === "hospital";
    },
    // 病区列标题
    wardColumnLabel() {
      return this.isInHospitalSatisfaction ? "在院病区" : "出院病区";
      return this.satisfactionScope !== "leave";
    },
  },
@@ -554,7 +586,8 @@
          params.endTime = this.queryParams.dateRange[1];
        }
        // 处理病区/科室选择
        // 处理病区/科室选择:只保留当前统计类型 + 当前满意度类型对应的字段,
        // 避免在院/离院两套条件同时拼进 SQL
        if (params.statisticaltype == 1) {
          // 病区统计
          let wardCodes = params.leavehospitaldistrictcodes || [];
@@ -564,9 +597,11 @@
              (ward) => ward.districtCode
            );
          }
          // 住院满意度针对在院患者,按在院病区(hospitaldistrictcodes)统计;
          // 出院随访等其他服务类型仍按出院病区(leavehospitaldistrictcodes)统计
          delete params.leavehospitaldistrictcodes;
          delete params.hospitaldistrictcodes;
          delete params.deptcodes;
          delete params.leaveldeptcodes;
          delete params.hospitaldeptcodes;
          if (this.isInHospitalSatisfaction) {
            params.hospitaldistrictcodes = wardCodes;
          } else {
@@ -574,20 +609,33 @@
          }
        } else if (params.statisticaltype == 2) {
          // 科室统计
          if (params.deptcodes.includes("all")) {
          let deptCodes = params.deptcodes || [];
          if (deptCodes.includes("all")) {
            // 如果选择了"全部",则移除"all"值
            params.deptcodes = params.deptcodes.filter(
              (item) => item !== "all"
            );
            deptCodes = deptCodes.filter((item) => item !== "all");
            // 如果需要传所有科室代码,可以从store中获取
            params.deptcodes = (this.$store.getters.belongDepts || []).map(
            deptCodes = (this.$store.getters.belongDepts || []).map(
              (dept) => dept.deptCode
            );
          }
          delete params.deptcodes;
          delete params.leaveldeptcodes;
          delete params.hospitaldeptcodes;
          delete params.leavehospitaldistrictcodes;
          delete params.hospitaldistrictcodes;
          if (this.isInHospitalSatisfaction) {
            params.hospitaldeptcodes = deptCodes;
          } else {
            params.leaveldeptcodes = deptCodes;
          }
        }
        const response = await getSfStatisticsJoy(params);
        this.userList = this.customSort(response.data) || [];
        // 科室统计按接口返回顺序,病区统计保持原有的中文序号排序
        this.userList =
          this.queryParams.statisticaltype == 1
            ? this.customSort(response.data) || []
            : response.data || [];
        this.total = response.total || 0;
      } catch (error) {
        console.error("获取统计列表失败:", error);
@@ -597,9 +645,22 @@
      }
    },
    sortChineseNumber(aRow, bRow) {
      const a = this.getWardName(aRow);
      const b = this.getWardName(bRow);
      return this.compareWardNames(this.getWardName(aRow), this.getWardName(bRow));
    },
    sortHospitalWard(aRow, bRow) {
      return this.compareWardNames(
        aRow && aRow.hospitaldistrictname,
        bRow && bRow.hospitaldistrictname
      );
    },
    sortLeaveWard(aRow, bRow) {
      return this.compareWardNames(
        aRow && aRow.leavehospitaldistrictname,
        bRow && bRow.leavehospitaldistrictname
      );
    },
    // 比较两个病区名称的中文序号;无序号时按字符串比较
    compareWardNames(a, b) {
      // 中文数字到阿拉伯数字的映射(扩展到45)
      const chineseNumMap = {
        一: 1,
@@ -793,13 +854,14 @@
      this.getList();
    },
    // 重置查询
    // 重置查询(恢复默认:在院满意度 + 服务类型 6)
    resetQuery() {
      this.satisfactionScope = "hospital";
      this.queryParams = {
        statisticaltype: 1,
        leavehospitaldistrictcodes: [],
        deptcodes: [],
        serviceType: [2],
        serviceType: [6],
        dateRange: [],
        pageNum: 1,
        pageSize: 20,
@@ -827,17 +889,19 @@
      this.multiple = !selection.length;
    },
    // 获取行key
    // 获取行key(按当前统计类型取对应维度编码)
    getRowKey(row) {
      return row.statisticaltype === 1
      return this.queryParams.statisticaltype == 1
        ? row.hospitaldistrictcode || row.leavehospitaldistrictcode
        : row.deptcode;
        : row.hospitaldeptcode || row.deptcode;
    },
    // 病区名称:住院满意度接口返回在院病区字段,其余返回出院病区字段
    // 当前满意度类型对应的病区名称(用于排序/导出/详情标题)
    getWardName(row) {
      if (!row) return "";
      return row.hospitaldistrictname || row.leavehospitaldistrictname || "";
      return this.isInHospitalSatisfaction
        ? row.hospitaldistrictname || ""
        : row.leavehospitaldistrictname || "";
    },
    // 格式化百分比
@@ -874,22 +938,33 @@
          params.endTime = this.queryParams.dateRange[1];
        }
        // 详情只按当前分组维度过滤,清掉其余维度,避免在院/离院条件互相干扰
        delete params.deptcodes;
        delete params.leaveldeptcodes;
        delete params.hospitaldeptcodes;
        delete params.leavehospitaldistrictcodes;
        delete params.hospitaldistrictcodes;
        if (this.queryParams.statisticaltype == 1) {
          this.topicvalue.name = this.getWardName(row);
          // 住院满意度按在院病区统计,其余按出院病区统计
          if (this.isInHospitalSatisfaction) {
            delete params.leavehospitaldistrictcodes;
            params.hospitaldistrictcodes = [
              row.hospitaldistrictcode || row.leavehospitaldistrictcode,
            ];
            this.topicvalue.name = row.hospitaldistrictname || "-";
            params.hospitaldistrictcodes = [row.hospitaldistrictcode].filter(
              Boolean
            );
          } else {
            this.topicvalue.name = row.leavehospitaldistrictname || "-";
            params.leavehospitaldistrictcodes = [
              row.leavehospitaldistrictcode,
            ];
            ].filter(Boolean);
          }
        } else {
          this.topicvalue.name = row.deptname;
          params.deptcodes = [row.deptcode];
          if (this.isInHospitalSatisfaction) {
            this.topicvalue.name = row.hospitaldeptname || "-";
            params.hospitaldeptcodes = [row.hospitaldeptcode].filter(Boolean);
          } else {
            this.topicvalue.name = row.deptname || "-";
            params.leaveldeptcodes = [row.deptcode].filter(Boolean);
          }
        }
        const response = await getSfStatisticsJoyInfo(params);
@@ -1012,16 +1087,18 @@
          },
        };
        // 添加总标题
        // 添加总标题(两列维度 + 八个指标列,共 10 列)
        worksheet.mergeCells(1, 1, 1, 10);
        const titleCell = worksheet.getCell(1, 1);
        titleCell.value = `满意度随访统计表(${sheetNameSuffix})`;
        titleCell.style = titleStyle;
        worksheet.getRow(1).height = 35;
        // 添加表头
        // 添加表头(科室统计导出在院科室+离院科室,病区统计导出在院病区+离院病区)
        const isWardStatistics = this.queryParams.statisticaltype == 1;
        const headers = [
          this.queryParams.statisticaltype == 1 ? this.wardColumnLabel : "科室",
          isWardStatistics ? "在院病区" : "在院科室",
          isWardStatistics ? "离院病区" : "离院科室",
          "出院人次",
          "无需随访人次",
          "应随访人次",
@@ -1041,9 +1118,12 @@
        // 添加数据行
        this.userList.forEach((item) => {
          const dataRow = worksheet.addRow([
            this.queryParams.statisticaltype == 1
              ? this.getWardName(item)
              : item.deptname,
            isWardStatistics
              ? item.hospitaldistrictname || "-"
              : item.hospitaldeptname || "-",
            isWardStatistics
              ? item.leavehospitaldistrictname || "-"
              : item.deptname || "-",
            item.dischargeCount || 0,
            item.nonFollowUp || 0,
            item.followUpNeeded || 0,
@@ -1063,6 +1143,7 @@
        // 设置列宽
        worksheet.columns = [
          { width: 20 },
          { width: 20 },
          { width: 12 },
          { width: 12 },
          { width: 12 },