| | |
| | | <el-form-item label="满意度类型" prop="satisfactionScope"> |
| | | <el-select |
| | | v-model="satisfactionScope" |
| | | placeholder="默认离院" |
| | | placeholder="默认在院" |
| | | clearable |
| | | style="width: 150px" |
| | | @change="handleSatisfactionScopeChange" |
| | |
| | | @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="出院人次" |
| | |
| | | data() { |
| | | return { |
| | | // 满意度类型:leave=离院满意度(按出院病区统计),hospital=在院满意度(按在院病区统计) |
| | | satisfactionScope: "leave", |
| | | // 默认在院满意度 |
| | | satisfactionScope: "hospital", |
| | | |
| | | // 查询参数 |
| | | queryParams: { |
| | | statisticaltype: 1, |
| | | leavehospitaldistrictcodes: ["all"], |
| | | deptcodes: [], |
| | | serviceType: [2], |
| | | // 默认服务类型:6=住院满意度(出入院满意度) |
| | | serviceType: [6], |
| | | dateRange: [], |
| | | pageNum: 1, |
| | | pageSize: 20, |
| | |
| | | }, |
| | | |
| | | computed: { |
| | | // 是否按「在院满意度」口径统计:在院患者按在院病区(hospitaldistrictcodes)统计, |
| | | // 离院满意度仍按出院病区(leavehospitaldistrictcodes)统计 |
| | | // 是否按「在院满意度」口径统计:在院用 hospitaldistrictcodes / hospitaldeptcodes, |
| | | // 离院用 leavehospitaldistrictcodes / leaveldeptcodes |
| | | // 默认在院,所以清空下拉时仍按在院口径处理 |
| | | isInHospitalSatisfaction() { |
| | | return this.satisfactionScope === "hospital"; |
| | | }, |
| | | |
| | | // 病区列标题 |
| | | wardColumnLabel() { |
| | | return this.isInHospitalSatisfaction ? "在院病区" : "出院病区"; |
| | | return this.satisfactionScope !== "leave"; |
| | | }, |
| | | }, |
| | | |
| | |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | |
| | | // 处理病区/科室选择 |
| | | // 处理病区/科室选择:只保留当前统计类型 + 当前满意度类型对应的字段, |
| | | // 避免在院/离院两套条件同时拼进 SQL |
| | | if (params.statisticaltype == 1) { |
| | | // 病区统计 |
| | | let wardCodes = params.leavehospitaldistrictcodes || []; |
| | |
| | | (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 { |
| | |
| | | } |
| | | } 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); |
| | |
| | | } |
| | | }, |
| | | 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, |
| | |
| | | this.getList(); |
| | | }, |
| | | |
| | | // 重置查询 |
| | | // 重置查询(恢复默认:在院满意度 + 服务类型 6) |
| | | resetQuery() { |
| | | this.satisfactionScope = "hospital"; |
| | | this.queryParams = { |
| | | statisticaltype: 1, |
| | | leavehospitaldistrictcodes: [], |
| | | deptcodes: [], |
| | | serviceType: [2], |
| | | serviceType: [6], |
| | | dateRange: [], |
| | | pageNum: 1, |
| | | pageSize: 20, |
| | |
| | | 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 || ""; |
| | | }, |
| | | |
| | | // 格式化百分比 |
| | |
| | | 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); |
| | |
| | | }, |
| | | }; |
| | | |
| | | // 添加总标题 |
| | | // 添加总标题(两列维度 + 八个指标列,共 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 ? "离院病区" : "离院科室", |
| | | "出院人次", |
| | | "无需随访人次", |
| | | "应随访人次", |
| | |
| | | // 添加数据行 |
| | | 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, |
| | |
| | | // 设置列宽 |
| | | worksheet.columns = [ |
| | | { width: 20 }, |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |