<template>
|
<div class="second-follow-up">
|
<div class="your-table-container">
|
<el-table
|
ref="exportTableSecond"
|
id="exportTableidSecond"
|
v-loading="loading"
|
:data="tableData"
|
:border="true"
|
@selection-change="handleSelectionChange"
|
@expand-change="handleRowClick"
|
:row-key="getRowKey"
|
show-summary
|
:summary-method="getSummaries"
|
:expand-row-keys="expands"
|
>
|
<!-- 展开行箭头列 -->
|
<el-table-column type="expand">
|
<template slot-scope="props">
|
<el-table
|
:data="props.row.doctorStats"
|
border
|
style="width: 95%; margin: 0 auto"
|
class="inner-table"
|
show-summary
|
:summary-method="getInnerSummaries"
|
>
|
<el-table-column label="医生姓名" prop="drname" align="center" />
|
<el-table-column label="科室" width="120" prop="deptname" align="center" />
|
<el-table-column label="出院人次" prop="dischargeCount" align="center" />
|
<el-table-column label="无需随访人次" align="center" width="100" key="nonFollowUp" prop="nonFollowUp" />
|
<el-table-column label="应随访人次" align="center" width="100" key="followUpNeeded" prop="followUpNeeded" />
|
|
<el-table-column align="center" label="再次出院随访">
|
<el-table-column label="需随访" align="center" key="needFollowUpAgain" prop="needFollowUpAgain" />
|
<el-table-column label="待随访" align="center" key="pendingFollowUpAgain" prop="pendingFollowUpAgain" />
|
<el-table-column label="随访成功" align="center" key="followUpSuccessAgain" prop="followUpSuccessAgain" />
|
<el-table-column label="随访失败" align="center" key="followUpFailAgain" prop="followUpFailAgain" />
|
<el-table-column label="随访率" align="center" width="120" key="followUpRateAgain" prop="followUpRateAgain" />
|
<el-table-column label="人工" align="center" key="manualAgain" prop="manualAgain" />
|
<el-table-column label="短信" align="center" key="smsAgain" prop="smsAgain" />
|
<el-table-column label="微信" align="center" key="weChatAgain" prop="weChatAgain" />
|
</el-table-column>
|
</el-table>
|
</template>
|
</el-table-column>
|
|
<!-- 表格列定义 -->
|
<el-table-column
|
label="出院病区"
|
align="center"
|
sortable
|
key="leavehospitaldistrictname"
|
prop="leavehospitaldistrictname"
|
width="150"
|
:show-overflow-tooltip="true"
|
:sort-method="sortChineseNumber"
|
/>
|
<el-table-column label="科室" align="center" key="deptname" prop="deptname" :show-overflow-tooltip="true" />
|
<el-table-column label="出院人次" align="center" key="dischargeCount" prop="dischargeCount" />
|
<el-table-column label="无需随访人次" align="center" width="100" key="nonFollowUp" prop="nonFollowUp" />
|
<el-table-column label="应随访人次" align="center" width="100" key="followUpNeeded" prop="followUpNeeded" />
|
|
<el-table-column align="center" label="再次出院随访">
|
<el-table-column label="需随访" align="center" key="needFollowUpAgain" prop="needFollowUpAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'needFollowUpAgainInfo', '再次随访需随访列表')">
|
<span class="button-zx">{{ scope.row.needFollowUpAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="待随访" align="center" key="pendingFollowUpAgain" prop="pendingFollowUpAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'pendingFollowUpAgainInfo', '再次随访待随访列表')">
|
<span class="button-zx">{{ scope.row.pendingFollowUpAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="随访成功" align="center" key="followUpSuccessAgain" prop="followUpSuccessAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'followUpSuccessAgainInfo', '再次随访随访成功列表')">
|
<span class="button-zx">{{ scope.row.followUpSuccessAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="随访失败" align="center" key="followUpFailAgain" prop="followUpFailAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'followUpFailAgainInfo', '再次随访随访失败列表')">
|
<span class="button-zx">{{ scope.row.followUpFailAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="随访率" align="center" width="120" key="followUpRateAgain" prop="followUpRateAgain" />
|
<el-table-column label="人工" align="center" key="manualAgain" prop="manualAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'manualAgainInfo', '再次随访人工随访列表')">
|
<span class="button-zx">{{ scope.row.manualAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="短信" align="center" key="smsAgain" prop="smsAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'smsAgainInfo', '再次随访短信随访列表')">
|
<span class="button-zx">{{ scope.row.smsAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
<el-table-column label="微信" align="center" key="weChatAgain" prop="weChatAgain">
|
<template slot-scope="scope">
|
<el-button size="medium" type="text" @click="handleViewDetails(scope.row, 'weChatAgainInfo', '再次随访微信随访列表')">
|
<span class="button-zx">{{ scope.row.weChatAgain }}</span>
|
</el-button>
|
</template>
|
</el-table-column>
|
</el-table-column>
|
</el-table>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { getSfStatistics } from "@/api/system/user";
|
import ExcelJS from "exceljs";
|
import { saveAs } from "file-saver";
|
|
export default {
|
name: 'SecondFollowUp',
|
props: {
|
queryParams: {
|
type: Object,
|
required: true
|
},
|
flatArrayhospit: {
|
type: Array,
|
default: () => []
|
},
|
flatArraydept: {
|
type: Array,
|
default: () => []
|
},
|
options: {
|
type: Array,
|
default: () => []
|
},
|
orgname: {
|
type: String,
|
default: ''
|
}
|
},
|
data() {
|
return {
|
tableData: [],
|
loading: false,
|
expands: [],
|
ids: []
|
}
|
},
|
methods: {
|
loadData() {
|
this.loading = true
|
const params = {
|
...this.queryParams,
|
visitCount: 2,
|
leavehospitaldistrictcodes: this.queryParams.leavehospitaldistrictcodes.includes("all")
|
? this.getAllWardCodes()
|
: this.queryParams.leavehospitaldistrictcodes,
|
deptcodes: this.queryParams.deptcodes.includes("all")
|
? this.getAllDeptCodes()
|
: this.queryParams.deptcodes
|
}
|
|
delete params.leavehospitaldistrictcodes.all
|
delete params.deptcodes.all
|
|
getSfStatistics(params)
|
.then(response => {
|
this.tableData = this.customSort(response.data)
|
})
|
.catch(error => {
|
console.error("获取再次随访数据失败:", error)
|
this.$message.error("获取再次随访数据失败")
|
})
|
.finally(() => {
|
this.loading = false
|
})
|
},
|
|
getAllWardCodes() {
|
return this.flatArrayhospit
|
.filter(item => item.value !== 'all')
|
.map(item => item.value)
|
},
|
|
getAllDeptCodes() {
|
return this.flatArraydept
|
.filter(item => item.value !== 'all')
|
.map(item => item.value)
|
},
|
|
customSort(data) {
|
const order = [
|
"一","二","三","四","五","六","七","八","九","十",
|
"十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
|
"二十一","二十二","二十三","二十四","二十五","二十六","二十七","二十八","二十九","三十",
|
"三十一","三十二","三十三","三十四","三十五","三十六","三十七","三十八","三十九","四十",
|
"四十一","四十二","四十三","四十四","四十五"
|
]
|
|
return data.sort((a, b) => {
|
const getIndex = (name) => {
|
if (!name || typeof name !== "string") return -1
|
const chineseMatch = name.match(/^([一二三四五六七八九十]+)/)
|
if (chineseMatch && chineseMatch[1]) {
|
return order.indexOf(chineseMatch[1])
|
}
|
const arabicMatch = name.match(/^(\d+)/)
|
if (arabicMatch && arabicMatch[1]) {
|
const num = parseInt(arabicMatch[1], 10)
|
if (num >= 1 && num <= 45) {
|
return num - 1
|
}
|
}
|
return -1
|
}
|
|
const indexA = getIndex(a.leavehospitaldistrictname)
|
const indexB = getIndex(b.leavehospitaldistrictname)
|
|
if (indexA === -1 && indexB === -1) {
|
return (a.leavehospitaldistrictname || "").localeCompare(b.leavehospitaldistrictname || "")
|
}
|
if (indexA === -1) return 1
|
if (indexB === -1) return -1
|
return indexA - indexB
|
})
|
},
|
|
sortChineseNumber(aRow, bRow) {
|
const a = aRow.leavehospitaldistrictname
|
const b = bRow.leavehospitaldistrictname
|
|
const chineseNumMap = {
|
一:1,二:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9,十:10,
|
十一:11,十二:12,十三:13,十四:14,十五:15,十六:16,十七:17,十八:18,十九:19,二十:20,
|
二十一:21,二十二:22,二十三:23,二十四:24,二十五:25,二十六:26,二十七:27,二十八:28,二十九:29,三十:30,
|
三十一:31,三十二:32,三十三:33,三十四:34,三十五:35,三十六:36,三十七:37,三十八:38,三十九:39,四十:40,
|
四十一:41,四十二:42,四十三:43,四十四:44,四十五:45
|
}
|
|
const getNumberFromText = (text) => {
|
if (!text || typeof text !== "string") return -1
|
const match = text.match(/^([一二三四五六七八九十]+)/)
|
if (match && match[1]) {
|
const chineseNum = match[1]
|
return chineseNumMap[chineseNum] !== undefined ? chineseNumMap[chineseNum] : -1
|
}
|
const arabicMatch = text.match(/^(\d+)/)
|
if (arabicMatch && arabicMatch[1]) {
|
const num = parseInt(arabicMatch[1], 10)
|
return num >= 1 && num <= 45 ? num : -1
|
}
|
return -1
|
}
|
|
const numA = getNumberFromText(a)
|
const numB = getNumberFromText(b)
|
|
if (numA === -1 && numB === -1) {
|
return (a || "").localeCompare(b || "")
|
}
|
if (numA === -1) return 1
|
if (numB === -1) return -1
|
return numA - numB
|
},
|
|
getRowKey(row) {
|
return row.statisticaltype === 1 ? row.leavehospitaldistrictcode : row.deptcode
|
},
|
|
handleRowClick(row) {
|
if (this.expands.includes(this.getRowKey(row))) {
|
this.expands = []
|
return
|
}
|
|
const params = {
|
...this.queryParams,
|
deptcodes: this.queryParams.deptcodes.includes("all")
|
? this.getAllDeptCodes()
|
: this.queryParams.deptcodes,
|
leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
|
drcode: "1",
|
visitCount: 2
|
}
|
|
delete params.leavehospitaldistrictcodes.all
|
delete params.deptcodes.all
|
|
if (!row.doctorStats) {
|
this.loading = true
|
getSfStatistics(params).then((res) => {
|
this.$set(row, "doctorStats", res.data)
|
this.expands = [this.getRowKey(row)]
|
this.loading = false
|
})
|
} else {
|
this.expands = [this.getRowKey(row)]
|
}
|
},
|
|
getSummaries(param) {
|
const { columns, data } = param
|
const sums = []
|
|
columns.forEach((column, index) => {
|
if (index === 0) {
|
sums[index] = "合计"
|
return
|
}
|
if (index === 1 || index === 2) {
|
sums[index] = "/"
|
return
|
}
|
|
if (column.property === "followUpRateAgain") {
|
const percentageValues = data
|
.map((item) => {
|
const value = item[column.property]
|
if (!value || value === "-" || value === "0%") return null
|
if (typeof value === "string" && value.includes("%")) {
|
const numValue = parseFloat(value.replace("%", "")) / 100
|
return isNaN(numValue) ? null : numValue
|
} else {
|
const numValue = parseFloat(value)
|
return isNaN(numValue) ? null : numValue
|
}
|
})
|
.filter((value) => value !== null && value !== 0)
|
|
if (percentageValues.length > 0) {
|
const average = percentageValues.reduce((sum, value) => sum + value, 0) / percentageValues.length
|
sums[index] = (average * 100).toFixed(2) + "%"
|
} else {
|
sums[index] = "0.00%"
|
}
|
} else {
|
const values = data.map((item) => {
|
const value = item[column.property]
|
if (value === "-" || value === "" || value === null) return 0
|
return Number(value) || 0
|
})
|
|
if (!values.every((value) => isNaN(value))) {
|
sums[index] = values.reduce((prev, curr) => prev + curr, 0)
|
sums[index] = this.formatNumber(sums[index])
|
} else {
|
sums[index] = "-"
|
}
|
}
|
})
|
|
return sums
|
},
|
|
getInnerSummaries(param) {
|
const { columns, data } = param
|
const sums = []
|
|
columns.forEach((column, index) => {
|
if (index === 0) {
|
sums[index] = "小计"
|
return
|
}
|
|
if (column.property === "drname" || column.property === "deptname") {
|
sums[index] = "-"
|
return
|
}
|
|
if (column.property === "followUpRateAgain") {
|
const percentageValues = data
|
.map((item) => {
|
const value = item[column.property]
|
if (!value || value === "-" || value === "0%") return null
|
if (typeof value === "string" && value.includes("%")) {
|
const numValue = parseFloat(value.replace("%", "")) / 100
|
return isNaN(numValue) ? null : numValue
|
} else {
|
const numValue = parseFloat(value)
|
return isNaN(numValue) ? null : numValue
|
}
|
})
|
.filter((value) => value !== null && value !== 0)
|
|
if (percentageValues.length > 0) {
|
const average = percentageValues.reduce((sum, value) => sum + value, 0) / percentageValues.length
|
sums[index] = (average * 100).toFixed(2) + "%"
|
} else {
|
sums[index] = "0.00%"
|
}
|
} else {
|
const values = data.map((item) => {
|
const value = item[column.property]
|
if (value === "-" || value === "" || value === null) return 0
|
return Number(value) || 0
|
})
|
|
if (!values.every((value) => isNaN(value))) {
|
sums[index] = values.reduce((prev, curr) => prev + curr, 0)
|
sums[index] = this.formatNumber(sums[index])
|
} else {
|
sums[index] = "-"
|
}
|
}
|
})
|
|
return sums
|
},
|
|
formatNumber(num) {
|
if (isNaN(num)) return "-"
|
return Number.isInteger(num) ? num.toString() : num.toFixed(0)
|
},
|
|
handleSelectionChange(selection) {
|
this.ids = selection.map((item) => item.tagid)
|
},
|
|
handleViewDetails(row, infoKey, titleSuffix) {
|
const title = `${row.leavehospitaldistrictname || row.deptname}${titleSuffix}`
|
this.$emit('view-details', row[infoKey], title)
|
},
|
|
async exportTable() {
|
try {
|
let dateRangeString = ""
|
let sheetNameSuffix = ""
|
|
if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
|
const startDateStr = this.queryParams.dateRange[0]
|
const endDateStr = this.queryParams.dateRange[1]
|
const formatDateForDisplay = (dateTimeStr) => {
|
return dateTimeStr.split(" ")[0]
|
}
|
const startDateFormatted = formatDateForDisplay(startDateStr)
|
const endDateFormatted = formatDateForDisplay(endDateStr)
|
dateRangeString = `${startDateFormatted}至${endDateFormatted}`
|
sheetNameSuffix = `${startDateFormatted}至${endDateFormatted}`
|
} else {
|
const now = new Date()
|
const currentMonth = now.getMonth() + 1
|
dateRangeString = `${currentMonth}月`
|
sheetNameSuffix = `${currentMonth}月`
|
}
|
|
const excelName = `再次出院随访统计表_${dateRangeString}.xlsx`
|
const worksheetName = `再次随访统计_${sheetNameSuffix}`
|
|
if (!this.tableData || this.tableData.length === 0) {
|
this.$message.warning("暂无再次随访数据可导出")
|
return false
|
}
|
|
const workbook = new ExcelJS.Workbook()
|
const worksheet = workbook.addWorksheet(worksheetName)
|
|
// 构建表格
|
this.buildExportSheet(worksheet, sheetNameSuffix)
|
|
const buffer = await workbook.xlsx.writeBuffer()
|
const blob = new Blob([buffer], {
|
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
})
|
saveAs(blob, excelName)
|
|
this.$message.success("导出成功")
|
return true
|
} catch (error) {
|
console.error("导出失败:", error)
|
this.$message.error(`导出失败: ${error.message}`)
|
return false
|
}
|
},
|
|
buildExportSheet(worksheet, sheetNameSuffix) {
|
const titleStyle = {
|
font: { name: "微软雅黑", size: 16, bold: true, color: { argb: "FF000000" } },
|
fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFE6F3FF" } },
|
alignment: { vertical: "middle", horizontal: "center", wrapText: true },
|
border: {
|
top: { style: "thin", color: { argb: "FFD0D0D0" } },
|
left: { style: "thin", color: { argb: "FFD0D0D0" } },
|
bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
|
right: { style: "thin", color: { argb: "FFD0D0D0" } }
|
}
|
}
|
|
const headerStyle = {
|
font: { name: "微软雅黑", size: 11, bold: true, color: { argb: "FF000000" } },
|
fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } },
|
alignment: { vertical: "middle", horizontal: "center", wrapText: true },
|
border: {
|
top: { style: "thin", color: { argb: "FFD0D0D0" } },
|
left: { style: "thin", color: { argb: "FFD0D0D0" } },
|
bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
|
right: { style: "thin", color: { argb: "FFD0D0D0" } }
|
}
|
}
|
|
const cellStyle = {
|
font: { name: "宋体", size: 10, color: { argb: "FF000000" } },
|
alignment: { vertical: "middle", horizontal: "center" },
|
border: {
|
top: { style: "thin", color: { argb: "FFD0D0D0" } },
|
left: { style: "thin", color: { argb: "FFD0D0D0" } },
|
bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
|
right: { style: "thin", color: { argb: "FFD0D0D0" } }
|
}
|
}
|
|
const summaryStyle = {
|
font: { name: "宋体", size: 10, bold: true, color: { argb: "FF409EFF" } },
|
fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } },
|
alignment: { vertical: "middle", horizontal: "center" },
|
border: {
|
top: { style: "thin", color: { argb: "FFD0D0D0" } },
|
left: { style: "thin", color: { argb: "FFD0D0D0" } },
|
bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
|
right: { style: "thin", color: { argb: "FFD0D0D0" } }
|
}
|
}
|
|
// 添加标题行
|
worksheet.mergeCells(1, 1, 1, 15)
|
const titleCell = worksheet.getCell(1, 1)
|
titleCell.value = `再次出院随访统计表_${sheetNameSuffix}`
|
titleCell.style = titleStyle
|
worksheet.getRow(1).height = 35
|
|
// 表头
|
const secondRowHeaders = [
|
"", "出院病区", "科室", "出院人次", "无需随访人次", "应随访人次",
|
"需随访", "待随访", "随访成功", "随访失败", "随访率", "人工", "短信", "微信"
|
]
|
|
secondRowHeaders.forEach((header, index) => {
|
const cell = worksheet.getCell(3, index + 1)
|
cell.value = header
|
cell.style = headerStyle
|
})
|
|
// 合并单元格
|
for (let i = 1; i <= 6; i++) {
|
worksheet.mergeCells(2, i, 3, i)
|
const cell = worksheet.getCell(2, i)
|
cell.style = headerStyle
|
}
|
|
worksheet.getCell(2, 1).value = ""
|
worksheet.getCell(2, 2).value = "出院病区"
|
worksheet.getCell(2, 3).value = "科室"
|
worksheet.getCell(2, 4).value = "出院人次"
|
worksheet.getCell(2, 5).value = "无需随访人次"
|
worksheet.getCell(2, 6).value = "应随访人次"
|
|
worksheet.mergeCells(2, 7, 2, 14)
|
worksheet.getCell(2, 7).value = "再次出院随访"
|
worksheet.getCell(2, 7).style = headerStyle
|
|
worksheet.getRow(2).height = 28
|
worksheet.getRow(3).height = 25
|
|
// 数据行
|
this.tableData.forEach((item, rowIndex) => {
|
const dataRow = worksheet.addRow([
|
"",
|
item.leavehospitaldistrictname || "",
|
item.deptname || "",
|
item.dischargeCount || 0,
|
item.nonFollowUp || 0,
|
item.followUpNeeded || 0,
|
item.needFollowUpAgain || 0,
|
item.pendingFollowUpAgain || 0,
|
item.followUpSuccessAgain || 0,
|
item.followUpFailAgain || 0,
|
item.followUpRateAgain || "0%",
|
item.manualAgain || 0,
|
item.smsAgain || 0,
|
item.weChatAgain || 0
|
], rowIndex + 4)
|
|
dataRow.eachCell((cell) => {
|
cell.style = cellStyle
|
})
|
dataRow.height = 24
|
})
|
|
// 合计行
|
const summaries = this.getExportSummaries()
|
const summaryRow = worksheet.addRow(summaries)
|
summaryRow.eachCell((cell, colNumber) => {
|
cell.style = summaryStyle
|
if (colNumber === 1) {
|
cell.value = "合计"
|
}
|
})
|
summaryRow.height = 28
|
|
// 列宽
|
worksheet.columns = [
|
{ width: 8 }, { width: 20 }, { width: 15 }, { width: 12 }, { width: 12 }, { width: 12 },
|
{ width: 10 }, { width: 10 }, { width: 10 }, { width: 10 }, { width: 12 },
|
{ width: 8 }, { width: 8 }, { width: 8 }
|
]
|
},
|
|
getExportSummaries() {
|
const summaries = ["合计", "/", "/", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0]
|
|
this.tableData.forEach((item) => {
|
summaries[3] += Number(item.dischargeCount) || 0
|
summaries[4] += Number(item.nonFollowUp) || 0
|
summaries[5] += Number(item.followUpNeeded) || 0
|
summaries[6] += Number(item.needFollowUpAgain) || 0
|
summaries[7] += Number(item.pendingFollowUpAgain) || 0
|
summaries[8] += Number(item.followUpSuccessAgain) || 0
|
summaries[9] += Number(item.followUpFailAgain) || 0
|
summaries[11] += Number(item.manualAgain) || 0
|
summaries[12] += Number(item.smsAgain) || 0
|
summaries[13] += Number(item.weChatAgain) || 0
|
})
|
|
const followUpRateAgainValues = this.tableData
|
.map((item) => this.extractPercentageValue(item.followUpRateAgain))
|
.filter((value) => value !== null)
|
|
if (followUpRateAgainValues.length > 0) {
|
const avgFollowUpRateAgain = followUpRateAgainValues.reduce((sum, val) => sum + val, 0) / followUpRateAgainValues.length
|
summaries[10] = (avgFollowUpRateAgain * 100).toFixed(2) + "%"
|
}
|
|
summaries[3] = this.formatNumber(summaries[3])
|
summaries[4] = this.formatNumber(summaries[4])
|
summaries[5] = this.formatNumber(summaries[5])
|
summaries[6] = this.formatNumber(summaries[6])
|
summaries[7] = this.formatNumber(summaries[7])
|
summaries[8] = this.formatNumber(summaries[8])
|
summaries[9] = this.formatNumber(summaries[9])
|
summaries[11] = this.formatNumber(summaries[11])
|
summaries[12] = this.formatNumber(summaries[12])
|
summaries[13] = this.formatNumber(summaries[13])
|
|
return summaries
|
},
|
|
extractPercentageValue(value) {
|
if (!value) return null
|
if (typeof value === "string" && value.includes("%")) {
|
const num = parseFloat(value.replace("%", ""))
|
return isNaN(num) ? null : num / 100
|
}
|
const num = parseFloat(value)
|
return isNaN(num) ? null : num
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.second-follow-up {
|
.your-table-container {
|
margin-top: 10px;
|
}
|
|
.button-zx {
|
color: rgb(70, 204, 238);
|
}
|
}
|
</style>
|