| | |
| | | data: data |
| | | }) |
| | | }; |
| | | // è¯é³æå¡è½¬äººå·¥ï¼å 餿£è
æªå®æé访任å¡å¹¶éæ°çæäººå·¥éè®¿ä»»å¡ |
| | | export function addManualVisit(data) { |
| | | return request({ |
| | | url: '/smartor/patinhosp/addManualVisit', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | }; |
| | |
| | | data: data, |
| | | }); |
| | | } |
| | | // é访é¢ç®é项ä¸é»æ£è
æå¡å表 |
| | | export function getSfStatisticsCountDetailsHyperLink(data) { |
| | | return request({ |
| | | url: "/smartor/serviceSubtask/getSfStatisticsCountDetailsHyperLink", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | | // æªåæ¶æ¥è¯¢ |
| | | export function selectTimelyRate(data) { |
| | | return request({ |
| | |
| | | localStorage.setItem("deptCode", ""); |
| | | localStorage.setItem("YongHuID", ""); |
| | | localStorage.setItem("YongHuXM", ""); |
| | | } else if (orgid == "1" && campusid == 8) { |
| | | localStorage.setItem("orgname", "第ä¸äººæ°å»é¢åä¸é¢åº"); |
| | | localStorage.setItem("ZuHuID", ""); |
| | | localStorage.setItem("deptCode", ""); |
| | | localStorage.setItem("YongHuID", ""); |
| | | localStorage.setItem("YongHuXM", ""); |
| | | } else if (orgid == "47246116333112211A1001") { |
| | | localStorage.setItem("orgname", "ç¼äºå¿äººæ°å»é¢"); |
| | | localStorage.setItem("ZuHuID", "1429338802177000010"); |
| | |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | :row-key="getRowKey" |
| | | show-summary |
| | | :summary-method="getSummaries" |
| | | > |
| | | <!-- ç
åºç»è®¡ï¼å¨é¢ç
åº + 离é¢ç
åº --> |
| | | <el-table-column |
| | |
| | | return `${(num * 100).toFixed(2)}%`; |
| | | }, |
| | | |
| | | // è¡¨æ ¼åè®¡è¡ |
| | | getSummaries(param) { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = "å计"; |
| | | return; |
| | | } |
| | | |
| | | const prop = column.property; |
| | | |
| | | // æ°å¼åæ±å |
| | | if ( |
| | | [ |
| | | "dischargeCount", |
| | | "nonFollowUp", |
| | | "followUpNeeded", |
| | | "joyAllCount", |
| | | "joyCount", |
| | | ].includes(prop) |
| | | ) { |
| | | sums[index] = data.reduce( |
| | | (sum, item) => sum + (Number(item[prop]) || 0), |
| | | 0 |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | // 宿æ¯çï¼æ»¡æåº¦å¡«æ¥é / 满æåº¦é¢ç®æ»é |
| | | if (prop === "joyTotal") { |
| | | const totalJoyAllCount = data.reduce( |
| | | (sum, item) => sum + (Number(item.joyAllCount) || 0), |
| | | 0 |
| | | ); |
| | | const totalJoyCount = data.reduce( |
| | | (sum, item) => sum + (Number(item.joyCount) || 0), |
| | | 0 |
| | | ); |
| | | sums[index] = |
| | | totalJoyAllCount > 0 |
| | | ? ((totalJoyCount / totalJoyAllCount) * 100).toFixed(2) + "%" |
| | | : "0.00%"; |
| | | return; |
| | | } |
| | | |
| | | // ç¾åæ¯åï¼é访ç/åæ¶çï¼ï¼åå¹³åå¼ï¼0 å¼ä¹åä¸å¹³åï¼ |
| | | if (prop === "followUpRate" || prop === "rate") { |
| | | const percentageValues = data |
| | | .map((item) => { |
| | | const value = item[prop]; |
| | | if ( |
| | | value === null || |
| | | value === undefined || |
| | | value === "" || |
| | | value === "-" |
| | | ) { |
| | | return null; |
| | | } |
| | | if (typeof value === "string" && value.includes("%")) { |
| | | const num = parseFloat(value.replace("%", "")) / 100; |
| | | return isNaN(num) ? null : num; |
| | | } |
| | | const num = parseFloat(value); |
| | | return isNaN(num) ? null : num; |
| | | }) |
| | | .filter((value) => value !== null); |
| | | |
| | | sums[index] = |
| | | percentageValues.length > 0 |
| | | ? ( |
| | | (percentageValues.reduce((sum, value) => sum + value, 0) / |
| | | percentageValues.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%"; |
| | | return; |
| | | } |
| | | |
| | | sums[index] = ""; |
| | | }); |
| | | |
| | | return sums; |
| | | }, |
| | | |
| | | // æ¥çæªåæ¶é访详æ
|
| | | handleSeedetails(row) { |
| | | this.currentRow = row; |
| | |
| | | console.error("è·å满æåº¦è¯¦æ
失败:", error); |
| | | this.$message.error("è·å详æ
失败"); |
| | | } |
| | | }, |
| | | |
| | | // è·åæå®ç
åº/ç§å®¤çé¢ç®è¯¦æ
|
| | | async fetchTopicDetail(row) { |
| | | const params = { |
| | | configKey: "joyCount", |
| | | ...this.queryParams, |
| | | }; |
| | | // 导åºéè¦è¯¥ç
åº/ç§å®¤çå
¨é¨é¢ç®ï¼è¦ç主表å页忰 |
| | | params.pageNum = 1; |
| | | params.pageSize = 1000; |
| | | if ( |
| | | this.queryParams.dateRange && |
| | | this.queryParams.dateRange.length === 2 |
| | | ) { |
| | | params.startTime = this.queryParams.dateRange[0]; |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode]; |
| | | } else { |
| | | params.deptcodes = [row.deptcode]; |
| | | } |
| | | const response = await getSfStatisticsJoyInfo(params); |
| | | return response.data || {}; |
| | | }, |
| | | |
| | | // 主表导åºè¡æ°æ® |
| | | getMainExportRow(item) { |
| | | return [ |
| | | this.queryParams.statisticaltype == 1 |
| | | ? item.leavehospitaldistrictname |
| | | : item.deptname, |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.followUpRate || "0%", |
| | | item.rate ? this.formatPercent(item.rate) : "0%", |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | item.joyTotal ? this.formatPercent(item.joyTotal) : "0%", |
| | | ]; |
| | | }, |
| | | |
| | | // è®¡ç®ææ¬æ¾ç¤ºå®½åº¦ï¼ä¸ææ 2ãè±æ/æ°åæ 1ï¼ |
| | | textWidth(str) { |
| | | if (!str) return 0; |
| | | let width = 0; |
| | | for (const ch of String(str)) { |
| | | width += ch.charCodeAt(0) > 255 ? 2 : 1; |
| | | } |
| | | return width; |
| | | }, |
| | | |
| | | // 丽水å¸ä¸å»é¢ï¼æåææç§å®¤é¢ç®æç»ï¼æå¹³å为ãé¢ç®é项ãåç»æ |
| | | async buildLishuiTopicColumns() { |
| | | const topicMap = new Map(); |
| | | const rowQuantities = []; |
| | | |
| | | for (const item of this.userList) { |
| | | const topiclist = await this.fetchTopicDetail(item); |
| | | const qMap = new Map(); |
| | | |
| | | if (topiclist && Object.keys(topiclist).length) { |
| | | Object.keys(topiclist).forEach((key) => { |
| | | const topic = topiclist[key]; |
| | | if (!topic || !topic.scriptContent) return; |
| | | |
| | | const tKey = |
| | | topic.scriptid != null && topic.scriptid !== "" |
| | | ? String(topic.scriptid) |
| | | : topic.scriptContent; |
| | | |
| | | if (!topicMap.has(tKey)) { |
| | | topicMap.set(tKey, { |
| | | key: tKey, |
| | | scriptContent: topic.scriptContent, |
| | | options: [], |
| | | optionSet: new Set(), |
| | | }); |
| | | } |
| | | |
| | | const t = topicMap.get(tKey); |
| | | const topicQ = new Map(); |
| | | (topic.details || []).forEach((detail) => { |
| | | if (!detail || !detail.optionText) return; |
| | | if (!t.optionSet.has(detail.optionText)) { |
| | | t.optionSet.add(detail.optionText); |
| | | t.options.push(detail.optionText); |
| | | } |
| | | topicQ.set(detail.optionText, Number(detail.chosenQuantity) || 0); |
| | | }); |
| | | qMap.set(tKey, topicQ); |
| | | }); |
| | | } |
| | | |
| | | rowQuantities.push(qMap); |
| | | } |
| | | |
| | | const topics = Array.from(topicMap.values()); |
| | | // 没æé项çé¢ç®é»è®¤å¡«å
ä¸ä¸ªç©ºé项åï¼é¿å
表头/æ°æ®éä½ |
| | | topics.forEach((t) => { |
| | | if (!t.options.length) { |
| | | t.options = [""]; |
| | | } |
| | | }); |
| | | return { topics, rowQuantities }; |
| | | }, |
| | | |
| | | // å¯¼åºæ°æ® |
| | |
| | | pattern: "solid", |
| | | fgColor: { argb: "FFF5F7FA" }, |
| | | }, |
| | | alignment: { vertical: "middle", horizontal: "center" }, |
| | | alignment: { |
| | | vertical: "middle", |
| | | horizontal: "center", |
| | | wrapText: true, |
| | | }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | |
| | | }, |
| | | }; |
| | | |
| | | // 表头æé¡µé¢å卿çæï¼ç§å®¤/ç
åºç»è®¡åä¸åï¼ãåæ¶çãåªææ¯å®é¢åºé¡µé¢ææ¾ç¤º |
| | | const isWardStatistics = this.queryParams.statisticaltype == 1; |
| | | const showTimelyRate = this.orgname === "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | const headers = [ |
| | | isWardStatistics ? "å¨é¢ç
åº" : "å¨é¢ç§å®¤", |
| | | isWardStatistics ? "离é¢ç
åº" : "离é¢ç§å®¤", |
| | | // 丽水å¸ä¸å»é¢ï¼é¢å
æåé¢ç®æç»ï¼æå¹³å为ãé¢ç®é项ãå |
| | | let lishuiTopics = []; |
| | | let lishuiRowQuantities = []; |
| | | if (isLishuiHospital) { |
| | | const built = await this.buildLishuiTopicColumns(); |
| | | lishuiTopics = built.topics; |
| | | lishuiRowQuantities = built.rowQuantities; |
| | | } |
| | | |
| | | // 主表å |
| | | const mainHeaders = [ |
| | | this.queryParams.statisticaltype == 1 ? "åºé¢ç
åº" : "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | "满æåº¦é¢ç®æ»é", |
| | | "满æåº¦å¡«æ¥é", |
| | | "宿æ¯ç", |
| | | ]; |
| | | if (showTimelyRate) { |
| | | headers.push("åæ¶ç"); |
| | | } |
| | | headers.push("满æåº¦é¢ç®æ»é", "满æåº¦å¡«æ¥é", "宿æ¯ç"); |
| | | const colCount = headers.length; |
| | | const mainColumnCount = mainHeaders.length; |
| | | |
| | | // æ»åæ°ï¼ä¸½æ°´å¸ä¸å»é¢å¨æ«å°¾è¿½å é¢ç®é项åï¼ |
| | | const topicColumnCount = lishuiTopics.reduce( |
| | | (sum, t) => sum + (t.options.length || 1), |
| | | 0 |
| | | ); |
| | | const totalColumns = mainColumnCount + topicColumnCount; |
| | | |
| | | // æ·»å æ»æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, colCount); |
| | | worksheet.mergeCells(1, 1, 1, totalColumns); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = `满æåº¦é访ç»è®¡è¡¨ï¼${sheetNameSuffix}ï¼`; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | // æ·»å æ°æ®è¡ï¼ç©ºå¼ç»ä¸æ¾ç¤ºâ-âï¼ä¸é¡µé¢ä¿æä¸è´ï¼ |
| | | const dash = (v, formatter) => { |
| | | if (v === null || v === undefined || v === "") return "-"; |
| | | return formatter ? formatter(v) : v; |
| | | }; |
| | | this.userList.forEach((item) => { |
| | | const rowData = [ |
| | | isWardStatistics |
| | | ? item.hospitaldistrictname || "-" |
| | | : item.hospitaldeptname || "-", |
| | | isWardStatistics |
| | | ? item.leavehospitaldistrictname || "-" |
| | | : item.deptname || "-", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | dash(item.followUpRate), |
| | | ]; |
| | | if (showTimelyRate) { |
| | | rowData.push(dash(item.rate, (v) => this.formatPercent(v))); |
| | | } |
| | | rowData.push( |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | dash(item.joyTotal, (v) => this.formatPercent(v)) |
| | | ); |
| | | const dataRow = worksheet.addRow(rowData); |
| | | |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | if (isLishuiHospital && lishuiTopics.length) { |
| | | // è®¡ç®æ¯ä¸ªé¢ç®çé项å宽ï¼é项æåèªéåºï¼é¢å¹²è¿é¿æ¶æå®½åãå¿
è¦æ¶æ¢è¡ï¼ |
| | | const topicColumns = lishuiTopics.map((topic) => { |
| | | const n = topic.options.length || 1; |
| | | const baseWidths = topic.options.map((opt) => |
| | | opt === "" ? 10 : Math.max(10, this.textWidth(opt) + 4) |
| | | ); |
| | | const sumWidth = baseWidths.reduce((s, w) => s + w, 0); |
| | | const topicWidth = this.textWidth(topic.scriptContent) + 4; |
| | | const groupWidth = Math.max(sumWidth, topicWidth); |
| | | const extra = (groupWidth - sumWidth) / n; |
| | | const widths = baseWidths.map((w) => w + extra); |
| | | const lines = Math.max(1, Math.ceil(topicWidth / groupWidth)); |
| | | return { widths, lines }; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | const maxHeaderLines = topicColumns.reduce( |
| | | (m, t) => Math.max(m, t.lines), |
| | | 1 |
| | | ); |
| | | |
| | | // 设置å宽ï¼è·åæ°ä¸è´ï¼ |
| | | worksheet.columns = headers.map((h, i) => ({ |
| | | width: i < 2 ? 20 : h.length > 6 ? 15 : 12, |
| | | })); |
| | | // 两è¡è¡¨å¤´ï¼ç¬¬ä¸è¡ = 主表å + é¢ç®åï¼ç¬¬äºè¡ = é项å |
| | | const headerRow1 = worksheet.addRow([]); |
| | | const headerRow2 = worksheet.addRow([]); |
| | | |
| | | mainHeaders.forEach((h, i) => { |
| | | const col = i + 1; |
| | | headerRow1.getCell(col).value = h; |
| | | headerRow1.getCell(col).style = headerStyle; |
| | | headerRow2.getCell(col).style = headerStyle; |
| | | worksheet.mergeCells( |
| | | headerRow1.number, |
| | | col, |
| | | headerRow2.number, |
| | | col |
| | | ); |
| | | }); |
| | | |
| | | let colIndex = mainColumnCount + 1; |
| | | lishuiTopics.forEach((topic) => { |
| | | const optCount = topic.options.length || 1; |
| | | for (let k = 0; k < optCount; k++) { |
| | | headerRow1.getCell(colIndex + k).style = headerStyle; |
| | | } |
| | | headerRow1.getCell(colIndex).value = topic.scriptContent; |
| | | if (optCount > 1) { |
| | | worksheet.mergeCells( |
| | | headerRow1.number, |
| | | colIndex, |
| | | headerRow1.number, |
| | | colIndex + optCount - 1 |
| | | ); |
| | | } |
| | | topic.options.forEach((opt, k) => { |
| | | headerRow2.getCell(colIndex + k).value = opt; |
| | | headerRow2.getCell(colIndex + k).style = headerStyle; |
| | | }); |
| | | colIndex += optCount; |
| | | }); |
| | | |
| | | // 表头é«åº¦ï¼é¢å¹²æ¢è¡æ¶ææé¿é¢ç®é¢ç |
| | | headerRow1.height = Math.max(30, 15 * maxHeaderLines + 8); |
| | | headerRow2.height = 25; |
| | | |
| | | // æ°æ®è¡ |
| | | this.userList.forEach((item, idx) => { |
| | | const row = worksheet.addRow([]); |
| | | const main = this.getMainExportRow(item); |
| | | main.forEach((v, i) => { |
| | | const cell = row.getCell(i + 1); |
| | | cell.value = v; |
| | | cell.style = cellStyle; |
| | | }); |
| | | |
| | | const qMap = lishuiRowQuantities[idx] || new Map(); |
| | | let cIndex = mainColumnCount + 1; |
| | | for (const topic of lishuiTopics) { |
| | | const topicQ = qMap.get(topic.key); |
| | | topic.options.forEach((opt) => { |
| | | const cell = row.getCell(cIndex); |
| | | if (opt === "") { |
| | | // 空é项å ä½åä¸å¡«æ°å |
| | | cell.value = ""; |
| | | } else { |
| | | const val = topicQ ? topicQ.get(opt) : undefined; |
| | | cell.value = val === undefined || val === null ? 0 : val; |
| | | } |
| | | cell.style = cellStyle; |
| | | cIndex++; |
| | | }); |
| | | } |
| | | row.height = 22; |
| | | }); |
| | | |
| | | // å宽ï¼ä¸»è¡¨å + é¢ç®é项å |
| | | const columns = [ |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | ]; |
| | | lishuiTopics.forEach((topic, ti) => { |
| | | topicColumns[ti].widths.forEach((w) => { |
| | | columns.push({ width: w }); |
| | | }); |
| | | }); |
| | | worksheet.columns = columns; |
| | | } else { |
| | | // å
¶ä»å»é¢ï¼åè¡è¡¨å¤´ |
| | | const headerRow = worksheet.addRow(mainHeaders); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | this.userList.forEach((item) => { |
| | | const dataRow = worksheet.addRow(this.getMainExportRow(item)); |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | |
| | | worksheet.columns = [ |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | ]; |
| | | } |
| | | |
| | | // çæå¹¶ä¸è½½æä»¶ |
| | | const buffer = await workbook.xlsx.writeBuffer(); |
| | |
| | | min-width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | {{ row.chosenQuantity || 0 }} |
| | | <el-button |
| | | v-if="row.chosenQuantity" |
| | | type="text" |
| | | @click="handleOptionClick(item, row)" |
| | | > |
| | | {{ row.chosenQuantity }} |
| | | </el-button> |
| | | <span v-else>0</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | |
| | | > |
| | | <el-button @click="handleClose">å
³ é</el-button> |
| | | </div> |
| | | |
| | | <!-- é项ä¸é»ï¼æ£è
æå¡å表 --> |
| | | <TopicPatientListDialog |
| | | :visible.sync="patientListVisible" |
| | | :title="patientListTitle" |
| | | :drill-params="patientDrillParams" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import ExcelJS from "exceljs"; |
| | | import { saveAs } from "file-saver"; |
| | | import TopicPatientListDialog from "./TopicPatientListDialog.vue"; |
| | | |
| | | export default { |
| | | name: "TopicDialog", |
| | | components: { |
| | | TopicPatientListDialog, |
| | | }, |
| | | props: { |
| | | rowData: { |
| | | type: Object, |
| | |
| | | return { |
| | | processedTopicList: [], |
| | | orgname: "", // æ°å¢ï¼å»é¢åç§° |
| | | patientListVisible: false, |
| | | patientListTitle: "æ£è
æå¡å表", |
| | | patientDrillParams: {}, |
| | | }; |
| | | }, |
| | | computed: { |
| | | configTitle() { |
| | | const key = this.queryParams?.configKey; |
| | | return key === "returnVisitCount" ? "å¤è¯éç¥" : "满æåº¦"; |
| | | return this.topType == 1 ? "å¤è¯éç¥" : "满æåº¦"; |
| | | }, |
| | | // ä¸é»æ¥å£éè¦ç configKeyï¼1 å¤è¯éç¥ï¼2 满æåº¦ |
| | | configKey() { |
| | | return this.topType == 1 ? "returnVisitCount" : "joyCount"; |
| | | }, |
| | | }, |
| | | created() { |
| | |
| | | this.processedTopicList = result; |
| | | }, |
| | | |
| | | // ç¹å»é项âéæ©äººæ°âä¸é»å°æ£è
æå¡å表 |
| | | handleOptionClick(topicItem, detail) { |
| | | if (!detail || !detail.optionText) return; |
| | | |
| | | const params = { |
| | | scriptid: topicItem.scriptid, |
| | | scriptContent: topicItem.scriptContent, |
| | | subtaskType: topicItem.subtaskType, |
| | | optionText: detail.optionText, |
| | | statisticaltype: this.queryParams.statisticaltype, |
| | | serviceType: this.queryParams.serviceType || [], |
| | | configKey: this.configKey, |
| | | }; |
| | | |
| | | // æ¶é´èå´ |
| | | if ( |
| | | this.queryParams.dateRange && |
| | | this.queryParams.dateRange.length === 2 |
| | | ) { |
| | | params.startTime = this.queryParams.dateRange[0]; |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | |
| | | // ç»è®¡ç»´åº¦ |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | // æç
åº |
| | | params.deptcode = this.rowData.leavehospitaldistrictcode; |
| | | params.leavehospitaldistrictcode = |
| | | this.rowData.leavehospitaldistrictcode; |
| | | params.leavehospitaldistrictcodes = [ |
| | | this.rowData.leavehospitaldistrictcode, |
| | | ]; |
| | | } else { |
| | | // æç§å®¤ |
| | | params.deptcode = this.rowData.deptcode; |
| | | params.deptcodes = [this.rowData.deptcode]; |
| | | } |
| | | |
| | | this.patientDrillParams = params; |
| | | this.patientListTitle = `ã${detail.optionText}ãæ£è
æå¡å表`; |
| | | this.patientListVisible = true; |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¥æèå´å符串ï¼ä¸ä¸»é¡µé¢ä¸è´ï¼ |
| | | formatDateRangeForExport() { |
| | | let dateRangeString = ""; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | :title="title" |
| | | :visible.sync="dialogVisible" |
| | | width="80%" |
| | | :close-on-click-modal="false" |
| | | append-to-body |
| | | @close="handleClose" |
| | | > |
| | | <div class="topic-patient-dialog"> |
| | | <div class="query-bar"> |
| | | <span class="label">æ£è
å§åæ¥è¯¢:</span> |
| | | <el-input |
| | | v-model="searchName" |
| | | placeholder="请è¾å
¥æ£è
å§åè¿è¡çé" |
| | | clearable |
| | | style="width: 300px" |
| | | @input="handleSearch" |
| | | @clear="handleSearch" |
| | | /> |
| | | <span class="count">å
± {{ filteredList.length }} æ¡è®°å½</span> |
| | | </div> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="filteredList" |
| | | style="width: 100%" |
| | | :border="true" |
| | | max-height="560" |
| | | > |
| | | <el-table-column |
| | | prop="sendname" |
| | | label="å§å" |
| | | align="center" |
| | | width="100" |
| | | /> |
| | | <el-table-column |
| | | prop="phone" |
| | | label="èç³»çµè¯" |
| | | align="center" |
| | | width="130" |
| | | /> |
| | | <el-table-column |
| | | prop="taskName" |
| | | label="ä»»å¡åç§°" |
| | | align="center" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | prop="sendstate" |
| | | label="ä»»å¡ç¶æ" |
| | | align="center" |
| | | width="110" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-tag :type="getStateTagType(row.sendstate)" size="small"> |
| | | {{ getStateText(row.sendstate) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="visitTime" |
| | | label="åºé访æ¶é´" |
| | | align="center" |
| | | width="170" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | prop="finishtime" |
| | | label="éè®¿å®ææ¶é´" |
| | | align="center" |
| | | width="170" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | prop="endtime" |
| | | label="åºé¢æ¥æ" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span>{{ formatTime(row.endtime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="nurseName" |
| | | label="责任æ¤å£«" |
| | | align="center" |
| | | width="110" |
| | | /> |
| | | <el-table-column |
| | | prop="drname" |
| | | label="主治å»ç" |
| | | align="center" |
| | | width="110" |
| | | /> |
| | | <el-table-column |
| | | prop="excep" |
| | | label="ç»æç¶æ" |
| | | align="center" |
| | | width="110" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <dict-tag :options="dict.type.sys_yujing" :value="row.excep" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="suggest" |
| | | label="å¤çæè§" |
| | | align="center" |
| | | width="110" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <dict-tag :options="dict.type.sys_suggest" :value="row.suggest" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="templatename" |
| | | label="æå¡æ¨¡æ¿" |
| | | align="center" |
| | | width="160" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | prop="remark" |
| | | label="æå¡è®°å½" |
| | | align="center" |
| | | width="160" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="æä½" |
| | | fixed="right" |
| | | align="center" |
| | | width="90" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-button type="text" size="small" @click="handleViewDetail(row)"> |
| | | <i class="el-icon-view"></i> æ¥ç |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <div v-if="hasMore" class="load-more"> |
| | | <el-button type="text" :loading="loading" @click="loadMore"> |
| | | å è½½æ´å¤ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getSfStatisticsCountDetailsHyperLink } from "@/api/system/user"; |
| | | |
| | | export default { |
| | | name: "TopicPatientListDialog", |
| | | dicts: ["sys_yujing", "sys_suggest"], |
| | | props: { |
| | | visible: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: "æ£è
æå¡å表", |
| | | }, |
| | | // ä¸é»è¯·æ±åæ°ï¼ä¸å«å页ï¼ï¼ç±ç¶ç»ä»¶æå»º |
| | | drillParams: { |
| | | type: Object, |
| | | default: () => ({}), |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | pageSize: 200, |
| | | offset: 0, |
| | | hasMore: false, |
| | | loading: false, |
| | | allList: [], |
| | | searchName: "", |
| | | }; |
| | | }, |
| | | computed: { |
| | | dialogVisible: { |
| | | get() { |
| | | return this.visible; |
| | | }, |
| | | set(val) { |
| | | this.$emit("update:visible", val); |
| | | }, |
| | | }, |
| | | filteredList() { |
| | | const keyword = this.searchName.trim(); |
| | | if (!keyword) return this.allList; |
| | | return this.allList.filter( |
| | | (item) => item.sendname && item.sendname.indexOf(keyword) !== -1 |
| | | ); |
| | | }, |
| | | }, |
| | | watch: { |
| | | visible(newVal) { |
| | | if (newVal) { |
| | | this.resetAndLoad(); |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | resetAndLoad() { |
| | | this.offset = 0; |
| | | this.allList = []; |
| | | this.searchName = ""; |
| | | this.hasMore = false; |
| | | this.fetchPage(false); |
| | | }, |
| | | async fetchPage(isLoadMore) { |
| | | this.loading = true; |
| | | try { |
| | | const params = { |
| | | ...this.drillParams, |
| | | pageNum: this.offset, |
| | | pageSize: this.pageSize, |
| | | }; |
| | | const response = await getSfStatisticsCountDetailsHyperLink(params); |
| | | const batch = response.data || []; |
| | | this.allList = isLoadMore ? this.allList.concat(batch) : batch; |
| | | this.offset += batch.length; |
| | | this.hasMore = batch.length >= this.pageSize; |
| | | } catch (error) { |
| | | console.error("è·åæ£è
æå¡å表失败:", error); |
| | | this.$message.error("è·åæ£è
æå¡å表失败"); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | loadMore() { |
| | | this.fetchPage(true); |
| | | }, |
| | | handleSearch() { |
| | | // å§åçé为å端æ¬å°è¿æ»¤ï¼æ ééæ°è¯·æ± |
| | | }, |
| | | getStateTagType(state) { |
| | | const map = { |
| | | 1: "primary", |
| | | 2: "primary", |
| | | 3: "success", |
| | | 4: "info", |
| | | 5: "danger", |
| | | 6: "success", |
| | | 7: "danger", |
| | | }; |
| | | return map[state] || "info"; |
| | | }, |
| | | getStateText(state) { |
| | | const map = { |
| | | 1: "表åå·²é¢å", |
| | | 2: "å¾
é访", |
| | | 3: "表åå·²åé", |
| | | 4: "䏿§è¡", |
| | | 5: "åé失败", |
| | | 6: "已宿", |
| | | 7: "è¶
æ¶", |
| | | }; |
| | | return map[state] || "æªç¥ç¶æ"; |
| | | }, |
| | | formatTime(time) { |
| | | if (!time) return "-"; |
| | | return time; |
| | | }, |
| | | handleViewDetail(row) { |
| | | this.$emit("update:visible", false); |
| | | |
| | | let type = ""; |
| | | if (row.preachform && row.preachform.includes("3")) { |
| | | type = 1; |
| | | } |
| | | setTimeout(() => { |
| | | this.$router.push({ |
| | | path: "/followvisit/record/detailpage/", |
| | | query: { |
| | | taskid: row.taskid, |
| | | patid: row.patid, |
| | | id: row.id, |
| | | Voicetype: type, |
| | | }, |
| | | }); |
| | | }, 300); |
| | | }, |
| | | handleClose() { |
| | | this.$emit("close"); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .topic-patient-dialog { |
| | | .query-bar { |
| | | display: flex; |
| | | align-items: center; |
| | | margin-bottom: 16px; |
| | | |
| | | .label { |
| | | margin-right: 10px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .count { |
| | | margin-left: 16px; |
| | | color: rgb(35, 81, 233); |
| | | font-size: 15px; |
| | | } |
| | | } |
| | | |
| | | .load-more { |
| | | text-align: center; |
| | | padding-top: 12px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | orgname: "", |
| | | |
| | | // éä¸çè¡ |
| | | ids: [], |
| | |
| | | }, |
| | | |
| | | created() { |
| | | this.orgname = localStorage.getItem("orgname"); |
| | | this.initData(); |
| | | }, |
| | | |
| | |
| | | } |
| | | }, |
| | | |
| | | // è·åæå®ç
åº/ç§å®¤çé¢ç®è¯¦æ
|
| | | async fetchTopicDetail(row) { |
| | | const params = { |
| | | configKey: "returnVisitCount", |
| | | ...this.queryParams, |
| | | }; |
| | | // 导åºéè¦è¯¥ç
åº/ç§å®¤çå
¨é¨é¢ç®ï¼è¦ç主表å页忰 |
| | | params.pageNum = 1; |
| | | params.pageSize = 1000; |
| | | if ( |
| | | this.queryParams.dateRange && |
| | | this.queryParams.dateRange.length === 2 |
| | | ) { |
| | | params.startTime = this.queryParams.dateRange[0]; |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode]; |
| | | } else { |
| | | params.deptcodes = [row.deptcode]; |
| | | } |
| | | const response = await getSfStatisticsJoyInfo(params); |
| | | return response.data || {}; |
| | | }, |
| | | |
| | | // 主表导åºè¡æ°æ® |
| | | getMainExportRow(item) { |
| | | return [ |
| | | this.queryParams.statisticaltype == 1 |
| | | ? item.leavehospitaldistrictname |
| | | : item.deptname, |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.followUpRate || "0%", |
| | | item.rate ? this.formatPercent(item.rate) : "0%", |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | item.joyTotal ? this.formatPercent(item.joyTotal) : "0%", |
| | | ]; |
| | | }, |
| | | |
| | | // è®¡ç®ææ¬æ¾ç¤ºå®½åº¦ï¼ä¸ææ 2ãè±æ/æ°åæ 1ï¼ |
| | | textWidth(str) { |
| | | if (!str) return 0; |
| | | let width = 0; |
| | | for (const ch of String(str)) { |
| | | width += ch.charCodeAt(0) > 255 ? 2 : 1; |
| | | } |
| | | return width; |
| | | }, |
| | | |
| | | // 丽水å¸ä¸å»é¢ï¼æåææç§å®¤é¢ç®æç»ï¼æå¹³å为ãé¢ç®é项ãåç»æ |
| | | async buildLishuiTopicColumns() { |
| | | const topicMap = new Map(); |
| | | const rowQuantities = []; |
| | | |
| | | for (const item of this.userList) { |
| | | const topiclist = await this.fetchTopicDetail(item); |
| | | const qMap = new Map(); |
| | | |
| | | if (topiclist && Object.keys(topiclist).length) { |
| | | Object.keys(topiclist).forEach((key) => { |
| | | const topic = topiclist[key]; |
| | | if (!topic || !topic.scriptContent) return; |
| | | |
| | | const tKey = |
| | | topic.scriptid != null && topic.scriptid !== "" |
| | | ? String(topic.scriptid) |
| | | : topic.scriptContent; |
| | | |
| | | if (!topicMap.has(tKey)) { |
| | | topicMap.set(tKey, { |
| | | key: tKey, |
| | | scriptContent: topic.scriptContent, |
| | | options: [], |
| | | optionSet: new Set(), |
| | | }); |
| | | } |
| | | |
| | | const t = topicMap.get(tKey); |
| | | const topicQ = new Map(); |
| | | (topic.details || []).forEach((detail) => { |
| | | if (!detail || !detail.optionText) return; |
| | | if (!t.optionSet.has(detail.optionText)) { |
| | | t.optionSet.add(detail.optionText); |
| | | t.options.push(detail.optionText); |
| | | } |
| | | topicQ.set(detail.optionText, Number(detail.chosenQuantity) || 0); |
| | | }); |
| | | qMap.set(tKey, topicQ); |
| | | }); |
| | | } |
| | | |
| | | rowQuantities.push(qMap); |
| | | } |
| | | |
| | | const topics = Array.from(topicMap.values()); |
| | | // 没æé项çé¢ç®é»è®¤å¡«å
ä¸ä¸ªç©ºé项åï¼é¿å
表头/æ°æ®éä½ |
| | | topics.forEach((t) => { |
| | | if (!t.options.length) { |
| | | t.options = [""]; |
| | | } |
| | | }); |
| | | return { topics, rowQuantities }; |
| | | }, |
| | | |
| | | // å¯¼åºæ°æ® |
| | | async handleExport() { |
| | | if (!this.userList.length) { |
| | |
| | | pattern: "solid", |
| | | fgColor: { argb: "FFF5F7FA" }, |
| | | }, |
| | | alignment: { vertical: "middle", horizontal: "center" }, |
| | | alignment: { |
| | | vertical: "middle", |
| | | horizontal: "center", |
| | | wrapText: true, |
| | | }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | |
| | | }, |
| | | }; |
| | | |
| | | // 表头æé¡µé¢å卿çæï¼ãåæ¶çãåªææ¯å®é¢åºé¡µé¢ææ¾ç¤º |
| | | const showTimelyRate = this.orgname === "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | const headers = [ |
| | | // 丽水å¸ä¸å»é¢ï¼é¢å
æåé¢ç®æç»ï¼æå¹³å为ãé¢ç®é项ãå |
| | | let lishuiTopics = []; |
| | | let lishuiRowQuantities = []; |
| | | if (isLishuiHospital) { |
| | | const built = await this.buildLishuiTopicColumns(); |
| | | lishuiTopics = built.topics; |
| | | lishuiRowQuantities = built.rowQuantities; |
| | | } |
| | | |
| | | // 主表å |
| | | const mainHeaders = [ |
| | | this.queryParams.statisticaltype == 1 ? "åºé¢ç
åº" : "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | "å¤è¯éç¥é¢ç®æ»é", |
| | | "å¤è¯éç¥å¡«æ¥é", |
| | | "宿æ¯ç", |
| | | ]; |
| | | if (showTimelyRate) { |
| | | headers.push("åæ¶ç"); |
| | | } |
| | | headers.push("å¤è¯éç¥é¢ç®æ»é", "å¤è¯éç¥å¡«æ¥é", "宿æ¯ç"); |
| | | const colCount = headers.length; |
| | | const mainColumnCount = mainHeaders.length; |
| | | |
| | | // æ»åæ°ï¼ä¸½æ°´å¸ä¸å»é¢å¨æ«å°¾è¿½å é¢ç®é项åï¼ |
| | | const topicColumnCount = lishuiTopics.reduce( |
| | | (sum, t) => sum + (t.options.length || 1), |
| | | 0 |
| | | ); |
| | | const totalColumns = mainColumnCount + topicColumnCount; |
| | | |
| | | // æ·»å æ»æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, colCount); |
| | | worksheet.mergeCells(1, 1, 1, totalColumns); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = `å¤è¯éç¥ç»è®¡è¡¨ï¼${sheetNameSuffix}ï¼`; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | // æ·»å æ°æ®è¡ï¼ç©ºå¼ç»ä¸æ¾ç¤ºâ-âï¼ä¸é¡µé¢ä¿æä¸è´ï¼ |
| | | const dash = (v, formatter) => { |
| | | if (v === null || v === undefined || v === "") return "-"; |
| | | return formatter ? formatter(v) : v; |
| | | }; |
| | | this.userList.forEach((item) => { |
| | | const rowData = [ |
| | | this.queryParams.statisticaltype == 1 |
| | | ? item.leavehospitaldistrictname |
| | | : item.deptname, |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | dash(item.followUpRate), |
| | | ]; |
| | | if (showTimelyRate) { |
| | | rowData.push(dash(item.rate, (v) => this.formatPercent(v))); |
| | | } |
| | | rowData.push( |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | dash(item.joyTotal, (v) => this.formatPercent(v)) |
| | | ); |
| | | const dataRow = worksheet.addRow(rowData); |
| | | |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | if (isLishuiHospital && lishuiTopics.length) { |
| | | // è®¡ç®æ¯ä¸ªé¢ç®çé项å宽ï¼é项æåèªéåºï¼é¢å¹²è¿é¿æ¶æå®½åãå¿
è¦æ¶æ¢è¡ï¼ |
| | | const topicColumns = lishuiTopics.map((topic) => { |
| | | const n = topic.options.length || 1; |
| | | const baseWidths = topic.options.map((opt) => |
| | | opt === "" ? 10 : Math.max(10, this.textWidth(opt) + 4) |
| | | ); |
| | | const sumWidth = baseWidths.reduce((s, w) => s + w, 0); |
| | | const topicWidth = this.textWidth(topic.scriptContent) + 4; |
| | | const groupWidth = Math.max(sumWidth, topicWidth); |
| | | const extra = (groupWidth - sumWidth) / n; |
| | | const widths = baseWidths.map((w) => w + extra); |
| | | const lines = Math.max(1, Math.ceil(topicWidth / groupWidth)); |
| | | return { widths, lines }; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | const maxHeaderLines = topicColumns.reduce( |
| | | (m, t) => Math.max(m, t.lines), |
| | | 1 |
| | | ); |
| | | |
| | | // 设置å宽ï¼è·åæ°ä¸è´ï¼ |
| | | worksheet.columns = headers.map((h, i) => ({ |
| | | width: i === 0 ? 20 : h.length > 6 ? 15 : 12, |
| | | })); |
| | | // 两è¡è¡¨å¤´ï¼ç¬¬ä¸è¡ = 主表å + é¢ç®åï¼ç¬¬äºè¡ = é项å |
| | | const headerRow1 = worksheet.addRow([]); |
| | | const headerRow2 = worksheet.addRow([]); |
| | | |
| | | mainHeaders.forEach((h, i) => { |
| | | const col = i + 1; |
| | | headerRow1.getCell(col).value = h; |
| | | headerRow1.getCell(col).style = headerStyle; |
| | | headerRow2.getCell(col).style = headerStyle; |
| | | worksheet.mergeCells( |
| | | headerRow1.number, |
| | | col, |
| | | headerRow2.number, |
| | | col |
| | | ); |
| | | }); |
| | | |
| | | let colIndex = mainColumnCount + 1; |
| | | lishuiTopics.forEach((topic) => { |
| | | const optCount = topic.options.length || 1; |
| | | for (let k = 0; k < optCount; k++) { |
| | | headerRow1.getCell(colIndex + k).style = headerStyle; |
| | | } |
| | | headerRow1.getCell(colIndex).value = topic.scriptContent; |
| | | if (optCount > 1) { |
| | | worksheet.mergeCells( |
| | | headerRow1.number, |
| | | colIndex, |
| | | headerRow1.number, |
| | | colIndex + optCount - 1 |
| | | ); |
| | | } |
| | | topic.options.forEach((opt, k) => { |
| | | headerRow2.getCell(colIndex + k).value = opt; |
| | | headerRow2.getCell(colIndex + k).style = headerStyle; |
| | | }); |
| | | colIndex += optCount; |
| | | }); |
| | | |
| | | // 表头é«åº¦ï¼é¢å¹²æ¢è¡æ¶ææé¿é¢ç®é¢ç |
| | | headerRow1.height = Math.max(30, 15 * maxHeaderLines + 8); |
| | | headerRow2.height = 25; |
| | | |
| | | // æ°æ®è¡ |
| | | this.userList.forEach((item, idx) => { |
| | | const row = worksheet.addRow([]); |
| | | const main = this.getMainExportRow(item); |
| | | main.forEach((v, i) => { |
| | | const cell = row.getCell(i + 1); |
| | | cell.value = v; |
| | | cell.style = cellStyle; |
| | | }); |
| | | |
| | | const qMap = lishuiRowQuantities[idx] || new Map(); |
| | | let cIndex = mainColumnCount + 1; |
| | | for (const topic of lishuiTopics) { |
| | | const topicQ = qMap.get(topic.key); |
| | | topic.options.forEach((opt) => { |
| | | const cell = row.getCell(cIndex); |
| | | if (opt === "") { |
| | | // 空é项å ä½åä¸å¡«æ°å |
| | | cell.value = ""; |
| | | } else { |
| | | const val = topicQ ? topicQ.get(opt) : undefined; |
| | | cell.value = val === undefined || val === null ? 0 : val; |
| | | } |
| | | cell.style = cellStyle; |
| | | cIndex++; |
| | | }); |
| | | } |
| | | row.height = 22; |
| | | }); |
| | | |
| | | // å宽ï¼ä¸»è¡¨å + é¢ç®é项å |
| | | const columns = [ |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | ]; |
| | | lishuiTopics.forEach((topic, ti) => { |
| | | topicColumns[ti].widths.forEach((w) => { |
| | | columns.push({ width: w }); |
| | | }); |
| | | }); |
| | | worksheet.columns = columns; |
| | | } else { |
| | | // å
¶ä»å»é¢ï¼åè¡è¡¨å¤´ |
| | | const headerRow = worksheet.addRow(mainHeaders); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | this.userList.forEach((item) => { |
| | | const dataRow = worksheet.addRow(this.getMainExportRow(item)); |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | |
| | | worksheet.columns = [ |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | ]; |
| | | } |
| | | |
| | | // çæå¹¶ä¸è½½æä»¶ |
| | | const buffer = await workbook.xlsx.writeBuffer(); |
| | |
| | | }, |
| | | // endOut: 1, |
| | | endOut: |
| | | localStorage.getItem("orgname") == "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢" ? 0 : 1, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" ? 0 : 1, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | endOuts: [ |
| | | { |
| | | value: 0, |
| | |
| | | <el-form-item label="ç»ç®¡å»ç" prop="managementDoctor"> |
| | | <el-input |
| | | v-model="topqueryParams.managementDoctor" |
| | | placeholder="请è¾å
¥ä¸»æ²»å»ç" |
| | | placeholder="请è¾å
¥ç»ç®¡å»ç" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ¥æéå¶" prop="status"> |
| | |
| | | <el-select v-model="topqueryParams.sort" placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in topicoptionssort" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å½åæ§è¡æ¹å¼" prop="currentPreachforms"> |
| | | <el-select |
| | | v-model="topqueryParams.currentPreachforms" |
| | | placeholder="è¯·éæ©" |
| | | multiple |
| | | clearable |
| | | collapse-tags |
| | | > |
| | | <el-option |
| | | v-for="item in currentPreachformOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | |
| | | }, |
| | | // endOut: 1, |
| | | endOut: |
| | | localStorage.getItem("orgname") == "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢" ? 0 : 1, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" ? 0 : 1, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | endOuts: [ |
| | | { |
| | | value: 0, |
| | |
| | | : "", |
| | | leaveldeptcodes: [], |
| | | leavehospitaldistrictcodes: [], |
| | | currentPreachforms: [], |
| | | }, |
| | | orgname: "", |
| | | propss: { multiple: true }, |
| | |
| | | value: 5, |
| | | label: "æ éé访", |
| | | }, |
| | | ], |
| | | |
| | | currentPreachformOptions: [ |
| | | { value: "1", label: "人工" }, |
| | | { value: "2", label: "纸质" }, |
| | | { value: "3", label: "æºè½è¯é³" }, |
| | | { value: "4", label: "çä¿¡" }, |
| | | { value: "5", label: "微信å
¬ä¼å·" }, |
| | | { value: "6", label: "微信å°ç¨åº" }, |
| | | { value: "7", label: "æ¯åé访" }, |
| | | ], |
| | | |
| | | sextype: [ |
| | |
| | | } |
| | | |
| | | try { |
| | | // é¡¶é¨å¡çç¹å»çä¸´æ¶æ¡ä»¶åªå 卿¬æ¬¡è¯·æ±ä¸ï¼ä¸åå表å |
| | | const query = this.applyCardFilter({ ...this.topqueryParams }); |
| | | const response = await getTaskservelist(query); |
| | | // å½åæ§è¡æ¹å¼ä¸ºå¤éï¼é转æéå·åéå符串ï¼å¦ 1,2,5ï¼ |
| | | const params = { ...this.topqueryParams }; |
| | | if (Array.isArray(params.currentPreachforms)) { |
| | | params.currentPreachforms = params.currentPreachforms.join(","); |
| | | } |
| | | const response = await getTaskservelist(params); |
| | | |
| | | // â
ç¬¬ä¸æ¥ï¼å
é宿¢å¤ç¶æ |
| | | this.isRestoring = true; |
| | |
| | | }); |
| | | } |
| | | if (item.currentPreachform) { |
| | | |
| | | |
| | | item.currentPreachform = this.checkboxlist.find( |
| | | (item) => item.value == item.currentPreachform |
| | | )?.value; |
| | | console.log(item.currentPreachform, "mi"); |
| | | (items) => items.value == item.currentPreachform |
| | | )?.label; |
| | | } |
| | | }); |
| | | |
| | |
| | | scopetype: [], |
| | | leaveldeptcodes: [], |
| | | leavehospitaldistrictcodes: [], |
| | | currentPreachforms: [], |
| | | }; |
| | | this.handleQuery(1); |
| | | }, |
| | |
| | | scopetype: [], |
| | | leaveldeptcodes: [], |
| | | leavehospitaldistrictcodes: [], |
| | | currentPreachforms: [], |
| | | }; |
| | | }, |
| | | handleSelectionChange(rows) { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <statistics-cards |
| | | :cardlist="cardlist" |
| | | :ycvalue="ycvalue" |
| | | :jgvalue="jgvalue" |
| | | :show-warning-condition="orgname == 'çç«åå¾·ç¿ èé¢åº'" |
| | | /> |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | :model="topqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="98px" |
| | | > |
| | | <el-form-item label="ä»»å¡åç§°"> |
| | | <el-input |
| | | v-model="topqueryParams.taskName" |
| | | placeholder="è¯·éæ©ä»»å¡åç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æå¡æ¶é´"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | style="width: 240px" |
| | | value-format="yyyy-MM-dd" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="åºé访æ¶é´"> |
| | | <el-date-picker |
| | | v-model="dateRangefs" |
| | | style="width: 240px" |
| | | value-format="yyyy-MM-dd" |
| | | type="daterange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ£è
å§å" prop="sendname"> |
| | | <el-input |
| | | v-model="topqueryParams.sendname" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="è¯æåç§°" prop="leavediagname"> |
| | | <el-input |
| | | v-model="topqueryParams.leavediagname" |
| | | placeholder="请è¾å
¥è¯æåç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ£è
èå´" prop="status"> |
| | | <el-cascader |
| | | v-model="topqueryParams.scopetype" |
| | | placeholder="é»è®¤å
¨é¨" |
| | | :options="sourcetype" |
| | | filterable |
| | | clearable |
| | | :props="{ expandTrigger: 'hover' }" |
| | | @change="handleChange" |
| | | ></el-cascader> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="éè®¿ç¶æ" prop="status"> |
| | | <el-cascader |
| | | v-model="serviceStatusValue" |
| | | placeholder="è¯·éæ©" |
| | | :options="serviceStatusOptions" |
| | | :props="cascaderProps" |
| | | @change="handleServiceStatusChange" |
| | | clearable |
| | | ></el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="æåºæ¹å¼" prop="status"> |
| | | <el-select v-model="topqueryParams.sort" placeholder="è¯·éæ©"> |
| | | <el-option |
| | | v-for="item in topicoptionssort" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="medium" |
| | | @click="handleQuery(1)" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="medium" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-divider></el-divider> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-upload2" |
| | | size="medium" |
| | | @click="handleExport" |
| | | >导åº</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <!-- <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | @click="handleAdd" |
| | | >æ°å¢</el-button |
| | | > |
| | | </el-col> --> |
| | | |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-warning-outline" |
| | | size="medium" |
| | | @click="toleadExport(1)" |
| | | >æ§è¡å¤±è´¥</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="danger" |
| | | plain |
| | | icon="el-icon-warning" |
| | | size="medium" |
| | | @click="toleadExport(2)" |
| | | >ç»æå¼å¸¸</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="success" |
| | | plain |
| | | size="medium" |
| | | @click="buidegetTasklist()" |
| | | >å¾
åæå¡</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <!-- <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | size="medium" |
| | | @click="affiliation()" |
| | | >æ¬äººæå±æå¡</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> --> |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button type="success" size="medium" @click="onthatday()" |
| | | >仿¥æå¡</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="userList" |
| | | :row-class-name="tableRowClassName" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column |
| | | label="ä»»å¡åç§°" |
| | | fixed |
| | | width="150" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | key="taskName" |
| | | prop="taskName" |
| | | /> |
| | | <!-- <el-table-column label="åºå·" fixed align="center" key="id" prop="id" /> --> |
| | | <el-table-column |
| | | label="å§å" |
| | | width="100" |
| | | align="center" |
| | | key="sendname" |
| | | prop="sendname" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | gettoken360( |
| | | scope.row.sfzh, |
| | | scope.row.drcode, |
| | | scope.row.drname, |
| | | scope.row.patid |
| | | ) |
| | | " |
| | | ><span class="button-textsc">{{ |
| | | scope.row.sendname |
| | | }}</span></el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="éè®¿ç¶æ" |
| | | align="center" |
| | | key="sendstateView" |
| | | prop="sendstateView" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tooltip |
| | | class="item" |
| | | effect="dark" |
| | | :content="scope.row.remark" |
| | | placement="top-start" |
| | | > |
| | | <div v-if="scope.row.sendstateView == 1"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >å¾
é访</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 2"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 3"> |
| | | <el-tag type="warning" :disable-transitions="false" |
| | | >æ éé访</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column |
| | | label="ä»»å¡å¼å¸¸è¯´æ" |
| | | width="120" |
| | | align="center" |
| | | key="remark" |
| | | prop="remark" --> |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="å¤çæè§" |
| | | align="center" |
| | | key="suggest" |
| | | prop="suggest" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_suggest" |
| | | :value="scope.row.suggest" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="éè®¿å®ææ¶é´" |
| | | sortable |
| | | align="center" |
| | | prop="finishtime" |
| | | width="160" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.finishtime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å°±è¯æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="endtime" |
| | | prop="endtime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.endtime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | | label="åºéè®¿æ¥æ" |
| | | width="146" |
| | | align="center" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | | label="主治å»ç" |
| | | width="120" |
| | | align="center" |
| | | key="drname" |
| | | prop="drname" |
| | | /> |
| | | |
| | | <!-- <el-table-column |
| | | label="æå¡å¤©æ°" |
| | | width="120" |
| | | align="center" |
| | | key="endDay" |
| | | prop="endDay" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.endDay ? scope.row.endDay + "天" : "" }}</span> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column |
| | | label="身份è¯å·ç " |
| | | width="200" |
| | | align="center" |
| | | key="sfzh" |
| | | prop="sfzh" |
| | | /> |
| | | <el-table-column |
| | | label="èç³»çµè¯" |
| | | width="200" |
| | | align="center" |
| | | key="phone" |
| | | prop="phone" |
| | | /> |
| | | <el-table-column |
| | | label="责任æ¤å£«" |
| | | width="120" |
| | | align="center" |
| | | key="nurseName" |
| | | prop="nurseName" |
| | | /> |
| | | |
| | | <!-- <el-table-column |
| | | label="ç
åå·" |
| | | align="center" |
| | | sortable |
| | | key="medicalRecordNo" |
| | | prop="medicalRecordNo" |
| | | width="120" |
| | | /> --> |
| | | |
| | | <!-- <el-table-column label="å¹´é¾" align="center" key="age" prop="age" /> --> |
| | | <!-- <el-table-column label="æ§å«"width="100" align="center" key="sex" prop="sex" /> --> |
| | | <!-- <el-table-column label="åºå·" align="center" key="badNo" prop="badNo" /> --> |
| | | <el-table-column |
| | | label="馿¬¡é访ç§å®¤" |
| | | align="center" |
| | | key="deptname" |
| | | prop="deptname" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æ¬æ¬¡ç§å®¤" |
| | | align="center" |
| | | key="visitDeptName" |
| | | prop="visitDeptName" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ç
åº" |
| | | align="center" |
| | | key="leavehospitaldistrictname" |
| | | prop="leavehospitaldistrictname" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="è¯æåç§°" |
| | | align="center" |
| | | key="leavediagname" |
| | | prop="leavediagname" |
| | | width="120" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访人å" |
| | | align="center" |
| | | key="updateBy" |
| | | prop="updateBy" |
| | | width="120" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æå¡é访模æ¿åç§°" |
| | | align="center" |
| | | key="templatename" |
| | | prop="templatename" |
| | | width="200" |
| | | /> |
| | | <el-table-column |
| | | label="ä»»å¡ç¶æ" |
| | | align="center" |
| | | key="sendstate" |
| | | prop="sendstate" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tooltip |
| | | class="item" |
| | | effect="dark" |
| | | :content="scope.row.remark" |
| | | placement="top-start" |
| | | > |
| | | <div v-if="scope.row.sendstate == 1"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >表åå·²é¢å</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 2"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >å¾
é访</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 3"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >表åå·²åé</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 4"> |
| | | <el-tag type="info" :disable-transitions="false">䏿§è¡</el-tag> |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 5"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false">è¶
æ¶</el-tag> |
| | | </div> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="任塿§è¡æ¹å¼" |
| | | align="center" |
| | | key="preachform" |
| | | prop="preachform" |
| | | width="160" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-for="item in scope.row.preachform">{{ item }}ã </span> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column |
| | | label="ä»»å¡åéæµç¨" |
| | | align="center" |
| | | key="serviceSubtaskRecordList" |
| | | prop="serviceSubtaskRecordList" |
| | | width="160" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-for="item in scope.row.serviceSubtaskRecordList" |
| | | >{{ item.remark }}ã |
| | | </span> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column |
| | | label="ä»»å¡ç»æè¯´æ" |
| | | width="220" |
| | | align="center" |
| | | key="remark" |
| | | prop="remark" |
| | | > |
| | | <template slot-scope="scope" v-if="scope.row.remark"> |
| | | <el-tooltip |
| | | :content="scope.row.remark" |
| | | placement="top" |
| | | effect="dark" |
| | | > |
| | | <el-tag |
| | | type="warning" |
| | | v-if="scope.row.sendstate != 5 && scope.row.sendstate != 4" |
| | | >{{ scope.row.remark }}</el-tag |
| | | > |
| | | <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | fixed="right" |
| | | width="300" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <!-- <el-tooltip |
| | | class="item" |
| | | effect="dark" |
| | | content="忬¡é访" |
| | | placement="top" |
| | | > |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | v-if="scope.row.isVisitAgain!=2" |
| | | @click="followupvisit(scope.row)" |
| | | ><span class="button-bb" |
| | | ><i class="el-icon-s-promotion"></i>忬¡é访</span |
| | | ></el-button |
| | | > |
| | | </el-tooltip> |
| | | <el-tooltip |
| | | v-if="scope.row.sendstate == 1 || scope.row.sendstate == 2" |
| | | class="item" |
| | | effect="dark" |
| | | content="æåæå¡" |
| | | placement="top" |
| | | > |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handlestop(scope.row)" |
| | | |
| | | ><span class="button-sc" |
| | | ><i class="el-icon-remove-outline"></i>æåæå¡</span |
| | | ></el-button |
| | | > |
| | | </el-tooltip> --> |
| | | <el-button size="medium" type="text" @click="Seedetails(scope.row)" |
| | | ><span class="button-zx" |
| | | ><i class="el-icon-s-order"></i>æ¥ç详æ
</span |
| | | ></el-button |
| | | > |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handleUpdate(scope.row)" |
| | | ><span class="button-textxga" |
| | | ><i class="el-icon-edit"></i>æ£è
è¿æ»¤</span |
| | | ></el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="topqueryParams.pageNum" |
| | | :limit.sync="topqueryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-row> |
| | | <!-- æ·»å æä¿®æ¹å½±åéè®¿å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="amendtag ? 'ä¿®æ¹æ£è
ä¿¡æ¯' : 'æ°å¢æ£è
'" |
| | | :visible.sync="Labelchange" |
| | | width="900px" |
| | | > |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="100px"> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å§å" width="100" prop="name"> |
| | | <el-input |
| | | v-model="form.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | maxlength="30" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ§å«" width="100" prop="sex"> |
| | | <el-select v-model="form.sex" placeholder="è¯·éæ©æ§å«"> |
| | | <el-option |
| | | v-for="dict in sextype" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å¹´é¾" prop="age"> |
| | | <el-input |
| | | v-model="form.age" |
| | | placeholder="请è¾å
¥å¹´é¾" |
| | | maxlength="30" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è¿æ»¤å»ç" width="100" prop="filterDrname"> |
| | | <el-input |
| | | v-model="form.filterDrname" |
| | | placeholder="请è¾å
¥å»çå§å" |
| | | maxlength="30" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="è¿æ»¤åå "> |
| | | <el-input |
| | | v-model="form.notrequiredreason" |
| | | type="textarea" |
| | | placeholder="请è¾å
¥è¿æ»¤åå " |
| | | ></el-input> |
| | | <!-- æéæå --> |
| | | <div class="filter-warning"> |
| | | <i class="el-icon-warning-outline"></i> |
| | | 该åè½éç¨äºæ»äº¡ãåå
¥å»é¢é»ååãæç¡®æç»éè®¿çæ£è
çè¿æ»¤æé¤ï¼è¿æ»¤å该æ£è
ææè¿è¡ä¸ä»»å¡å
¨é¨åæ¢ä¸æ æ³å¹é
æ°çé访任å¡ï¼è¯·è°¨æ
æä½ï¼ |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- ä¿®æ¹åéæ¶é´å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="åéæ¶é´è®¾ç½®" |
| | | :visible.sync="modificationVisible" |
| | | width="45%" |
| | | > |
| | | <div style="margin-bottom: 20px; color: red"> |
| | | ç»ä¸ä¿®æ¹å½å¤©æªåéç任塿¶é´ |
| | | </div> |
| | | |
| | | <el-form |
| | | :model="ruleForm" |
| | | :rules="rules" |
| | | ref="ruleForm" |
| | | label-width="120px" |
| | | class="demo-ruleForm" |
| | | > |
| | | <el-form-item label="å鿥æ"> |
| | | <el-date-picker |
| | | v-model="ruleForm.value1" |
| | | type="date" |
| | | placeholder="éæ©æ¥æ" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¶é´æ®µ" prop="type"> |
| | | <el-checkbox-group v-model="ruleForm.type"> |
| | | <el-checkbox label="ä¸å" name="type"></el-checkbox> |
| | | <el-checkbox label="ä¸å" name="type"></el-checkbox> |
| | | <el-checkbox label="æä¸" name="type"></el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸åæ¶é´åºé´" required> |
| | | <el-time-picker |
| | | is-range |
| | | v-model="ruleForm.value2" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¶é´" |
| | | end-placeholder="ç»ææ¶é´" |
| | | placeholder="éæ©æ¶é´èå´" |
| | | > |
| | | </el-time-picker> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸åæ¶é´åºé´" required> |
| | | <el-time-picker |
| | | is-range |
| | | v-model="ruleForm.value3" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¶é´" |
| | | end-placeholder="ç»ææ¶é´" |
| | | placeholder="éæ©æ¶é´èå´" |
| | | > |
| | | </el-time-picker> |
| | | </el-form-item> |
| | | <el-form-item label="æä¸æ¶é´åºé´" required> |
| | | <el-time-picker |
| | | is-range |
| | | v-model="ruleForm.value4" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¶é´" |
| | | end-placeholder="ç»ææ¶é´" |
| | | placeholder="éæ©æ¶é´èå´" |
| | | > |
| | | </el-time-picker> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="modificationVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="modificationVisible = false" |
| | | >ç¡® å®</el-button |
| | | > |
| | | </span> |
| | | </el-dialog> |
| | | <!-- 忬¡é访 --> |
| | | <el-dialog title="æ£è
忬¡é访" :visible.sync="dialogFormVisible"> |
| | | <el-form ref="zcform" :rules="zcrules" :model="zcform" label-width="80px"> |
| | | <el-form-item label="ä»»å¡åç§°"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.taskName" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
åç§°"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.sendname" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å¹´é¾"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.age" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç§å®¤"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.deptname" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç
åº"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.leavehospitaldistrictname" |
| | | ></el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="é访æ¹å¼" prop="resource"> |
| | | <el-radio-group v-model="zcform.resource"> |
| | | <el-radio label="1">æ¬ç
åºé访</el-radio> |
| | | <el-radio label="2">é访ä¸å¿é访</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="å³å»åé"> |
| | | <el-switch v-model="zcform.delivery"></el-switch> |
| | | </el-form-item> --> |
| | | <el-form-item label="æå¡æ¶é´"> |
| | | <el-input |
| | | style="width: 400px" |
| | | disabled |
| | | v-model="zcform.endtime" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="éè®¿å®ææ¶é´" prop="date1"> |
| | | <el-date-picker |
| | | type="date" |
| | | placeholder="éæ©æ¥æ" |
| | | v-model="zcform.date1" |
| | | style="width: 100%" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="é访记å½"> |
| | | <el-input type="textarea" v-model="zcform.remark"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="dialogFormVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="setupsubtask">确认å建æå¡</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | delUser, |
| | | addUser, |
| | | updateUser, |
| | | resetUserPwd, |
| | | changeUserStatus, |
| | | } from "@/api/system/user"; |
| | | import { |
| | | getTaskservelist, |
| | | buidegetTasklist, |
| | | addserviceSubtask, |
| | | query360PatInfo, |
| | | query360PatInfonh, |
| | | } from "@/api/AiCentre/index"; |
| | | import { alterpatient, particularpatient } from "@/api/patient/homepage"; |
| | | import Treeselect from "@riophae/vue-treeselect"; |
| | | import store from "@/store"; |
| | | import "@riophae/vue-treeselect/dist/vue-treeselect.css"; |
| | | import StatisticsCards from "@/components/StatisticsCards"; |
| | | |
| | | export default { |
| | | name: "Discharge", |
| | | dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"], |
| | | components: { Treeselect,StatisticsCards }, |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | dialogFormVisible: false, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // ç¨æ·è¡¨æ ¼æ°æ® |
| | | userList: null, |
| | | // å¼¹åºå±æ é¢ |
| | | title: "æ°å¢å½±åé访", |
| | | // æ¯å¦æ¾ç¤ºä¿®æ¹ãæ·»å å¼¹åºå± |
| | | addalteropen: false, |
| | | // ä¿®æ¹åéæ¶é´å¯¹è¯æ¡ |
| | | modificationVisible: false, |
| | | // é¨é¨åç§° |
| | | deptName: undefined, |
| | | // é»è®¤å¯ç |
| | | initPassword: undefined, |
| | | // æ¥æèå´ |
| | | dateRange: [], |
| | | dateRangefs: [], |
| | | // å²ä½é项 |
| | | postOptions: [], |
| | | ruleForm: { |
| | | type: [], |
| | | }, |
| | | zcform: {}, |
| | | dynamicTags: ["é项ä¸", "é项äº", "é项ä¸"], //é项 |
| | | inputVisible: false, |
| | | Labelchange: false, |
| | | ycvalue: 0, |
| | | yfsvalue: "", |
| | | inputValue: "", |
| | | preachform: "", |
| | | previewVisible: false, //å½±åé访é¢è§å¼¹æ¡ |
| | | radio: "", |
| | | radios: [], |
| | | total: 0, // æ»æ¡æ° |
| | | ImportQuantity: 999, //导影åé访æ°é |
| | | //é¢è§å½±åéè®¿ä¿¡æ¯ |
| | | previewvalue: { |
| | | username: "è¿ä¸ªå»çå¯¹ä½ æä¹æ ·", |
| | | }, |
| | | value: [], |
| | | list: [], |
| | | jgvalue: 0, |
| | | |
| | | sourcetype: [ |
| | | { |
| | | value: 1, |
| | | label: "ç§å®¤", |
| | | children: [], |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "ç
åº", |
| | | children: [], |
| | | }, |
| | | { |
| | | value: 3, |
| | | label: "å
¨é¨", |
| | | }, |
| | | ], |
| | | loading: false, |
| | | cardlist: [ |
| | | { |
| | | name: "æ£è
æå¡æ»é", |
| | | value: 0, |
| | | }, |
| | | |
| | | { |
| | | name: "æ éé访", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "éé访", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "å¾
é访", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "已宿", |
| | | value: 0, |
| | | }, |
| | | ], |
| | | zcrules: { |
| | | date1: [ |
| | | { required: true, message: "è¯·éæ©é访æ¹å¼", trigger: "change" }, |
| | | ], |
| | | resource: [ |
| | | { required: true, message: "è¯·éæ©é访æ¶é´", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | // 级èéæ©å¨ç»å®å¼ |
| | | serviceStatusValue: 10, |
| | | cascaderProps: { |
| | | expandTrigger: "hover", // æ¬åå±å¼ |
| | | checkStrictly: true, // â
å
³é®ï¼å
许éä¸ä»»æä¸çº§ |
| | | emitPath: false, // â
åªè¿åéä¸çå¼ï¼ä¸è¿åè·¯å¾æ°ç» |
| | | }, |
| | | // æå¡ç¶æé项ï¼ä¸çº§åäºçº§å¼ä¸å²çªï¼ |
| | | serviceStatusOptions: [ |
| | | { |
| | | value: null, |
| | | label: "å
¨é¨", |
| | | }, |
| | | { |
| | | value: 10, // ä¸çº§ï¼å¾
é访 |
| | | label: "å¾
é访", |
| | | children: [ |
| | | { value: 1, label: "被é¢å" }, |
| | | { value: 2, label: "å¾
åé" }, |
| | | { value: 3, label: "å·²åé" }, |
| | | { value: 5, label: "åé失败" }, |
| | | { value: 7, label: "è¶
æ¶" }, |
| | | ], |
| | | }, |
| | | { |
| | | value: 20, // ä¸çº§ï¼å·²å®æ |
| | | label: "已宿", |
| | | children: [{ value: 6, label: "已宿" }], |
| | | }, |
| | | { |
| | | value: 30, // ä¸çº§ï¼æ éé访 |
| | | label: "æ éé访", |
| | | children: [{ value: 4, label: "䏿§è¡" }], |
| | | }, |
| | | ], |
| | | // 表ååæ° |
| | | form: { |
| | | phonenumber: "", |
| | | totagid: "", |
| | | types: "", |
| | | nickName: "", |
| | | qystatus: "", |
| | | btstatus: "", |
| | | }, |
| | | topicoptionssort: [ |
| | | { |
| | | value: 0, |
| | | label: "æå¡æ¶é´(æ£åº)", |
| | | }, |
| | | { |
| | | value: 1, |
| | | label: "æå¡æ¶é´(ååº)", |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "åéæ¶é´(æ£åº)", |
| | | }, |
| | | { |
| | | value: 3, |
| | | label: "åéæ¶é´(ååº)", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "åºéè®¿æ¥æ(æ£åº)", |
| | | }, |
| | | { |
| | | value: 8, |
| | | label: "åºéè®¿æ¥æ(ååº)", |
| | | }, |
| | | ], |
| | | // æ¥è¯¢åæ° |
| | | topqueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | sendstateView:1, |
| | | sort: localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" ? 8 : 2, //0 æå¡æ¶é´(æ£åº) 1 æå¡æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | serviceType: 19, |
| | | searchscope: 3, |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }, |
| | | propss: { multiple: true }, |
| | | options: [], |
| | | |
| | | topicoptions: [ |
| | | { |
| | | value: null, |
| | | label: "å
¨é¨", |
| | | }, |
| | | { |
| | | value: 1, |
| | | label: "å¾
é访", |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "é访ä¸", |
| | | }, |
| | | { |
| | | value: 3, |
| | | label: "æªå®æ", |
| | | }, |
| | | { |
| | | value: 4, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 5, |
| | | label: "æ éé访", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | | value: 1, |
| | | label: "ç·", |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "女", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | | value: 1, |
| | | label: "å¼å¸¸", |
| | | }, |
| | | { |
| | | value: 0, |
| | | label: "æ£å¸¸", |
| | | }, |
| | | ], |
| | | url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo", |
| | | postData: { |
| | | XiaoXiTou: { |
| | | FaSongFCSJC: "ZJHES", |
| | | FaSongJGID: localStorage.getItem("orgid"), |
| | | FaSongJGMC: localStorage.getItem("orgname"), |
| | | FaSongSJ: "2025-01-09Â 17:29:36", |
| | | FaSongXTJC: "SUIFANGXT", |
| | | FaSongXTMC: "é访系ç»", |
| | | XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171", |
| | | XiaoXiLX: "SC_LC_360STCX", |
| | | XiaoXiMC: "360 è§å¾æ¥è¯¢", |
| | | ZuHuID: localStorage.getItem("ZuHuID"), |
| | | ZuHuMC: localStorage.getItem("orgname"), |
| | | }, |
| | | YeWuXX: { |
| | | BingRenXX: { |
| | | ZhengJianHM: "", |
| | | ZhengJianLXDM: "01", |
| | | ZhengJianLXMC: "å±
æ°èº«ä»½è¯", |
| | | ZuZhiJGID: localStorage.getItem("orgid"), |
| | | ZuZhiJGMC: localStorage.getItem("orgname"), |
| | | }, |
| | | YongHuXX: { |
| | | XiTongID: "SUIFANGXT", |
| | | XiTongMC: "é访系ç»", |
| | | YongHuID: localStorage.getItem("YongHuID"), |
| | | YongHuXM: localStorage.getItem("YongHuXM"), |
| | | ZuZhiJGID: localStorage.getItem("orgid"), |
| | | ZuZhiJGMC: localStorage.getItem("orgname"), |
| | | idp: "lyra", |
| | | }, |
| | | }, |
| | | }, |
| | | amendtag: false, |
| | | errtype: "", |
| | | leavehospitaldistrictcode: "", |
| | | serviceState: [], |
| | | checkboxlist: [], |
| | | // è¡¨åæ ¡éª |
| | | rules: {}, |
| | | }; |
| | | }, |
| | | watch: {}, |
| | | created() { |
| | | this.serviceState = store.getters.serviceState; |
| | | this.checkboxlist = store.getters.checkboxlist; |
| | | this.errtype = this.$route.query.errtype; |
| | | this.leavehospitaldistrictcode = |
| | | this.$route.query.leavehospitaldistrictcode; |
| | | this.sourcetype[0].children = store.getters.belongDepts.map((dept) => { |
| | | return { |
| | | label: dept.deptName, |
| | | value: dept.deptCode, |
| | | }; |
| | | }); |
| | | this.sourcetype[1].children = store.getters.belongWards.map((dept) => { |
| | | return { |
| | | label: dept.districtName, |
| | | value: dept.districtCode, |
| | | }; |
| | | }); |
| | | if (this.errtype) { |
| | | this.toleadExport(2); |
| | | } else { |
| | | this.getList(1); |
| | | } |
| | | this.getConfigKey("sys.user.initPassword").then((response) => { |
| | | this.initPassword = response.msg; |
| | | }); |
| | | }, |
| | | activated() { |
| | | this.getList(1); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢é访æå¡å表 */ |
| | | getList(refresh) { |
| | | // é»è®¤å
¨é¨ |
| | | |
| | | if (this.topqueryParams.searchscope == 3) { |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | | // æ¥åå¼å¸¸è·³è½¬ |
| | | if (this.errtype) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push( |
| | | this.leavehospitaldistrictcode |
| | | ); |
| | | console.log(this.topqueryParams.leavehospitaldistrictcodes, "11"); |
| | | } |
| | | this.loading = true; |
| | | if ( |
| | | this.topqueryParams.leavehospitaldistrictcodes[0] && |
| | | this.topqueryParams.visitDeptCodes[0] |
| | | ) { |
| | | this.topqueryParams.deptOrDistrict = 4; |
| | | } else { |
| | | this.topqueryParams.deptOrDistrict = 1; |
| | | } |
| | | |
| | | if (!this.followupAuthority()) { |
| | | this.$message.warning("æªé
ç½®ç§å®¤/ç
åºç¸å
³æéä¸å¯æ¥è¯¢"); |
| | | return Promise.reject(new Error("æ æéæ¥è¯¢")); |
| | | } |
| | | getTaskservelist(this.topqueryParams).then((response) => { |
| | | this.userList = response.rows[0].serviceSubtaskList; |
| | | this.total = response.total; |
| | | if (refresh) { |
| | | this.cardlist[0].value = |
| | | Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0; |
| | | // this.cardlist[1].value = response.rows[0].wzx; |
| | | this.cardlist[1].value = response.rows[0].wxsf || 0; |
| | | this.ycvalue = response.rows[0].yc; |
| | | this.cardlist[2].value = response.rows[0].xsf || 0; |
| | | this.cardlist[3].value = response.rows[0].dsf || 0; |
| | | this.cardlist[4].value = response.rows[0].ywc || 0; |
| | | this.yfsvalue = response.rows[0].yfs; |
| | | } |
| | | this.loading = false; |
| | | this.userList.forEach((item) => { |
| | | let idArray = null; |
| | | if (item.endtime) { |
| | | item.endDay = this.daysBetween(item.endtime); |
| | | } |
| | | |
| | | if (item.preachform) { |
| | | if (item.endtime) { |
| | | item.preachformson = item.preachform; |
| | | idArray = item.preachform.split(","); |
| | | } |
| | | |
| | | item.preachform = idArray.map((value) => { |
| | | // æ¥æ¾id对åºç对象 |
| | | const item = this.checkboxlist.find( |
| | | (item) => item.value == value |
| | | ); |
| | | // 妿æ¾å°å¯¹åºçidï¼è¿ålabelå¼ï¼å¦åè¿ånull |
| | | return item ? item.label : null; |
| | | }); |
| | | } |
| | | }); |
| | | this.total = response.total; |
| | | }); |
| | | }, |
| | | affiliation() { |
| | | this.topqueryParams.managementDoctorCode = store.getters.hisUserId; |
| | | |
| | | this.getList(1); |
| | | }, |
| | | onthatday() { |
| | | this.topqueryParams.sendstateView = 1; // å¾
é访 |
| | | this.topqueryParams.sendstate = null; |
| | | this.topqueryParams.startSendDateTime = null; |
| | | this.topqueryParams.endSendDateTime = this.getCurrentDate(); // å¼å§éè®¿æ¥æ <= ä»å¤© |
| | | this.getList(1); |
| | | }, |
| | | getCurrentDate() { |
| | | const now = new Date(); |
| | | return now.toISOString().slice(0, 10); // æªåå10个å符ï¼å³ YYYY-MM-DD |
| | | }, |
| | | buidegetTasklist(type) { |
| | | // ç¨æ·æé䏿æå¾
é访任å¡ï¼ä¼ éå
¨é¨ç§å®¤åç
åº |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | // æ¥åå¼å¸¸è·³è½¬ |
| | | if (this.errtype) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push( |
| | | this.leavehospitaldistrictcode |
| | | ); |
| | | } |
| | | let obj = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | leavehospitaldistrictcodes: |
| | | this.topqueryParams.leavehospitaldistrictcodes, |
| | | sendstateView: 1, |
| | | visitDeptCodes: this.topqueryParams.visitDeptCodes, |
| | | // leaveldeptcodes: this.topqueryParams.leaveldeptcodes, |
| | | }; |
| | | buidegetTasklist(obj).then((response) => { |
| | | this.userList = response.rows[0].serviceSubtaskList; |
| | | this.total = response.total; |
| | | if (refresh) { |
| | | this.cardlist[0].value = |
| | | Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0; |
| | | this.cardlist[1].value = response.rows[0].wzx; |
| | | this.cardlist[2].value = response.rows[0].ysf; |
| | | this.ycvalue = response.rows[0].yc; |
| | | this.cardlist[3].value = response.rows[0].fssb; |
| | | this.cardlist[4].value = response.rows[0].dsf; |
| | | // this.cardlist[5].value = response.rows[0].yfs2; |
| | | this.yfsvalue = response.rows[0].yfs; |
| | | } |
| | | this.loading = false; |
| | | this.userList.forEach((item) => { |
| | | let idArray = null; |
| | | if (item.endtime) { |
| | | item.endDay = this.daysBetween(item.endtime); |
| | | } |
| | | |
| | | if (item.preachform) { |
| | | if (item.endtime) { |
| | | item.preachformson = item.preachform; |
| | | idArray = item.preachform.split(","); |
| | | } |
| | | |
| | | item.preachform = idArray.map((value) => { |
| | | // æ¥æ¾id对åºç对象 |
| | | const item = this.checkboxlist.find( |
| | | (item) => item.value == value |
| | | ); |
| | | // 妿æ¾å°å¯¹åºçidï¼è¿ålabelå¼ï¼å¦åè¿ånull |
| | | return item ? item.label : null; |
| | | }); |
| | | } |
| | | }); |
| | | this.total = response.total; |
| | | }); |
| | | }, |
| | | // æ¥çæå¡é访详æ
|
| | | Referencequestion(row) { |
| | | this.previewVisible = true; |
| | | }, |
| | | // æ·»å å¼¹æ¡æç´¢ |
| | | remoteMethod(query) { |
| | | if (query !== "") { |
| | | this.loading = true; |
| | | setTimeout(() => { |
| | | this.loading = false; |
| | | this.options = this.list.filter((item) => { |
| | | return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1; |
| | | }); |
| | | }, 200); |
| | | } else { |
| | | this.options = []; |
| | | } |
| | | }, |
| | | // å½±åéè®¿ç¶æä¿®æ¹ |
| | | handleStatusChange(row) { |
| | | let text = row.status === "0" ? "å¯ç¨" : "åç¨"; |
| | | this.$modal |
| | | .confirm('确认è¦"' + text + '""' + row.userName + '"ç¨æ·åï¼') |
| | | .then(function () { |
| | | return changeUserStatus(row.userId, row.status); |
| | | }) |
| | | .then(() => { |
| | | this.$modal.msgSuccess(text + "æå"); |
| | | }) |
| | | .catch(function () { |
| | | row.status = row.status === "0" ? "1" : "0"; |
| | | }); |
| | | }, |
| | | |
| | | // 表åéç½® |
| | | reset() { |
| | | this.form = { |
| | | userId: undefined, |
| | | deptId: undefined, |
| | | userName: undefined, |
| | | nickName: undefined, |
| | | password: undefined, |
| | | phonenumber: undefined, |
| | | email: undefined, |
| | | sex: undefined, |
| | | status: "0", |
| | | remark: undefined, |
| | | postIds: [], |
| | | roleIds: [], |
| | | }; |
| | | this.resetForm("form"); |
| | | }, |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery(refresh) { |
| | | if (this.topqueryParams.searchscope == 3) { |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | | this.topqueryParams.pageNum = 1; |
| | | this.topqueryParams.startOutHospTime = this.dateRange[0]; |
| | | this.topqueryParams.endOutHospTime = this.dateRange[1]; |
| | | this.topqueryParams.startSendDateTime = this.dateRangefs[0]; |
| | | this.topqueryParams.endSendDateTime = this.dateRangefs[1]; |
| | | console.log("2"); |
| | | this.getList(refresh); |
| | | }, |
| | | // æ£è
èå´å¤ç |
| | | handleChange(value) { |
| | | let type = value[0]; |
| | | let code = value.slice(-1)[0]; |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | if (type == 1) { |
| | | this.topqueryParams.visitDeptCodes.push(code); |
| | | // this.topqueryParams.leaveldeptcodes.push(code); |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.searchscope = 1; |
| | | } else if (type == 2) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push(code); |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | this.topqueryParams.searchscope = 2; |
| | | } else { |
| | | this.topqueryParams.searchscope = 3; |
| | | } |
| | | }, |
| | | // éè®¿ç¶æåæ´å¤ç |
| | | handleServiceStatusChange(value) { |
| | | // æ¸
ç©ºéæ© |
| | | if (value === null || value === undefined || value === "") { |
| | | this.topqueryParams.sendstateView = null; |
| | | this.topqueryParams.sendstate = null; |
| | | return; |
| | | } |
| | | console.log(value, "value"); |
| | | |
| | | // ä¸çº§èç¹çå¼ï¼å¤§äºçäº10ï¼ |
| | | if (value >= 10) { |
| | | // éä¸äºä¸çº§ |
| | | switch (value) { |
| | | case 10: |
| | | this.topqueryParams.sendstateView = 1; // å¾
é访 |
| | | break; |
| | | case 20: |
| | | this.topqueryParams.sendstateView = 2; // 已宿 |
| | | break; |
| | | case 30: |
| | | this.topqueryParams.sendstateView = 3; // æ éé访 |
| | | break; |
| | | } |
| | | this.topqueryParams.sendstate = null; |
| | | } else { |
| | | // éä¸äºäºçº§ï¼å
·ä½ç¶æï¼ |
| | | this.topqueryParams.sendstateView = null; |
| | | this.topqueryParams.sendstate = value; |
| | | } |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.dateRangefs = []; |
| | | this.serviceStatusValue = 10; |
| | | |
| | | this.topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | sendstateView:1, |
| | | sort: 2, //0 æå¡æ¶é´(æ£åº) 1 æå¡æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) |
| | | serviceType: 19, |
| | | searchscope: 3, |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }; |
| | | this.handleQuery(1); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map((item) => item.userId); |
| | | this.single = selection.length != 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | //å é¤é项 |
| | | handleClose(tag) { |
| | | this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1); |
| | | }, |
| | | //è§¦åæ°å¢è¾å
¥ |
| | | showInput() { |
| | | this.inputVisible = true; |
| | | this.$nextTick((_) => { |
| | | this.$refs.saveTagInput.$refs.input.focus(); |
| | | }); |
| | | }, |
| | | //è·å失å»ç¦ç¹è§¦å |
| | | handleInputConfirm() { |
| | | let inputValue = this.inputValue; |
| | | if (inputValue) { |
| | | this.dynamicTags.push(inputValue); |
| | | } |
| | | this.inputVisible = false; |
| | | this.inputValue = ""; |
| | | }, |
| | | /** æ°å¢æé®æä½ */ |
| | | handleAdd() { |
| | | this.$router.push({ |
| | | path: "/followvisit/QuestionnaireTask", |
| | | query: { |
| | | type: 2, |
| | | serviceType: 19, |
| | | }, |
| | | }); |
| | | }, |
| | | //æ£è
360跳转 |
| | | gettoken360(sfzh, drcode, drname, id) { |
| | | // const orgname = localStorage.getItem("orgname"); |
| | | if (orgname == "åå大å¦éå±ç¬¬ä¸å»é¢") { |
| | | query360PatInfonh(id).then((res) => { |
| | | if (res.data) { |
| | | window.open(res.data, "_blank"); |
| | | } else { |
| | | this.$modal.msgWarning("360æ¥è¯¢æ ç»æ"); |
| | | } |
| | | }); |
| | | return; |
| | | } else if ( |
| | | orgname == "第ä¸äººæ°å»é¢æ¹æ»¨é¢åº" || |
| | | orgname == "第ä¸äººæ°å»é¢å´å±±é¢åº" |
| | | ) { |
| | | let url = `http://192.200.81.189:9100/blj/view?BINGRENID=${id}&YONGHUID=DBA`; |
| | | window.open(url, "_blank"); |
| | | return; |
| | | } |
| | | |
| | | this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh; |
| | | |
| | | query360PatInfo(this.postData).then((res) => { |
| | | if (res.data.url) { |
| | | window.open(res.data.url, "_blank"); |
| | | // this.linkUrl = res.data.url; |
| | | } else { |
| | | this.$modal.msgWarning("360æ¥è¯¢æ ç»æ"); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** éç½®å¯ç æé®æä½ */ |
| | | handleResetPwd(row) { |
| | | this.$prompt('请è¾å
¥"' + row.userName + '"çæ°å¯ç ', "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | closeOnClickModal: false, |
| | | inputPattern: /^.{5,20}$/, |
| | | inputErrorMessage: "ç¨æ·å¯ç é¿åº¦å¿
é¡»ä»äº 5 å 20 ä¹é´", |
| | | }) |
| | | .then(({ value }) => { |
| | | resetUserPwd(row.userId, value).then((response) => { |
| | | this.$modal.msgSuccess("ä¿®æ¹æåï¼æ°å¯ç æ¯ï¼" + value); |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // åæ¶æé® |
| | | cancel() { |
| | | this.Labelchange = false; |
| | | this.reset(); |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm: function () { |
| | | this.$refs["form"].validate((valid) => { |
| | | if (valid) { |
| | | this.form.isoperation = 2; |
| | | this.form.notrequiredFlag = 1; |
| | | alterpatient(this.form) |
| | | .then((response) => { |
| | | console.log(response); |
| | | }) |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgSuccess("æ£è
è¿æ»¤æå"); |
| | | }); |
| | | |
| | | this.reset(); |
| | | this.Labelchange = false; |
| | | } |
| | | }); |
| | | }, |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const userIds = row.userId || this.ids; |
| | | this.$modal |
| | | .confirm('æ¯å¦ç¡®è®¤å é¤ç¨æ·ç¼å·ä¸º"' + userIds + '"çæ°æ®é¡¹ï¼') |
| | | .then(function () { |
| | | return delUser(userIds); |
| | | }) |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // å
¨é¨åæ¢ |
| | | AllStop() { |
| | | this.$modal |
| | | .confirm("æ¯å¦åæ¢å
¨é¨ä»»å¡ï¼") |
| | | .then(function () { |
| | | return console.log("忢æå"); |
| | | }) |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgWarning("忢æå"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // å
¨é¨å¼å§ |
| | | AllStarted() { |
| | | this.$modal |
| | | .confirm("æ¯å¦å¼å¯å
¨é¨ä»»å¡ï¼") |
| | | .then(function () { |
| | | return console.log("å¼å¯æå"); |
| | | }) |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgSuccess("å¼å¯æå"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // ä»»å¡éç½® |
| | | TaskReset() { |
| | | this.$modal |
| | | .confirm("æ¯å¦éç½®éä¸çä»»å¡é¡¹ï¼") |
| | | .then(function () { |
| | | return console.log("é䏿å"); |
| | | }) |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgSuccess("éç½®æå"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // 设置åéæ¶é´ |
| | | Sendtimesetting() { |
| | | this.modificationVisible = true; |
| | | }, |
| | | // 跳转详æ
页 |
| | | Seedetails(row) { |
| | | let type = ""; |
| | | console.log(row, "rwo"); |
| | | if (row.type == 1) { |
| | | type = 1; |
| | | } |
| | | this.$router.push({ |
| | | path: "/followvisit/record/detailpage/", |
| | | query: { |
| | | taskid: row.taskid, |
| | | patid: row.patid, |
| | | id: row.id, |
| | | Voicetype: type, |
| | | visitCount: this.topqueryParams.visitCount, |
| | | }, |
| | | }); |
| | | }, |
| | | // 忬¡é访 |
| | | followupvisit(row) { |
| | | this.zcform = row; |
| | | this.zcform.endtime = this.formatTime(this.zcform.endtime); |
| | | this.dialogFormVisible = true; |
| | | }, |
| | | onSubmit() {}, |
| | | // æåæå¡ |
| | | handlestop(row) { |
| | | let objson = row; |
| | | this.$modal |
| | | .confirm( |
| | | 'æ¯å¦ç¡®è®¤æåä»»å¡å称为"' + |
| | | row.taskName + |
| | | 'æ£è
å称为"' + |
| | | row.sendname + |
| | | '"çæ°æ®é¡¹ï¼' |
| | | ) |
| | | .then(() => { |
| | | getTaskservelist({ |
| | | patid: row.patid, |
| | | taskid: row.taskid, |
| | | }).then((res) => { |
| | | if (res.code == 200) { |
| | | objson.sendstate = 4; |
| | | objson.remark = "æå¡æå"; |
| | | Editsingletaskson(objson).then((res) => { |
| | | if (res.code) { |
| | | this.$modal.msgSuccess("è®°å½æå"); |
| | | this.getList(1); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | // æ£è
è¿æ»¤è§¦å |
| | | handleUpdate(row) { |
| | | particularpatient(row.patid).then((response) => { |
| | | this.form = response.data; |
| | | this.form.filterDrname = store.getters.nickName; |
| | | }); |
| | | this.amendtag = true; |
| | | this.Labelchange = true; |
| | | }, |
| | | // ä¾¿æ·æé® |
| | | toleadExport(too) { |
| | | if (too == 1) { |
| | | this.topqueryParams.sendstate = 4; |
| | | this.topqueryParams.excep = null; |
| | | } else if (too == 2) { |
| | | this.topqueryParams.excep = 1; |
| | | } |
| | | this.handleQuery(); |
| | | }, |
| | | /** å¯¼åºæé®æä½ */ |
| | | handleExport() { |
| | | this.topqueryParams.pageNum = null; |
| | | this.topqueryParams.pageSize = null; |
| | | this.download( |
| | | "smartor/serviceSubtask/patItemExport", |
| | | { |
| | | ...this.topqueryParams, |
| | | }, |
| | | `user_${new Date().getTime()}.xlsx` |
| | | ); |
| | | }, |
| | | // å¼å¸¸å渲æ |
| | | tableRowClassName({ row, rowIndex }) { |
| | | if (row.excep == 1) { |
| | | return "warning-row"; |
| | | } |
| | | return ""; |
| | | }, |
| | | // åå»ºåæ¬¡é访æå¡ |
| | | setupsubtask() { |
| | | this.$refs["zcform"].validate((valid) => { |
| | | if (valid) { |
| | | this.zcform.remark = |
| | | this.zcform.remark + "ã" + this.getCurrentTime() + "ã"; |
| | | let form = structuredClone(this.zcform); |
| | | form.visitTime = this.formatTime(form.date1); |
| | | form.finishtime = ""; |
| | | if (form.resource) { |
| | | if (form.resource == 2) { |
| | | form.serviceType = 13; |
| | | } |
| | | } else { |
| | | this.$modal.msgError("æªéæ©é访æ¹å¼"); |
| | | } |
| | | form.id = null; |
| | | form.sendstate = 2; |
| | | form.preachform = form.preachformson; |
| | | form.longTask = 0; |
| | | addserviceSubtask(form).then((res) => { |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("å建æå"); |
| | | } else { |
| | | this.$modal.msgError("å建失败"); |
| | | } |
| | | this.dialogFormVisible = false; |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | getCurrentTime() { |
| | | const now = new Date(); |
| | | const year = now.getFullYear(); |
| | | const month = String(now.getMonth() + 1).padStart(2, "0"); |
| | | const day = String(now.getDate()).padStart(2, "0"); |
| | | const hours = String(now.getHours()).padStart(2, "0"); |
| | | const minutes = String(now.getMinutes()).padStart(2, "0"); |
| | | const seconds = String(now.getSeconds()).padStart(2, "0"); |
| | | |
| | | return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .el-button--primary.is-plain { |
| | | color: #ffffff; |
| | | background: #409eff; |
| | | border-color: #4fabe9; |
| | | } |
| | | |
| | | .document { |
| | | // width: 100px; |
| | | height: 50px; |
| | | } |
| | | ::v-deep.el-table .warning-row { |
| | | background: #eec4c4; |
| | | } |
| | | |
| | | .documentf { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .download { |
| | | text-align: center; |
| | | |
| | | .el-upload__tip { |
| | | font-size: 23px; |
| | | } |
| | | |
| | | .el-upload__text { |
| | | font-size: 23px; |
| | | } |
| | | } |
| | | |
| | | .uploading { |
| | | margin-top: 20px; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #ffffff; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | } |
| | | |
| | | .el-tag + .el-tag { |
| | | margin-left: 10px; |
| | | } |
| | | |
| | | .button-new-tag { |
| | | margin-left: 10px; |
| | | height: 32px; |
| | | line-height: 30px; |
| | | padding-top: 0; |
| | | padding-bottom: 0; |
| | | } |
| | | |
| | | .input-new-tag { |
| | | width: 90px; |
| | | margin-left: 10px; |
| | | vertical-align: bottom; |
| | | } |
| | | |
| | | .drexamine { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 30px; |
| | | background: #daeaf5; |
| | | |
| | | img { |
| | | width: 100px; |
| | | height: 100px; |
| | | } |
| | | } |
| | | |
| | | .qrcode-dialo { |
| | | // text-align: center; |
| | | // display: flex; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | |
| | | .topic-dev { |
| | | margin-bottom: 25px; |
| | | font-size: 20px !important; |
| | | |
| | | .dev-text { |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | } |
| | | ::v-deep.leftvlue .el-card__body { |
| | | background: #f2f8ff; |
| | | color: #324a9b; |
| | | } |
| | | ::v-deep.leftvlue .el-card__body:hover { |
| | | background: #3664d9; |
| | | color: #fff; |
| | | cursor: pointer; /* é¼ æ æ¬æµ®æ¶å为æå½¢ */ |
| | | } |
| | | ::v-deep.errleftvlue .el-card__body { |
| | | background: #fdd0d7; |
| | | } |
| | | ::v-deep.errleftvlue .el-card__body:hover { |
| | | background: #f88d96; |
| | | cursor: pointer; /* é¼ æ æ¬æµ®æ¶å为æå½¢ */ |
| | | } |
| | | |
| | | ::v-deep.ysfleftvlue .el-card__body { |
| | | background: #d0fdd8; |
| | | } |
| | | ::v-deep.ysfleftvlue .el-card__body:hover { |
| | | background: #8df8a4; |
| | | cursor: pointer; /* é¼ æ æ¬æµ®æ¶å为æå½¢ */ |
| | | } |
| | | .button-bb { |
| | | font-weight: 500; |
| | | background-color: #2ba05c; |
| | | padding: 5px; |
| | | border-radius: 1px; |
| | | color: #ffffff; |
| | | } |
| | | .button-xq { |
| | | font-weight: 500; |
| | | background-color: #409eff; |
| | | padding: 5px; |
| | | border-radius: 1px; |
| | | color: #ffffff; |
| | | } |
| | | .button-sc { |
| | | font-weight: 500; |
| | | background-color: #b3a21f; |
| | | padding: 5px; |
| | | border-radius: 1px; |
| | | color: #ffffff; |
| | | } |
| | | .button-zx { |
| | | background: #4fabe9; |
| | | padding: 5px; |
| | | border-radius: 1px; |
| | | color: #ffffff; |
| | | } |
| | | .button-textxga { |
| | | color: #de7897; |
| | | } |
| | | ::v-deep.el-radio-group { |
| | | span { |
| | | font-size: 24px; |
| | | } |
| | | } |
| | | .filter-warning { |
| | | margin-top: 8px; |
| | | padding: 10px 14px; |
| | | background: #fff7e6; |
| | | border: 1px solid #ffe58f; |
| | | border-radius: 6px; |
| | | color: #d46b08; |
| | | font-size: 18px; |
| | | line-height: 1.6; |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 6px; |
| | | } |
| | | |
| | | .filter-warning .el-icon-warning-outline { |
| | | font-size: 16px; |
| | | color: #faad14; |
| | | flex-shrink: 0; |
| | | margin-top: 2px; |
| | | } |
| | | // é项å使¾å¤§ |
| | | // ::v-deep.el-checkbox-group { |
| | | // span { |
| | | // font-size: 24px; |
| | | // } |
| | | // } |
| | | </style> |
| | |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | <el-table-column |
| | | v-if=" |
| | | orgname == 'æ¯å®ç²æèªæ²»å¿äººæ°å»é¢' || |
| | | orgname == '丽水å¸ä¸å»é¢' |
| | | orgname == 'æ¯å®ç²æèªæ²»å¿äººæ°å»é¢' || orgname == '丽水å¸ä¸å»é¢' |
| | | " |
| | | label="æ¨å·ç¶æ" |
| | | width="120" |
| | |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | |
| | | |
| | | |
| | | <el-table-column |
| | | prop="bankcardno" |
| | |
| | | <!-- 顶鍿ä½åºå --> |
| | | <div class="section-header"> |
| | | <h3><i class="el-icon-s-operation"></i> 人工å¤ç</h3> |
| | | |
| | | <div class="header-actions"> |
| | | <div v-if="form.doctorOpinion2" class="last-opinion"> |
| | | <i class="el-icon-sunny"></i> |
| | | <span class="last-opinion-label">䏿¬¡çå¤çæè§ï¼</span> |
| | | <span class="last-opinion-text">{{ form.doctorOpinion2 }}</span> |
| | | </div> |
| | | <!-- åºç¡æä½æé®ç» --> |
| | | <div class="action-group basic-actions"> |
| | | <el-button type="primary" plain @click="alterpatient('')"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | |
| | | <!-- 表ååºå --> |
| | | <div class="form-content"> |
| | |
| | | </el-button> |
| | | <el-button plain type="info" @click="Editsingletaskson('5')"> |
| | | 人工é访 |
| | | </el-button> |
| | | <el-button |
| | | plain |
| | | v-if="orgname != 'ç¼äºç¬¬äºäººæ°å»é¢'" |
| | | type="primary" |
| | | @click="Editsingletaskson('7')" |
| | | > |
| | | åé¢å¤æ¥å¤è¯ |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | |
| | | v-model="form.remark2" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å¤çæè§"> |
| | | <el-input |
| | | class="custom-disabled" |
| | | type="textarea" |
| | | disabled |
| | | v-model="form.doctorOpinion2" |
| | | placeholder="æ " |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-collapse-item> |
| | | |
| | | <!-- 䏿¬¡éè®¿ä¿¡æ¯ - é»è®¤å±å¼ --> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="é访类å" prop="resource"> |
| | | <el-radio-group v-model="form.resource"> |
| | | <el-radio-group |
| | | v-model="form.resource" |
| | | @change="handleResourceChange" |
| | | > |
| | | <el-radio label="1">æ¬ç
åºé访</el-radio> |
| | | <el-radio label="2">é访ä¸å¿é访</el-radio> |
| | | </el-radio-group> |
| | |
| | | <el-form-item label="é访记å½" :required="form.resource == '2'"> |
| | | <el-input type="textarea" v-model="form.remark"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å»çå¤çæè§" prop="doctorOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="form.doctorOpinion" |
| | | ></el-input> |
| | | <el-form-item |
| | | label="å»çå¤çæè§" |
| | | prop="doctorOpinion" |
| | | :required="isDoctorOpinionRequired" |
| | | > |
| | | <el-input type="textarea" v-model="form.doctorOpinion"></el-input> |
| | | </el-form-item> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | // å»çå¤çæè§ï¼ä»
ãé访ä¸å¿é访ã+ã丽水å¸ä¸å»é¢ãæ¶å¿
å¡«ï¼å
¶ä½æ
åµä¸æ ¡éª |
| | | doctorOpinion: [ |
| | | { required: true, message: "请è¾å
¥å»çå¤çæè§", trigger: "blur" }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | const needRequired = |
| | | this.form.resource == "2" && this.orgname === "丽水å¸ä¸å»é¢"; |
| | | if (needRequired && !String(value || "").trim()) { |
| | | return callback(new Error("请è¾å
¥å»çå¤çæè§")); |
| | | } |
| | | callback(); |
| | | }, |
| | | trigger: "blur", |
| | | }, |
| | | ], |
| | | }, |
| | | userrules: { |
| | |
| | | failed: "error", |
| | | }; |
| | | return typeMap[this.callStatus]; |
| | | }, |
| | | // å»çå¤çæè§æ¯å¦å¿
å¡«ï¼é访类åéãé访ä¸å¿é访ãä¸å½åæºæä¸ºä¸½æ°´å¸ä¸å»é¢ |
| | | isDoctorOpinionRequired() { |
| | | return this.form.resource == "2" && this.orgname === "丽水å¸ä¸å»é¢"; |
| | | }, |
| | | // æ¯å¦ä»¥é®å·å½¢å¼å±ç¤ºï¼éè¯é³æå¡ï¼æè¯é³æå¡ä½æ 宿´è¯é³æ°æ®éæå¨å¡«æ¥ï¼ |
| | | showQuestionnaireForm() { |
| | |
| | | path: "/followvisit/discharge", |
| | | }); |
| | | } |
| | | } else if (this.form.serviceType == 3) { |
| | | if (this.visitCount != 1) { |
| | | this.$router.push({ |
| | | path: "/logisticsservice/OutpatientAgain", |
| | | }); |
| | | } else { |
| | | this.$router.push({ |
| | | path: "/followvisit/discharge", |
| | | }); |
| | | } |
| | | } else if (this.form.serviceType == 19) { |
| | | if (this.visitCount != 1) { |
| | | this.$router.push({ |
| | | path: "/logisticsservice/operationAgain", |
| | | }); |
| | | } else { |
| | | this.$router.push({ |
| | | path: "/followvisit/discharge", |
| | | }); |
| | | } |
| | | } else { |
| | | // location.reload(); |
| | | this.$router.go(-1); |
| | |
| | | console.log(this.form.templatename, "templatename"); |
| | | |
| | | this.form.remark = this.form.remark || ""; |
| | | this.form.doctorOpinion = this.form.doctorOpinion || ""; |
| | | this.form.doctorOpinion2 = this.form.doctorOpinion || ""; |
| | | this.form.doctorOpinion = ""; |
| | | this.logsheetlist = res.rows[0].serviceSubtaskList; |
| | | this.templateid = this.form.templateid; |
| | | this.selectedTag = this.form.excep; |
| | |
| | | } |
| | | }); |
| | | }, |
| | | // 忢é访类ååï¼éç½®å»çå¤çæè§çæ ¡éªç¶æï¼å¿
å¡«æ¡ä»¶éç±»åååï¼ |
| | | handleResourceChange() { |
| | | this.$nextTick(() => { |
| | | if (this.$refs.zcform) { |
| | | this.$refs.zcform.clearValidate("doctorOpinion"); |
| | | } |
| | | }); |
| | | }, |
| | | // åå»ºåæ¬¡é访æå¡ |
| | | setupsubtask() { |
| | | this.$refs["zcform"].validate((valid) => { |
| | |
| | | this.form.remark = |
| | | this.form.remark + "ã" + this.getCurrentTime() + "ã"; |
| | | let form = structuredClone(this.form); |
| | | // 忬¡é访å³âåé¢å¤æ¥å¤è¯âï¼å¤çæè§ç½®ä¸º suggest=7 |
| | | if (String(form.suggest) !== "7") { |
| | | form.suggest = "7"; |
| | | } |
| | | form.visitTime = this.parseTime(form.date1); |
| | | form.finishtime = ""; |
| | | if (form.resource) { |
| | |
| | | } |
| | | } |
| | | |
| | | /* 䏿¬¡çå¤çæè§ */ |
| | | .last-opinion { |
| | | display: flex; |
| | | gap: 8px; |
| | | margin-bottom: 20px; |
| | | padding: 8px 14px; |
| | | background: linear-gradient(135deg, #ecfdf5 0%, #f0fdfa 100%); |
| | | border: 1px solid #d1fae5; |
| | | border-left: 4px solid #10b981; |
| | | border-radius: 8px; |
| | | box-shadow: 0 1px 3px rgba(16, 185, 129, 0.08); |
| | | line-height: 1.5; |
| | | |
| | | > i { |
| | | font-size: 18px; |
| | | color: #10b981; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .last-opinion-label { |
| | | font-size: 13px; |
| | | color: #059669; |
| | | font-weight: 600; |
| | | white-space: nowrap; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .last-opinion-text { |
| | | font-size: 14px; |
| | | color: #334155; |
| | | word-break: break-word; |
| | | white-space: pre-wrap; |
| | | } |
| | | } |
| | | |
| | | /* éè¯æ§å¶åºå */ |
| | | .call-controls { |
| | | margin: 15px 0; |
| | |
| | | placeholder="请è¾å
¥è¯æåç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="主治å»ç" prop="drname"> |
| | | <el-input |
| | | v-model="topqueryParams.drname" |
| | | placeholder="请è¾å
¥ä¸»æ²»å»ç" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ç®¡å»ç" prop="managementDoctor"> |
| | | <el-input |
| | | v-model="topqueryParams.managementDoctor" |
| | | placeholder="请è¾å
¥ç»ç®¡å»ç" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="æå¡ç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="topqueryParams.sendstateView" |
| | |
| | | align="center" |
| | | key="drname" |
| | | prop="drname" |
| | | /> |
| | | <el-table-column |
| | | label="ç»ç®¡å»ç" |
| | | align="center" |
| | | key="managementDoctor" |
| | | prop="managementDoctor" |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | label="è¯æåç§°" |
| | |
| | | serviceType: 13, |
| | | searchscope: 3, |
| | | sendstateView: 1, |
| | | |
| | | visitCount: 1, |
| | | sendstate: null, |
| | | sort: |
| | | sort: |
| | | localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" |
| | | ? 8 |
| | | : localStorage.getItem("orgname") == "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢" |
| | | ? 2 |
| | | : 1, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) scopetype: [], |
| | | leaveldeptcodes: [], |
| | | managementDoctor: |
| | | localStorage.getItem("orgname") == "ç¼äºå¿äººæ°å»é¢" || |
| | | localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" |
| | | ? store.getters.nickName |
| | | : "", |
| | | leavehospitaldistrictcodes: [], |
| | | }, |
| | | propss: { multiple: true }, |
| | |
| | | sort: 2, |
| | | searchscope: 2, |
| | | sendstateView: 1, |
| | | visitCount: 1, |
| | | |
| | | scopetype: [], |
| | | leaveldeptcodes: [], |
| | | leavehospitaldistrictcodes: [], |
| | |
| | | Voicetype: type, |
| | | visitCount: 1, |
| | | again: 1, |
| | | visitCount: this.topqueryParams.visitCount, |
| | | |
| | | }, |
| | | }); |
| | | }, |
| | |
| | | address: row.parentAddress || "", |
| | | }); |
| | | } |
| | | // éè®¿å¨æï¼è¯¦æ
表 followupPeriod å JSON æ°ç»ï¼ç»ä¸è¿åå° archive.followupCycle |
| | | // ï¼åè¡¨ä¸»è¡¨è¡æ²¡æè¯¥å段ï¼è¿ééé»è·³è¿ï¼ |
| | | if (row.followupPeriod) { |
| | | target.followupCycle = unpackJson(row.followupPeriod, []); |
| | | } |
| | | if (row.sourceType === "1" || row.sourceType === 1) target.sourcePage = "outpatient"; |
| | | return target; |
| | | } |
| | |
| | | closeStatus: archive.closeStatus == null ? "0" : String(archive.closeStatus), |
| | | }); |
| | | |
| | | // éè®¿å¨æï¼5 ç§ä¸æ¡ç»ä¸å followupPeriodï¼JSON æ°ç»ï¼ã |
| | | // pregnancy ç followupCycle æ¾å¨ pregFormData éï¼ç±ä¸æ¹ pregnancy 忝åç¬å¤çï¼è¿éæé¤ä»¥å
被è¦çã |
| | | if (key !== "pregnancy") { |
| | | payload.followupPeriod = packJson(archive.followupCycle || []); |
| | | } |
| | | |
| | | if (key === "pregnancy") { |
| | | const p = archive.pregFormData || {}; |
| | | const reg = p.registration || {}; |
| | |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- éè®¿å¨æï¼å¿ä¿ä¸ç§ä¸æ¡éç¨ï¼ --> |
| | | <el-card v-if="archive.subType === 'highrisk' || archive.subType === 'nutrition' || archive.subType === 'learning'" class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>éè®¿å¨æ</span></div> |
| | | <EditableTable :data.sync="followupCycle" :editing="editing" :columns="followupColumns" auto-seq="seq" /> |
| | | </el-card> |
| | | |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="æå¡è®°å½" name="service"> |
| | |
| | | trainDate:"", trainingType:"", trainContent:"", duration:40, trainer:"", progress:"è¯å¥½" }, |
| | | growthData: [], neuroData: [], interventionData: [], |
| | | measureData: [], dietData: [], planData: [], |
| | | followupCycle: [], |
| | | followupColumns: [ |
| | | { prop:"seq", label:"åºå·", width:60 }, |
| | | { prop:"planDate", label:"æéè®¿æ¥æ", width:180, type:"date" }, |
| | | { prop:"status", label:"ç¶åµ", width:130, type:"select", options:["已宿","æªå®æ"], default:"æªå®æ" }, |
| | | { prop:"method", label:"é访æ¹å¼", width:110 }, |
| | | { prop:"situation", label:"é访æ
åµ", minWidth:160 }, |
| | | { prop:"followDate", label:"éè®¿æ¥æ", width:130, type:"date" }, |
| | | { prop:"staff", label:"é访人å", width:110 }, |
| | | ], |
| | | growthColumns: [ |
| | | { prop:"checkDate", label:"æ£æ¥æ¥æ", width:180, type:"date" },{ prop:"monthAge", label:"æé¾", width:80 }, |
| | | { prop:"weight", label:"ä½é(kg)", width:100, type:"number" },{ prop:"height", label:"身é«(cm)", width:100, type:"number" }, |
| | |
| | | this.archive = archive || null; |
| | | if (this.archive) { |
| | | if (!this.archive.parentInfo) this.archive.parentInfo = {}; |
| | | this.followupCycle = this.archive.followupCycle || []; |
| | | if (this.archive.subType === 'highrisk') { |
| | | this.activeTab = "growth"; |
| | | this.growthData = this.archive.growthData || getDefaultGrowthData(); |
| | |
| | | this.archive.dietData = JSON.parse(JSON.stringify(this.dietData)); |
| | | this.archive.planData = JSON.parse(JSON.stringify(this.planData)); |
| | | } |
| | | this.archive.followupCycle = JSON.parse(JSON.stringify(this.followupCycle)); |
| | | this.loading = true; |
| | | saveArchive(this.archive) |
| | | .then(() => { |
| | |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="éè®¿å¨æ" |
| | | align="center" |
| | | min-width="180" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="formatFollowupCycle(scope.row)"> |
| | | {{ formatFollowupCycle(scope.row) }} |
| | | </span> |
| | | <span v-else style="color: #c0c4cc">â</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="夿³¨" |
| | | align="center" |
| | | prop="remark" |
| | |
| | | <el-dialog |
| | | :title="dialogTitle" |
| | | :visible.sync="dialogVisible" |
| | | width="45%" |
| | | width="60%" |
| | | :close-on-click-modal="false" |
| | | @close="cancelForm" |
| | | > |
| | |
| | | <div class="form-tip">ä»ç¾ç
è¯æè¡¨ä¸éæ©ï¼æ ICD10 ç¼ç å¹é
æ£è
</div> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="éè®¿å¨æé
ç½®"> |
| | | <EditableTable |
| | | :data.sync="form.followupCycle" |
| | | :editing="true" |
| | | :columns="followupColumns" |
| | | auto-seq="seq" |
| | | /> |
| | | <div class="form-tip">å®ä¹è¯¥è§åå¹é
å建档çé访计åï¼éè®¿å¨æ / æ¹å¼ / å
容ï¼</div> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input |
| | | v-model="form.remark" |
| | |
| | | } from "@/api/smartor/specificArchiveGenerateConfig"; |
| | | import { getillnesslist } from "@/api/AiCentre/index"; |
| | | import OptionalForm from "@/components/OptionalForm"; |
| | | import EditableTable from "../components/EditableTable.vue"; |
| | | |
| | | // é¨é¨ç±»åï¼1 ç§å®¤ï¼2 ç
åº |
| | | const DEPT_TYPE_OPTIONS = [ |
| | |
| | | |
| | | export default { |
| | | name: "GenerateConfig", |
| | | components: { OptionalForm }, |
| | | components: { OptionalForm, EditableTable }, |
| | | data() { |
| | | // ç§å®¤/ç
åºç¼ç ä¸ è¯æç¼ç è³å°å¡«åä¸é¡¹ï¼å¦å该è§åæ æ³å¹é
任使£è
|
| | | const validateDeptOrIcd = (rule, value, callback) => { |
| | |
| | | // 常é |
| | | DEPT_TYPE_OPTIONS, |
| | | DEPT_CATEGORY_OPTIONS, |
| | | |
| | | // éè®¿å¨æé
ç½®åï¼éè®¿è®¡åæ¨¡æ¿ï¼åºå· / éè®¿å¨æ / é访æ¹å¼ / é访å
å®¹ï¼ |
| | | followupColumns: [ |
| | | { prop: "seq", label: "åºå·", width: 60 }, |
| | | { prop: "cycle", label: "éè®¿å¨æ", width: 180 }, |
| | | { prop: "method", label: "é访æ¹å¼", width: 160 }, |
| | | { prop: "content", label: "é访å
容", minWidth: 240 }, |
| | | ], |
| | | |
| | | // é®ç½©å± |
| | | loading: false, |
| | |
| | | archiveType: "", |
| | | deptCodes: [], |
| | | icdList: [], |
| | | followupCycle: [], |
| | | remark: "", |
| | | }, |
| | | // è¡¨åæ ¡éª |
| | |
| | | archiveType: row.archiveType || "", |
| | | deptCodes: this.parseJsonArray(row.deptCodes), |
| | | icdList: this.resolveIcdCodes(row.icd10Codes), |
| | | followupCycle: this.parseJsonArray(row.followupPeriod), |
| | | remark: row.remark || "", |
| | | }; |
| | | }, |
| | |
| | | this.form.icdList && this.form.icdList.length |
| | | ? JSON.stringify(this.form.icdList.map((d) => d.icdcode)) |
| | | : "[]"; |
| | | data.followupPeriod = |
| | | this.form.followupCycle && this.form.followupCycle.length |
| | | ? JSON.stringify(this.form.followupCycle) |
| | | : "[]"; |
| | | |
| | | saveSpecificArchiveGenerateConfig(data) |
| | | .then((response) => { |
| | |
| | | archiveType: "", |
| | | deptCodes: [], |
| | | icdList: [], |
| | | followupCycle: [], |
| | | remark: "", |
| | | }; |
| | | }, |
| | |
| | | .join("ã"); |
| | | }, |
| | | |
| | | /** éè®¿å¨æ -> å±ç¤ºææ¬ï¼éè®¿å¨æ / é访æ¹å¼ æ¼æ¥ï¼ */ |
| | | formatFollowupCycle(row) { |
| | | const list = this.parseJsonArray(row.followupPeriod); |
| | | if (!list.length) return ""; |
| | | return list |
| | | .map((c) => { |
| | | const cycle = c.cycle || ""; |
| | | const method = c.method ? "(" + c.method + ")" : ""; |
| | | return cycle + method; |
| | | }) |
| | | .filter((s) => s.trim()) |
| | | .join("ã"); |
| | | }, |
| | | |
| | | /** è§£æå端è¿åç JSON å符串ï¼deptCodes / icd10Codesï¼ */ |
| | | parseJsonArray(val) { |
| | | if (!val) return []; |
| | |
| | | </el-card> |
| | | </template> |
| | | |
| | | <!-- éè®¿å¨æï¼å´ç»ç»æMHIï¼ --> |
| | | <template v-if="archive.subType === 'menopause'"> |
| | | <el-card class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>éè®¿å¨æ</span></div> |
| | | <EditableTable |
| | | :data.sync="followupCycle" |
| | | :editing="editing" |
| | | :columns="followupColumns" |
| | | auto-seq="seq" |
| | | /> |
| | | </el-card> |
| | | </template> |
| | | |
| | | <!-- ===== å´ç»ç»æMHIï¼6 个é表 tab ===== --> |
| | | <template v-if="archive.subType === 'menopause'"> |
| | | <el-card class="info-card" shadow="never" style="margin-top:14px"> |
| | |
| | | return { |
| | | PREGNANCY_OPTIONS, PREGNANCY_DETAIL_OPTIONS, PREGNANCY_DETAIL_HINTS, UNREGISTERED_REASONS, |
| | | loading: false, archive: null, editing: true, activeTab: "sysQ", mainTab: "detail", |
| | | followupCycle: [], |
| | | followupColumns: [ |
| | | { prop: "seq", label: "åºå·", width: 60 }, |
| | | { prop: "planDate", label: "æéè®¿æ¥æ", width: 180, type: "date" }, |
| | |
| | | if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]); |
| | | }); |
| | | } |
| | | this.followupCycle = this.archive.followupCycle || []; |
| | | } |
| | | } |
| | | if (autoEdit) this.editing = true; |
| | |
| | | if (this.editing) { |
| | | // å
æé¡µé¢è¡¨ååå¡«å°æ¡£æ¡å¯¹è±¡ï¼åæ´ä½æäº¤ |
| | | if (this.archive.subType === "pregnancy") this.archive.pregFormData = JSON.parse(JSON.stringify(this.pregForm)); |
| | | if (this.archive.subType === "menopause") this.archive.formData = JSON.parse(JSON.stringify(this.form)); |
| | | if (this.archive.subType === "menopause") { |
| | | this.archive.formData = JSON.parse(JSON.stringify(this.form)); |
| | | this.archive.followupCycle = JSON.parse(JSON.stringify(this.followupCycle)); |
| | | } |
| | | this.loading = true; |
| | | saveArchive(this.archive) |
| | | .then(() => { |
| | |
| | | }, |
| | | }, |
| | | created() { |
| | | // å½åæºæä¸ºä¸½æ°´å¸ä¸å»é¢æ¶ï¼å»ºæ¡£æ¥æé»è®¤æè¿ä¸ä¸ªæ |
| | | if (localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢") { |
| | | this.dateRange = this.getLastMonthRange(); |
| | | this.queryParams.createTimeStart = this.dateRange[0]; |
| | | this.queryParams.createTimeEnd = this.dateRange[1]; |
| | | } |
| | | this.getList(); |
| | | this.gettabList(); |
| | | this.Filterreason = store.getters.Filterreason; |
| | | }, |
| | | methods: { |
| | | /** è·åæè¿ä¸ä¸ªææ¶é´èå´ */ |
| | | getLastMonthRange() { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
| | | |
| | | const formatDate = (date) => { |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const day = String(date.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day} 00:00:00`; |
| | | }; |
| | | |
| | | const formatEndDate = (date) => { |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const day = String(date.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day} 23:59:59`; |
| | | }; |
| | | |
| | | return [formatDate(start), formatEndDate(end)]; |
| | | }, |
| | | /** æ¥è¯¢æ£è
å表 */ |
| | | getList() { |
| | | this.loading = true; |
| | |
| | | </div> |
| | | </template> |
| | | </el-table> |
| | | <pagination |
| | | v-show="taskTotal > 0" |
| | | :total="taskTotal" |
| | | :page.sync="taskQueryParams.pageNum" |
| | | :limit.sync="taskQueryParams.pageSize" |
| | | @pagination="loadTaskList" |
| | | /> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | taskList: [], // ä»»å¡å表 |
| | | selectedTask: null, // éä¸çä»»å¡å表 |
| | | batchLoading: false, // æ¹éæäº¤å è½½ç¶æ |
| | | taskQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 20, |
| | | }, |
| | | taskTotal: 0, |
| | | deptcode: "", |
| | | Patientrange: [ |
| | | { |
| | |
| | | // æ¾ç¤ºå¼¹çª |
| | | this.batchTaskVisible = true; |
| | | |
| | | // è·åä»»å¡å表 |
| | | this.loadTaskList(deptcode); |
| | | // é置任å¡å页并è·åä»»å¡å表 |
| | | this.taskQueryParams.pageNum = 1; |
| | | this.loadTaskList(); |
| | | }, |
| | | |
| | | /** å 载任å¡å表 */ |
| | | loadTaskList(deptcode) { |
| | | loadTaskList() { |
| | | this.batchLoading = true; |
| | | let topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | pageNum: this.taskQueryParams.pageNum, |
| | | pageSize: this.taskQueryParams.pageSize, |
| | | serviceType: 3, |
| | | type: 2, |
| | | }; |
| | | // deptcode: deptcode,åæ¶ç§å®¤éå¶ |
| | | getTasklist(topqueryParams).then((response) => { |
| | | this.taskList = response.rows; |
| | | this.taskTotal = response.total; |
| | | this.batchLoading = false; |
| | | }); |
| | | }, |
| | |
| | | æ·»å å»¶ç»æ¤çä»»å¡ |
| | | </el-button> |
| | | </el-col> |
| | | <!-- è¯é³æå¡è½¬äººå·¥æé® --> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-refresh-right" |
| | | size="medium" |
| | | :disabled="multiple" |
| | | v-if="orgname === '第ä¸äººæ°å»é¢æ¹æ»¨é¢åº'||orgname === '第ä¸äººæ°å»é¢å´å±±é¢åº'||orgname === '第ä¸äººæ°å»é¢åä¸é¢åº'" |
| | | @click="handleManualVisit" |
| | | > |
| | | è¯é³æå¡è½¬äººå·¥ |
| | | </el-button> |
| | | </el-col> |
| | | <!-- <el-col :span="1.5"> |
| | | <el-button |
| | | type="success" |
| | |
| | | <!-- æ¹éæ·»å å»¶ç»æ¤çä»»å¡å¼¹çª --> |
| | | <!-- æ¹éæ·»å å»¶ç»æ¤çä»»å¡å¼¹çª --> |
| | | <el-dialog |
| | | title="æ¹éæ·»å å»¶ç»æ¤ç" |
| | | :title="batchMode === 'manual' ? 'è¯é³æå¡è½¬äººå·¥' : 'æ¹éæ·»å å»¶ç»æ¤ç'" |
| | | :visible.sync="batchTaskVisible" |
| | | width="90%" |
| | | append-to-body |
| | |
| | | <el-col :span="12"> |
| | | <div class="batch-task-section"> |
| | | <div class="section-header"> |
| | | <h4>å»¶ç»æ¤çä»»å¡</h4> |
| | | <h4> |
| | | {{ batchMode === "manual" ? "人工é访任å¡" : "å»¶ç»æ¤çä»»å¡" }} |
| | | </h4> |
| | | <div v-if="selectedTask" class="task-selected-hint selected"> |
| | | <i class="el-icon-success"></i> |
| | | <span>已鿩ï¼{{ selectedTask.taskName }}</span> |
| | |
| | | <template #empty> |
| | | <div class="empty-message"> |
| | | <i class="el-icon-document"></i> |
| | | <span>ææ å¯ç¨å»¶ç»æ¤çä»»å¡</span> |
| | | <span>{{ |
| | | batchMode === "manual" |
| | | ? "ææ å¯ç¨äººå·¥é访任å¡" |
| | | : "ææ å¯ç¨å»¶ç»æ¤çä»»å¡" |
| | | }}</span> |
| | | <span class="empty-tips">请è系管çåå建任å¡</span> |
| | | </div> |
| | | </template> |
| | |
| | | @click="submitBatchTask" |
| | | :disabled="!selectedTask || batchLoading" |
| | | > |
| | | {{ batchLoading ? "å建ä¸..." : "åå»ºå»¶ç»æ¤çä»»å¡" }} |
| | | {{ |
| | | batchLoading |
| | | ? batchMode === "manual" |
| | | ? "转æ¢ä¸..." |
| | | : "å建ä¸..." |
| | | : batchMode === "manual" |
| | | ? "确认转人工" |
| | | : "åå»ºå»¶ç»æ¤çä»»å¡" |
| | | }} |
| | | </el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | import { delUser } from "@/api/system/user"; |
| | | import formatTime from "@/filters/index"; |
| | | |
| | | import { listpatient } from "@/api/patient/record"; |
| | | import { listpatient, addManualVisit } from "@/api/patient/record"; |
| | | import { |
| | | messagelistpatient, |
| | | alterpatient, |
| | |
| | | initPassword: undefined, |
| | | amendtag: false, //æ¯å¦ä¿®æ¹ |
| | | // æ¹éä»»å¡ç¸å
³æ°æ® |
| | | batchMode: "continue", // å¼¹çªæ¨¡å¼ï¼continue å»¶ç»æ¤ç / manual è¯é³æå¡è½¬äººå·¥ |
| | | batchTaskVisible: false, // å¼¹çªå¯è§æ§ |
| | | selectedPatients: [], // éä¸çæ£è
å表 |
| | | taskList: [], // ä»»å¡å表 |
| | |
| | | label: "ç
åºæ£è
", |
| | | }, |
| | | ], |
| | | orgName: localStorage.getItem("orgname"), |
| | | orgname: localStorage.getItem("orgname"), |
| | | |
| | | postData: { |
| | | XiaoXiTou: { |
| | |
| | | this.queryParams.leavehospitaldistrictcodes = store.getters.belongWards.map( |
| | | (obj) => obj.districtCode |
| | | ); |
| | | console.log(this.orgname); |
| | | |
| | | this.getList(); |
| | | // this.listDept(); |
| | | this.gettabList(); |
| | |
| | | return; |
| | | } |
| | | |
| | | // è·åé䏿£è
çç§å®¤ä¿¡æ¯ |
| | | const patientDepts = new Set(); |
| | | let deptcode = ""; |
| | | this.ids.forEach((patId) => { |
| | | const patient = this.userList.find((item) => item.patid === patId); |
| | | if (patient) { |
| | | patientDepts.add(patient.deptname); |
| | | deptcode = patient.deptcode; |
| | | } |
| | | }); |
| | | |
| | | this.batchMode = "continue"; |
| | | // è·åé䏿£è
å表 |
| | | this.selectedPatients = this.userList.filter((item) => |
| | | this.ids.includes(item.patid) |
| | | ); |
| | | this.selectedTask = null; |
| | | |
| | | // æ¾ç¤ºå¼¹çª |
| | | this.batchTaskVisible = true; |
| | | |
| | | // è·åä»»å¡å表 |
| | | this.loadTaskList(deptcode); |
| | | this.loadTaskList(); |
| | | }, |
| | | |
| | | /** è¯é³æå¡è½¬äººå·¥æé®ç¹å» */ |
| | | handleManualVisit() { |
| | | // æ ¡éªæ¯å¦é䏿£è
|
| | | if (this.ids.length === 0) { |
| | | this.$modal.msgWarning("请è³å°éä¸1忣è
"); |
| | | return; |
| | | } |
| | | |
| | | this.batchMode = "manual"; |
| | | // è·åé䏿£è
å表 |
| | | this.selectedPatients = this.userList.filter((item) => |
| | | this.ids.includes(item.patid) |
| | | ); |
| | | this.selectedTask = null; |
| | | |
| | | // æ¾ç¤ºå¼¹çª |
| | | this.batchTaskVisible = true; |
| | | |
| | | // è·åä»»å¡å表 |
| | | this.loadTaskList(); |
| | | }, |
| | | |
| | | /** å 载任å¡å表 */ |
| | | loadTaskList(deptcode) { |
| | | loadTaskList() { |
| | | this.batchLoading = true; |
| | | let topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 100, // 设置è¾å¤§çå页è·åæ´å¤ä»»å¡ |
| | | type: 2, // å»¶ç»æ¤çä»»å¡ç±»å |
| | | pageSize: 1000, // 设置è¾å¤§çå页è·åæ´å¤ä»»å¡ |
| | | }; |
| | | if (this.batchMode !== "manual") { |
| | | topqueryParams.type = 2; // å»¶ç»æ¤çä»»å¡ç±»å |
| | | } |
| | | topqueryParams.deptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | |
| | | ); |
| | | getTasklist(topqueryParams) |
| | | .then((response) => { |
| | | this.taskList = response.rows; |
| | | this.taskList = response.rows || []; |
| | | if (this.batchMode === "manual") { |
| | | // åªä¿çã人工ãä»»å¡å½¢å¼ï¼preachform å« 1ï¼ |
| | | this.taskList = this.taskList.filter((task) => |
| | | this.isManualTask(task) |
| | | ); |
| | | } |
| | | this.batchLoading = false; |
| | | |
| | | if (this.taskList.length === 0) { |
| | | this.$modal.msgWarning("å½åç§å®¤æ å¯ç¨å»¶ç»æ¤çä»»å¡"); |
| | | this.$modal.msgWarning( |
| | | this.batchMode === "manual" |
| | | ? "å½åç§å®¤æ å¯ç¨äººå·¥é访任å¡" |
| | | : "å½åç§å®¤æ å¯ç¨å»¶ç»æ¤çä»»å¡" |
| | | ); |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** 夿æ¯å¦ä¸ºã人工ãä»»å¡å½¢å¼ï¼preachform å« 1ï¼ */ |
| | | isManualTask(task) { |
| | | if (task.preachform != null && task.preachform !== "") { |
| | | const forms = String(task.preachform) |
| | | .split(",") |
| | | .map((s) => s.trim()); |
| | | if (forms.includes("1")) return true; |
| | | } |
| | | if (Array.isArray(task.preachformList)) { |
| | | return task.preachformList.some( |
| | | (item) => String(item.preachform) === "1" |
| | | ); |
| | | } |
| | | return false; |
| | | }, |
| | | |
| | | /** å¤çä»»å¡éæ©åå */ |
| | | handleTaskSelectionChange(currentRow) { |
| | | this.selectedTask = currentRow; |
| | | }, |
| | | |
| | | /** æ¹éæäº¤å»¶ç»æ¤çä»»å¡ */ |
| | | /** æ¹éæäº¤ï¼å»¶ç»æ¤ç / è¯é³æå¡è½¬äººå·¥ï¼ */ |
| | | async submitBatchTask() { |
| | | // æ ¡éªæ¯å¦éä¸ä»»å¡ |
| | | if (!this.selectedTask) { |
| | | this.$modal.msgWarning("è¯·éæ©1个任å¡"); |
| | | return; |
| | | } |
| | | |
| | | // è¯é³æå¡è½¬äººå·¥ï¼èµ°æ°æ¥å£ |
| | | if (this.batchMode === "manual") { |
| | | this.submitManualVisit(); |
| | | return; |
| | | } |
| | | |
| | |
| | | } |
| | | }, |
| | | |
| | | /** è¯é³æå¡è½¬äººå·¥ï¼å 餿ªå®æé访任å¡å¹¶éæ°çæäººå·¥éè®¿ä»»å¡ */ |
| | | async submitManualVisit() { |
| | | this.batchLoading = true; |
| | | try { |
| | | const params = { |
| | | patids: this.selectedPatients.map((item) => item.patid), |
| | | taskid: this.selectedTask.taskid, |
| | | }; |
| | | const response = await addManualVisit(params); |
| | | if (response.code === 200) { |
| | | const data = response.data || {}; |
| | | const generated = data.generatedCount || 0; |
| | | const noDischarge = (data.noDischargeRecordPatids || []).length; |
| | | const noArchive = (data.noArchivePatids || []).length; |
| | | const failed = (data.generateFailedPatids || []).length; |
| | | let msg = `æåçæ ${generated} 个人工é访任å¡`; |
| | | if (noDischarge) msg += `ï¼${noDischarge} 人æ åºé¢è®°å½`; |
| | | if (noArchive) msg += `ï¼${noArchive} äººæ æ£è
æ¡£æ¡`; |
| | | if (failed) msg += `ï¼${failed} 人çæå¤±è´¥`; |
| | | this.$modal.msgSuccess(msg); |
| | | this.batchTaskVisible = false; |
| | | this.getList(); // å·æ°æ£è
å表 |
| | | } else { |
| | | this.$modal.msgError(response.msg || "è¯é³æå¡è½¬äººå·¥å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | this.$modal.msgError( |
| | | "è¯é³æå¡è½¬äººå·¥å¤±è´¥ï¼" + (error.message || "ç½ç»é误") |
| | | ); |
| | | } finally { |
| | | this.batchLoading = false; |
| | | } |
| | | }, |
| | | |
| | | /** 计ç®éè®¿ç»ææ¶é´ï¼å¨é¢æ£è
ï¼åºé¢å7å¤©ï¼ */ |
| | | getFollowUpEndTime(admitDate) { |
| | | if (!admitDate) return ""; |
| | |
| | | </div> |
| | | </template> |
| | | </el-table> |
| | | <pagination |
| | | v-show="taskTotal > 0" |
| | | :total="taskTotal" |
| | | :page.sync="taskQueryParams.pageNum" |
| | | :limit.sync="taskQueryParams.pageSize" |
| | | @pagination="loadTaskList" |
| | | /> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | taskList: [], // ä»»å¡å表 |
| | | selectedTask: null, // éä¸çä»»å¡ |
| | | batchLoading: false, // æ¹éæäº¤å è½½ç¶æ |
| | | taskQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 20, |
| | | }, |
| | | taskTotal: 0, |
| | | // æ¥æèå´ |
| | | dateRange: [], |
| | | source: [ |
| | |
| | | // æ¾ç¤ºå¼¹çª |
| | | this.batchTaskVisible = true; |
| | | |
| | | // è·åä»»å¡å表 |
| | | this.loadTaskList(deptcode); |
| | | // é置任å¡å页并è·åä»»å¡å表 |
| | | this.taskQueryParams.pageNum = 1; |
| | | this.loadTaskList(); |
| | | }, |
| | | /** è¡¨æ ¼è¡æ ·å¼ */ |
| | | tableRowClassName({ row, rowIndex }) { |
| | |
| | | } |
| | | }, |
| | | /** å 载任å¡å表 */ |
| | | loadTaskList(deptcode) { |
| | | loadTaskList() { |
| | | this.batchLoading = true; |
| | | let topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 100, // 设置è¾å¤§çå页è·åæ´å¤ä»»å¡ |
| | | pageNum: this.taskQueryParams.pageNum, |
| | | pageSize: this.taskQueryParams.pageSize, |
| | | type: 2, // æ ¹æ®å®é
æ
åµè°æ´ |
| | | }; |
| | | topqueryParams.deptcodes = store.getters.belongDepts.map( |
| | |
| | | getTasklist(topqueryParams) |
| | | .then((response) => { |
| | | this.taskList = response.rows; |
| | | this.taskTotal = response.total; |
| | | this.batchLoading = false; |
| | | |
| | | if (this.taskList.length === 0) { |
| | |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | v-if="orgname='丽水å¸å¦å¹¼ä¿å¥é¢'" |
| | | type="success" |
| | | plain |
| | | icon="el-icon-folder-add" |
| | |
| | | </div> |
| | | </template> |
| | | </el-table> |
| | | <pagination |
| | | v-show="taskTotal > 0" |
| | | :total="taskTotal" |
| | | :page.sync="taskQueryParams.pageNum" |
| | | :limit.sync="taskQueryParams.pageSize" |
| | | @pagination="loadTaskList" |
| | | /> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | taskList: [], // ä»»å¡å表 |
| | | selectedTask: null, // éä¸çä»»å¡å表 |
| | | batchLoading: false, // æ¹éæäº¤å è½½ç¶æ |
| | | taskQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 20, |
| | | }, |
| | | taskTotal: 0, |
| | | // æ£è
建档 |
| | | archiveDialogVisible: false, |
| | | archivePatients: [], |
| | |
| | | id: 1, |
| | | }, |
| | | ], |
| | | orgName: localStorage.getItem("orgname"), |
| | | orgname: localStorage.getItem("orgname"), |
| | | postData: { |
| | | XiaoXiTou: { |
| | | FaSongFCSJC: "ZJHES", |
| | |
| | | // æ¾ç¤ºå¼¹çª |
| | | this.batchTaskVisible = true; |
| | | |
| | | // è·åä»»å¡å表 |
| | | this.loadTaskList(deptcode); |
| | | // é置任å¡å页并è·åä»»å¡å表 |
| | | this.taskQueryParams.pageNum = 1; |
| | | this.loadTaskList(); |
| | | }, |
| | | |
| | | /** å 载任å¡å表 */ |
| | | loadTaskList(deptcode) { |
| | | loadTaskList() { |
| | | this.batchLoading = true; |
| | | let topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | pageNum: this.taskQueryParams.pageNum, |
| | | pageSize: this.taskQueryParams.pageSize, |
| | | serviceType: 3, |
| | | type: 2, |
| | | }; |
| | | // deptcode: deptcode,åæ¶ç§å®¤éå¶ |
| | | getTasklist(topqueryParams).then((response) => { |
| | | this.taskList = response.rows; |
| | | this.taskTotal = response.total; |
| | | this.batchLoading = false; |
| | | }); |
| | | }, |
| | |
| | | this.leavehospitaldistrictcodes = []; |
| | | this.deptcodesWards = []; |
| | | this.queryParamsdept.taskId = this.form.taskid; |
| | | this.queryParamsdept.taskid = this.form.taskid; |
| | | console.log(1, this.queryParamsdept); |
| | | |
| | | taskdepthospgetsonlist(this.queryParamsdept).then((res) => { |
| | |
| | | this.deptcodesWards = []; |
| | | this.medicalCodes = []; |
| | | this.medicalOptions = []; |
| | | // this.queryParamsdept.taskId = this.form.taskid; |
| | | this.queryParamsdept.taskId = this.form.taskid; |
| | | this.queryParamsdept.taskid = this.form.taskid; |
| | | |
| | | if (this.form.appltype == 5) { |
| | | rwztaskdepthospgetsonlist(this.queryParamsdept).then((res) => { |
| | |
| | | this.deptcodesWards = []; |
| | | this.medicalCodes = []; |
| | | this.medicalOptions = []; |
| | | this.queryParamsdept.taskid = this.form.taskid; |
| | | this.queryParamsdept.taskId = this.form.taskid; |
| | | |
| | | if (this.form.appltype == 5) { |
| | |
| | | </el-table-column> |
| | | </el-table-column> |
| | | |
| | | <!-- ===== é访æ
åµï¼ä¸½æ°´å¸ä¸å»é¢ï¼ä»é¦æ¬¡é访移å
¥ï¼ ===== --> |
| | | <el-table-column align="center" label="é访æ
åµ"> |
| | | <el-table-column |
| | | label="æ£å¸¸è¯é³" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation1" |
| | | /> |
| | | <el-table-column |
| | | label="æ£è
ææ¥ææè®¿" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation2" |
| | | /> |
| | | <el-table-column |
| | | label="é¢è®¿æè
æ¥è¯" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation3" |
| | | /> |
| | | <el-table-column |
| | | label="微信é访" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation4" |
| | | /> |
| | | <el-table-column |
| | | label="é访çµè¯ä¸æ£ç¡®" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation5" |
| | | /> |
| | | <el-table-column |
| | | label="å
¶ä»æ
åµä¸å®é访" |
| | | align="center" |
| | | width="100" |
| | | prop="taskSituation6" |
| | | /> |
| | | </el-table-column> |
| | | |
| | | <!-- ===== æ°å¢è®¡ç®ææ ===== --> |
| | | <el-table-column |
| | | label="é访ç" |
| | |
| | | > |
| | | <span class="button-zx">{{ scope.row.manuallyCalled }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="忬¡é访æ¨é人æ°" |
| | | align="center" |
| | | prop="againFollowUpPushCount" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'againFollowUpPushCountInfo', |
| | | '忬¡é访æ¨éå表', |
| | | '1' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.againFollowUpPushCount |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="追踪é访æ¨éç" |
| | | align="center" |
| | | prop="againFollowUpPushRate" |
| | | :render-header="TooltipAgainFollowUpPushRate" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ calculateAgainFollowUpPushRate(scope.row) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | return ((successAgain / denominator) * 100).toFixed(2) + "%"; |
| | | }, |
| | | |
| | | // 追踪é访æ¨éç = 忬¡é访æ¨éäººæ° / åºé¢äººæ¬¡ |
| | | calculateAgainFollowUpPushRate(row) { |
| | | const pushCount = Number(row.againFollowUpPushCount) || 0; |
| | | const discharge = Number(row.dischargeCount) || 0; |
| | | if (discharge <= 0) return "0.00%"; |
| | | return ((pushCount / discharge) * 100).toFixed(2) + "%"; |
| | | }, |
| | | |
| | | // ===================== æ±æ» ===================== |
| | | getSummaries(param) { |
| | | const { columns, data } = param; |
| | |
| | | sums[index] = |
| | | (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) + |
| | | "%"; |
| | | } else if (prop === "againFollowUpPushRate") { |
| | | const totalPush = data.reduce( |
| | | (s, row) => s + (Number(row.againFollowUpPushCount) || 0), |
| | | 0 |
| | | ); |
| | | const totalDischarge = data.reduce( |
| | | (s, row) => s + (Number(row.dischargeCount) || 0), |
| | | 0 |
| | | ); |
| | | sums[index] = |
| | | totalDischarge > 0 |
| | | ? ((totalPush / totalDischarge) * 100).toFixed(2) + "%" |
| | | : "0.00%"; |
| | | } else { |
| | | // æ°ååæ±å |
| | | const values = data.map((item) => Number(item[prop]) || 0); |
| | |
| | | [h("span", column.label)] |
| | | ); |
| | | }, |
| | | TooltipAgainFollowUpPushRate(h, { column }) { |
| | | return h( |
| | | "el-tooltip", |
| | | { |
| | | props: { |
| | | content: "忬¡é访æ¨é人æ°/åºé¢äººæ¬¡", |
| | | placement: "top", |
| | | effect: "dark", |
| | | }, |
| | | }, |
| | | [h("span", column.label)] |
| | | ); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | key="pendingFollowUp" |
| | |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="å¾
åé" |
| | | align="center" |
| | | key="pendingFollowUpWaitSend" |
| | | prop="pendingFollowUpWaitSend" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpWaitSendInfo', |
| | | 'å¾
åéå表', |
| | | '1' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpWaitSend |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å·²åé" |
| | | align="center" |
| | | key="pendingFollowUpSent" |
| | | prop="pendingFollowUpSent" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpSentInfo', |
| | | 'å·²åéå表', |
| | | '1' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpSent |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访æå" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="é访失败" |
| | | align="center" |
| | | key="followUpFail" |
| | |
| | | type="text" |
| | | @click="handleSeeDetails(scope.row)" |
| | | > |
| | | <span class="button-zx" |
| | | >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span |
| | | > |
| | | <span class="button-zx">{{ |
| | | getTimelyRateText(scope.row) |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | key="pendingFollowUp" |
| | |
| | | <span class="button-zx">{{ scope.row.pendingFollowUp }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="å¾
åé" |
| | | align="center" |
| | | key="pendingFollowUpWaitSend" |
| | | prop="pendingFollowUpWaitSend" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpWaitSendInfo', |
| | | 'å¾
åéå表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpWaitSend |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å·²åé" |
| | | align="center" |
| | | key="pendingFollowUpSent" |
| | | prop="pendingFollowUpSent" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpSentInfo', |
| | | 'å·²åéå表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpSent |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访æå" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="é访失败" |
| | | align="center" |
| | | key="followUpFail" |
| | |
| | | type="text" |
| | | @click="handleSeeDetails(scope.row)" |
| | | > |
| | | <span class="button-zx" |
| | | >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span |
| | | > |
| | | <span class="button-zx">{{ |
| | | getTimelyRateText(scope.row) |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="人工" |
| | | v-if="orgname == 'ç¼äºå¿äººæ°å»é¢'" |
| | | label="åæ¶é访人次" |
| | | align="center" |
| | | key="timelyFollowUp" |
| | | prop="timelyFollowUp" |
| | | width="138" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="manual" |
| | | prop="manual" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualInfo', |
| | | 'åéå®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.manual }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="manualSuccess" |
| | | prop="manualSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualSuccessInfo', |
| | | 'æç»å®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.manualSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'timelyFollowUpInfo', |
| | | 'åæ¶é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.timelyFollowUp }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="è¯é³" |
| | | align="center" |
| | | > |
| | | <el-table-column v-if="isTargetHospital" label="è¯é³" align="center"> |
| | | <el-table-column |
| | | label="åé宿" |
| | | label="åéæ°" |
| | | align="center" |
| | | key="voice" |
| | | prop="voice" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | label="æåæ°" |
| | | align="center" |
| | | key="voiceSuccess" |
| | | prop="voiceSuccess" |
| | |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.voiceSuccess |
| | | }}</span> |
| | | <span class="button-zx">{{ scope.row.voiceSuccess }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="çä¿¡" |
| | | align="center" |
| | | > |
| | | <el-table-column v-if="isTargetHospital" label="微信" align="center"> |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="sms" |
| | | prop="sms" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsInfo', |
| | | 'åé宿çä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.sms }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="smsSuccess" |
| | | prop="smsSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsSuccessInfo', |
| | | 'æç»å®æçä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.smsSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="微信" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | label="åéæ°" |
| | | align="center" |
| | | key="weChat" |
| | | prop="weChat" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | label="æåæ°" |
| | | align="center" |
| | | key="weChatSuccess" |
| | | prop="weChatSuccess" |
| | |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.weChatSuccess |
| | | }}</span> |
| | | <span class="button-zx">{{ scope.row.weChatSuccess }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column v-if="isTargetHospital" label="çä¿¡" align="center"> |
| | | <el-table-column |
| | | label="åéæ°" |
| | | align="center" |
| | | key="sms" |
| | | prop="sms" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsInfo', |
| | | 'åé宿çä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.sms }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æåæ°" |
| | | align="center" |
| | | key="smsSuccess" |
| | | prop="smsSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsSuccessInfo', |
| | | 'æç»å®æçä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.smsSuccess }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column v-if="isTargetHospital" label="人工" align="center"> |
| | | <el-table-column |
| | | label="åéæ°" |
| | | align="center" |
| | | key="manual" |
| | | prop="manual" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualInfo', |
| | | 'åéå®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.manual }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æåæ°" |
| | | align="center" |
| | | key="manualSuccess" |
| | | prop="manualSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualSuccessInfo', |
| | | 'æç»å®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.manualSuccess }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="人工" |
| | |
| | | </el-table-column> |
| | | </el-table-column> |
| | | |
| | | <!-- é访æ
åµåï¼ä»
丽水å¸ä¸å»é¢æ¾ç¤ºï¼ --> |
| | | <!-- é访æ
åµåï¼ä¸½æ°´å¸ä¸å»é¢å·²ç§»å°ç»¼åç»è®¡ï¼æ¤å¤ä»
æ¯å®ç²æèªæ²»å¿äººæ°å»é¢æ¾ç¤ºï¼ --> |
| | | <el-table-column |
| | | v-if=" |
| | | orgname == '丽水å¸ä¸å»é¢' || orgname == 'æ¯å®ç²æèªæ²»å¿äººæ°å»é¢' |
| | | " |
| | | v-if="orgname == 'æ¯å®ç²æèªæ²»å¿äººæ°å»é¢'" |
| | | align="center" |
| | | label="é访æ
åµ" |
| | | > |
| | |
| | | const need = Number(needFollowUp) || 0; |
| | | const pending = Number(pendingFollowUp) || 0; |
| | | |
| | | // 忝 = éé访 - å¾
é访 |
| | | const denominator = need - pending; |
| | | // ç®æ å»é¢ï¼æåç = é访æå / éé访ï¼å
¶ä»ï¼é访æå / (éé访 - å¾
é访) |
| | | const denominator = this.isTargetHospital ? need : need - pending; |
| | | |
| | | if (denominator <= 0) { |
| | | return "0.00%"; |
| | |
| | | |
| | | const rate = (success / denominator) * 100; |
| | | return rate.toFixed(2) + "%"; |
| | | }, |
| | | // 计ç®åæ¶çï¼ç®æ å»é¢ï¼ï¼(éé访 - 人工è§å®æ¶é´å
没æè¿çµè¯) / éé访 |
| | | calculateTimelyRate(needFollowUp, manualCallTimeout) { |
| | | const need = Number(needFollowUp) || 0; |
| | | const timeout = Number(manualCallTimeout) || 0; |
| | | if (need <= 0) { |
| | | return "0.00%"; |
| | | } |
| | | const rate = ((need - timeout) / need) * 100; |
| | | return (rate < 0 ? 0 : rate).toFixed(2) + "%"; |
| | | }, |
| | | // åæ¶çå±ç¤ºææ¡ï¼ç®æ å»é¢å端计ç®ï¼å
¶ä»ç¨å端 rate åæ®µ |
| | | getTimelyRateText(row) { |
| | | if (this.isTargetHospital) { |
| | | return this.calculateTimelyRate( |
| | | row.needFollowUp, |
| | | row.manualCallTimeout |
| | | ); |
| | | } |
| | | return (Number(row.rate) * 100).toFixed(2) + "%"; |
| | | }, |
| | | // å¨ç»è®¡æ±æ»æ¹æ³ä¸å¤çæåç |
| | | getSummaries(param) { |
| | |
| | | return sum + (Number(item.pendingFollowUp) || 0); |
| | | }, 0); |
| | | |
| | | const denominator = totalNeed - totalPending; |
| | | const denominator = this.isTargetHospital |
| | | ? totalNeed |
| | | : totalNeed - totalPending; |
| | | |
| | | if (denominator > 0) { |
| | | sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | | } else { |
| | | sums[index] = "0.00%"; |
| | | } |
| | | } else if ( |
| | | column.property === "followUpRate" || |
| | | column.property === "rate" |
| | | ) { |
| | | } else if (column.property === "rate") { |
| | | if (this.isTargetHospital) { |
| | | const totalNeed = data.reduce( |
| | | (sum, item) => sum + (Number(item.needFollowUp) || 0), |
| | | 0 |
| | | ); |
| | | const totalTimeout = data.reduce( |
| | | (sum, item) => sum + (Number(item.manualCallTimeout) || 0), |
| | | 0 |
| | | ); |
| | | sums[index] = this.calculateTimelyRate(totalNeed, totalTimeout); |
| | | } else { |
| | | 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 if (column.property === "followUpRate") { |
| | | const percentageValues = data |
| | | .map((item) => { |
| | | const value = item[column.property]; |
| | |
| | | "el-tooltip", |
| | | { |
| | | props: { |
| | | content: "é访æå/(éé访-å¾
é访)", |
| | | content: this.isTargetHospital |
| | | ? "é访æå/éé访" |
| | | : "é访æå/(éé访-å¾
é访)", |
| | | placement: "top", |
| | | effect: "dark", |
| | | }, |
| | |
| | | "el-tooltip", |
| | | { |
| | | props: { |
| | | content: |
| | | "(åºé¢æ¶é´+ä»»å¡å¨æ)å°äºå®ææ¶é´å³ä¸ºè¶
æ¶;(éé访-è¶
æ¶)/éé访", |
| | | content: this.isTargetHospital |
| | | ? "åæ¶ç=(éé访-人工è§å®æ¶é´å
没æè¿çµè¯)/éé访" |
| | | : "(åºé¢æ¶é´+ä»»å¡å¨æ)å°äºå®ææ¶é´å³ä¸ºè¶
æ¶;(éé访-è¶
æ¶)/éé访", |
| | | placement: "top", |
| | | effect: "dark", |
| | | }, |
| | |
| | | return sum + (Number(item.pendingFollowUp) || 0); |
| | | }, 0); |
| | | |
| | | const denominator = totalNeed - totalPending; |
| | | const denominator = this.isTargetHospital |
| | | ? totalNeed |
| | | : totalNeed - totalPending; |
| | | |
| | | if (denominator > 0) { |
| | | sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | | } else { |
| | | sums[index] = "0.00%"; |
| | | } |
| | | } else if ( |
| | | column.property === "followUpRate" || |
| | | column.property === "rate" |
| | | ) { |
| | | } else if (column.property === "rate") { |
| | | if (this.isTargetHospital) { |
| | | const totalNeed = data.reduce( |
| | | (sum, item) => sum + (Number(item.needFollowUp) || 0), |
| | | 0 |
| | | ); |
| | | const totalTimeout = data.reduce( |
| | | (sum, item) => sum + (Number(item.manualCallTimeout) || 0), |
| | | 0 |
| | | ); |
| | | sums[index] = this.calculateTimelyRate(totalNeed, totalTimeout); |
| | | } else { |
| | | 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 if (column.property === "followUpRate") { |
| | | const percentageValues = data |
| | | .map((item) => { |
| | | const value = item[column.property]; |
| | |
| | | }, |
| | | }; |
| | | |
| | | // æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, 10); |
| | | worksheet.getCell(1, 1).value = `${areaName}å»çé访å表`; |
| | | worksheet.getCell(1, 1).style = titleStyle; |
| | | worksheet.getRow(1).height = 30; |
| | | const graded = this.isTargetHospital; |
| | | // æåçï¼æ¯å®ç²æèªæ²»å¿äººæ°å»é¢ä¸å±ç¤ºï¼åæ¶çï¼ä¸½æ°´å¸ä¸å»é¢ä¸å±ç¤º |
| | | const showSuccessRate = this.orgname != "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | const showTimelyRate = this.orgname != "丽水å¸ä¸å»é¢"; |
| | | |
| | | // 表头 |
| | | // åå®ä¹ï¼ä¸å±å¼çå»çåè¡¨ä¿æä¸è´ï¼ |
| | | const headers = [ |
| | | "å»çå§å", |
| | | "ç§å®¤", |
| | |
| | | "æ éé访", |
| | | "åºé访", |
| | | "éé访", |
| | | "å¾
é访", |
| | | ...(graded ? ["å¾
åé", "å·²åé"] : ["å¾
é访"]), |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", // æ°å¢ |
| | | "é访ç", // 忥卿åçä½ç½® |
| | | ...(graded ? [] : ["é访失败"]), |
| | | ...(showSuccessRate ? ["æåç"] : []), |
| | | "é访ç", |
| | | ...(showTimelyRate ? ["åæ¶ç"] : []), |
| | | "人工", |
| | | "è¯é³", |
| | | "çä¿¡", |
| | | "微信", |
| | | ]; |
| | | const totalCols = headers.length; |
| | | |
| | | // æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, totalCols); |
| | | worksheet.getCell(1, 1).value = `${areaName}å»çé访å表`; |
| | | worksheet.getCell(1, 1).style = titleStyle; |
| | | worksheet.getRow(1).height = 30; |
| | | |
| | | // 表头 |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | |
| | | item.nonFollowUp, |
| | | item.followUpNeeded, |
| | | item.needFollowUp, |
| | | item.pendingFollowUp, |
| | | ...(graded |
| | | ? [item.pendingFollowUpWaitSend || 0, item.pendingFollowUpSent || 0] |
| | | : [item.pendingFollowUp || 0]), |
| | | item.followUpSuccess, |
| | | item.followUpFail, |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccess, |
| | | item.needFollowUp, |
| | | item.pendingFollowUp |
| | | ), |
| | | ...(graded ? [] : [item.followUpFail || 0]), |
| | | ...(showSuccessRate |
| | | ? [ |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccess, |
| | | item.needFollowUp, |
| | | item.pendingFollowUp |
| | | ), |
| | | ] |
| | | : []), |
| | | item.followUpRate, |
| | | ...(showTimelyRate ? [this.getTimelyRateText(item)] : []), |
| | | item.manual || 0, |
| | | item.voice || 0, |
| | | item.sms || 0, |
| | | item.weChat || 0, |
| | | ]); |
| | | row.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | |
| | | }; |
| | | }); |
| | | |
| | | // å宽 |
| | | worksheet.columns = [ |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, // æåç |
| | | { width: 12 }, // é访ç |
| | | ]; |
| | | // å宽ï¼å两åå§å/ç§å®¤è¾å®½ï¼å
¶ä½ç»ä¸ï¼ |
| | | const widths = [15, 15]; |
| | | headers.slice(2).forEach(() => widths.push(12)); |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | getDoctorExportSummary(data) { |
| | | const sums = ["å°è®¡"]; |
| | | const graded = this.isTargetHospital; |
| | | const showSuccessRate = this.orgname != "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | const showTimelyRate = this.orgname != "丽水å¸ä¸å»é¢"; |
| | | |
| | | const keys = [ |
| | | "dischargeCount", |
| | | "nonFollowUp", |
| | | "followUpNeeded", |
| | | "needFollowUp", |
| | | "pendingFollowUp", |
| | | "followUpSuccess", |
| | | "followUpFail", |
| | | ]; |
| | | const sums = ["å°è®¡", "-"]; |
| | | |
| | | // æ°å¼åæ±å |
| | | const keys = graded |
| | | ? [ |
| | | "dischargeCount", |
| | | "nonFollowUp", |
| | | "followUpNeeded", |
| | | "needFollowUp", |
| | | "pendingFollowUpWaitSend", |
| | | "pendingFollowUpSent", |
| | | "followUpSuccess", |
| | | ] |
| | | : [ |
| | | "dischargeCount", |
| | | "nonFollowUp", |
| | | "followUpNeeded", |
| | | "needFollowUp", |
| | | "pendingFollowUp", |
| | | "followUpSuccess", |
| | | "followUpFail", |
| | | ]; |
| | | |
| | | keys.forEach((key) => { |
| | | sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0)); |
| | | }); |
| | | |
| | | // æåçï¼å¹³åå¼ï¼ |
| | | const successRates = data |
| | | .map((item) => { |
| | | const success = Number(item.followUpSuccess) || 0; |
| | | const need = Number(item.needFollowUp) || 0; |
| | | const pending = Number(item.pendingFollowUp) || 0; |
| | | const denominator = need - pending; |
| | | if (denominator <= 0) return 0; |
| | | return success / denominator; |
| | | }) |
| | | .filter((rate) => !isNaN(rate)); |
| | | if (showSuccessRate) { |
| | | const successRates = data |
| | | .map((item) => { |
| | | const success = Number(item.followUpSuccess) || 0; |
| | | const need = Number(item.needFollowUp) || 0; |
| | | const pending = Number(item.pendingFollowUp) || 0; |
| | | const denominator = graded ? need : need - pending; |
| | | if (denominator <= 0) return 0; |
| | | return success / denominator; |
| | | }) |
| | | .filter((rate) => !isNaN(rate)); |
| | | |
| | | sums.push( |
| | | successRates.length |
| | | ? ( |
| | | (successRates.reduce((a, b) => a + b, 0) / successRates.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | sums.push( |
| | | successRates.length |
| | | ? ( |
| | | (successRates.reduce((a, b) => a + b, 0) / |
| | | successRates.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | } |
| | | |
| | | // é访çï¼å¹³åå¼ï¼ |
| | | const followUpRates = data |
| | |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | |
| | | // åæ¶çï¼ç®æ å»é¢è®¡ç®ï¼å
¶ä»å rate å¹³åï¼ |
| | | if (showTimelyRate) { |
| | | if (graded) { |
| | | const totalNeed = data.reduce( |
| | | (s, r) => s + (Number(r.needFollowUp) || 0), |
| | | 0 |
| | | ); |
| | | const totalTimeout = data.reduce( |
| | | (s, r) => s + (Number(r.manualCallTimeout) || 0), |
| | | 0 |
| | | ); |
| | | sums.push(this.calculateTimelyRate(totalNeed, totalTimeout)); |
| | | } else { |
| | | const rateValues = data |
| | | .map((i) => this.extractPercentageValue(i.rate)) |
| | | .filter(Boolean); |
| | | sums.push( |
| | | rateValues.length |
| | | ? ( |
| | | (rateValues.reduce((a, b) => a + b, 0) / rateValues.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | } |
| | | } |
| | | |
| | | // 人工/è¯é³/çä¿¡/微信 |
| | | ["manual", "voice", "sms", "weChat"].forEach((key) => { |
| | | sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0)); |
| | | }); |
| | | |
| | | return sums; |
| | | }, |
| | |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | }, |
| | | }; |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åé宿/æç»å®æ å级å±ç¤ºï¼ |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åéæ°/æåæ° å级å±ç¤ºï¼ |
| | | const graded = this.isTargetHospital; |
| | | |
| | | const baseHeaders = [ |
| | |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | ]; |
| | | const coreHeaders = [ |
| | | "éé访", |
| | | "å¾
é访", |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | ]; |
| | | const coreHeaders = this.isTargetHospital |
| | | ? [ |
| | | "éé访", |
| | | "å¾
åé", |
| | | "å·²åé", |
| | | "é访æå", |
| | | "æåç", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | ] |
| | | : [ |
| | | "éé访", |
| | | "å¾
é访", |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | ]; |
| | | const methodGroups = this.getMethodColumns(); |
| | | |
| | | const baseCount = baseHeaders.length; // 6 |
| | |
| | | worksheet.getCell(2, coreStartCol).value = serviceTypeName; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å纵ååå¹¶ + é访æ¹å¼åç»æ¨ªååå¹¶ |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const col = coreStartCol + k; |
| | | // 第3è¡ï¼éè®¿æ ¸å¿åï¼ç®æ å»é¢âå¾
é访âä¸åµå¥âå¾
åé/å·²åéâï¼ |
| | | worksheet.mergeCells(3, coreStartCol, headerEndRow, coreStartCol); |
| | | worksheet.getCell(3, coreStartCol).value = "éé访"; |
| | | worksheet.getCell(3, coreStartCol).style = headerStyle; |
| | | |
| | | worksheet.mergeCells(3, coreStartCol + 1, 3, coreStartCol + 2); |
| | | worksheet.getCell(3, coreStartCol + 1).value = "å¾
é访"; |
| | | worksheet.getCell(3, coreStartCol + 1).style = headerStyle; |
| | | |
| | | worksheet.mergeCells( |
| | | 3, |
| | | coreStartCol + 3, |
| | | headerEndRow, |
| | | coreStartCol + 3 |
| | | ); |
| | | worksheet.getCell(3, coreStartCol + 3).value = "é访æå"; |
| | | worksheet.getCell(3, coreStartCol + 3).style = headerStyle; |
| | | |
| | | ["æåç", "é访ç", "åæ¶ç"].forEach((label, i) => { |
| | | const col = coreStartCol + 4 + i; |
| | | worksheet.mergeCells(3, col, headerEndRow, col); |
| | | const cell = worksheet.getCell(3, col); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.getCell(3, col).value = label; |
| | | worksheet.getCell(3, col).style = headerStyle; |
| | | }); |
| | | |
| | | // 第4è¡ï¼å¾
åé/å·²åé åå |
| | | worksheet.getCell(4, coreStartCol + 1).value = "å¾
åé"; |
| | | worksheet.getCell(4, coreStartCol + 1).style = headerStyle; |
| | | worksheet.getCell(4, coreStartCol + 2).value = "å·²åé"; |
| | | worksheet.getCell(4, coreStartCol + 2).style = headerStyle; |
| | | |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | if (g.fields.length > 1) { |
| | |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åé宿/æç»å®æï¼ |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åéæ°/æåæ°ï¼ |
| | | mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field, idx) => { |
| | |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUp || 0, |
| | | item.pendingFollowUp || 0, |
| | | // å¾
é访ï¼ç®æ å»é¢æä¸ºå¾
åé/å·²åéï¼å
¶ä»ç¨å¾
é访 |
| | | ...(this.isTargetHospital |
| | | ? [item.pendingFollowUpWaitSend || 0, item.pendingFollowUpSent || 0] |
| | | : [item.pendingFollowUp || 0]), |
| | | item.followUpSuccess || 0, |
| | | item.followUpFail || 0, |
| | | // é访失败ï¼ç®æ å»é¢ä¸æ¾ç¤º |
| | | ...(this.isTargetHospital ? [] : [item.followUpFail || 0]), |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccess, |
| | |
| | | item.pendingFollowUp |
| | | ), |
| | | item.followUpRate || "0%", // é访ç |
| | | item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // åæ¶ç |
| | | this.getTimelyRateText(item), // åæ¶ç |
| | | ]; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field) => { |
| | |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | getMethodColumns() { |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåé宿/æç»å®æâå级å±ç¤º |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåéæ°/æåæ°âå级å±ç¤º |
| | | if (this.isTargetHospital) { |
| | | return [ |
| | | { label: "人工", fields: ["manual", "manualSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "è¯é³", fields: ["voice", "voiceSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "çä¿¡", fields: ["sms", "smsSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "微信", fields: ["weChat", "weChatSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { |
| | | label: "人工", |
| | | fields: ["manual", "manualSuccess"], |
| | | sub: ["åéæ°", "æåæ°"], |
| | | }, |
| | | { |
| | | label: "è¯é³", |
| | | fields: ["voice", "voiceSuccess"], |
| | | sub: ["åéæ°", "æåæ°"], |
| | | }, |
| | | { |
| | | label: "çä¿¡", |
| | | fields: ["sms", "smsSuccess"], |
| | | sub: ["åéæ°", "æåæ°"], |
| | | }, |
| | | { |
| | | label: "微信", |
| | | fields: ["weChat", "weChatSuccess"], |
| | | sub: ["åéæ°", "æåæ°"], |
| | | }, |
| | | ]; |
| | | } |
| | | return [ |
| | |
| | | 0, // 4: nonFollowUp |
| | | 0, // 5: followUpNeeded |
| | | 0, // 6: needFollowUp |
| | | 0, // 7: pendingFollowUp |
| | | 0, // 8: followUpSuccess |
| | | 0, // 9: followUpFail |
| | | 0, // 7: å¾
åé/å¾
é访 |
| | | 0, // 8: å·²åé/é访æå |
| | | 0, // 9: é访æå/é访失败 |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | "0%", // 12: åæ¶ç |
| | |
| | | summaries[4] += Number(item.nonFollowUp) || 0; |
| | | summaries[5] += Number(item.followUpNeeded) || 0; |
| | | summaries[6] += Number(item.needFollowUp) || 0; |
| | | summaries[7] += Number(item.pendingFollowUp) || 0; |
| | | summaries[8] += Number(item.followUpSuccess) || 0; |
| | | summaries[9] += Number(item.followUpFail) || 0; |
| | | if (this.isTargetHospital) { |
| | | summaries[7] += Number(item.pendingFollowUpWaitSend) || 0; |
| | | summaries[8] += Number(item.pendingFollowUpSent) || 0; |
| | | summaries[9] += Number(item.followUpSuccess) || 0; |
| | | } else { |
| | | summaries[7] += Number(item.pendingFollowUp) || 0; |
| | | summaries[8] += Number(item.followUpSuccess) || 0; |
| | | summaries[9] += Number(item.followUpFail) || 0; |
| | | } |
| | | methodFields.forEach((field, i) => { |
| | | summaries[methodStartIndex + i] += Number(item[field]) || 0; |
| | | }); |
| | | }); |
| | | |
| | | // æåçè®¡ç® |
| | | const totalSuccess = summaries[8]; // followUpSuccessçæ»å |
| | | // æåç计ç®ï¼é访æå / éé访ï¼ç®æ å»é¢ï¼ï¼å¦å é访æå / (éé访-å¾
é访) |
| | | const totalSuccess = this.isTargetHospital ? summaries[9] : summaries[8]; |
| | | const totalNeed = summaries[6]; // needFollowUpçæ»å |
| | | const totalPending = summaries[7]; // pendingFollowUpçæ»å |
| | | const denominator = totalNeed - totalPending; |
| | | const totalPending = summaries[7]; // å¾
åé/å¾
éè®¿çæ»å |
| | | const denominator = this.isTargetHospital |
| | | ? totalNeed |
| | | : totalNeed - totalPending; |
| | | |
| | | if (denominator > 0) { |
| | | summaries[10] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | |
| | | summaries[11] = (avgFollowUpRate * 100).toFixed(2) + "%"; |
| | | } |
| | | |
| | | // åæ¶çè®¡ç® |
| | | const rateValues = this.tableData |
| | | .map((item) => this.extractPercentageValue(item.rate)) |
| | | .filter((value) => value !== null); |
| | | // åæ¶ç计ç®ï¼ç®æ å»é¢ (éé访-人工è¶
æ¶)/éé访ï¼å
¶ä»åå端 rate å¹³å |
| | | if (this.isTargetHospital) { |
| | | const totalTimeout = this.tableData.reduce( |
| | | (sum, item) => sum + (Number(item.manualCallTimeout) || 0), |
| | | 0 |
| | | ); |
| | | summaries[12] = this.calculateTimelyRate(totalNeed, totalTimeout); |
| | | } else { |
| | | const rateValues = this.tableData |
| | | .map((item) => this.extractPercentageValue(item.rate)) |
| | | .filter((value) => value !== null); |
| | | |
| | | if (rateValues.length > 0) { |
| | | const avgRate = |
| | | rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length; |
| | | summaries[12] = (avgRate * 100).toFixed(2) + "%"; |
| | | if (rateValues.length > 0) { |
| | | const avgRate = |
| | | rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length; |
| | | summaries[12] = (avgRate * 100).toFixed(2) + "%"; |
| | | } |
| | | } |
| | | |
| | | // æ ¼å¼åæ°å |
| | |
| | | } |
| | | // åºé¢æ¶é´èå´ |
| | | if (queryParams.hospitalEndTime) { |
| | | this.patientqueryParams.hospitalStartTime = |
| | | this.patientqueryParams.startOutHospTime = |
| | | queryParams.hospitalStartTime; |
| | | this.patientqueryParams.hospitalEndTime = queryParams.hospitalEndTime; |
| | | this.patientqueryParams.endOutHospTime = queryParams.hospitalEndTime; |
| | | } else { |
| | | this.patientqueryParams.hospitalStartTime = this.parseTime( |
| | | this.patientqueryParams.startOutHospTime = this.parseTime( |
| | | queryParams.dateRangecy[0] |
| | | ); |
| | | this.patientqueryParams.hospitalEndTime = this.parseTime( |
| | | this.patientqueryParams.endOutHospTime = this.parseTime( |
| | | queryParams.dateRangecy[1] |
| | | ); |
| | | } |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | key="pendingFollowUpAgain" |
| | |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="å¾
åé" |
| | | align="center" |
| | | key="pendingFollowUpWaitSendAgain" |
| | | prop="pendingFollowUpWaitSendAgain" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpWaitSendAgainInfo', |
| | | 'å¾
åéå表', |
| | | '1' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpWaitSendAgain |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å·²åé" |
| | | align="center" |
| | | key="pendingFollowUpSentAgain" |
| | | prop="pendingFollowUpSentAgain" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpSentAgainInfo', |
| | | 'å·²åéå表', |
| | | '1' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpSentAgain |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访æå" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="é访失败" |
| | | align="center" |
| | | key="followUpFailAgain" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | key="pendingFollowUpAgain" |
| | |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="å¾
é访" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="å¾
åé" |
| | | align="center" |
| | | key="pendingFollowUpWaitSendAgain" |
| | | prop="pendingFollowUpWaitSendAgain" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpWaitSendAgainInfo', |
| | | '忬¡é访å¾
åéå表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpWaitSendAgain |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å·²åé" |
| | | align="center" |
| | | key="pendingFollowUpSentAgain" |
| | | prop="pendingFollowUpSentAgain" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'pendingFollowUpSentAgainInfo', |
| | | '忬¡é访已åéå表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.pendingFollowUpSentAgain |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访æå" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="!isTargetHospital" |
| | | label="é访失败" |
| | | align="center" |
| | | key="followUpFailAgain" |
| | |
| | | prop="followUpRateAgain" |
| | | :render-header="Tooltipsfl" |
| | | /> |
| | | |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="人工" |
| | | v-if="orgname == 'ç¼äºå¿äººæ°å»é¢'" |
| | | label="å¤è¯å¤æ¥æ°é" |
| | | align="center" |
| | | key="suggest7CountAgain" |
| | | prop="suggest7CountAgain" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="manualAgain" |
| | | prop="manualAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <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="manualAgainSuccess" |
| | | prop="manualAgainSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualAgainSuccessInfo', |
| | | 'æç»å®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.manualAgainSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'suggest7CountAgainInfo', |
| | | '忬¡é访å¤è¯å¤æ¥å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.suggest7CountAgain |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="è¯é³" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | label="åéæ°" |
| | | align="center" |
| | | key="voiceAgain" |
| | | prop="voiceAgain" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | label="æåæ°" |
| | | align="center" |
| | | key="voiceAgainSuccess" |
| | | prop="voiceAgainSuccess" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="微信" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="åéæ°" |
| | | align="center" |
| | | key="weChatAgain" |
| | | prop="weChatAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <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 |
| | | label="æåæ°" |
| | | align="center" |
| | | key="weChatAgainSuccess" |
| | | prop="weChatAgainSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'wechatAgainSuccessInfo', |
| | | 'æç»å®æå¾®ä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.weChatAgainSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="çä¿¡" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | label="åéæ°" |
| | | align="center" |
| | | key="smsAgain" |
| | | prop="smsAgain" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | label="æåæ°" |
| | | align="center" |
| | | key="smsAgainSuccess" |
| | | prop="smsAgainSuccess" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column |
| | | |
| | | <el-table-column |
| | | v-if="isTargetHospital" |
| | | label="微信" |
| | | label="人工" |
| | | align="center" |
| | | > |
| | | <el-table-column |
| | | label="åé宿" |
| | | label="åéæ°" |
| | | align="center" |
| | | key="weChatAgain" |
| | | prop="weChatAgain" |
| | | key="manualAgain" |
| | | prop="manualAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'weChatAgainInfo', |
| | | 'åéå®æå¾®ä¿¡é访å表' |
| | | 'manualAgainInfo', |
| | | 'åéå®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.weChatAgain }}</span> |
| | | <span class="button-zx">{{ scope.row.manualAgain }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | label="æåæ°" |
| | | align="center" |
| | | key="weChatAgainSuccess" |
| | | prop="weChatAgainSuccess" |
| | | key="manualAgainSuccess" |
| | | prop="manualAgainSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'wechatAgainSuccessInfo', |
| | | 'æç»å®æå¾®ä¿¡é访å表' |
| | | 'manualAgainSuccessInfo', |
| | | 'æç»å®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.weChatAgainSuccess |
| | | scope.row.manualAgainSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | |
| | | "el-tooltip", |
| | | { |
| | | props: { |
| | | content: "é访æå/(éé访-å¾
é访)", |
| | | content: this.isTargetHospital |
| | | ? "é访æå/éé访" |
| | | : "é访æå/(éé访-å¾
é访)", |
| | | placement: "top", |
| | | effect: "dark", |
| | | }, |
| | |
| | | return sum + (Number(item.pendingFollowUpAgain) || 0); |
| | | }, 0); |
| | | |
| | | const denominator = totalNeed - totalPending; |
| | | const denominator = this.isTargetHospital ? totalNeed : totalNeed - totalPending; |
| | | |
| | | if (denominator > 0) { |
| | | sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | |
| | | return sum + (Number(item.pendingFollowUpAgain) || 0); |
| | | }, 0); |
| | | |
| | | const denominator = totalNeed - totalPending; |
| | | const denominator = this.isTargetHospital ? totalNeed : totalNeed - totalPending; |
| | | |
| | | if (denominator > 0) { |
| | | sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | |
| | | const need = Number(needFollowUp) || 0; |
| | | const pending = Number(pendingFollowUp) || 0; |
| | | |
| | | // 忝 = éé访 - å¾
é访 |
| | | const denominator = need - pending; |
| | | // 忝 = éé访ï¼ç®æ å»é¢ï¼/ éé访 - å¾
é访ï¼å
¶ä»ï¼ |
| | | const denominator = this.isTargetHospital ? need : need - pending; |
| | | |
| | | if (denominator <= 0) { |
| | | return "0.00%"; |
| | |
| | | }, |
| | | }; |
| | | |
| | | // æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, 10); |
| | | worksheet.getCell(1, 1).value = `${areaName}å»ç忬¡é访å表`; |
| | | worksheet.getCell(1, 1).style = titleStyle; |
| | | worksheet.getRow(1).height = 30; |
| | | const graded = this.isTargetHospital; |
| | | // æåçï¼æ¯å®ç²æèªæ²»å¿äººæ°å»é¢ä¸å±ç¤º |
| | | const showSuccessRate = this.orgname != "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | |
| | | // 表头 |
| | | // åå®ä¹ï¼ä¸å±å¼çå»çåè¡¨ä¿æä¸è´ï¼ |
| | | const headers = [ |
| | | "å»çå§å", |
| | | "ç§å®¤", |
| | |
| | | "æ éé访", |
| | | "åºé访", |
| | | "éé访", |
| | | "å¾
é访", |
| | | ...(graded ? ["å¾
åé", "å·²åé"] : ["å¾
é访"]), |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", // æ°å¢ |
| | | "é访ç", // 忥卿åçä½ç½® |
| | | ...(graded ? [] : ["é访失败"]), |
| | | ...(showSuccessRate ? ["æåç"] : []), |
| | | "é访ç", |
| | | "人工", |
| | | "è¯é³", |
| | | "çä¿¡", |
| | | "微信", |
| | | ]; |
| | | const totalCols = headers.length; |
| | | |
| | | // æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, totalCols); |
| | | worksheet.getCell(1, 1).value = `${areaName}å»ç忬¡é访å表`; |
| | | worksheet.getCell(1, 1).style = titleStyle; |
| | | worksheet.getRow(1).height = 30; |
| | | |
| | | // 表头 |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | |
| | | item.nonFollowUp, |
| | | item.followUpNeeded, |
| | | item.needFollowUpAgain, |
| | | item.pendingFollowUpAgain, |
| | | ...(graded |
| | | ? [ |
| | | item.pendingFollowUpWaitSendAgain || 0, |
| | | item.pendingFollowUpSentAgain || 0, |
| | | ] |
| | | : [item.pendingFollowUpAgain || 0]), |
| | | item.followUpSuccessAgain, |
| | | item.followUpFailAgain, |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccessAgain, |
| | | item.needFollowUpAgain, |
| | | item.pendingFollowUpAgain |
| | | ), |
| | | ...(graded ? [] : [item.followUpFailAgain || 0]), |
| | | ...(showSuccessRate |
| | | ? [ |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccessAgain, |
| | | item.needFollowUpAgain, |
| | | item.pendingFollowUpAgain |
| | | ), |
| | | ] |
| | | : []), |
| | | item.followUpRateAgain, |
| | | item.manualAgain || 0, |
| | | item.voiceAgain || 0, |
| | | item.smsAgain || 0, |
| | | item.weChatAgain || 0, |
| | | ]); |
| | | row.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | |
| | | }; |
| | | }); |
| | | |
| | | // å宽 |
| | | worksheet.columns = [ |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, // æåç |
| | | { width: 12 }, // é访ç |
| | | ]; |
| | | // å宽ï¼å两åå§å/ç§å®¤è¾å®½ï¼å
¶ä½ç»ä¸ï¼ |
| | | const widths = [15, 15]; |
| | | headers.slice(2).forEach(() => widths.push(12)); |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | /** 忬¡é访 - å»çå表导åºå°è®¡ */ |
| | | getDoctorAgainExportSummary(data) { |
| | | const sums = ["å°è®¡"]; |
| | | const graded = this.isTargetHospital; |
| | | const showSuccessRate = this.orgname != "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢"; |
| | | |
| | | const sums = ["å°è®¡", "-"]; |
| | | |
| | | const keys = [ |
| | | "dischargeCount", |
| | | "nonFollowUp", |
| | | "followUpNeeded", |
| | | "needFollowUpAgain", |
| | | "pendingFollowUpAgain", |
| | | ...(graded |
| | | ? ["pendingFollowUpWaitSendAgain", "pendingFollowUpSentAgain"] |
| | | : ["pendingFollowUpAgain"]), |
| | | "followUpSuccessAgain", |
| | | "followUpFailAgain", |
| | | ...(graded ? [] : ["followUpFailAgain"]), |
| | | ]; |
| | | |
| | | keys.forEach((key) => { |
| | |
| | | }); |
| | | |
| | | // æåçï¼å¹³åå¼ï¼ |
| | | const successRates = data |
| | | .map((item) => { |
| | | const success = Number(item.followUpSuccessAgain) || 0; |
| | | const need = Number(item.needFollowUpAgain) || 0; |
| | | const pending = Number(item.pendingFollowUpAgain) || 0; |
| | | const denominator = need - pending; |
| | | if (denominator <= 0) return 0; |
| | | return success / denominator; |
| | | }) |
| | | .filter((rate) => !isNaN(rate)); |
| | | if (showSuccessRate) { |
| | | const successRates = data |
| | | .map((item) => { |
| | | const success = Number(item.followUpSuccessAgain) || 0; |
| | | const need = Number(item.needFollowUpAgain) || 0; |
| | | const pending = Number(item.pendingFollowUpAgain) || 0; |
| | | const denominator = graded ? need : need - pending; |
| | | if (denominator <= 0) return 0; |
| | | return success / denominator; |
| | | }) |
| | | .filter((rate) => !isNaN(rate)); |
| | | |
| | | sums.push( |
| | | successRates.length |
| | | ? ( |
| | | (successRates.reduce((a, b) => a + b, 0) / successRates.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | sums.push( |
| | | successRates.length |
| | | ? ( |
| | | (successRates.reduce((a, b) => a + b, 0) / |
| | | successRates.length) * |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | } |
| | | |
| | | // é访çï¼å¹³åå¼ï¼ |
| | | const followUpRates = data |
| | |
| | | 100 |
| | | ).toFixed(2) + "%" |
| | | : "0.00%" |
| | | ); |
| | | |
| | | // 人工/è¯é³/çä¿¡/微信 |
| | | ["manualAgain", "voiceAgain", "smsAgain", "weChatAgain"].forEach( |
| | | (key) => { |
| | | sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0)); |
| | | } |
| | | ); |
| | | |
| | | return sums; |
| | |
| | | }, |
| | | }; |
| | | |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åé宿/æç»å®æ å级å±ç¤ºï¼ |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åéæ°/æåæ° å级å±ç¤ºï¼ |
| | | const graded = this.isTargetHospital; |
| | | |
| | | const baseHeaders = [ |
| | |
| | | ]; |
| | | const coreHeaders = [ |
| | | "éé访", |
| | | "å¾
é访", |
| | | ...(this.isTargetHospital ? ["å¾
åé", "å·²åé"] : ["å¾
é访"]), |
| | | "é访æå", |
| | | "é访失败", |
| | | ...(this.isTargetHospital ? [] : ["é访失败"]), |
| | | "æåç", |
| | | "é访ç", |
| | | ]; |
| | |
| | | worksheet.getCell(2, coreStartCol).value = "忬¡åºé¢é访"; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å纵ååå¹¶ + é访æ¹å¼åç»æ¨ªååå¹¶ |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const col = coreStartCol + k; |
| | | // 第3è¡ï¼éè®¿æ ¸å¿åï¼ç®æ å»é¢âå¾
é访âä¸åµå¥âå¾
åé/å·²åéâï¼ |
| | | worksheet.mergeCells(3, coreStartCol, headerEndRow, coreStartCol); |
| | | worksheet.getCell(3, coreStartCol).value = "éé访"; |
| | | worksheet.getCell(3, coreStartCol).style = headerStyle; |
| | | |
| | | worksheet.mergeCells(3, coreStartCol + 1, 3, coreStartCol + 2); |
| | | worksheet.getCell(3, coreStartCol + 1).value = "å¾
é访"; |
| | | worksheet.getCell(3, coreStartCol + 1).style = headerStyle; |
| | | |
| | | worksheet.mergeCells( |
| | | 3, |
| | | coreStartCol + 3, |
| | | headerEndRow, |
| | | coreStartCol + 3 |
| | | ); |
| | | worksheet.getCell(3, coreStartCol + 3).value = "é访æå"; |
| | | worksheet.getCell(3, coreStartCol + 3).style = headerStyle; |
| | | |
| | | ["æåç", "é访ç"].forEach((label, i) => { |
| | | const col = coreStartCol + 4 + i; |
| | | worksheet.mergeCells(3, col, headerEndRow, col); |
| | | const cell = worksheet.getCell(3, col); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.getCell(3, col).value = label; |
| | | worksheet.getCell(3, col).style = headerStyle; |
| | | }); |
| | | |
| | | // 第4è¡ï¼å¾
åé/å·²åé åå |
| | | worksheet.getCell(4, coreStartCol + 1).value = "å¾
åé"; |
| | | worksheet.getCell(4, coreStartCol + 1).style = headerStyle; |
| | | worksheet.getCell(4, coreStartCol + 2).value = "å·²åé"; |
| | | worksheet.getCell(4, coreStartCol + 2).style = headerStyle; |
| | | |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | if (g.fields.length > 1) { |
| | |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åé宿/æç»å®æï¼ |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åéæ°/æåæ°ï¼ |
| | | mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field, idx) => { |
| | |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUpAgain || 0, |
| | | item.pendingFollowUpAgain || 0, |
| | | ...(this.isTargetHospital |
| | | ? [ |
| | | item.pendingFollowUpWaitSendAgain || 0, |
| | | item.pendingFollowUpSentAgain || 0, |
| | | ] |
| | | : [item.pendingFollowUpAgain || 0]), |
| | | item.followUpSuccessAgain || 0, |
| | | item.followUpFailAgain || 0, |
| | | ...(this.isTargetHospital ? [] : [item.followUpFailAgain || 0]), |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccessAgain, |
| | |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | getMethodColumns() { |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåé宿/æç»å®æâå级å±ç¤º |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåéæ°/æåæ°âå级å±ç¤º |
| | | if (this.isTargetHospital) { |
| | | return [ |
| | | { label: "人工", fields: ["manualAgain", "manualAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "è¯é³", fields: ["voiceAgain", "voiceAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "çä¿¡", fields: ["smsAgain", "smsAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "微信", fields: ["weChatAgain", "weChatAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "人工", fields: ["manualAgain", "manualAgainSuccess"], sub: ["åéæ°", "æåæ°"] }, |
| | | { label: "è¯é³", fields: ["voiceAgain", "voiceAgainSuccess"], sub: ["åéæ°", "æåæ°"] }, |
| | | { label: "çä¿¡", fields: ["smsAgain", "smsAgainSuccess"], sub: ["åéæ°", "æåæ°"] }, |
| | | { label: "微信", fields: ["weChatAgain", "weChatAgainSuccess"], sub: ["åéæ°", "æåæ°"] }, |
| | | ]; |
| | | } |
| | | return [ |
| | |
| | | }, |
| | | |
| | | getExportSummaries() { |
| | | const summaries = [ |
| | | "å计", |
| | | "/", |
| | | "/", |
| | | 0, // 3: dischargeCount |
| | | 0, // 4: nonFollowUp |
| | | 0, // 5: followUpNeeded |
| | | 0, // 6: needFollowUpAgain |
| | | 0, // 7: pendingFollowUpAgain |
| | | 0, // 8: followUpSuccessAgain |
| | | 0, // 9: followUpFailAgain |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | ]; |
| | | const summaries = this.isTargetHospital |
| | | ? [ |
| | | "å计", |
| | | "/", |
| | | "/", |
| | | 0, // 3: dischargeCount |
| | | 0, // 4: nonFollowUp |
| | | 0, // 5: followUpNeeded |
| | | 0, // 6: needFollowUpAgain |
| | | 0, // 7: pendingFollowUpWaitSendAgain |
| | | 0, // 8: pendingFollowUpSentAgain |
| | | 0, // 9: followUpSuccessAgain |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | ] |
| | | : [ |
| | | "å计", |
| | | "/", |
| | | "/", |
| | | 0, // 3: dischargeCount |
| | | 0, // 4: nonFollowUp |
| | | 0, // 5: followUpNeeded |
| | | 0, // 6: needFollowUpAgain |
| | | 0, // 7: pendingFollowUpAgain |
| | | 0, // 8: followUpSuccessAgain |
| | | 0, // 9: followUpFailAgain |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | ]; |
| | | |
| | | const methodFields = this.getMethodColumns().reduce( |
| | | (arr, g) => arr.concat(g.fields), |
| | |
| | | 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; |
| | | if (this.isTargetHospital) { |
| | | summaries[7] += Number(item.pendingFollowUpWaitSendAgain) || 0; |
| | | summaries[8] += Number(item.pendingFollowUpSentAgain) || 0; |
| | | summaries[9] += Number(item.followUpSuccessAgain) || 0; |
| | | } else { |
| | | summaries[7] += Number(item.pendingFollowUpAgain) || 0; |
| | | summaries[8] += Number(item.followUpSuccessAgain) || 0; |
| | | summaries[9] += Number(item.followUpFailAgain) || 0; |
| | | } |
| | | methodFields.forEach((field, i) => { |
| | | summaries[methodStartIndex + i] += Number(item[field]) || 0; |
| | | }); |
| | | }); |
| | | |
| | | // æåçè®¡ç® |
| | | const totalSuccess = summaries[8]; // followUpSuccessAgainçæ»å |
| | | const totalSuccess = this.isTargetHospital |
| | | ? summaries[9] // followUpSuccessAgainçæ»å |
| | | : summaries[8]; // followUpSuccessAgainçæ»å |
| | | const totalNeed = summaries[6]; // needFollowUpAgainçæ»å |
| | | const totalPending = summaries[7]; // pendingFollowUpAgainçæ»å |
| | | const denominator = totalNeed - totalPending; |
| | | const denominator = this.isTargetHospital |
| | | ? totalNeed |
| | | : totalNeed - summaries[7]; |
| | | |
| | | if (denominator > 0) { |
| | | summaries[10] = ((totalSuccess / denominator) * 100).toFixed(2) + "%"; |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ä»»å¡" prop="taskIds"> |
| | | <el-select |
| | | v-model="queryParams.taskIds" |
| | | multiple |
| | | filterable |
| | | clearable |
| | | collapse-tags |
| | | placeholder="è¯·éæ©ä»»å¡" |
| | | style="width: 220px" |
| | | > |
| | | <el-option |
| | | v-for="item in taskList" |
| | | :key="item.taskid" |
| | | :label="item.taskName" |
| | | :value="item.taskid" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label-width="200" label="åºé访æ¶é´èå´" prop="userName"> |
| | | <el-date-picker |
| | | v-model="queryParams.dateRange" |
| | |
| | | import QuestionRatioTable from "@/views/Satisfaction/sfstatistics/components/QuestionRatioTable.vue"; |
| | | import QuestionChart from "@/views/Satisfaction/sfstatistics/components/QuestionChart.vue"; |
| | | import followupAnalysisMixin from "./followupAnalysisMixin"; |
| | | import { getSfStatisticsHyperlink } from "@/api/AiCentre/index"; |
| | | import { getSfStatisticsHyperlink, getTasklist } from "@/api/AiCentre/index"; |
| | | |
| | | export default { |
| | | name: "Percentage", |
| | |
| | | options: this.$store.getters.tasktypes, |
| | | queryParams: { |
| | | serviceType: [2], |
| | | dateRange: [], |
| | | dateRangecy: this.getLastMonthRange(), |
| | | dateRange: |
| | | localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" |
| | | ? this.getLastMonthRange() |
| | | : [], |
| | | dateRangecy: '', |
| | | statisticaltype: |
| | | localStorage.getItem("orgname") == "ç¼äºå¿äººæ°å»é¢" || |
| | | localStorage.getItem("orgname") == "æ¯å®ç²æèªæ²»å¿äººæ°å»é¢" |
| | |
| | | : 1, |
| | | leavehospitaldistrictcodes: ["all"], |
| | | deptcodes: ["all"], |
| | | taskIds: [], |
| | | }, |
| | | pickerOptions: { |
| | | shortcuts: [ |
| | |
| | | }, |
| | | flatArrayhospit: [], |
| | | flatArraydept: [], |
| | | taskList: [], |
| | | allDeptCodes: [], |
| | | allWardCodes: [], |
| | | showSearch: true, |
| | |
| | | }, |
| | | created() { |
| | | this.getDeptTree(); |
| | | // å½åæºæä¸ºä¸½æ°´å¸ä¸å»é¢æ¶ï¼åºé访æ¶é´èå´é»è®¤æè¿ä¸ä¸ªæå¹¶ç´æ¥åºç¨ |
| | | if (localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢") { |
| | | this.queryParams.startTime = this.parseTime( |
| | | this.queryParams.dateRange[0] |
| | | ); |
| | | this.queryParams.endTime = this.parseTime( |
| | | this.queryParams.dateRange[1] |
| | | ); |
| | | } |
| | | this.loadCurrentTabData(); |
| | | }, |
| | | methods: { |
| | |
| | | |
| | | this.flatArraydept.push({ label: "å
¨é¨", value: "all" }); |
| | | this.flatArrayhospit.push({ label: "å
¨é¨", value: "all" }); |
| | | |
| | | // ä»»å¡å表ï¼ç¨äºä»»å¡çéï¼ |
| | | getTasklist({ pageNum: 1, pageSize: 100 }).then((response) => { |
| | | this.taskList = response.rows || []; |
| | | }); |
| | | }, |
| | | // æ·»å è·åæè¿ä¸ä¸ªææ¶é´èå´çæ¹æ³ |
| | | getLastMonthRange() { |
| | |
| | | resetQuery() { |
| | | this.queryParams.dateRange = []; |
| | | this.queryParams.leavehospitaldistrictcodes = []; |
| | | this.queryParams.taskIds = []; |
| | | this.handleQuery(); |
| | | }, |
| | | |
| | |
| | | v-if="columns[2].visible" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <!-- <el-table-column |
| | | label="é¨é¨" |
| | | <el-table-column |
| | | label="ç§å®¤" |
| | | align="center" |
| | | key="deptName" |
| | | prop="dept.deptName" |
| | | key="deptNames" |
| | | v-if="columns[3].visible" |
| | | :show-overflow-tooltip="true" |
| | | /> --> |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row._deptNames || "-" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ç
åº" |
| | | align="center" |
| | | key="wardNames" |
| | | v-if="columns[7].visible" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row._wardNames || "-" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é¢åº" |
| | | align="center" |
| | | key="campusName" |
| | | v-if="columns[8].visible && (orgname === '第ä¸äººæ°å»é¢æ¹æ»¨é¢åº' || orgname === '第ä¸äººæ°å»é¢å´å±±é¢åº' || orgname === '第ä¸äººæ°å»é¢åä¸é¢åº')" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row._campusName || "-" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ææºå·ç " |
| | | align="center" |
| | |
| | | deptTreeSelect, |
| | | } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { getorganization } from "@/api/AiCentre/index"; |
| | | import Treeselect from "@riophae/vue-treeselect"; |
| | | import "@riophae/vue-treeselect/dist/vue-treeselect.css"; |
| | | import { type } from "jquery"; |
| | |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | // å½åæºæåç§° |
| | | orgname: localStorage.getItem("orgname") || "", |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // ç¨æ·è¡¨æ ¼æ°æ® |
| | |
| | | // é¨é¨æ é项 |
| | | deptOptionsks: undefined, |
| | | deptOptionsbq: undefined, |
| | | // ç§å®¤ç¼ç -> åç§°æ å° |
| | | deptNameMap: {}, |
| | | // ç
åºç¼ç -> åç§°æ å° |
| | | wardNameMap: {}, |
| | | // é¢åºç¼ç -> åç§°æ å° |
| | | campusNameMap: {}, |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå± |
| | | open: false, |
| | | // é¨é¨åç§° |
| | |
| | | { key: 0, label: `ç¨æ·ç¼å·`, visible: true }, |
| | | { key: 1, label: `ç¨æ·å·¥å·`, visible: true }, |
| | | { key: 2, label: `ç¨æ·æµç§°`, visible: true }, |
| | | { key: 3, label: `é¨é¨`, visible: true }, |
| | | { key: 3, label: `ç§å®¤`, visible: true }, |
| | | { key: 4, label: `ææºå·ç `, visible: true }, |
| | | { key: 5, label: `ç¶æ`, visible: true }, |
| | | { key: 6, label: `å建æ¶é´`, visible: true }, |
| | | { key: 7, label: `ç
åº`, visible: true }, |
| | | { key: 8, label: `é¢åº`, visible: true }, |
| | | ], |
| | | |
| | | // è¡¨åæ ¡éª |
| | |
| | | }, |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | this.getDeptTree(); |
| | | this.getConfigKey("sys.user.initPassword").then((response) => { |
| | | this.initPassword = response.msg; |
| | |
| | | (response) => { |
| | | this.userList = response.rows; |
| | | this.total = response.total; |
| | | this.enrichUserDept(); |
| | | this.loading = false; |
| | | } |
| | | ); |
| | |
| | | /** æ¥è¯¢é¨é¨ä¸ææ ç»æ */ |
| | | getDeptTree() { |
| | | // ç§å®¤å表 |
| | | deptTreeSelect(1).then((response) => { |
| | | const ksPromise = deptTreeSelect(1).then((response) => { |
| | | this.deptOptionsks = response.data; |
| | | this.deptNameMap = this.flattenDeptTree(response.data); |
| | | }); |
| | | // ç
åºå表 |
| | | deptTreeSelect(2).then((response) => { |
| | | const bqPromise = deptTreeSelect(2).then((response) => { |
| | | this.deptOptionsbq = response.data; |
| | | this.wardNameMap = this.flattenDeptTree(response.data); |
| | | }); |
| | | // é¢åºå表 |
| | | // deptTreeSelect().then((response) => { |
| | | // this.deptOptions = response.data; |
| | | // }); |
| | | const campusPromise = getorganization({ pageSize: 100 }).then((res) => { |
| | | if (res.code == 200) { |
| | | (res.rows || []).forEach((item) => { |
| | | this.campusNameMap[String(item.organizationID)] = |
| | | item.organizationName; |
| | | }); |
| | | } |
| | | }); |
| | | // ç§å®¤/ç
åº/é¢åºæ å°å°±ç»ªååå è½½å表ï¼ä¿è¯é¦å±è½æ¾ç¤ºåç§° |
| | | Promise.all([ksPromise, bqPromise, campusPromise]).then(() => { |
| | | this.getList(); |
| | | }); |
| | | }, |
| | | /** å°ç§å®¤/ç
åºæ æå¹³ä¸º { deptCode: label } æ å° */ |
| | | flattenDeptTree(nodes) { |
| | | const map = {}; |
| | | const walk = (list) => { |
| | | (list || []).forEach((node) => { |
| | | if (node.deptCode) { |
| | | map[node.deptCode] = node.label; |
| | | } |
| | | if (node.children && node.children.length) { |
| | | walk(node.children); |
| | | } |
| | | }); |
| | | }; |
| | | walk(nodes); |
| | | return map; |
| | | }, |
| | | /** æ hospInfo/deptInfo ä¸çç¼ç 转æåç§°ï¼åå
¥è¡çå±ç¤ºå段 */ |
| | | enrichUserDept() { |
| | | (this.userList || []).forEach((row) => { |
| | | row._deptNames = this.mapCodesToNames(row.hospInfo, this.deptNameMap); |
| | | row._wardNames = this.mapCodesToNames(row.deptInfo, this.wardNameMap); |
| | | row._campusName = this.campusNameMap[String(row.campusid)] || "-"; |
| | | }); |
| | | }, |
| | | /** è§£æç¼ç JSON å¹¶æ å°ä¸ºåç§°ï¼çº§èè·¯å¾åå±ç¨ "/" è¿æ¥ï¼å¤æ¡ç¨ "ã" è¿æ¥ */ |
| | | mapCodesToNames(jsonStr, nameMap) { |
| | | if (!jsonStr || !nameMap) return ""; |
| | | let data = []; |
| | | try { |
| | | data = JSON.parse(jsonStr); |
| | | } catch (e) { |
| | | return ""; |
| | | } |
| | | if (!Array.isArray(data)) data = [data]; |
| | | return data |
| | | .map((item) => { |
| | | // 级èå¤éç弿¯æ´æ¡è·¯å¾ï¼æ°ç»ï¼ï¼æ§æ°æ®å¯è½æ¯å个ç¼ç |
| | | const path = Array.isArray(item) ? item : [item]; |
| | | return path |
| | | .map((code) => nameMap[code] || code) |
| | | .filter(Boolean) |
| | | .join(" / "); |
| | | }) |
| | | .filter(Boolean) |
| | | .join("ã"); |
| | | }, |
| | | // çéèç¹ |
| | | filterNode(value, data) { |