From b4fe2c16274a91fee4fb26d91374f95fbe2dbcec Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期一, 09 十一月 2026 15:28:21 +0800
Subject: [PATCH] 测试完成
---
src/views/patient/archives/generateConfig/index.vue | 58
随访适用丽水市一11.5.zip | 0
src/views/patient/patient/outpatient.vue | 27
src/views/Satisfaction/sfstatistics/components/visitStatistics.vue | 319 +
src/views/patient/propaganda/QuestionnaireTask.vue | 2
src/views/followvisit/operationAgain/index.vue | 1933 ++++++++++++
src/views/patient/archives/childHealth/detail.vue | 18
src/views/followvisit/record/detailpage/index.vue | 135
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue | 405 ++
11.3.zip | 0
src/views/patient/archives/maternalHealth/detail.vue | 20
src/views/patient/patient/behospitalized.vue | 160
src/views/patient/propaganda/Missioncreation.vue | 1
随访适用丽水市一11.5 (2).zip | 0
src/views/followvisit/discharge/index copy.vue | 2
src/views/patient/archives/apiAdapter.js | 11
src/views/sfstatistics/percentage/components/SecondFollowUp.vue | 550 ++-
src/api/system/user.js | 8
src/store/modules/user.js | 6
随访适用丽水市一11.3.zip | 0
src/views/sfstatistics/percentage/components/FirstFollowUp.vue | 848 +++-
src/views/followvisit/record/index.vue | 32
/dev/null | 3708 ------------------------
src/views/system/user/index.vue | 117
src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue | 322 ++
src/views/sfstatistics/percentage/index.vue | 45
src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue | 73
src/views/patient/patient/hospital.vue | 24
src/views/patient/patient/AwaitingAdmission.vue | 24
src/views/patient/propaganda/particty.vue | 1
随访适用丽水市一11.4.zip | 0
src/api/patient/record.js | 8
src/views/followvisit/discharge/index.vue | 49
src/views/patient/follow/index.vue | 28
src/views/sfstatistics/percentage/components/CombinedFollowUp.vue | 107
35 files changed, 4,740 insertions(+), 4,301 deletions(-)
diff --git a/11.3.zip b/11.3.zip
new file mode 100644
index 0000000..e7d53d0
--- /dev/null
+++ b/11.3.zip
Binary files differ
diff --git a/src/api/patient/record.js b/src/api/patient/record.js
index e318faa..c783c3b 100644
--- a/src/api/patient/record.js
+++ b/src/api/patient/record.js
@@ -42,3 +42,11 @@
data: data
})
};
+// 璇煶鏈嶅姟杞汉宸ワ細鍒犻櫎鎮h�呮湭瀹屾垚闅忚浠诲姟骞堕噸鏂扮敓鎴愪汉宸ラ殢璁夸换鍔�
+export function addManualVisit(data) {
+ return request({
+ url: '/smartor/patinhosp/addManualVisit',
+ method: 'post',
+ data: data
+ })
+};
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 97a0648..d35782a 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -126,6 +126,14 @@
data: data,
});
}
+// 闅忚棰樼洰閫夐」涓嬮捇鎮h�呮湇鍔″垪琛�
+export function getSfStatisticsCountDetailsHyperLink(data) {
+ return request({
+ url: "/smartor/serviceSubtask/getSfStatisticsCountDetailsHyperLink",
+ method: "post",
+ data: data,
+ });
+}
// 鏈強鏃舵煡璇�
export function selectTimelyRate(data) {
return request({
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index d98a63f..f8dec16 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -239,6 +239,12 @@
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");
diff --git a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
index 3f1c13d..9ac25b7 100644
--- a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -136,6 +136,8 @@
style="width: 100%"
@selection-change="handleSelectionChange"
:row-key="getRowKey"
+ show-summary
+ :summary-method="getSummaries"
>
<!-- 鐥呭尯鍒� -->
<el-table-column
@@ -801,6 +803,92 @@
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;
@@ -842,6 +930,113 @@
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 };
},
// 瀵煎嚭鏁版嵁
@@ -935,7 +1130,11 @@
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" } },
@@ -955,15 +1154,17 @@
},
};
- // 娣诲姞鎬绘爣棰�
- worksheet.mergeCells(1, 1, 1, 10);
- const titleCell = worksheet.getCell(1, 1);
- titleCell.value = `婊℃剰搴﹂殢璁跨粺璁¤〃锛�${sheetNameSuffix}锛塦;
- titleCell.style = titleStyle;
- worksheet.getRow(1).height = 35;
+ // 涓芥按甯備腑鍖婚櫌锛氶鍏堟媺鍙栭鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪
+ let lishuiTopics = [];
+ let lishuiRowQuantities = [];
+ if (isLishuiHospital) {
+ const built = await this.buildLishuiTopicColumns();
+ lishuiTopics = built.topics;
+ lishuiRowQuantities = built.rowQuantities;
+ }
- // 娣诲姞琛ㄥご
- const headers = [
+ // 涓昏〃鍒�
+ const mainHeaders = [
this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝",
"鍑洪櫌浜烘",
"鏃犻渶闅忚浜烘",
@@ -974,47 +1175,161 @@
"婊℃剰搴﹀~鎶ラ噺",
"瀹屾垚姣旂巼",
];
+ const mainColumnCount = mainHeaders.length;
- const headerRow = worksheet.addRow(headers);
- headerRow.eachCell((cell) => {
- cell.style = headerStyle;
- });
- headerRow.height = 25;
+ // 鎬诲垪鏁帮紙涓芥按甯備腑鍖婚櫌鍦ㄦ湯灏捐拷鍔犻鐩�夐」鍒楋級
+ const topicColumnCount = lishuiTopics.reduce(
+ (sum, t) => sum + (t.options.length || 1),
+ 0
+ );
+ const totalColumns = mainColumnCount + topicColumnCount;
- // 娣诲姞鏁版嵁琛�
- this.userList.forEach((item) => {
- const dataRow = worksheet.addRow([
- 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%",
- ]);
+ // 娣诲姞鎬绘爣棰�
+ worksheet.mergeCells(1, 1, 1, totalColumns);
+ const titleCell = worksheet.getCell(1, 1);
+ titleCell.value = `婊℃剰搴﹂殢璁跨粺璁¤〃锛�${sheetNameSuffix}锛塦;
+ titleCell.style = titleStyle;
+ worksheet.getRow(1).height = 35;
- 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 = [
- { width: 20 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 15 },
- { width: 15 },
- { width: 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();
diff --git a/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue b/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
index 3095477..ca5e54b 100644
--- a/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
+++ b/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
@@ -40,7 +40,14 @@
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
@@ -83,15 +90,26 @@
>
<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,
@@ -113,12 +131,18 @@
return {
processedTopicList: [],
orgname: "", // 鏂板锛氬尰闄㈠悕绉�
+ patientListVisible: false,
+ patientListTitle: "鎮h�呮湇鍔″垪琛�",
+ 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() {
@@ -158,6 +182,49 @@
this.processedTopicList = result;
},
+ // 鐐瑰嚮閫夐」鈥滈�夋嫨浜烘暟鈥濅笅閽诲埌鎮h�呮湇鍔″垪琛�
+ 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 = "";
diff --git a/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue b/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue
new file mode 100644
index 0000000..0b67aed
--- /dev/null
+++ b/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue
@@ -0,0 +1,322 @@
+<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">鎮h�呭鍚嶆煡璇�:</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="璐d换鎶ゅ+"
+ 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: "鎮h�呮湇鍔″垪琛�",
+ },
+ // 涓嬮捇璇锋眰鍙傛暟锛堜笉鍚垎椤碉級锛岀敱鐖剁粍浠舵瀯寤�
+ 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("鑾峰彇鎮h�呮湇鍔″垪琛ㄥけ璐�:", error);
+ this.$message.error("鑾峰彇鎮h�呮湇鍔″垪琛ㄥけ璐�");
+ } 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>
diff --git a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
index 2c7ed98..ea36ad9 100644
--- a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
@@ -383,6 +383,7 @@
// 鍔犺浇鐘舵��
loading: false,
+ orgname: "",
// 閫変腑鐨勮
ids: [],
@@ -441,6 +442,7 @@
},
created() {
+ this.orgname = localStorage.getItem("orgname");
this.initData();
},
@@ -824,6 +826,113 @@
}
},
+ // 鑾峰彇鎸囧畾鐥呭尯/绉戝鐨勯鐩鎯�
+ 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) {
@@ -916,7 +1025,11 @@
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" } },
@@ -936,15 +1049,17 @@
},
};
- // 娣诲姞鎬绘爣棰�
- worksheet.mergeCells(1, 1, 1, 10);
- const titleCell = worksheet.getCell(1, 1);
- titleCell.value = `澶嶈瘖閫氱煡缁熻琛紙${sheetNameSuffix}锛塦;
- titleCell.style = titleStyle;
- worksheet.getRow(1).height = 35;
+ // 涓芥按甯備腑鍖婚櫌锛氶鍏堟媺鍙栭鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪
+ let lishuiTopics = [];
+ let lishuiRowQuantities = [];
+ if (isLishuiHospital) {
+ const built = await this.buildLishuiTopicColumns();
+ lishuiTopics = built.topics;
+ lishuiRowQuantities = built.rowQuantities;
+ }
- // 娣诲姞琛ㄥご
- const headers = [
+ // 涓昏〃鍒�
+ const mainHeaders = [
this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝",
"鍑洪櫌浜烘",
"鏃犻渶闅忚浜烘",
@@ -955,47 +1070,161 @@
"澶嶈瘖閫氱煡濉姤閲�",
"瀹屾垚姣旂巼",
];
+ const mainColumnCount = mainHeaders.length;
- const headerRow = worksheet.addRow(headers);
- headerRow.eachCell((cell) => {
- cell.style = headerStyle;
- });
- headerRow.height = 25;
+ // 鎬诲垪鏁帮紙涓芥按甯備腑鍖婚櫌鍦ㄦ湯灏捐拷鍔犻鐩�夐」鍒楋級
+ const topicColumnCount = lishuiTopics.reduce(
+ (sum, t) => sum + (t.options.length || 1),
+ 0
+ );
+ const totalColumns = mainColumnCount + topicColumnCount;
- // 娣诲姞鏁版嵁琛�
- this.userList.forEach((item) => {
- const dataRow = worksheet.addRow([
- 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%",
- ]);
+ // 娣诲姞鎬绘爣棰�
+ worksheet.mergeCells(1, 1, 1, totalColumns);
+ const titleCell = worksheet.getCell(1, 1);
+ titleCell.value = `澶嶈瘖閫氱煡缁熻琛紙${sheetNameSuffix}锛塦;
+ titleCell.style = titleStyle;
+ worksheet.getRow(1).height = 35;
- 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 = [
- { width: 20 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 12 },
- { width: 15 },
- { width: 15 },
- { width: 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();
diff --git a/src/views/followvisit/discharge/index copy.vue b/src/views/followvisit/discharge/index copy.vue
index 04a61d9..b10c016 100644
--- a/src/views/followvisit/discharge/index copy.vue
+++ b/src/views/followvisit/discharge/index copy.vue
@@ -911,7 +911,7 @@
},
// endOut: 1,
endOut:
- localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+ localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
endOuts: [
{
value: 0,
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index f99e472..99ad37f 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -73,7 +73,7 @@
<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">
@@ -115,6 +115,24 @@
<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"
@@ -1320,7 +1338,7 @@
},
// endOut: 1,
endOut:
- localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+ localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
endOuts: [
{
value: 0,
@@ -1384,6 +1402,7 @@
: "",
leaveldeptcodes: [],
leavehospitaldistrictcodes: [],
+ currentPreachforms: [],
},
orgname: "",
propss: { multiple: true },
@@ -1414,6 +1433,16 @@
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: [
@@ -1613,7 +1642,12 @@
}
try {
- const response = await getTaskservelist(this.topqueryParams);
+ // 褰撳墠鎵ц鏂瑰紡涓哄閫夛紝闇�杞垚閫楀彿鍒嗛殧瀛楃涓诧紙濡� 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;
@@ -1660,10 +1694,11 @@
});
}
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;
}
});
@@ -2002,6 +2037,7 @@
scopetype: [],
leaveldeptcodes: [],
leavehospitaldistrictcodes: [],
+ currentPreachforms: [],
};
this.handleQuery(1);
},
@@ -2022,6 +2058,7 @@
scopetype: [],
leaveldeptcodes: [],
leavehospitaldistrictcodes: [],
+ currentPreachforms: [],
};
},
handleSelectionChange(rows) {
diff --git a/src/views/followvisit/operationAgain/index.vue b/src/views/followvisit/operationAgain/index.vue
new file mode 100644
index 0000000..5abcbbe
--- /dev/null
+++ b/src/views/followvisit/operationAgain/index.vue
@@ -0,0 +1,1933 @@
+<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="鎮h�呭鍚�" 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="鎮h�呰寖鍥�" 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="璐d换鎶ゅ+"
+ 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>鎮h�呰繃婊�</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 ? '淇敼鎮h�呬俊鎭�' : '鏂板鎮h��'"
+ :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>
+ 璇ュ姛鑳介�傜敤浜庢浜°�佸垪鍏ュ尰闄㈤粦鍚嶅崟銆佹槑纭嫆缁濋殢璁跨瓑鎮h�呯殑杩囨护鎺掗櫎锛岃繃婊ゅ悗璇ユ偅鑰呮墍鏈夎繘琛屼腑浠诲姟鍏ㄩ儴鍋滄涓旀棤娉曞尮閰嶆柊鐨勯殢璁夸换鍔★紝璇疯皑鎱庢搷浣滐紒
+ </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="鎮h�呭啀娆¢殢璁�" :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="鎮h�呭悕绉�">
+ <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: "鎮h�呮湇鍔℃�婚噺",
+ 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: "鏈嶅姟鏃堕棿(姝e簭)",
+ },
+ {
+ value: 1,
+ label: "鏈嶅姟鏃堕棿(鍊掑簭)",
+ },
+ {
+ value: 2,
+ label: "鍙戦�佹椂闂�(姝e簭)",
+ },
+ {
+ value: 3,
+ label: "鍙戦�佹椂闂�(鍊掑簭)",
+ },
+ {
+ value: 7,
+ label: "搴旈殢璁挎棩鏈�(姝e簭)",
+ },
+ {
+ value: 8,
+ label: "搴旈殢璁挎棩鏈�(鍊掑簭)",
+ },
+ ],
+ // 鏌ヨ鍙傛暟
+ topqueryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ sendstateView:1,
+ sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鏈嶅姟鏃堕棿(姝e簭) 1 鏈嶅姟鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+ 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: "姝e父",
+ },
+ ],
+ 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
+ );
+ // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖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
+ );
+ // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖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);
+ },
+ // 鎮h�呰寖鍥村鐞�
+ 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 鏈嶅姟鏃堕棿(姝e簭) 1 鏈嶅姟鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 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,
+ },
+ });
+ },
+ //鎮h��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("鎮h�呰繃婊ゆ垚鍔�");
+ });
+
+ 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 +
+ '鎮h�呭悕绉颁负"' +
+ 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(() => {});
+ },
+ // 鎮h�呰繃婊よЕ鍙�
+ 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>
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index d52a2b9..99123e5 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -127,10 +127,9 @@
</el-tooltip>
</template>
</el-table-column>
- <el-table-column
+ <el-table-column
v-if="
- orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�' ||
- orgname == '涓芥按甯備腑鍖婚櫌'
+ orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�' || orgname == '涓芥按甯備腑鍖婚櫌'
"
label="鎷ㄥ彿鐘舵��"
width="120"
@@ -305,8 +304,6 @@
show-overflow-tooltip
>
</el-table-column>
-
-
<el-table-column
prop="bankcardno"
@@ -718,7 +715,13 @@
<!-- 椤堕儴鎿嶄綔鍖哄煙 -->
<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('')">
@@ -798,6 +801,8 @@
</div>
</div>
</div>
+
+
<!-- 琛ㄥ崟鍖哄煙 -->
<div class="form-content">
@@ -1017,6 +1022,14 @@
</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"
@@ -1278,6 +1291,15 @@
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>
<!-- 涓嬫闅忚淇℃伅 - 榛樿灞曞紑 -->
@@ -1328,7 +1350,10 @@
</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>
@@ -1336,11 +1361,12 @@
<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>
@@ -1639,8 +1665,19 @@
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: {
@@ -1764,6 +1801,10 @@
failed: "error",
};
return typeMap[this.callStatus];
+ },
+ // 鍖荤敓澶勭悊鎰忚鏄惁蹇呭~锛氶殢璁跨被鍨嬮�夈�岄殢璁夸腑蹇冮殢璁裤�嶄笖褰撳墠鏈烘瀯涓轰附姘村競涓尰闄�
+ isDoctorOpinionRequired() {
+ return this.form.resource == "2" && this.orgname === "涓芥按甯備腑鍖婚櫌";
},
// 鏄惁浠ラ棶鍗峰舰寮忓睍绀猴紙闈炶闊虫湇鍔★紝鎴栬闊虫湇鍔′絾鏃犲畬鏁磋闊虫暟鎹渶鎵嬪姩濉姤锛�
showQuestionnaireForm() {
@@ -2274,6 +2315,26 @@
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);
@@ -2635,7 +2696,8 @@
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;
@@ -3069,6 +3131,14 @@
}
});
},
+ // 鍒囨崲闅忚绫诲瀷鍚庯紝閲嶇疆鍖荤敓澶勭悊鎰忚鐨勬牎楠岀姸鎬侊紙蹇呭~鏉′欢闅忕被鍨嬪彉鍖栵級
+ handleResourceChange() {
+ this.$nextTick(() => {
+ if (this.$refs.zcform) {
+ this.$refs.zcform.clearValidate("doctorOpinion");
+ }
+ });
+ },
// 鍒涘缓鍐嶆闅忚鏈嶅姟
setupsubtask() {
this.$refs["zcform"].validate((valid) => {
@@ -3084,6 +3154,10 @@
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) {
@@ -4121,6 +4195,41 @@
}
}
+/* 涓婃鐨勫鐞嗘剰瑙� */
+.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;
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
index 24a3773..de3b3c4 100644
--- a/src/views/followvisit/record/index.vue
+++ b/src/views/followvisit/record/index.vue
@@ -70,6 +70,18 @@
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"
@@ -368,6 +380,13 @@
align="center"
key="drname"
prop="drname"
+ />
+ <el-table-column
+ label="缁忕鍖荤敓"
+ align="center"
+ key="managementDoctor"
+ prop="managementDoctor"
+ width="120"
/>
<el-table-column
label="璇婃柇鍚嶇О"
@@ -964,15 +983,20 @@
serviceType: 13,
searchscope: 3,
sendstateView: 1,
-
+ visitCount: 1,
sendstate: null,
- sort:
+ sort:
localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌"
? 8
: localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�"
? 2
: 1, //0 鍑洪櫌鏃堕棿(姝e簭) 1 鍑洪櫌鏃堕棿(鍊掑簭) 2 鍙戦�佹椂闂�(姝e簭) 3 鍙戦�佹椂闂�(鍊掑簭) 7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭) scopetype: [],
leaveldeptcodes: [],
+ managementDoctor:
+ localStorage.getItem("orgname") == "缂欎簯鍘夸汉姘戝尰闄�" ||
+ localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌"
+ ? store.getters.nickName
+ : "",
leavehospitaldistrictcodes: [],
},
propss: { multiple: true },
@@ -1399,6 +1423,8 @@
sort: 2,
searchscope: 2,
sendstateView: 1,
+ visitCount: 1,
+
scopetype: [],
leaveldeptcodes: [],
leavehospitaldistrictcodes: [],
@@ -1563,6 +1589,8 @@
Voicetype: type,
visitCount: 1,
again: 1,
+ visitCount: this.topqueryParams.visitCount,
+
},
});
},
diff --git a/src/views/patient/archives/apiAdapter.js b/src/views/patient/archives/apiAdapter.js
index 3b1ec81..3967ff4 100644
--- a/src/views/patient/archives/apiAdapter.js
+++ b/src/views/patient/archives/apiAdapter.js
@@ -115,6 +115,11 @@
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;
}
@@ -266,6 +271,12 @@
closeStatus: archive.closeStatus == null ? "0" : String(archive.closeStatus),
});
+ // 闅忚鍛ㄦ湡锛�5 绉嶄笓妗堢粺涓�瀛� followupPeriod锛圝SON 鏁扮粍锛夈��
+ // pregnancy 鐨� followupCycle 鏀惧湪 pregFormData 閲岋紝鐢变笅鏂� pregnancy 鍒嗘敮鍗曠嫭澶勭悊锛岃繖閲屾帓闄や互鍏嶈瑕嗙洊銆�
+ if (key !== "pregnancy") {
+ payload.followupPeriod = packJson(archive.followupCycle || []);
+ }
+
if (key === "pregnancy") {
const p = archive.pregFormData || {};
const reg = p.registration || {};
diff --git a/src/views/patient/archives/childHealth/detail.vue b/src/views/patient/archives/childHealth/detail.vue
index 2c13ee6..3fc4b09 100644
--- a/src/views/patient/archives/childHealth/detail.vue
+++ b/src/views/patient/archives/childHealth/detail.vue
@@ -173,6 +173,12 @@
</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">
@@ -205,6 +211,16 @@
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" },
@@ -297,6 +313,7 @@
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();
@@ -333,6 +350,7 @@
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(() => {
diff --git a/src/views/patient/archives/generateConfig/index.vue b/src/views/patient/archives/generateConfig/index.vue
index 6570053..2a2c077 100644
--- a/src/views/patient/archives/generateConfig/index.vue
+++ b/src/views/patient/archives/generateConfig/index.vue
@@ -182,6 +182,20 @@
</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"
@@ -241,7 +255,7 @@
<el-dialog
:title="dialogTitle"
:visible.sync="dialogVisible"
- width="45%"
+ width="60%"
:close-on-click-modal="false"
@close="cancelForm"
>
@@ -337,6 +351,16 @@
<div class="form-tip">浠庣柧鐥呰瘖鏂〃涓�夋嫨锛屾寜 ICD10 缂栫爜鍖归厤鎮h��</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"
@@ -375,6 +399,7 @@
} 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 = [
@@ -403,7 +428,7 @@
export default {
name: "GenerateConfig",
- components: { OptionalForm },
+ components: { OptionalForm, EditableTable },
data() {
// 绉戝/鐥呭尯缂栫爜 涓� 璇婃柇缂栫爜 鑷冲皯濉啓涓�椤癸紝鍚﹀垯璇ヨ鍒欐棤娉曞尮閰嶄换浣曟偅鑰�
const validateDeptOrIcd = (rule, value, callback) => {
@@ -420,6 +445,14 @@
// 甯搁噺
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,
@@ -461,6 +494,7 @@
archiveType: "",
deptCodes: [],
icdList: [],
+ followupCycle: [],
remark: "",
},
// 琛ㄥ崟鏍¢獙
@@ -583,6 +617,7 @@
archiveType: row.archiveType || "",
deptCodes: this.parseJsonArray(row.deptCodes),
icdList: this.resolveIcdCodes(row.icd10Codes),
+ followupCycle: this.parseJsonArray(row.followupPeriod),
remark: row.remark || "",
};
},
@@ -657,6 +692,10 @@
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) => {
@@ -694,6 +733,7 @@
archiveType: "",
deptCodes: [],
icdList: [],
+ followupCycle: [],
remark: "",
};
},
@@ -759,6 +799,20 @@
.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("銆�");
+ },
+
/** 瑙f瀽鍚庣杩斿洖鐨� JSON 瀛楃涓诧紙deptCodes / icd10Codes锛� */
parseJsonArray(val) {
if (!val) return [];
diff --git a/src/views/patient/archives/maternalHealth/detail.vue b/src/views/patient/archives/maternalHealth/detail.vue
index c654b43..df11566 100644
--- a/src/views/patient/archives/maternalHealth/detail.vue
+++ b/src/views/patient/archives/maternalHealth/detail.vue
@@ -173,6 +173,19 @@
</el-card>
</template>
+ <!-- 闅忚鍛ㄦ湡锛堝洿缁濈粡鏈烳HI锛� -->
+ <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">
@@ -404,6 +417,7 @@
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" },
@@ -536,6 +550,7 @@
if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
});
}
+ this.followupCycle = this.archive.followupCycle || [];
}
}
if (autoEdit) this.editing = true;
@@ -611,7 +626,10 @@
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(() => {
diff --git a/src/views/patient/follow/index.vue b/src/views/patient/follow/index.vue
index d29ceff..2e403ef 100644
--- a/src/views/patient/follow/index.vue
+++ b/src/views/patient/follow/index.vue
@@ -388,11 +388,39 @@
},
},
created() {
+ // 褰撳墠鏈烘瀯涓轰附姘村競涓尰闄㈡椂锛屽缓妗f棩鏈熼粯璁ゆ渶杩戜竴涓湀
+ 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)];
+ },
/** 鏌ヨ鎮h�呭垪琛� */
getList() {
this.loading = true;
diff --git a/src/views/patient/patient/AwaitingAdmission.vue b/src/views/patient/patient/AwaitingAdmission.vue
index 64fb662..ac01323 100644
--- a/src/views/patient/patient/AwaitingAdmission.vue
+++ b/src/views/patient/patient/AwaitingAdmission.vue
@@ -433,6 +433,13 @@
</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>
@@ -631,6 +638,11 @@
taskList: [], // 浠诲姟鍒楄〃
selectedTask: null, // 閫変腑鐨勪换鍔″垪琛�
batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+ taskQueryParams: {
+ pageNum: 1,
+ pageSize: 20,
+ },
+ taskTotal: 0,
deptcode: "",
Patientrange: [
{
@@ -1070,22 +1082,24 @@
// 鏄剧ず寮圭獥
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;
});
},
diff --git a/src/views/patient/patient/behospitalized.vue b/src/views/patient/patient/behospitalized.vue
index f1f22c6..b92d1e1 100644
--- a/src/views/patient/patient/behospitalized.vue
+++ b/src/views/patient/patient/behospitalized.vue
@@ -122,6 +122,20 @@
娣诲姞寤剁画鎶ょ悊浠诲姟
</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"
@@ -314,7 +328,7 @@
<!-- 鎵归噺娣诲姞寤剁画鎶ょ悊浠诲姟寮圭獥 -->
<!-- 鎵归噺娣诲姞寤剁画鎶ょ悊浠诲姟寮圭獥 -->
<el-dialog
- title="鎵归噺娣诲姞寤剁画鎶ょ悊"
+ :title="batchMode === 'manual' ? '璇煶鏈嶅姟杞汉宸�' : '鎵归噺娣诲姞寤剁画鎶ょ悊'"
:visible.sync="batchTaskVisible"
width="90%"
append-to-body
@@ -391,7 +405,9 @@
<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>
@@ -453,7 +469,11 @@
<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>
@@ -473,7 +493,15 @@
@click="submitBatchTask"
:disabled="!selectedTask || batchLoading"
>
- {{ batchLoading ? "鍒涘缓涓�..." : "鍒涘缓寤剁画鎶ょ悊浠诲姟" }}
+ {{
+ batchLoading
+ ? batchMode === "manual"
+ ? "杞崲涓�..."
+ : "鍒涘缓涓�..."
+ : batchMode === "manual"
+ ? "纭杞汉宸�"
+ : "鍒涘缓寤剁画鎶ょ悊浠诲姟"
+ }}
</el-button>
</div>
</el-dialog>
@@ -581,7 +609,7 @@
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,
@@ -639,6 +667,7 @@
initPassword: undefined,
amendtag: false, //鏄惁淇敼
// 鎵归噺浠诲姟鐩稿叧鏁版嵁
+ batchMode: "continue", // 寮圭獥妯″紡锛歝ontinue 寤剁画鎶ょ悊 / manual 璇煶鏈嶅姟杞汉宸�
batchTaskVisible: false, // 寮圭獥鍙鎬�
selectedPatients: [], // 閫変腑鐨勬偅鑰呭垪琛�
taskList: [], // 浠诲姟鍒楄〃
@@ -669,7 +698,7 @@
label: "鐥呭尯鎮h��",
},
],
- orgName: localStorage.getItem("orgname"),
+ orgname: localStorage.getItem("orgname"),
postData: {
XiaoXiTou: {
@@ -811,6 +840,8 @@
this.queryParams.leavehospitaldistrictcodes = store.getters.belongWards.map(
(obj) => obj.districtCode
);
+ console.log(this.orgname);
+
this.getList();
// this.listDept();
this.gettabList();
@@ -929,37 +960,52 @@
return;
}
- // 鑾峰彇閫変腑鎮h�呯殑绉戝淇℃伅
- 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";
// 鑾峰彇閫変腑鎮h�呭垪琛�
this.selectedPatients = this.userList.filter((item) =>
this.ids.includes(item.patid)
);
+ this.selectedTask = null;
// 鏄剧ず寮圭獥
this.batchTaskVisible = true;
// 鑾峰彇浠诲姟鍒楄〃
- this.loadTaskList(deptcode);
+ this.loadTaskList();
+ },
+
+ /** 璇煶鏈嶅姟杞汉宸ユ寜閽偣鍑� */
+ handleManualVisit() {
+ // 鏍¢獙鏄惁閫変腑鎮h��
+ if (this.ids.length === 0) {
+ this.$modal.msgWarning("璇疯嚦灏戦�変腑1鍚嶆偅鑰�");
+ return;
+ }
+
+ this.batchMode = "manual";
+ // 鑾峰彇閫変腑鎮h�呭垪琛�
+ 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
);
@@ -968,11 +1014,21 @@
);
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) => {
@@ -981,16 +1037,38 @@
});
},
+ /** 鍒ゆ柇鏄惁涓恒�屼汉宸ャ�嶄换鍔″舰寮忥紙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;
}
@@ -1066,6 +1144,40 @@
}
},
+ /** 璇煶鏈嶅姟杞汉宸ワ細鍒犻櫎鏈畬鎴愰殢璁夸换鍔″苟閲嶆柊鐢熸垚浜哄伐闅忚浠诲姟 */
+ 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} 浜烘棤鎮h�呮。妗坄;
+ if (failed) msg += `锛�${failed} 浜虹敓鎴愬け璐;
+ this.$modal.msgSuccess(msg);
+ this.batchTaskVisible = false;
+ this.getList(); // 鍒锋柊鎮h�呭垪琛�
+ } else {
+ this.$modal.msgError(response.msg || "璇煶鏈嶅姟杞汉宸ュけ璐�");
+ }
+ } catch (error) {
+ this.$modal.msgError(
+ "璇煶鏈嶅姟杞汉宸ュけ璐ワ細" + (error.message || "缃戠粶閿欒")
+ );
+ } finally {
+ this.batchLoading = false;
+ }
+ },
+
/** 璁$畻闅忚缁撴潫鏃堕棿锛堝湪闄㈡偅鑰咃細鍑洪櫌鍚�7澶╋級 */
getFollowUpEndTime(admitDate) {
if (!admitDate) return "";
diff --git a/src/views/patient/patient/hospital.vue b/src/views/patient/patient/hospital.vue
index 9058f8a..7f12039 100644
--- a/src/views/patient/patient/hospital.vue
+++ b/src/views/patient/patient/hospital.vue
@@ -500,6 +500,13 @@
</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>
@@ -676,6 +683,11 @@
taskList: [], // 浠诲姟鍒楄〃
selectedTask: null, // 閫変腑鐨勪换鍔�
batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+ taskQueryParams: {
+ pageNum: 1,
+ pageSize: 20,
+ },
+ taskTotal: 0,
// 鏃ユ湡鑼冨洿
dateRange: [],
source: [
@@ -920,8 +932,9 @@
// 鏄剧ず寮圭獥
this.batchTaskVisible = true;
- // 鑾峰彇浠诲姟鍒楄〃
- this.loadTaskList(deptcode);
+ // 閲嶇疆浠诲姟鍒嗛〉骞惰幏鍙栦换鍔″垪琛�
+ this.taskQueryParams.pageNum = 1;
+ this.loadTaskList();
},
/** 琛ㄦ牸琛屾牱寮� */
tableRowClassName({ row, rowIndex }) {
@@ -941,11 +954,11 @@
}
},
/** 鍔犺浇浠诲姟鍒楄〃 */
- 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(
@@ -957,6 +970,7 @@
getTasklist(topqueryParams)
.then((response) => {
this.taskList = response.rows;
+ this.taskTotal = response.total;
this.batchLoading = false;
if (this.taskList.length === 0) {
diff --git a/src/views/patient/patient/outpatient.vue b/src/views/patient/patient/outpatient.vue
index 4ec86cf..7cfad0f 100644
--- a/src/views/patient/patient/outpatient.vue
+++ b/src/views/patient/patient/outpatient.vue
@@ -168,6 +168,7 @@
</el-col>
<el-col :span="1.5">
<el-button
+ v-if="orgname='涓芥按甯傚骞间繚鍋ラ櫌'"
type="success"
plain
icon="el-icon-folder-add"
@@ -475,6 +476,13 @@
</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>
@@ -681,6 +689,11 @@
taskList: [], // 浠诲姟鍒楄〃
selectedTask: null, // 閫変腑鐨勪换鍔″垪琛�
batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+ taskQueryParams: {
+ pageNum: 1,
+ pageSize: 20,
+ },
+ taskTotal: 0,
// 鎮h�呭缓妗�
archiveDialogVisible: false,
archivePatients: [],
@@ -695,7 +708,7 @@
id: 1,
},
],
- orgName: localStorage.getItem("orgname"),
+ orgname: localStorage.getItem("orgname"),
postData: {
XiaoXiTou: {
FaSongFCSJC: "ZJHES",
@@ -1149,22 +1162,24 @@
// 鏄剧ず寮圭獥
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;
});
},
diff --git a/src/views/patient/propaganda/Missioncreation.vue b/src/views/patient/propaganda/Missioncreation.vue
index db38b79..eaa298b 100644
--- a/src/views/patient/propaganda/Missioncreation.vue
+++ b/src/views/patient/propaganda/Missioncreation.vue
@@ -1741,6 +1741,7 @@
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) => {
diff --git a/src/views/patient/propaganda/QuestionnaireTask.vue b/src/views/patient/propaganda/QuestionnaireTask.vue
index 4235af7..1cea8bc 100644
--- a/src/views/patient/propaganda/QuestionnaireTask.vue
+++ b/src/views/patient/propaganda/QuestionnaireTask.vue
@@ -2256,8 +2256,8 @@
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) => {
diff --git a/src/views/patient/propaganda/particty.vue b/src/views/patient/propaganda/particty.vue
index 16482f9..c8887a6 100644
--- a/src/views/patient/propaganda/particty.vue
+++ b/src/views/patient/propaganda/particty.vue
@@ -2280,6 +2280,7 @@
this.deptcodesWards = [];
this.medicalCodes = [];
this.medicalOptions = [];
+ this.queryParamsdept.taskid = this.form.taskid;
this.queryParamsdept.taskId = this.form.taskid;
if (this.form.appltype == 5) {
diff --git a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
index ebdec78..b070bbf 100644
--- a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
@@ -621,6 +621,46 @@
</el-table-column>
</el-table-column>
+ <!-- ===== 闅忚鎯呭喌锛堜附姘村競涓尰闄紝浠庨娆¢殢璁跨Щ鍏ワ級 ===== -->
+ <el-table-column align="center" label="闅忚鎯呭喌">
+ <el-table-column
+ label="姝e父璇煶"
+ align="center"
+ width="100"
+ prop="taskSituation1"
+ />
+ <el-table-column
+ label="鎮h�呮嫆鎺ユ垨鎷掕"
+ 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="闅忚鐜�"
@@ -662,6 +702,39 @@
>
<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>
@@ -979,6 +1052,14 @@
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;
@@ -1020,6 +1101,19 @@
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);
@@ -1714,6 +1808,19 @@
[h("span", column.label)]
);
},
+ TooltipAgainFollowUpPushRate(h, { column }) {
+ return h(
+ "el-tooltip",
+ {
+ props: {
+ content: "鍐嶆闅忚鎺ㄩ�佷汉鏁�/鍑洪櫌浜烘",
+ placement: "top",
+ effect: "dark",
+ },
+ },
+ [h("span", column.label)]
+ );
+ },
},
};
</script>
diff --git a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
index adabf9f..ff4f3c8 100644
--- a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
@@ -156,6 +156,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰呴殢璁�"
align="center"
key="pendingFollowUp"
@@ -179,6 +180,62 @@
}}</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="闅忚鎴愬姛"
@@ -206,6 +263,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="闅忚澶辫触"
align="center"
key="followUpFail"
@@ -272,9 +330,9 @@
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>
@@ -476,6 +534,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰呴殢璁�"
align="center"
key="pendingFollowUp"
@@ -496,6 +555,60 @@
<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="闅忚鎴愬姛"
@@ -520,6 +633,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="闅忚澶辫触"
align="center"
key="followUpFail"
@@ -583,73 +697,39 @@
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"
@@ -672,7 +752,7 @@
</template>
</el-table-column>
<el-table-column
- label="鏈�缁堝畬鎴�"
+ label="鎴愬姛鏁�"
align="center"
key="voiceSuccess"
prop="voiceSuccess"
@@ -690,74 +770,14 @@
)
"
>
- <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"
@@ -780,7 +800,7 @@
</template>
</el-table-column>
<el-table-column
- label="鏈�缁堝畬鎴�"
+ label="鎴愬姛鏁�"
align="center"
key="weChatSuccess"
prop="weChatSuccess"
@@ -798,13 +818,108 @@
)
"
>
- <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="浜哄伐"
@@ -881,11 +996,9 @@
</el-table-column>
</el-table-column>
- <!-- 闅忚鎯呭喌鍒楋紙浠呬附姘村競涓尰闄㈡樉绀猴級 -->
+ <!-- 闅忚鎯呭喌鍒楋紙涓芥按甯備腑鍖婚櫌宸茬Щ鍒扮患鍚堢粺璁★紝姝ゅ浠呮櫙瀹佺暡鏃忚嚜娌诲幙浜烘皯鍖婚櫌鏄剧ず锛� -->
<el-table-column
- v-if="
- orgname == '涓芥按甯備腑鍖婚櫌' || orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'
- "
+ v-if="orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
align="center"
label="闅忚鎯呭喌"
>
@@ -1090,8 +1203,8 @@
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%";
@@ -1099,6 +1212,26 @@
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) {
@@ -1129,17 +1262,51 @@
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];
@@ -1185,7 +1352,9 @@
"el-tooltip",
{
props: {
- content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
+ content: this.isTargetHospital
+ ? "闅忚鎴愬姛/闇�闅忚"
+ : "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
placement: "top",
effect: "dark",
},
@@ -1198,8 +1367,9 @@
"el-tooltip",
{
props: {
- content:
- "(鍑洪櫌鏃堕棿+浠诲姟鍛ㄦ湡)灏忎簬瀹屾垚鏃堕棿鍗充负瓒呮椂;(闇�闅忚-瓒呮椂)/闇�闅忚",
+ content: this.isTargetHospital
+ ? "鍙婃椂鐜�=(闇�闅忚-浜哄伐瑙勫畾鏃堕棿鍐呮病鎵撹繃鐢佃瘽)/闇�闅忚"
+ : "(鍑洪櫌鏃堕棿+浠诲姟鍛ㄦ湡)灏忎簬瀹屾垚鏃堕棿鍗充负瓒呮椂;(闇�闅忚-瓒呮椂)/闇�闅忚",
placement: "top",
effect: "dark",
},
@@ -1275,17 +1445,51 @@
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];
@@ -1629,13 +1833,12 @@
},
};
- // 鏍囬
- 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 = [
"鍖荤敓濮撳悕",
"绉戝",
@@ -1643,13 +1846,26 @@
"鏃犻渶闅忚",
"搴旈殢璁�",
"闇�闅忚",
- "寰呴殢璁�",
+ ...(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;
@@ -1665,15 +1881,26 @@
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;
@@ -1691,58 +1918,66 @@
};
});
- // 鍒楀
- 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
@@ -1758,6 +1993,38 @@
).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;
},
@@ -1835,7 +2102,7 @@
right: { style: "thin", color: { argb: "FFD0D0D0" } },
},
};
- // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+ // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佹暟/鎴愬姛鏁� 鍒嗙骇灞曠ず锛�
const graded = this.isTargetHospital;
const baseHeaders = [
@@ -1846,15 +2113,25 @@
"鏃犻渶闅忚浜烘",
"搴旈殢璁夸汉娆�",
];
- const coreHeaders = [
- "闇�闅忚",
- "寰呴殢璁�",
- "闅忚鎴愬姛",
- "闅忚澶辫触",
- "鎴愬姛鐜�",
- "闅忚鐜�",
- "鍙婃椂鐜�",
- ];
+ const coreHeaders = this.isTargetHospital
+ ? [
+ "闇�闅忚",
+ "寰呭彂閫�",
+ "宸插彂閫�",
+ "闅忚鎴愬姛",
+ "鎴愬姛鐜�",
+ "闅忚鐜�",
+ "鍙婃椂鐜�",
+ ]
+ : [
+ "闇�闅忚",
+ "寰呴殢璁�",
+ "闅忚鎴愬姛",
+ "闅忚澶辫触",
+ "鎴愬姛鐜�",
+ "闅忚鐜�",
+ "鍙婃椂鐜�",
+ ];
const methodGroups = this.getMethodColumns();
const baseCount = baseHeaders.length; // 6
@@ -1890,14 +2167,37 @@
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) {
@@ -1909,7 +2209,7 @@
mc += g.fields.length;
});
- // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+ // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佹暟/鎴愬姛鏁帮級
mc = methodStartCol;
methodGroups.forEach((g) => {
g.fields.forEach((field, idx) => {
@@ -1966,9 +2266,13 @@
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,
@@ -1976,7 +2280,7 @@
item.pendingFollowUp
),
item.followUpRate || "0%", // 闅忚鐜�
- item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // 鍙婃椂鐜�
+ this.getTimelyRateText(item), // 鍙婃椂鐜�
];
methodGroups.forEach((g) => {
g.fields.forEach((field) => {
@@ -2010,13 +2314,29 @@
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 [
@@ -2036,9 +2356,9 @@
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: 鍙婃椂鐜�
@@ -2056,19 +2376,27 @@
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) + "%";
@@ -2088,15 +2416,23 @@
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) + "%";
+ }
}
// 鏍煎紡鍖栨暟瀛�
@@ -2137,14 +2473,14 @@
}
// 鍑洪櫌鏃堕棿鑼冨洿
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]
);
}
diff --git a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
index f49c5f4..e675bef 100644
--- a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
@@ -154,6 +154,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰呴殢璁�"
align="center"
key="pendingFollowUpAgain"
@@ -177,6 +178,62 @@
}}</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="闅忚鎴愬姛"
@@ -204,6 +261,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="闅忚澶辫触"
align="center"
key="followUpFailAgain"
@@ -457,6 +515,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="寰呴殢璁�"
align="center"
key="pendingFollowUpAgain"
@@ -479,6 +538,60 @@
}}</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="闅忚鎴愬姛"
@@ -505,6 +618,7 @@
</template>
</el-table-column>
<el-table-column
+ v-if="!isTargetHospital"
label="闅忚澶辫触"
align="center"
key="followUpFailAgain"
@@ -553,67 +667,40 @@
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"
@@ -636,7 +723,7 @@
</template>
</el-table-column>
<el-table-column
- label="鏈�缁堝畬鎴�"
+ label="鎴愬姛鏁�"
align="center"
key="voiceAgainSuccess"
prop="voiceAgainSuccess"
@@ -661,13 +748,67 @@
</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"
@@ -690,7 +831,7 @@
</template>
</el-table-column>
<el-table-column
- label="鏈�缁堝畬鎴�"
+ label="鎴愬姛鏁�"
align="center"
key="smsAgainSuccess"
prop="smsAgainSuccess"
@@ -715,16 +856,17 @@
</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">
@@ -734,20 +876,20 @@
@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">
@@ -757,13 +899,13 @@
@click="
handleViewDetails(
scope.row,
- 'wechatAgainSuccessInfo',
- '鏈�缁堝畬鎴愬井淇¢殢璁垮垪琛�'
+ 'manualAgainSuccessInfo',
+ '鏈�缁堝畬鎴愪汉宸ラ殢璁垮垪琛�'
)
"
>
<span class="button-zx">{{
- scope.row.weChatAgainSuccess
+ scope.row.manualAgainSuccess
}}</span>
</el-button>
</template>
@@ -946,7 +1088,9 @@
"el-tooltip",
{
props: {
- content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
+ content: this.isTargetHospital
+ ? "闅忚鎴愬姛/闇�闅忚"
+ : "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
placement: "top",
effect: "dark",
},
@@ -1103,7 +1247,7 @@
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) + "%";
@@ -1181,7 +1325,7 @@
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) + "%";
@@ -1312,8 +1456,8 @@
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%";
@@ -1535,13 +1679,11 @@
},
};
- // 鏍囬
- 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 = [
"鍖荤敓濮撳悕",
"绉戝",
@@ -1549,13 +1691,25 @@
"鏃犻渶闅忚",
"搴旈殢璁�",
"闇�闅忚",
- "寰呴殢璁�",
+ ...(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;
@@ -1571,15 +1725,28 @@
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;
@@ -1599,33 +1766,28 @@
};
});
- // 鍒楀
- 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) => {
@@ -1633,25 +1795,28 @@
});
// 鎴愬姛鐜囷紙骞冲潎鍊硷級
- 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
@@ -1666,6 +1831,13 @@
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;
@@ -1745,7 +1917,7 @@
},
};
- // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+ // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佹暟/鎴愬姛鏁� 鍒嗙骇灞曠ず锛�
const graded = this.isTargetHospital;
const baseHeaders = [
@@ -1758,9 +1930,9 @@
];
const coreHeaders = [
"闇�闅忚",
- "寰呴殢璁�",
+ ...(this.isTargetHospital ? ["寰呭彂閫�", "宸插彂閫�"] : ["寰呴殢璁�"]),
"闅忚鎴愬姛",
- "闅忚澶辫触",
+ ...(this.isTargetHospital ? [] : ["闅忚澶辫触"]),
"鎴愬姛鐜�",
"闅忚鐜�",
];
@@ -1799,14 +1971,37 @@
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) {
@@ -1818,7 +2013,7 @@
mc += g.fields.length;
});
- // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+ // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佹暟/鎴愬姛鏁帮級
mc = methodStartCol;
methodGroups.forEach((g) => {
g.fields.forEach((field, idx) => {
@@ -1875,9 +2070,14 @@
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,
@@ -1918,13 +2118,13 @@
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 [
@@ -1936,20 +2136,35 @@
},
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),
@@ -1963,19 +2178,28 @@
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) + "%";
diff --git a/src/views/sfstatistics/percentage/index copy.vue b/src/views/sfstatistics/percentage/index copy.vue
deleted file mode 100644
index 9917362..0000000
--- a/src/views/sfstatistics/percentage/index copy.vue
+++ /dev/null
@@ -1,3708 +0,0 @@
-<template>
- <div class="Questionnairemanagement">
- <div class="leftvlue">
- <div class="leftvlue-bg">
- <el-row :gutter="20">
- <!--鏍囩鏁版嵁-->
- <el-col :span="24" :xs="24">
- <el-form
- :model="queryParams"
- ref="queryForm"
- size="small"
- :inline="true"
- v-show="showSearch"
- label-width="98px"
- >
- <el-form-item label="缁熻绫诲瀷" prop="userName">
- <el-select
- v-model="queryParams.statisticaltype"
- placeholder="璇烽�夋嫨缁熻绫诲瀷"
- >
- <el-option
- v-for="item in Statisticallist"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- >
- </el-option>
- </el-select>
- <el-select
- style="margin-left: 10px"
- v-if="queryParams.statisticaltype == 1"
- v-model="queryParams.leavehospitaldistrictcodes"
- size="medium"
- multiple
- filterable
- placeholder="璇烽�夋嫨鐥呭尯"
- >
- <el-option
- v-for="item in flatArrayhospit"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- >
- </el-option>
- </el-select>
- <el-select
- v-else-if="queryParams.statisticaltype == 2"
- v-model="queryParams.deptcodes"
- size="medium"
- multiple
- filterable
- placeholder="璇烽�夋嫨绉戝"
- >
- <el-option
- v-for="item in flatArraydept"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- >
- </el-option>
- </el-select>
- </el-form-item>
-
- <el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
- <el-select
- v-model="queryParams.serviceType"
- multiple
- placeholder="璇烽�夋嫨"
- >
- <el-option
- v-for="item in options"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- >
- </el-option>
- </el-select>
- </el-form-item>
- <el-form-item
- label-width="200"
- label="搴旈殢璁挎椂闂磋寖鍥�"
- prop="userName"
- >
- <el-date-picker
- v-model="queryParams.dateRange"
- value-format="yyyy-MM-dd HH:mm:ss"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- :default-time="['00:00:00', '23:59:59']"
- >
- </el-date-picker>
- </el-form-item>
-
- <el-form-item>
- <el-button
- type="primary"
- icon="el-icon-search"
- size="medium"
- @click="handleQuery"
- >鎼滅储</el-button
- >
- <el-button
- icon="el-icon-refresh"
- size="medium"
- @click="resetQuery"
- >閲嶇疆</el-button
- >
- </el-form-item>
- <el-button
- type="warning"
- plain
- icon="el-icon-download"
- size="medium"
- @click="exportTable"
- >瀵煎嚭</el-button
- >
- <el-button
- type="primary"
- plain
- icon="el-icon-data-line"
- size="medium"
- @click="showChartDialog"
- >缁熻瓒嬪娍鍥�</el-button
- >
- </el-form>
-
- <!-- 鏂板锛歍ab鏍囩椤� -->
- <el-tabs v-model="activeTab" @tab-click="handleTabClick">
- <el-tab-pane label="棣栨闅忚" name="first">
- <div class="your-table-container">
- <el-table
- ref="exportTable"
- id="exportTableid"
- v-loading="loading"
- :data="firstFollowUpList"
- :border="true"
- @selection-change="handleSelectionChange"
- @expand-change="handleRowClick"
- :row-key="getRowKey"
- show-summary
- :summary-method="getSummaries"
- :expand-row-keys="expands"
- >
- <!-- 灞曞紑琛岀澶村垪 -->
- <el-table-column type="expand">
- <template slot-scope="props">
- <el-table
- :data="props.row.doctorStats"
- border
- style="width: 95%; margin: 0 auto"
- class="inner-table"
- show-summary
- :summary-method="getInnerSummaries"
- >
- <el-table-column
- label="鍖荤敓濮撳悕"
- prop="drname"
- align="center"
- />
- <el-table-column
- label="绉戝"
- width="120"
- prop="deptname"
- align="center"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- prop="dischargeCount"
- align="center"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- align="center"
- key="dischargeCount"
- prop="dischargeCount"
- >
- </el-table-column>
-
- <el-table-column
- label="鏃犻渶闅忚浜烘"
- align="center"
- width="100"
- key="nonFollowUp"
- prop="nonFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="搴旈殢璁夸汉娆�"
- align="center"
- width="100"
- key="followUpNeeded"
- prop="followUpNeeded"
- >
- </el-table-column>
- <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
- <el-table-column
- label="闇�闅忚"
- align="center"
- key="needFollowUp"
- prop="needFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="寰呴殢璁�"
- align="center"
- key="pendingFollowUp"
- prop="pendingFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="闅忚鎴愬姛"
- align="center"
- key="followUpSuccess"
- prop="followUpSuccess"
- >
- </el-table-column>
- <el-table-column
- label="闅忚澶辫触"
- align="center"
- key="followUpFail"
- prop="followUpFail"
- >
- </el-table-column>
- <el-table-column
- label="闅忚鐜�"
- align="center"
- width="120"
- key="followUpRate"
- prop="followUpRate"
- >
- </el-table-column>
- <el-table-column
- v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
- label="鍙婃椂鐜�"
- align="center"
- width="120"
- key="rate"
- prop="rate"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="Seedetails(scope.row)"
- ><span class="button-zx"
- >{{
- (Number(scope.row.rate) * 100).toFixed(2)
- }}%</span
- ></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="浜哄伐"
- align="center"
- key="manual"
- prop="manual"
- >
- </el-table-column>
- <el-table-column
- label="鐭俊"
- align="center"
- key="sms"
- prop="sms"
- >
- </el-table-column>
- <el-table-column
- label="寰俊"
- align="center"
- key="weChat"
- prop="weChat"
- >
- </el-table-column>
- </el-table-column>
- </el-table>
- </template>
- </el-table-column>
- <el-table-column
- label="鍑洪櫌鐥呭尯"
- align="center"
- sortable
- key="leavehospitaldistrictname"
- prop="leavehospitaldistrictname"
- width="150"
- :show-overflow-tooltip="true"
- :sort-method="sortChineseNumber"
- />
- <el-table-column
- label="绉戝"
- align="center"
- key="deptname"
- prop="deptname"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- align="center"
- key="dischargeCount"
- prop="dischargeCount"
- >
- </el-table-column>
-
- <el-table-column
- label="鏃犻渶闅忚浜烘"
- align="center"
- width="100"
- key="nonFollowUp"
- prop="nonFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="搴旈殢璁夸汉娆�"
- align="center"
- width="100"
- key="followUpNeeded"
- prop="followUpNeeded"
- >
- </el-table-column>
- <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
- <el-table-column
- label="闇�闅忚"
- align="center"
- key="needFollowUp"
- prop="needFollowUp"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.needFollowUpInfo,
- scope.row.leavehospitaldistrictname +
- '闇�闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.needFollowUp
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="寰呴殢璁�"
- align="center"
- key="pendingFollowUp"
- prop="pendingFollowUp"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.pendingFollowUpInfo,
- scope.row.leavehospitaldistrictname +
- '寰呴殢璁垮垪琛�'
- )
- "
- ><span class="button-zx">{{
- scope.row.pendingFollowUp
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚鎴愬姛"
- align="center"
- key="followUpSuccess"
- prop="followUpSuccess"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.followUpSuccessInfo,
- scope.row.leavehospitaldistrictname +
- '闅忚鎴愬姛鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.followUpSuccess
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚澶辫触"
- align="center"
- key="followUpFail"
- prop="followUpFail"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.followUpFailInfo,
- scope.row.leavehospitaldistrictname +
- '闅忚澶辫触鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.followUpFail
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚鐜�"
- align="center"
- width="120"
- key="followUpRate"
- prop="followUpRate"
- >
- </el-table-column>
- <el-table-column
- v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
- label="鍙婃椂鐜�"
- align="center"
- width="120"
- key="rate"
- prop="rate"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="Seedetails(scope.row)"
- ><span class="button-zx"
- >{{
- (Number(scope.row.rate) * 100).toFixed(2)
- }}%</span
- ></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="浜哄伐"
- align="center"
- key="manual"
- prop="manual"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.manualInfo,
- scope.row.leavehospitaldistrictname +
- '浜哄伐闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.manual
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="鐭俊"
- align="center"
- key="sms"
- prop="sms"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.smsInfo,
- scope.row.leavehospitaldistrictname +
- '鐭俊闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.sms
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="寰俊"
- align="center"
- key="weChat"
- prop="weChat"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.weChatInfo,
- scope.row.leavehospitaldistrictname +
- '寰俊闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.weChat
- }}</span></el-button
- >
- </template>
- </el-table-column>
- </el-table-column>
-
- <!-- 闅忚鎯呭喌鍒楋紙浠呬附姘村競涓尰闄㈡樉绀猴級 -->
- <el-table-column
- v-if="
- orgname == '涓芥按甯備腑鍖婚櫌' ||
- orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'
- "
- align="center"
- label="闅忚鎯呭喌"
- >
- <el-table-column
- label="姝e父璇煶"
- align="center"
- width="100"
- key="taskSituation1"
- prop="taskSituation1"
- >
- </el-table-column
- ><el-table-column
- label="鎮h�呮嫆鎺ユ垨鎷掕"
- align="center"
- width="100"
- key="taskSituation2"
- prop="taskSituation2"
- >
- </el-table-column
- ><el-table-column
- label="闈㈣鎴栬�呮帴璇�"
- align="center"
- width="100"
- key="taskSituation3"
- prop="taskSituation3"
- >
- </el-table-column
- ><el-table-column
- label="寰俊闅忚"
- align="center"
- width="100"
- key="taskSituation4"
- prop="taskSituation4"
- >
- </el-table-column
- ><el-table-column
- label="闅忚鐢佃瘽涓嶆纭�"
- align="center"
- width="100"
- key="taskSituation5"
- prop="taskSituation5"
- >
- </el-table-column
- ><el-table-column
- label="鍏朵粬鎯呭喌涓嶅疁闅忚"
- align="center"
- width="100"
- key="taskSituation6"
- prop="taskSituation6"
- >
- </el-table-column>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <el-tab-pane label="鍐嶆闅忚" name="second">
- <div class="your-table-container">
- <el-table
- ref="exportTableSecond"
- id="exportTableidSecond"
- v-loading="loadingSecond"
- :data="secondFollowUpList"
- :border="true"
- @selection-change="handleSelectionChangeSecond"
- @expand-change="handleRowClickSecond"
- :row-key="getRowKey"
- show-summary
- :summary-method="getSummariesSecond"
- :expand-row-keys="expandsSecond"
- >
- <!-- 灞曞紑琛岀澶村垪 -->
- <el-table-column type="expand">
- <template slot-scope="props">
- <el-table
- :data="props.row.doctorStats"
- border
- style="width: 95%; margin: 0 auto"
- class="inner-table"
- show-summary
- :summary-method="getInnerSummariesSecond"
- >
- <el-table-column
- label="鍖荤敓濮撳悕"
- prop="drname"
- align="center"
- />
- <el-table-column
- label="绉戝"
- width="120"
- prop="deptname"
- align="center"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- prop="dischargeCount"
- align="center"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- align="center"
- key="dischargeCount"
- prop="dischargeCount"
- >
- </el-table-column>
-
- <el-table-column
- label="鏃犻渶闅忚浜烘"
- align="center"
- width="100"
- key="nonFollowUp"
- prop="nonFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="搴旈殢璁夸汉娆�"
- align="center"
- width="100"
- key="followUpNeeded"
- prop="followUpNeeded"
- >
- </el-table-column>
- <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
- <el-table-column
- label="闇�闅忚"
- align="center"
- key="needFollowUpAgain"
- prop="needFollowUpAgain"
- >
- </el-table-column>
- <el-table-column
- label="寰呴殢璁�"
- align="center"
- key="pendingFollowUpAgain"
- prop="pendingFollowUpAgain"
- >
- </el-table-column>
- <el-table-column
- label="闅忚鎴愬姛"
- align="center"
- key="followUpSuccessAgain"
- prop="followUpSuccessAgain"
- >
- </el-table-column>
- <el-table-column
- label="闅忚澶辫触"
- align="center"
- key="followUpFailAgain"
- prop="followUpFailAgain"
- >
- </el-table-column>
- <el-table-column
- label="闅忚鐜�"
- align="center"
- width="120"
- key="followUpRateAgain"
- prop="followUpRateAgain"
- >
- </el-table-column>
- <el-table-column
- label="浜哄伐"
- align="center"
- key="manualAgain"
- prop="manualAgain"
- >
- </el-table-column>
- <el-table-column
- label="鐭俊"
- align="center"
- key="smsAgain"
- prop="smsAgain"
- >
- </el-table-column>
- <el-table-column
- label="寰俊"
- align="center"
- key="weChatAgain"
- prop="weChatAgain"
- >
- </el-table-column>
- </el-table-column>
- </el-table>
- </template>
- </el-table-column>
- <el-table-column
- label="鍑洪櫌鐥呭尯"
- align="center"
- sortable
- key="leavehospitaldistrictname"
- prop="leavehospitaldistrictname"
- width="150"
- :show-overflow-tooltip="true"
- :sort-method="sortChineseNumber"
- />
- <el-table-column
- label="绉戝"
- align="center"
- key="deptname"
- prop="deptname"
- :show-overflow-tooltip="true"
- />
- <el-table-column
- label="鍑洪櫌浜烘"
- align="center"
- key="dischargeCount"
- prop="dischargeCount"
- >
- </el-table-column>
-
- <el-table-column
- label="鏃犻渶闅忚浜烘"
- align="center"
- width="100"
- key="nonFollowUp"
- prop="nonFollowUp"
- >
- </el-table-column>
- <el-table-column
- label="搴旈殢璁夸汉娆�"
- align="center"
- width="100"
- key="followUpNeeded"
- prop="followUpNeeded"
- >
- </el-table-column>
- <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
- <el-table-column
- label="闇�闅忚"
- align="center"
- key="needFollowUpAgain"
- prop="needFollowUpAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.needFollowUpAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚闇�闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.needFollowUpAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="寰呴殢璁�"
- align="center"
- key="pendingFollowUpAgain"
- prop="pendingFollowUpAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.pendingFollowUpAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚寰呴殢璁垮垪琛�'
- )
- "
- ><span class="button-zx">{{
- scope.row.pendingFollowUpAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚鎴愬姛"
- align="center"
- key="followUpSuccessAgain"
- prop="followUpSuccessAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.followUpSuccessAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚闅忚鎴愬姛鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.followUpSuccessAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚澶辫触"
- align="center"
- key="followUpFailAgain"
- prop="followUpFailAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.followUpFailAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚闅忚澶辫触鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.followUpFailAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="闅忚鐜�"
- align="center"
- width="120"
- key="followUpRateAgain"
- prop="followUpRateAgain"
- >
- </el-table-column>
- <el-table-column
- label="浜哄伐"
- align="center"
- key="manualAgain"
- prop="manualAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.manualAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚浜哄伐闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.manualAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="鐭俊"
- align="center"
- key="smsAgain"
- prop="smsAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.smsAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚鐭俊闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.smsAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- <el-table-column
- label="寰俊"
- align="center"
- key="weChatAgain"
- prop="weChatAgain"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="
- viewDetails(
- scope.row.weChatAgainInfo,
- scope.row.leavehospitaldistrictname +
- '鍐嶆闅忚寰俊闅忚鍒楄〃'
- )
- "
- ><span class="button-zx">{{
- scope.row.weChatAgain
- }}</span></el-button
- >
- </template>
- </el-table-column>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
- </el-tabs>
- </el-col>
- </el-row>
- </div>
- </div>
- <!-- 缁熻瓒嬪娍鍥惧脊绐� -->
- <el-dialog
- title="闅忚缁熻瓒嬪娍鍥�"
- :visible.sync="chartDialogVisible"
- width="80%"
- :close-on-click-modal="false"
- >
- <div class="chart-container">
- <el-row :gutter="20">
- <el-col :span="12">
- <div class="chart-title">闅忚鐘舵�佸垎甯�</div>
- <div id="pieChart" style="width: 100%; height: 400px"></div>
- </el-col>
- <el-col :span="12">
- <div class="chart-title">闅忚瓒嬪娍鍒嗘瀽</div>
- <div id="barLineChart" style="width: 100%; height: 400px"></div>
- </el-col>
- </el-row>
- </div>
- </el-dialog>
- <el-dialog
- title="鏈強鏃堕殢璁挎偅鑰呮湇鍔�"
- :visible.sync="SeedetailsVisible"
- v-loading="Seedloading"
- width="70%"
- :close-on-click-modal="false"
- >
- <div class="examine-jic">
- <div class="jic-value">
- <el-row :gutter="20">
- <!--鐢ㄦ埛鏁版嵁-->
- <el-form
- :model="patientqueryParams"
- ref="queryForm"
- size="small"
- :inline="true"
- label-width="98px"
- >
- <el-form-item label="鎮h�咃細">
- <el-input
- v-model="patientqueryParams.name"
- @keyup.enter.native="handleQuery"
- ></el-input>
- </el-form-item>
- <el-form-item label="鎮h�呰瘖鏂細">
- <el-input
- v-model="patientqueryParams.leavediagname"
- @keyup.enter.native="handleQuery"
- ></el-input>
- </el-form-item>
-
- <el-form-item>
- <el-button
- type="primary"
- icon="el-icon-search"
- size="medium"
- @click="handleQuery"
- >鎼滅储</el-button
- >
- <el-button
- icon="el-icon-refresh"
- size="medium"
- @click="resetQuery"
- >鍙栨秷鍒涘缓</el-button
- >
- </el-form-item>
- </el-form>
- <!-- 閫夋嫨鎮h�呭垪琛� -->
- <el-table :data="logsheetlist" style="width: 100%">
- <el-table-column
- prop="sendname"
- align="center"
- label="濮撳悕"
- width="100"
- >
- </el-table-column>
- <el-table-column
- prop="taskName"
- align="center"
- width="200"
- show-overflow-tooltip
- label="浠诲姟鍚嶇О"
- >
- </el-table-column>
- <el-table-column
- prop="sendstate"
- align="center"
- width="200"
- label="浠诲姟鐘舵��"
- >
- <template slot-scope="scope">
- <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>
- </template>
- </el-table-column>
- <el-table-column
- prop="visitTime"
- align="center"
- label="搴旈殢璁挎椂闂�"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
- <el-table-column
- prop="finishtime"
- align="center"
- label="闅忚瀹屾垚鏃堕棿"
- width="200"
- show-overflow-tooltip
- >
- </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="璐d换鎶ゅ+"
- width="120"
- align="center"
- key="nurseName"
- prop="nurseName"
- />
- <el-table-column
- label="涓绘不鍖荤敓"
- width="120"
- align="center"
- key="drname"
- prop="drname"
- />
-
- <el-table-column
- label="缁撴灉鐘舵��"
- align="center"
- key="excep"
- prop="excep"
- width="120"
- >
- <template slot-scope="scope">
- <dict-tag
- :options="dict.type.sys_yujing"
- :value="scope.row.excep"
- />
- </template>
- </el-table-column>
- <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
- prop="templatename"
- align="center"
- label="鏈嶅姟妯℃澘"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
- <el-table-column
- prop="remark"
- align="center"
- label="鏈嶅姟璁板綍"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
-
- <el-table-column
- prop="bankcardno"
- align="center"
- label="鍛煎彨鐘舵��"
- width="210"
- >
- </el-table-column>
- <el-table-column
- label="鎿嶄綔"
- fixed="right"
- align="center"
- width="200"
- class-name="small-padding fixed-width"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="SeedetailsgGo(scope.row)"
- ><span class="button-zx"
- ><i class="el-icon-s-order"></i>鏌ョ湅</span
- ></el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-row>
- <pagination
- v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
- :total="patienttotal"
- :page.sync="patientqueryParams.pn"
- :limit.sync="patientqueryParams.ps"
- @pagination="Seedetailstion"
- />
- </div>
- </div>
- </el-dialog>
- <!-- 鍚勭被璇︽儏 -->
- <el-dialog
- :title="infotitle"
- :visible.sync="infotitleVisible"
- v-loading="infotitloading"
- width="70%"
- :close-on-click-modal="false"
- >
- <div style="margin-bottom: 16px; display: flex; align-items: center">
- <span style="margin-right: 10px; font-weight: bold">鎮h�呭鍚嶆煡璇�:</span>
- <el-input
- v-model="searchName"
- placeholder="璇疯緭鍏ユ偅鑰呭鍚嶈繘琛岀瓫閫�"
- clearable
- style="width: 300px"
- @input="handleSearch"
- @clear="handleSearch"
- >
- </el-input>
- <span
- style="margin-left: 10px; color: rgb(35, 81, 233); font-size: 16px"
- >
- 鍏� {{ infotitlelist.length }} 鏉¤褰�
- </span>
- </div>
- <div class="examine-jic">
- <div class="jic-value">
- <el-row :gutter="20">
- <!-- 閫夋嫨鎮h�呭垪琛� -->
- <div
- class="data-list"
- ref="dataList"
- @scroll="handleScroll"
- v-loading="infotitloading"
- >
- <el-table
- :data="currentDisplayList"
- height="660"
- style="width: 100%"
- >
- <el-table-column
- prop="sendname"
- align="center"
- label="濮撳悕"
- width="100"
- >
- </el-table-column>
- <el-table-column
- prop="taskName"
- align="center"
- width="200"
- show-overflow-tooltip
- label="浠诲姟鍚嶇О"
- >
- </el-table-column>
- <el-table-column
- prop="sendstate"
- align="center"
- width="200"
- label="浠诲姟鐘舵��"
- >
- <template slot-scope="scope">
- <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>
- </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
- prop="visitTime"
- align="center"
- label="搴旈殢璁挎椂闂�"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
- <el-table-column
- prop="finishtime"
- align="center"
- label="闅忚瀹屾垚鏃堕棿"
- width="200"
- show-overflow-tooltip
- >
- </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="璐d换鎶ゅ+"
- width="120"
- align="center"
- key="nurseName"
- prop="nurseName"
- />
- <el-table-column
- label="涓绘不鍖荤敓"
- width="120"
- align="center"
- key="drname"
- prop="drname"
- />
-
- <el-table-column
- label="缁撴灉鐘舵��"
- align="center"
- key="excep"
- prop="excep"
- width="120"
- >
- <template slot-scope="scope">
- <dict-tag
- :options="dict.type.sys_yujing"
- :value="scope.row.excep"
- />
- </template>
- </el-table-column>
- <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
- prop="templatename"
- align="center"
- label="鏈嶅姟妯℃澘"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
- <el-table-column
- prop="remark"
- align="center"
- label="鏈嶅姟璁板綍"
- width="200"
- show-overflow-tooltip
- >
- </el-table-column>
-
- <el-table-column
- prop="bankcardno"
- align="center"
- label="鍛煎彨鐘舵��"
- width="210"
- >
- </el-table-column>
- <el-table-column
- label="鎿嶄綔"
- fixed="right"
- align="center"
- width="200"
- class-name="small-padding fixed-width"
- >
- <template slot-scope="scope">
- <el-button
- size="medium"
- type="text"
- @click="SeedetailsgGo(scope.row)"
- ><span class="button-zx"
- ><i class="el-icon-s-order"></i>鏌ョ湅</span
- ></el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-row>
- </div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script>
-import {
- toamendtag,
- addapitag,
- deletetag,
- changetagcategory,
-} from "@/api/system/label";
-import store from "@/store";
-import { getSfStatistics, selectTimelyRate } from "@/api/system/user";
-import * as XLSX from "xlsx";
-import FileSaver from "file-saver";
-import ExcelJS from "exceljs";
-import { saveAs } from "file-saver";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-
-const shortcuts = [
- {
- text: "浠婂ぉ",
- onClick(picker) {
- picker.$emit("pick", new Date());
- },
- },
- {
- text: "鏄ㄥぉ",
- onClick(picker) {
- const date = new Date();
- date.setTime(date.getTime() - 3600 * 1000 * 24);
- picker.$emit("pick", date);
- },
- },
- {
- text: "涓�鍛ㄥ墠",
- onClick(picker) {
- const date = new Date();
- date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
- picker.$emit("pick", date);
- },
- },
-];
-
-export default {
- name: "Percentage",
- dicts: ["sys_normal_disable", "sys_user_sex"],
- components: { Treeselect },
- data() {
- return {
- // 鏂板锛歍ab鏍囩椤垫帶鍒�
- activeTab: "first", // 褰撳墠婵�娲荤殑tab锛宖irst-棣栨闅忚锛宻econd-鍐嶆闅忚
-
- // 鍒嗙鐨勬暟鎹垪琛�
- firstFollowUpList: [], // 棣栨闅忚鏁版嵁
- secondFollowUpList: [], // 鍐嶆闅忚鏁版嵁
-
- // 鍒嗙鐨勫姞杞界姸鎬�
- loading: false, // 棣栨闅忚琛ㄦ牸鍔犺浇鐘舵��
- loadingSecond: false, // 鍐嶆闅忚琛ㄦ牸鍔犺浇鐘舵��
-
- // 鍒嗙鐨勫睍寮�鐘舵��
- expands: [], // 棣栨闅忚琛ㄦ牸灞曞紑琛�
- expandsSecond: [], // 鍐嶆闅忚琛ㄦ牸灞曞紑琛�
-
- // 鍒嗙鐨勯�夋嫨鐘舵��
- ids: [], // 棣栨闅忚閫変腑椤�
- idsSecond: [], // 鍐嶆闅忚閫変腑椤�
-
- orgname: "",
- infotitlelist: [],
- currentDisplayList: [],
- loadIndex: 0,
- pageSize: 100,
- isLoading: false,
-
- Seedloading: false,
- chartDialogVisible: false,
- infotitleVisible: false,
- searchName: "",
- infotitloading: false,
- infotitle: "",
- pieChart: null,
- barLineChart: null,
-
- single: true,
- multiple: true,
- showSearch: true,
- idds: "",
- total: 0,
- flatArrayhospit: [],
- flatArraydept: [],
- patienttotal: 0,
- logsheetlist: [],
- Statisticallist: [
- {
- label: "鐥呭尯缁熻",
- value: 1,
- },
- {
- label: "绉戝缁熻",
- value: 2,
- },
- ],
- patientqueryParams: {
- pn: 1,
- ps: 10,
- },
- amendtag: false,
- lstamendtag: false,
- scavisible: false,
- deleteVisible: false,
- deletefenl: "楂樿鍘�",
- tagform: {
- isupload: "",
- tagname: "",
- tagcategoryid: "",
- tagdescription: "",
- },
- classifyform: {
- categoryname: "",
- },
- title: "",
- open: false,
- dateRange: [],
- postOptions: [],
- roleOptions: [],
- allDeptCodes: [],
- allWardCodes: [],
- checkboxlist: [],
- form: {},
- forms: {
- name: "",
- },
- numberlb: 22,
- dialogFormVisible: false,
- lstamendtagVisible: false,
- goQRCodeVisible: false,
- sidecolumnval: "",
- propss: { multiple: true },
- SeedetailsVisible: false,
- options: store.getters.tasktypes,
- pickerOptions: {
- disabledDate(time) {
- return time.getTime() < Date.now() - 3600 * 1000 * 24;
- },
- shortcuts: shortcuts,
- },
- pickerOptionsa: {
- disabledDate(time) {
- return time.getTime() > Date.now();
- },
- shortcuts: shortcuts,
- },
- queryParams: {
- serviceType: [2],
- dateRange: [],
- statisticaltype: 1,
- leavehospitaldistrictcodes: ["all"],
- deptcodes: [],
- visitCount: 1, // 鏂板锛氶殢璁挎鏁板弬鏁帮紝1-棣栨锛�2-鍐嶆
- },
- columns: [
- { key: 0, label: `鏍囩缂栧彿`, visible: true },
- { key: 1, label: `鏍囩鍚嶇О`, visible: true },
- { key: 2, label: `鏍囩鏄电О`, visible: true },
- { key: 3, label: `閮ㄩ棬`, visible: true },
- { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
- { key: 5, label: `鐘舵�乣, visible: true },
- { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
- ],
- };
- },
- watch: {},
- created() {
- this.getDeptTree();
- this.getFirstFollowUpList(); // 榛樿鍔犺浇棣栨闅忚鏁版嵁
- this.checkboxlist = store.getters.checkboxlist;
- this.orgname = localStorage.getItem("orgname");
- },
-
- methods: {
- /** 鏌ヨ棣栨闅忚鍒楄〃 */
- async getFirstFollowUpList() {
- this.loading = true;
- this.queryParams.visitCount = 1; // 璁剧疆闅忚娆℃暟涓洪娆�
-
- const params = {
- ...this.queryParams,
- leavehospitaldistrictcodes:
- this.queryParams.leavehospitaldistrictcodes.includes("all")
- ? this.allWardCodes
- : this.queryParams.leavehospitaldistrictcodes,
- deptcodes: this.queryParams.deptcodes.includes("all")
- ? this.allDeptCodes
- : this.queryParams.deptcodes,
- };
-
- delete params.leavehospitaldistrictcodes.all;
- delete params.deptcodes.all;
-
- try {
- const response = await getSfStatistics(params);
- this.firstFollowUpList = this.customSort(response.data);
- this.total = response.total;
- } catch (error) {
- console.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触:", error);
- this.$message.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触");
- } finally {
- this.loading = false;
- }
- },
-
- /** 鏌ヨ鍐嶆闅忚鍒楄〃 */
- async getSecondFollowUpList() {
- this.loadingSecond = true;
- this.queryParams.visitCount = 2; // 璁剧疆闅忚娆℃暟涓哄啀娆�
-
- const params = {
- ...this.queryParams,
- leavehospitaldistrictcodes:
- this.queryParams.leavehospitaldistrictcodes.includes("all")
- ? this.allWardCodes
- : this.queryParams.leavehospitaldistrictcodes,
- deptcodes: this.queryParams.deptcodes.includes("all")
- ? this.allDeptCodes
- : this.queryParams.deptcodes,
- };
-
- delete params.leavehospitaldistrictcodes.all;
- delete params.deptcodes.all;
-
- try {
- const response = await getSfStatistics(params);
- this.secondFollowUpList = this.customSort(response.data);
- this.total = response.total;
- } catch (error) {
- console.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触:", error);
- this.$message.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触");
- } finally {
- this.loadingSecond = false;
- }
- },
-
- /** Tab鍒囨崲浜嬩欢 */
- handleTabClick(tab) {
- if (tab.name === "first") {
- if (this.firstFollowUpList.length === 0) {
- this.getFirstFollowUpList();
- }
- } else if (tab.name === "second") {
- if (this.secondFollowUpList.length === 0) {
- this.getSecondFollowUpList();
- }
- }
- },
- sortChineseNumber(aRow, bRow) {
- const a = aRow.leavehospitaldistrictname;
- const b = bRow.leavehospitaldistrictname;
-
- // 涓枃鏁板瓧鍒伴樋鎷変集鏁板瓧鐨勬槧灏勶紙鎵╁睍鍒�45锛�
- const chineseNumMap = {
- 涓�: 1,
- 浜�: 2,
- 涓�: 3,
- 鍥�: 4,
- 浜�: 5,
- 鍏�: 6,
- 涓�: 7,
- 鍏�: 8,
- 涔�: 9,
- 鍗�: 10,
- 鍗佷竴: 11,
- 鍗佷簩: 12,
- 鍗佷笁: 13,
- 鍗佸洓: 14,
- 鍗佷簲: 15,
- 鍗佸叚: 16,
- 鍗佷竷: 17,
- 鍗佸叓: 18,
- 鍗佷節: 19,
- 浜屽崄: 20,
- 浜屽崄涓�: 21,
- 浜屽崄浜�: 22,
- 浜屽崄涓�: 23,
- 浜屽崄鍥�: 24,
- 浜屽崄浜�: 25,
- 浜屽崄鍏�: 26,
- 浜屽崄涓�: 27,
- 浜屽崄鍏�: 28,
- 浜屽崄涔�: 29,
- 涓夊崄: 30,
- 涓夊崄涓�: 31,
- 涓夊崄浜�: 32,
- 涓夊崄涓�: 33,
- 涓夊崄鍥�: 34,
- 涓夊崄浜�: 35,
- 涓夊崄鍏�: 36,
- 涓夊崄涓�: 37,
- 涓夊崄鍏�: 38,
- 涓夊崄涔�: 39,
- 鍥涘崄: 40,
- 鍥涘崄涓�: 41,
- 鍥涘崄浜�: 42,
- 鍥涘崄涓�: 43,
- 鍥涘崄鍥�: 44,
- 鍥涘崄浜�: 45,
- };
-
- // 鎻愬彇涓枃鏁板瓧
- const getNumberFromText = (text) => {
- if (!text || typeof text !== "string") return -1;
-
- // 鍖归厤涓枃鏁板瓧锛屾敮鎸佷竴鍒板洓鍗佷簲
- const match = text.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
-
- if (match && match[1]) {
- const chineseNum = match[1];
- return chineseNumMap[chineseNum] !== undefined
- ? chineseNumMap[chineseNum]
- : -1;
- }
-
- // 濡傛灉娌℃湁鍖归厤鍒颁腑鏂囨暟瀛楋紝灏濊瘯鍖归厤闃挎媺浼暟瀛�
- const arabicMatch = text.match(/^(\d+)/);
- if (arabicMatch && arabicMatch[1]) {
- const num = parseInt(arabicMatch[1], 10);
- return num >= 1 && num <= 45 ? num : -1;
- }
-
- return -1;
- };
-
- const numA = getNumberFromText(a);
- const numB = getNumberFromText(b);
-
- // 澶勭悊鏃犳硶瑙f瀽鐨勬儏鍐�
- if (numA === -1 && numB === -1) {
- return (a || "").localeCompare(b || "");
- }
- if (numA === -1) return 1;
- if (numB === -1) return -1;
-
- return numA - numB;
- },
- // 鎼滅储澶勭悊鍑芥暟
- handleSearch() {
- if (!this.searchName.trim()) {
- // 濡傛灉鎼滅储妗嗕负绌猴紝鏄剧ず鎵�鏈夋暟鎹�
- this.currentDisplayList = [...this.infotitlelist];
- } else {
- // 鏍规嵁鎮h�呭鍚嶈繘琛岀瓫閫夛紙涓嶅尯鍒嗗ぇ灏忓啓锛�
- const keyword = this.searchName.toLowerCase();
- this.currentDisplayList = this.infotitlelist.filter((item) => {
- return item.sendname && item.sendname.toLowerCase().includes(keyword);
- });
- }
- },
- customSort(data) {
- // 瀹氫箟鎮ㄦ湡鏈涚殑鐥呭尯椤哄簭锛堟墿灞曞埌鍥涘崄浜旓級
- const order = [
- "涓�",
- "浜�",
- "涓�",
- "鍥�",
- "浜�",
- "鍏�",
- "涓�",
- "鍏�",
- "涔�",
- "鍗�",
- "鍗佷竴",
- "鍗佷簩",
- "鍗佷笁",
- "鍗佸洓",
- "鍗佷簲",
- "鍗佸叚",
- "鍗佷竷",
- "鍗佸叓",
- "鍗佷節",
- "浜屽崄",
- "浜屽崄涓�",
- "浜屽崄浜�",
- "浜屽崄涓�",
- "浜屽崄鍥�",
- "浜屽崄浜�",
- "浜屽崄鍏�",
- "浜屽崄涓�",
- "浜屽崄鍏�",
- "浜屽崄涔�",
- "涓夊崄",
- "涓夊崄涓�",
- "涓夊崄浜�",
- "涓夊崄涓�",
- "涓夊崄鍥�",
- "涓夊崄浜�",
- "涓夊崄鍏�",
- "涓夊崄涓�",
- "涓夊崄鍏�",
- "涓夊崄涔�",
- "鍥涘崄",
- "鍥涘崄涓�",
- "鍥涘崄浜�",
- "鍥涘崄涓�",
- "鍥涘崄鍥�",
- "鍥涘崄浜�",
- ];
-
- return data.sort((a, b) => {
- // 鎻愬彇鐥呭尯鍚嶇О涓殑涓枃鏁板瓧閮ㄥ垎
- const getIndex = (name) => {
- if (!name || typeof name !== "string") return -1;
-
- // 鍖归厤涓枃鏁板瓧
- const chineseMatch = name.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
- if (chineseMatch && chineseMatch[1]) {
- return order.indexOf(chineseMatch[1]);
- }
-
- // 鍖归厤闃挎媺浼暟瀛�
- const arabicMatch = name.match(/^(\d+)/);
- if (arabicMatch && arabicMatch[1]) {
- const num = parseInt(arabicMatch[1], 10);
- if (num >= 1 && num <= 45) {
- return num - 1; // 鍥犱负鏁扮粍绱㈠紩浠�0寮�濮�
- }
- }
-
- return -1;
- };
-
- const indexA = getIndex(a.leavehospitaldistrictname);
- const indexB = getIndex(b.leavehospitaldistrictname);
-
- // 鎺掑簭閫昏緫
- if (indexA === -1 && indexB === -1) {
- return (a.leavehospitaldistrictname || "").localeCompare(
- b.leavehospitaldistrictname || ""
- );
- }
- if (indexA === -1) return 1;
- if (indexB === -1) return -1;
- return indexA - indexB;
- });
- },
- getRowKey(row) {
- return row.statisticaltype === 1
- ? row.leavehospitaldistrictcode
- : row.deptcode;
- },
-
- // 澶勭悊琛岀偣鍑诲睍寮�
- handleRowClick(row) {
- console.log(row, "row");
-
- // 濡傛灉宸茬粡灞曞紑鍒欐敹璧�
- if (this.expands.includes(this.getRowKey(row))) {
- this.expands = [];
- return;
- }
- // 澶勭悊鏌ヨ鍙傛暟
- const params = {
- ...this.queryParams,
- // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
- deptcodes: this.queryParams.deptcodes.includes("all")
- ? this.allDeptCodes
- : this.queryParams.deptcodes,
- leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
- drcode: "1",
- visitCount: 1, // 璁剧疆涓洪娆¢殢璁�
- };
-
- // 绉婚櫎鍙兘瀛樺湪鐨�"all"鍊�
- delete params.leavehospitaldistrictcodes.all;
- delete params.deptcodes.all;
- // 濡傛灉璇ヨ杩樻病鏈夊姞杞藉尰鐢熸暟鎹紝鍒欏姞杞�
- if (!row.doctorStats) {
- this.loading = true;
- getSfStatistics(params).then((res) => {
- this.$set(row, "doctorStats", res.data);
- this.expands = [this.getRowKey(row)];
- this.loading = false;
- });
- } else {
- this.expands = [this.getRowKey(row)];
- }
- },
- getSummaries(param) {
- const { columns, data } = param;
- const sums = [];
-
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "鍚堣";
- return;
- }
- if (index === 1 || index === 2) {
- sums[index] = "/";
- return;
- }
-
- // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
- if (
- column.property === "followUpRate" ||
- column.property === "rate" ||
- column.property === "followUpRateAgain"
- ) {
- // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
- const percentageValues = data
- .map((item) => {
- const value = item[column.property];
- if (!value || value === "-" || value === "0%") return null;
-
- // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
- if (typeof value === "string" && value.includes("%")) {
- // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
- const numValue = parseFloat(value.replace("%", "")) / 100;
- return isNaN(numValue) ? null : numValue;
- } else {
- // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
- const numValue = parseFloat(value);
- return isNaN(numValue) ? null : numValue;
- }
- })
- .filter((value) => value !== null && value !== 0); // 杩囨护鎺塶ull鍜�0鍊�
-
- if (percentageValues.length > 0) {
- const average =
- percentageValues.reduce((sum, value) => sum + value, 0) /
- percentageValues.length;
- sums[index] = (average * 100).toFixed(2) + "%";
- } else {
- sums[index] = "0.00%";
- }
- } else {
- // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
- const values = data.map((item) => {
- const value = item[column.property];
- if (value === "-" || value === "" || value === null) return 0;
- return Number(value) || 0;
- });
-
- if (!values.every((value) => isNaN(value))) {
- sums[index] = values.reduce((prev, curr) => prev + curr, 0);
- sums[index] = this.formatNumber(sums[index]);
- } else {
- sums[index] = "-";
- }
- }
- });
-
- return sums;
- },
-
- // 鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉�
- getInnerSummaries(param) {
- const { columns, data } = param;
- const sums = [];
-
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "灏忚";
- return;
- }
-
- if (column.property === "drname" || column.property === "deptname") {
- sums[index] = "-";
- return;
- }
-
- // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
- if (column.property === "followUpRate" || column.property === "rate") {
- // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
- const percentageValues = data
- .map((item) => {
- const value = item[column.property];
- if (!value || value === "-" || value === "0%") return null;
-
- // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
- if (typeof value === "string" && value.includes("%")) {
- // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
- const numValue = parseFloat(value.replace("%", "")) / 100;
- return isNaN(numValue) ? null : numValue;
- } else {
- // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
- const numValue = parseFloat(value);
- return isNaN(numValue) ? null : numValue;
- }
- })
- .filter((value) => value !== null && value !== 0);
-
- if (percentageValues.length > 0) {
- const average =
- percentageValues.reduce((sum, value) => sum + value, 0) /
- percentageValues.length;
- sums[index] = (average * 100).toFixed(2) + "%";
- } else {
- sums[index] = "0.00%";
- }
- } else {
- // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
- const values = data.map((item) => {
- const value = item[column.property];
- if (value === "-" || value === "" || value === null) return 0;
- return Number(value) || 0;
- });
-
- if (!values.every((value) => isNaN(value))) {
- sums[index] = values.reduce((prev, curr) => prev + curr, 0);
- sums[index] = this.formatNumber(sums[index]);
- } else {
- sums[index] = "-";
- }
- }
- });
-
- return sums;
- },
-
- // 杈呭姪鏂规硶锛氭彁鍙栫櫨鍒嗘瘮鏁板��
- extractPercentageValue(value) {
- if (!value) return null;
-
- if (typeof value === "string") {
- // 澶勭悊甯︾櫨鍒嗗彿鐨勫瓧绗︿覆
- if (value.includes("%")) {
- const num = parseFloat(value.replace("%", ""));
- return isNaN(num) ? null : num / 100;
- }
- // 澶勭悊绾暟瀛楀瓧绗︿覆
- const num = parseFloat(value);
- return isNaN(num) ? null : num;
- }
-
- // 澶勭悊鏁板瓧绫诲瀷
- return typeof value === "number" ? value : null;
- },
-
- // 鏁板瓧鏍煎紡鍖栨柟娉�
- formatNumber(num) {
- if (isNaN(num)) return "-";
- return Number.isInteger(num) ? num.toString() : num.toFixed(0);
- },
- /** 淇敼鏍囩 */
- handleUpdate(row) {
- console.log(row, "淇敼鏍囩");
- this.lstamendtagVisible = true;
- this.lstamendtag = true;
- this.tagform = {
- isupload: row.isupload,
- tagname: row.tagname,
- tagcategoryid: row.tagcategoryid,
- tagdescription: row.tagdescription,
- tagid: row.tagid,
- };
- },
- // 鑾峰彇绉戝鏍�
- getDeptTree() {
- // 绉戝鍒楄〃
- this.flatArraydept = store.getters.belongDepts.map((dept) => {
- return {
- label: dept.deptName,
- value: dept.deptCode,
- };
- });
- // 瀛樺偍鎵�鏈夌瀹や唬鐮�
- this.allDeptCodes = store.getters.belongDepts.map(
- (dept) => dept.deptCode
- );
-
- // 鐥呭尯鍒楄〃
- this.flatArrayhospit = store.getters.belongWards.map((ward) => {
- return {
- label: ward.districtName,
- value: ward.districtCode,
- };
- });
-
- // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
- this.allWardCodes = store.getters.belongWards.map(
- (ward) => ward.districtCode
- );
- this.flatArraydept.push({ label: "鍏ㄩ儴", value: "all" });
- this.flatArrayhospit.push({ label: "鍏ㄩ儴", value: "all" });
- },
- flattenArray(multiArray) {
- let result = [];
-
- // 閫掑綊鍑芥暟锛岀敤浜庡皢澶氱骇鏁扮粍杞崲涓轰竴缁存暟缁勶紝鍙寘鍚渶搴曞眰鐨勫厓绱�
- function flatten(element) {
- // 濡傛灉褰撳墠鍏冪礌鏈夊瓙鍏冪礌锛岀户缁�掑綊
- if (element.children && element.children.length > 0) {
- element.children.forEach((child) => flatten(child));
- } else {
- // 鍏嬮殕鍏冪礌浠ラ伩鍏嶄慨鏀瑰師濮嬫暟鎹�
- let item = JSON.parse(JSON.stringify(element));
- result.push(item); // 灏嗘渶搴曞眰鐨勫厓绱犳坊鍔犲埌缁撴灉鏁扮粍
- }
- }
-
- // 浠庨《灞傚厓绱犲紑濮嬮�掑綊
- multiArray.forEach((element) => flatten(element));
- return result; // 杩斿洖鍙寘鍚渶搴曞眰鍏冪礌鐨勪竴缁存暟缁�
- },
- addladeltag() {
- this.lstamendtagVisible = true;
- this.lstamendtag = false;
- this.tagform = {
- isupload: "",
- tagname: "",
- tagcategoryid: "",
- tagdescription: "",
- tagid: "",
- };
- },
- Seedetails(row) {
- this.SeedetailsVisible = true;
- this.Seedloading = true;
- if (queryParams.dateRange) {
- this.patientqueryParams.starttime = this.parseTime(
- this.queryParams.dateRange[0]
- );
- this.patientqueryParams.endtime = this.parseTime(
- this.queryParams.dateRange[1]
- );
- } else {
- this.patientqueryParams.endtime = null;
- this.patientqueryParams.starttime = null;
- }
-
- this.patientqueryParams.deptcode = row.deptcode;
- selectTimelyRate(this.patientqueryParams).then((response) => {
- this.logsheetlist = response.data.detail;
- this.patienttotal = response.data.total;
- this.Seedloading = false;
- });
- },
- Seedetailstion() {
- selectTimelyRate(this.patientqueryParams).then((response) => {
- this.logsheetlist = response.data.detail;
- this.patienttotal = response.data.total;
- this.Seedloading = false;
- });
- },
- viewDetails(row, title) {
- this.infotitleVisible = true;
- this.infotitle = title;
- this.infotitlelist = row; // 鍋囪row灏辨槸闇�瑕佸睍绀虹殑璇︾粏鏁扮粍
- console.log(this.infotitlelist, "this.infotitlelist");
-
- this.infotitlelist.forEach((item) => {
- let idArray = null;
-
- 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);
- // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖null
- return item ? item.label : null;
- });
- }
- });
- // 鍒濆鍖栧姞杞�
- this.loadIndex = 0;
- this.currentDisplayList = [];
- this.$nextTick(() => {
- this.loadMoreData();
- });
- },
- loadMoreData() {
- if (this.isLoading) return;
- this.isLoading = true;
-
- // 妯℃嫙寮傛鍔犺浇锛屽疄闄呭彲鑳芥槸鐩存帴鍒囩墖鏈湴鏁版嵁
- setTimeout(() => {
- console.log(this.infotitlelist, "this.infotitlelist");
-
- const nextChunk = this.infotitlelist.slice(
- this.loadIndex,
- this.loadIndex + this.pageSize
- );
- this.currentDisplayList = this.currentDisplayList.concat(nextChunk);
- this.loadIndex += this.pageSize;
- this.isLoading = false;
- }, 200);
- },
- handleScroll(event) {
- const scrollContainer = event.target;
- // 鍒ゆ柇鏄惁婊氬姩鍒板簳閮�
- const isAtBottom =
- scrollContainer.scrollTop + scrollContainer.clientHeight >=
- scrollContainer.scrollHeight - 10;
-
- if (
- isAtBottom &&
- !this.isLoading &&
- this.loadIndex < this.infotitlelist.length
- ) {
- this.loadMoreData();
- }
- },
- SeedetailsgGo(row) {
- this.SeedetailsVisible = false;
- this.infotitleVisible = false;
-
- let type = "";
- if (row.preachformson && row.preachformson.includes("3")) {
- type = 1;
- }
- setTimeout(() => {
- this.$router.push({
- path: "/followvisit/record/detailpage/",
- query: {
- taskid: row.taskid,
- patid: row.patid,
- id: row.id,
- Voicetype: type,
- // visitCount: this.topqueryParams.visitCount,
- },
- });
- }, 300);
- },
- // 娣诲姞/淇敼鏍囩
- Maintenancetag() {
- if (this.lstamendtag) {
- toamendtag(this.addDateRange(this.tagform)).then((response) => {
- console.log(response);
- this.getList();
- });
- } else {
- addapitag(this.addDateRange(this.tagform)).then((response) => {
- console.log(response);
- this.getList();
- });
- }
- this.tagform = {
- isupload: "",
- tagname: "",
- tagcategoryid: "",
- tagdescription: "",
- tagid: "",
- };
- },
- routerErr(row) {
- console.log(row, "璺宠浆寮傚父");
- this.$router.push({
- path: "/followvisit/discharge",
- query: {
- errtype: 1,
- leavehospitaldistrictcode: row.leavehospitaldistrictcode,
- },
- });
- },
-
- // 琛ㄥ崟閲嶇疆
- 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");
- },
- // 鏍囩鐘舵�佷慨鏀�
- handleStatusChange(row) {
- console.log(row.isupload);
- let text = row.isupload === "0" ? "鍚敤" : "鍋滅敤";
- this.$modal
- .confirm('纭瑕�"' + text + '""' + row.tagname + '"鏍囩鍚楋紵')
- .then(function () {
- return changetagcategory(row.tagid, row.isupload);
- })
- .then(() => {
- this.$modal.msgSuccess(text + "鎴愬姛");
- })
- .catch(function () {
- row.isupload = row.isupload === "0" ? "1" : "0";
- });
- },
- /** 鎼滅储鎸夐挳鎿嶄綔 - 淇敼涓烘悳绱㈠綋鍓嶆縺娲荤殑tab鏁版嵁 */
- handleQuery() {
- this.queryParams.pageNum = 1;
- if (!this.queryParams.dateRange) this.queryParams.dateRange = [];
- if (this.queryParams.statisticaltype == 1) {
- this.queryParams.deptcodes = [];
- } else if (this.queryParams.statisticaltype == 2) {
- this.queryParams.leavehospitaldistrictcodes = [];
- }
-
- this.queryParams.startTime = this.parseTime(
- this.queryParams.dateRange[0]
- );
- this.queryParams.endTime = this.parseTime(this.queryParams.dateRange[1]);
-
- // 鏍规嵁褰撳墠婵�娲荤殑tab鍔犺浇瀵瑰簲鏁版嵁
- if (this.activeTab === "first") {
- this.getFirstFollowUpList();
- } else {
- this.getSecondFollowUpList();
- }
- },
-
- /** 閲嶇疆鎸夐挳鎿嶄綔 */
- resetQuery() {
- this.queryParams.dateRange = [];
- this.queryParams.leavehospitaldistrictcodes = [];
- this.handleQuery();
- },
- // 澶氶�夋閫変腑鏁版嵁
- handleSelectionChange(selection) {
- this.ids = selection.map((item) => item.tagid);
- this.single = selection.length != 1;
- this.multiple = !selection.length;
- },
-
- /** 鍒犻櫎鎸夐挳鎿嶄綔 */
- handleDelete(row) {
- console.log(row, "鍒犻櫎寮圭獥");
- const tagids = row.tagid || this.ids;
- console.log(tagids);
- const tagname = row.tagname;
- this.$modal
- .confirm(
- tagname
- ? '鏄惁纭鍒犻櫎鏍囩鍚嶇О涓�"' + tagname + '"鐨勬暟鎹」锛�'
- : "鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�"
- )
- .then(function () {
- return deletetag(tagids);
- })
- .then(() => {
- this.getList();
- this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- })
- .catch(() => {});
- },
- // 瀵煎嚭鏂规硶
-
- async exportTable() {
- try {
- // 1. 鑾峰彇骞舵牸寮忓寲鏃ユ湡鑼冨洿
- let dateRangeString = "";
- let sheetNameSuffix = "";
-
- if (
- this.queryParams.dateRange &&
- this.queryParams.dateRange.length === 2
- ) {
- const startDateStr = this.queryParams.dateRange[0];
- const endDateStr = this.queryParams.dateRange[1];
- const formatDateForDisplay = (dateTimeStr) => {
- return dateTimeStr.split(" ")[0];
- };
- const startDateFormatted = formatDateForDisplay(startDateStr);
- const endDateFormatted = formatDateForDisplay(endDateStr);
- dateRangeString = `${startDateFormatted}鑷�${endDateFormatted}`;
- sheetNameSuffix = `${startDateFormatted}鑷�${endDateFormatted}`;
- } else {
- const now = new Date();
- const currentMonth = now.getMonth() + 1;
- dateRangeString = `${currentMonth}鏈坄;
- sheetNameSuffix = `${currentMonth}鏈坄;
- }
-
- // 2. 鏍规嵁褰撳墠婵�娲荤殑tab纭畾瀵煎嚭鐨勬暟鎹�
- const isFirstFollowUp = this.activeTab === "first";
- let excelName, worksheetName, dataToExport;
-
- if (isFirstFollowUp) {
- excelName = `棣栨鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
- worksheetName = `棣栨闅忚缁熻_${sheetNameSuffix}`;
- dataToExport = this.firstFollowUpList;
-
- if (!dataToExport || dataToExport.length === 0) {
- this.$message.warning("鏆傛棤棣栨闅忚鏁版嵁鍙鍑�");
- return false;
- }
- } else {
- excelName = `鍐嶆鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
- worksheetName = `鍐嶆闅忚缁熻_${sheetNameSuffix}`;
- dataToExport = this.secondFollowUpList;
-
- if (!dataToExport || dataToExport.length === 0) {
- this.$message.warning("鏆傛棤鍐嶆闅忚鏁版嵁鍙鍑�");
- return false;
- }
- }
-
- // 3. 鍒涘缓宸ヤ綔绨垮拰宸ヤ綔琛�
- const workbook = new ExcelJS.Workbook();
- const worksheet = workbook.addWorksheet(worksheetName);
-
- // 4. 鏋勫缓琛ㄦ牸
- if (isFirstFollowUp) {
- this.buildFirstFollowUpExportSheet(
- worksheet,
- dataToExport,
- sheetNameSuffix
- );
- } else {
- this.buildSecondFollowUpExportSheet(
- worksheet,
- dataToExport,
- sheetNameSuffix
- );
- }
-
- // 5. 鐢熸垚骞朵笅杞芥枃浠�
- const buffer = await workbook.xlsx.writeBuffer();
- const blob = new Blob([buffer], {
- type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
- });
- saveAs(blob, excelName);
-
- this.$message.success("瀵煎嚭鎴愬姛");
- return true;
- } catch (error) {
- console.error("瀵煎嚭澶辫触:", error);
- this.$message.error(`瀵煎嚭澶辫触: ${error.message}`);
- return false;
- }
- },
- /** 鏋勫缓棣栨闅忚瀵煎嚭琛ㄦ牸 */
- buildFirstFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
- const titleStyle = {
- font: {
- name: "寰蒋闆呴粦",
- size: 16,
- bold: true,
- color: { argb: "FF000000" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFE6F3FF" },
- },
- alignment: { vertical: "middle", horizontal: "center", wrapText: true },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const headerStyle = {
- font: {
- name: "寰蒋闆呴粦",
- size: 11,
- bold: true,
- color: { argb: "FF000000" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFF5F7FA" },
- },
- alignment: { vertical: "middle", horizontal: "center", wrapText: true },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const cellStyle = {
- font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
- alignment: { vertical: "middle", horizontal: "center" },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const summaryStyle = {
- font: {
- name: "瀹嬩綋",
- size: 10,
- bold: true,
- color: { argb: "FF409EFF" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFF5F7FA" },
- },
- alignment: { vertical: "middle", horizontal: "center" },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- // 1. 娣诲姞鎬绘爣棰樿
- worksheet.mergeCells(1, 1, 1, 16); // 鍚堝苟A1鍒癙1
- const titleCell = worksheet.getCell(1, 1);
- titleCell.value = `棣栨鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
- titleCell.style = titleStyle;
- worksheet.getRow(1).height = 35;
-
- // 2. 鍒涘缓琛ㄥご
- const secondRowHeaders = [
- "", // A2 灞曞紑鍒楀崰浣�
- "鍑洪櫌鐥呭尯",
- "绉戝",
- "鍑洪櫌浜烘",
- "鏃犻渶闅忚浜烘",
- "搴旈殢璁夸汉娆�", // B2 to F2
- // 棣栨鍑洪櫌闅忚瀛愯〃澶�
- "闇�闅忚",
- "寰呴殢璁�",
- "闅忚鎴愬姛",
- "闅忚澶辫触",
- "闅忚鐜�",
- "鍙婃椂鐜�",
- "浜哄伐",
- "鐭俊",
- "寰俊",
- ];
-
- // 娣诲姞绗簩琛�
- secondRowHeaders.forEach((header, index) => {
- const cell = worksheet.getCell(3, index + 1);
- cell.value = header;
- cell.style = headerStyle;
- });
-
- // 3. 鍚堝苟鍗曞厓鏍�
- // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
- for (let i = 1; i <= 6; i++) {
- worksheet.mergeCells(2, i, 3, i);
- const cell = worksheet.getCell(2, i);
- cell.style = headerStyle;
- }
-
- // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
- worksheet.getCell(2, 1).value = "";
- worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
- worksheet.getCell(2, 3).value = "绉戝";
- worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
- worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
- worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
-
- // 4. 鍚堝苟"棣栨鍑洪櫌闅忚"鏍囬
- worksheet.mergeCells(2, 7, 2, 15); // G2:O2
- worksheet.getCell(2, 7).value = "棣栨鍑洪櫌闅忚";
- worksheet.getCell(2, 7).style = headerStyle;
-
- // 5. 璁剧疆琛岄珮
- worksheet.getRow(2).height = 28;
- worksheet.getRow(3).height = 25;
-
- // 6. 娣诲姞鏁版嵁琛�
- data.forEach((item, rowIndex) => {
- const dataRow = worksheet.addRow(
- [
- "", // 灞曞紑鍒�
- item.leavehospitaldistrictname || "",
- item.deptname || "",
- item.dischargeCount || 0,
- item.nonFollowUp || 0,
- item.followUpNeeded || 0,
- // 棣栨鍑洪櫌闅忚鏁版嵁
- item.needFollowUp || 0,
- item.pendingFollowUp || 0,
- item.followUpSuccess || 0,
- item.followUpFail || 0,
- item.followUpRate || "0%",
- item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
- item.manual || 0,
- item.sms || 0,
- item.weChat || 0,
- ],
- rowIndex + 4
- );
-
- // 搴旂敤鏁版嵁琛屾牱寮�
- dataRow.eachCell((cell) => {
- cell.style = cellStyle;
- });
- dataRow.height = 24;
- });
-
- // 7. 娣诲姞鍚堣琛�
- const summaries = this.getFirstFollowUpSummaries(data);
- const summaryRow = worksheet.addRow(summaries);
- summaryRow.eachCell((cell, colNumber) => {
- cell.style = summaryStyle;
- if (colNumber === 1) {
- cell.value = "鍚堣";
- }
- });
- summaryRow.height = 28;
-
- // 8. 璁剧疆鍒楀
- worksheet.columns = [
- { width: 8 }, // 灞曞紑鍒�
- { width: 20 }, // 鍑洪櫌鐥呭尯
- { width: 15 }, // 绉戝
- { width: 12 }, // 鍑洪櫌浜烘
- { width: 12 }, // 鏃犻渶闅忚浜烘
- { width: 12 }, // 搴旈殢璁夸汉娆�
- // 棣栨鍑洪櫌闅忚鍒�
- { width: 10 }, // 闇�闅忚
- { width: 10 }, // 寰呴殢璁�
- { width: 10 }, // 闅忚鎴愬姛
- { width: 10 }, // 闅忚澶辫触
- { width: 12 }, // 闅忚鐜�
- { width: 12 }, // 鍙婃椂鐜�
- { width: 8 }, // 浜哄伐
- { width: 8 }, // 鐭俊
- { width: 8 }, // 寰俊
- ];
- },
-
- /** 棣栨闅忚鏁版嵁鍚堣琛岃绠� */
- getFirstFollowUpSummaries(data) {
- const summaries = [
- "鍚堣",
- "/",
- "/",
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- "0%",
- "0%",
- 0,
- 0,
- 0,
- ];
-
- data.forEach((item) => {
- // 鏁板�煎瓧娈垫眰鍜�
- summaries[3] += Number(item.dischargeCount) || 0;
- 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;
- summaries[12] += Number(item.manual) || 0;
- summaries[13] += Number(item.sms) || 0;
- summaries[14] += Number(item.weChat) || 0;
- });
-
- // 璁$畻鐧惧垎姣斿瓧娈电殑骞冲潎鍊�
- const followUpRateValues = data
- .map((item) => this.extractPercentageValue(item.followUpRate))
- .filter((value) => value !== null);
-
- const rateValues = data
- .map((item) => this.extractPercentageValue(item.rate))
- .filter((value) => value !== null);
-
- if (followUpRateValues.length > 0) {
- const avgFollowUpRate =
- followUpRateValues.reduce((sum, val) => sum + val, 0) /
- followUpRateValues.length;
- summaries[10] = (avgFollowUpRate * 100).toFixed(2) + "%";
- }
-
- if (rateValues.length > 0) {
- const avgRate =
- rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length;
- summaries[11] = (avgRate * 100).toFixed(2) + "%";
- }
-
- // 鏍煎紡鍖栨暟瀛�
- summaries[3] = this.formatNumber(summaries[3]);
- summaries[4] = this.formatNumber(summaries[4]);
- summaries[5] = this.formatNumber(summaries[5]);
- summaries[6] = this.formatNumber(summaries[6]);
- summaries[7] = this.formatNumber(summaries[7]);
- summaries[8] = this.formatNumber(summaries[8]);
- summaries[9] = this.formatNumber(summaries[9]);
- summaries[12] = this.formatNumber(summaries[12]);
- summaries[13] = this.formatNumber(summaries[13]);
- summaries[14] = this.formatNumber(summaries[14]);
-
- return summaries;
- },
-
- /** 鏋勫缓鍐嶆闅忚瀵煎嚭琛ㄦ牸 */
- buildSecondFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
- const titleStyle = {
- font: {
- name: "寰蒋闆呴粦",
- size: 16,
- bold: true,
- color: { argb: "FF000000" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFE6F3FF" },
- },
- alignment: { vertical: "middle", horizontal: "center", wrapText: true },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const headerStyle = {
- font: {
- name: "寰蒋闆呴粦",
- size: 11,
- bold: true,
- color: { argb: "FF000000" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFF5F7FA" },
- },
- alignment: { vertical: "middle", horizontal: "center", wrapText: true },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const cellStyle = {
- font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
- alignment: { vertical: "middle", horizontal: "center" },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- const summaryStyle = {
- font: {
- name: "瀹嬩綋",
- size: 10,
- bold: true,
- color: { argb: "FF409EFF" },
- },
- fill: {
- type: "pattern",
- pattern: "solid",
- fgColor: { argb: "FFF5F7FA" },
- },
- alignment: { vertical: "middle", horizontal: "center" },
- border: {
- top: { style: "thin", color: { argb: "FFD0D0D0" } },
- left: { style: "thin", color: { argb: "FFD0D0D0" } },
- bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
- right: { style: "thin", color: { argb: "FFD0D0D0" } },
- },
- };
-
- // 1. 娣诲姞鎬绘爣棰樿
- worksheet.mergeCells(1, 1, 1, 15); // 鍚堝苟A1鍒癘1
- const titleCell = worksheet.getCell(1, 1);
- titleCell.value = `鍐嶆鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
- titleCell.style = titleStyle;
- worksheet.getRow(1).height = 35;
-
- // 2. 鍒涘缓琛ㄥご
- const secondRowHeaders = [
- "", // A2 灞曞紑鍒楀崰浣�
- "鍑洪櫌鐥呭尯",
- "绉戝",
- "鍑洪櫌浜烘",
- "鏃犻渶闅忚浜烘",
- "搴旈殢璁夸汉娆�", // B2 to F2
- // 鍐嶆鍑洪櫌闅忚瀛愯〃澶�
- "闇�闅忚",
- "寰呴殢璁�",
- "闅忚鎴愬姛",
- "闅忚澶辫触",
- "闅忚鐜�",
- "浜哄伐",
- "鐭俊",
- "寰俊",
- ];
-
- // 娣诲姞绗簩琛�
- secondRowHeaders.forEach((header, index) => {
- const cell = worksheet.getCell(3, index + 1);
- cell.value = header;
- cell.style = headerStyle;
- });
-
- // 3. 鍚堝苟鍗曞厓鏍�
- // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
- for (let i = 1; i <= 6; i++) {
- worksheet.mergeCells(2, i, 3, i);
- const cell = worksheet.getCell(2, i);
- cell.style = headerStyle;
- }
-
- // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
- worksheet.getCell(2, 1).value = "";
- worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
- worksheet.getCell(2, 3).value = "绉戝";
- worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
- worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
- worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
-
- // 4. 鍚堝苟"鍐嶆鍑洪櫌闅忚"鏍囬
- worksheet.mergeCells(2, 7, 2, 14); // G2:N2
- worksheet.getCell(2, 7).value = "鍐嶆鍑洪櫌闅忚";
- worksheet.getCell(2, 7).style = headerStyle;
-
- // 5. 璁剧疆琛岄珮
- worksheet.getRow(2).height = 28;
- worksheet.getRow(3).height = 25;
-
- // 6. 娣诲姞鏁版嵁琛�
- data.forEach((item, rowIndex) => {
- const dataRow = worksheet.addRow(
- [
- "", // 灞曞紑鍒�
- item.leavehospitaldistrictname || "",
- item.deptname || "",
- item.dischargeCount || 0,
- item.nonFollowUp || 0,
- item.followUpNeeded || 0,
- // 鍐嶆鍑洪櫌闅忚鏁版嵁
- item.needFollowUpAgain || 0,
- item.pendingFollowUpAgain || 0,
- item.followUpSuccessAgain || 0,
- item.followUpFailAgain || 0,
- item.followUpRateAgain || "0%",
- item.manualAgain || 0,
- item.smsAgain || 0,
- item.weChatAgain || 0,
- ],
- rowIndex + 4
- );
-
- // 搴旂敤鏁版嵁琛屾牱寮�
- dataRow.eachCell((cell) => {
- cell.style = cellStyle;
- });
- dataRow.height = 24;
- });
-
- // 7. 娣诲姞鍚堣琛�
- const summaries = this.getSecondFollowUpSummaries(data);
- const summaryRow = worksheet.addRow(summaries);
- summaryRow.eachCell((cell, colNumber) => {
- cell.style = summaryStyle;
- if (colNumber === 1) {
- cell.value = "鍚堣";
- }
- });
- summaryRow.height = 28;
-
- // 8. 璁剧疆鍒楀
- worksheet.columns = [
- { width: 8 }, // 灞曞紑鍒�
- { width: 20 }, // 鍑洪櫌鐥呭尯
- { width: 15 }, // 绉戝
- { width: 12 }, // 鍑洪櫌浜烘
- { width: 12 }, // 鏃犻渶闅忚浜烘
- { width: 12 }, // 搴旈殢璁夸汉娆�
- // 鍐嶆鍑洪櫌闅忚鍒�
- { width: 10 }, // 闇�闅忚
- { width: 10 }, // 寰呴殢璁�
- { width: 10 }, // 闅忚鎴愬姛
- { width: 10 }, // 闅忚澶辫触
- { width: 12 }, // 闅忚鐜�
- { width: 8 }, // 浜哄伐
- { width: 8 }, // 鐭俊
- { width: 8 }, // 寰俊
- ];
- },
-
- /** 鍐嶆闅忚鏁版嵁鍚堣琛岃绠� */
- getSecondFollowUpSummaries(data) {
- const summaries = ["鍚堣", "/", "/", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0];
-
- data.forEach((item) => {
- // 鏁板�煎瓧娈垫眰鍜�
- summaries[3] += Number(item.dischargeCount) || 0;
- summaries[4] += Number(item.nonFollowUp) || 0;
- summaries[5] += Number(item.followUpNeeded) || 0;
- summaries[6] += Number(item.needFollowUpAgain) || 0;
- summaries[7] += Number(item.pendingFollowUpAgain) || 0;
- summaries[8] += Number(item.followUpSuccessAgain) || 0;
- summaries[9] += Number(item.followUpFailAgain) || 0;
- summaries[11] += Number(item.manualAgain) || 0;
- summaries[12] += Number(item.smsAgain) || 0;
- summaries[13] += Number(item.weChatAgain) || 0;
- });
-
- // 璁$畻闅忚鐜囩櫨鍒嗘瘮瀛楁鐨勫钩鍧囧��
- const followUpRateAgainValues = data
- .map((item) => this.extractPercentageValue(item.followUpRateAgain))
- .filter((value) => value !== null);
-
- if (followUpRateAgainValues.length > 0) {
- const avgFollowUpRateAgain =
- followUpRateAgainValues.reduce((sum, val) => sum + val, 0) /
- followUpRateAgainValues.length;
- summaries[10] = (avgFollowUpRateAgain * 100).toFixed(2) + "%";
- }
-
- // 鏍煎紡鍖栨暟瀛�
- summaries[3] = this.formatNumber(summaries[3]);
- summaries[4] = this.formatNumber(summaries[4]);
- summaries[5] = this.formatNumber(summaries[5]);
- summaries[6] = this.formatNumber(summaries[6]);
- summaries[7] = this.formatNumber(summaries[7]);
- summaries[8] = this.formatNumber(summaries[8]);
- summaries[9] = this.formatNumber(summaries[9]);
- summaries[11] = this.formatNumber(summaries[11]);
- summaries[12] = this.formatNumber(summaries[12]);
- summaries[13] = this.formatNumber(summaries[13]);
-
- return summaries;
- },
-
- /** 鍐嶆闅忚琛ㄦ牸鐨勫悎璁¤璁$畻鏂规硶 */
- getSummariesSecond(param) {
- const { columns, data } = param;
- const sums = [];
-
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "鍚堣";
- return;
- }
- if (index === 1 || index === 2) {
- sums[index] = "/";
- return;
- }
-
- if (column.property === "followUpRateAgain") {
- const percentageValues = data
- .map((item) => {
- const value = item[column.property];
- if (!value || value === "-" || value === "0%") return null;
- if (typeof value === "string" && value.includes("%")) {
- const numValue = parseFloat(value.replace("%", "")) / 100;
- return isNaN(numValue) ? null : numValue;
- } else {
- const numValue = parseFloat(value);
- return isNaN(numValue) ? null : numValue;
- }
- })
- .filter((value) => value !== null && value !== 0);
-
- if (percentageValues.length > 0) {
- const average =
- percentageValues.reduce((sum, value) => sum + value, 0) /
- percentageValues.length;
- sums[index] = (average * 100).toFixed(2) + "%";
- } else {
- sums[index] = "0.00%";
- }
- } else {
- const values = data.map((item) => {
- const value = item[column.property];
- if (value === "-" || value === "" || value === null) return 0;
- return Number(value) || 0;
- });
-
- if (!values.every((value) => isNaN(value))) {
- sums[index] = values.reduce((prev, curr) => prev + curr, 0);
- sums[index] = this.formatNumber(sums[index]);
- } else {
- sums[index] = "-";
- }
- }
- });
-
- return sums;
- },
- /** 鍐嶆闅忚鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉� */
- getInnerSummariesSecond(param) {
- const { columns, data } = param;
- const sums = [];
-
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "灏忚";
- return;
- }
-
- if (column.property === "drname" || column.property === "deptname") {
- sums[index] = "-";
- return;
- }
-
- if (column.property === "followUpRateAgain") {
- const percentageValues = data
- .map((item) => {
- const value = item[column.property];
- if (!value || value === "-" || value === "0%") return null;
- if (typeof value === "string" && value.includes("%")) {
- const numValue = parseFloat(value.replace("%", "")) / 100;
- return isNaN(numValue) ? null : numValue;
- } else {
- const numValue = parseFloat(value);
- return isNaN(numValue) ? null : numValue;
- }
- })
- .filter((value) => value !== null && value !== 0);
-
- if (percentageValues.length > 0) {
- const average =
- percentageValues.reduce((sum, value) => sum + value, 0) /
- percentageValues.length;
- sums[index] = (average * 100).toFixed(2) + "%";
- } else {
- sums[index] = "0.00%";
- }
- } else {
- const values = data.map((item) => {
- const value = item[column.property];
- if (value === "-" || value === "" || value === null) return 0;
- return Number(value) || 0;
- });
-
- if (!values.every((value) => isNaN(value))) {
- sums[index] = values.reduce((prev, curr) => prev + curr, 0);
- sums[index] = this.formatNumber(sums[index]);
- } else {
- sums[index] = "-";
- }
- }
- });
-
- return sums;
- },
- /** 鍐嶆闅忚琛ㄦ牸鐨勮鐐瑰嚮灞曞紑 */
- handleRowClickSecond(row) {
- if (this.expandsSecond.includes(this.getRowKey(row))) {
- this.expandsSecond = [];
- return;
- }
-
- const params = {
- ...this.queryParams,
- deptcodes: this.queryParams.deptcodes.includes("all")
- ? this.allDeptCodes
- : this.queryParams.deptcodes,
- leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
- drcode: "1",
- visitCount: 2, // 璁剧疆涓哄啀娆¢殢璁�
- };
-
- delete params.leavehospitaldistrictcodes.all;
- delete params.deptcodes.all;
-
- if (!row.doctorStats) {
- this.loadingSecond = true;
- getSfStatistics(params).then((res) => {
- this.$set(row, "doctorStats", res.data);
- this.expandsSecond = [this.getRowKey(row)];
- this.loadingSecond = false;
- });
- } else {
- this.expandsSecond = [this.getRowKey(row)];
- }
- },
-
- /** 鍐嶆闅忚琛ㄦ牸鐨勫閫夋閫変腑鏁版嵁 */
- handleSelectionChangeSecond(selection) {
- this.idsSecond = selection.map((item) => item.tagid);
- this.single = selection.length != 1;
- this.multiple = !selection.length;
- },
- // 鏄剧ず鍥捐〃寮圭獥
-
- showChartDialog() {
- this.chartDialogVisible = true;
- this.$nextTick(() => {
- this.initPieChart();
- this.initBarLineChart();
- });
- },
- // 鍦╩ethods涓慨鏀圭粺璁℃柟娉�
- showChartDialog() {
- this.chartDialogVisible = true;
- this.$nextTick(() => {
- console.log(this.userList, "this.userList");
-
- this.initCharts();
- });
- },
-
- // 鏂板鍒濆鍖栧浘琛ㄦ柟娉�
- initCharts() {
- this.initPieChart();
- this.initBarLineChart();
- },
-
- // 鍒濆鍖栭ゼ鍥�
- initPieChart() {
- const echarts = require("echarts");
- const pieDom = document.getElementById("pieChart");
- if (!pieDom) return;
-
- if (this.pieChart) {
- this.pieChart.dispose();
- }
-
- this.pieChart = echarts.init(pieDom);
-
- // 璁$畻楗煎浘鏁版嵁
- const followUpData = {
- pending: 0,
- success: 0,
- fail: 0,
- };
-
- this.userList.forEach((item) => {
- followUpData.pending += item.pendingFollowUp || 0;
- followUpData.success += item.followUpSuccess || 0;
- followUpData.fail += item.followUpFail || 0;
- });
-
- // 浣跨敤鏇寸編瑙傜殑棰滆壊鏂规
- const pieOption = {
- title: {
- text: "闅忚鐘舵�佸垎甯�",
- left: "center",
- textStyle: {
- color: "#333",
- fontSize: 16,
- },
- },
- tooltip: {
- trigger: "item",
- formatter: "{a} <br/>{b}: {c} ({d}%)",
- },
- legend: {
- orient: "vertical",
- left: "left",
- data: ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"],
- textStyle: {
- color: "#666",
- },
- },
- color: ["#FF9D4D", "#36B37E", "#FF5C5C"], // 鏂扮殑閰嶈壊鏂规
- series: [
- {
- name: "闅忚鐘舵��",
- type: "pie",
- radius: ["40%", "70%"],
- avoidLabelOverlap: true,
- itemStyle: {
- borderRadius: 10,
- borderColor: "#fff",
- borderWidth: 2,
- },
- label: {
- show: true,
- formatter: "{b}: {c} ({d}%)",
- color: "#333",
- },
- emphasis: {
- label: {
- show: true,
- fontSize: "18",
- fontWeight: "bold",
- },
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: "rgba(0, 0, 0, 0.5)",
- },
- },
- data: [
- {
- value: followUpData.pending,
- name: "寰呴殢璁�",
- },
- {
- value: followUpData.success,
- name: "闅忚鎴愬姛",
- },
- {
- value: followUpData.fail,
- name: "闅忚澶辫触",
- },
- ],
- },
- ],
- };
-
- this.pieChart.setOption(pieOption);
- window.addEventListener("resize", this.resizePieChart);
- },
-
- // 鍒濆鍖栨煴鐘舵姌绾垮浘
- initBarLineChart() {
- const echarts = require("echarts");
- const barDom = document.getElementById("barLineChart");
- if (!barDom) return;
-
- if (this.barLineChart) {
- this.barLineChart.dispose();
- }
-
- this.barLineChart = echarts.init(barDom);
-
- // 鍑嗗鏁版嵁
- const categories = this.userList.map(
- (item) => item.leavehospitaldistrictname || item.deptname
- );
-
- const dischargeData = this.userList.map(
- (item) => item.dischargeCount || 0
- );
- const followUpData = this.userList.map(
- (item) => item.followUpNeeded || 0
- );
-
- // 鏂板涓ゆ潯鎶樼嚎鏁版嵁
- const followUpRateData = this.userList.map((item) => {
- if (!item.followUpRate) return 0;
- // 鍘绘帀鐧惧垎鍙峰苟杞负鏁板瓧
- const rateStr = String(item.followUpRate).replace("%", "");
- return parseFloat(rateStr) || 0;
- });
-
- const timelyRateData = this.userList.map((item) =>
- item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
- );
-
- const option = {
- title: {
- text: "绉戝/鐥呭尯闅忚瓒嬪娍",
- left: "center",
- textStyle: {
- color: "#333",
- fontSize: 16,
- },
- },
- tooltip: {
- trigger: "axis",
- axisPointer: {
- type: "cross",
- crossStyle: {
- color: "#999",
- },
- },
- },
- legend: {
- data: ["鍑洪櫌浜烘", "搴旈殢璁夸汉娆�", "闅忚鐜�(%)", "鍙婃椂鐜�(%)"],
- top: "bottom",
- textStyle: {
- color: "#666",
- },
- },
- color: ["#5470C6", "#91CC75", "#EE6666", "#9A60B4"], // 鏂板绱壊鐢ㄤ簬鍙婃椂鐜�
- xAxis: {
- type: "category",
- data: categories,
- axisLabel: {
- interval: 0,
- rotate: 30,
- color: "#666",
- },
- axisLine: {
- lineStyle: {
- color: "#ddd",
- },
- },
- },
- yAxis: [
- {
- type: "value",
- name: "浜烘",
- min: 0,
- axisLabel: {
- color: "#666",
- },
- axisLine: {
- lineStyle: {
- color: "#ddd",
- },
- },
- splitLine: {
- lineStyle: {
- color: "#f0f0f0",
- },
- },
- },
- {
- type: "value",
- name: "鐧惧垎姣�(%)",
- min: 0,
- max: 100,
- axisLabel: {
- color: "#666",
- formatter: "{value}%",
- },
- axisLine: {
- lineStyle: {
- color: "#ddd",
- },
- },
- splitLine: {
- show: false,
- },
- },
- ],
- series: [
- {
- name: "鍑洪櫌浜烘",
- type: "bar",
- barWidth: "25%",
- data: dischargeData,
- itemStyle: {
- borderRadius: [4, 4, 0, 0],
- },
- },
- {
- name: "搴旈殢璁夸汉娆�",
- type: "bar",
- barWidth: "25%",
- data: followUpData,
- itemStyle: {
- borderRadius: [4, 4, 0, 0],
- },
- },
- {
- name: "闅忚鐜�(%)",
- type: "line",
- yAxisIndex: 1,
- data: followUpRateData,
- symbolSize: 8,
- lineStyle: {
- width: 3,
- },
- markLine: {
- silent: true,
- data: [
- {
- yAxis: 80,
- lineStyle: {
- color: "#EE6666",
- type: "dashed",
- },
- // label: {
- // position: 'end',
- // formatter: '鐩爣80%'
- // }
- },
- ],
- },
- },
- {
- name: "鍙婃椂鐜�(%)",
- type: "line",
- yAxisIndex: 1,
- data: timelyRateData,
- symbolSize: 8,
- lineStyle: {
- width: 3,
- type: "dotted", // 浣跨敤铏氱嚎鍖哄垎
- },
- markLine: {
- silent: true,
- data: [
- {
- yAxis: 90,
- lineStyle: {
- color: "#9A60B4",
- type: "dashed",
- },
- // label: {
- // position: 'end',
- // formatter: '鐩爣90%'
- // }
- },
- ],
- },
- },
- ],
- grid: {
- top: "15%",
- left: "3%",
- right: "4%",
- bottom: "15%",
- containLabel: true,
- },
- };
-
- this.barLineChart.setOption(option);
- window.addEventListener("resize", this.resizeBarLineChart);
- },
-
- // 鍥捐〃鍝嶅簲寮忚皟鏁存柟娉�
- resizePieChart() {
- if (this.pieChart) {
- this.pieChart.resize();
- }
- },
-
- resizeBarLineChart() {
- if (this.barLineChart) {
- this.barLineChart.resize();
- }
- },
-
- // 鍦ㄧ粍浠堕攢姣佹椂娓呯悊
- beforeDestroy() {
- // 绉婚櫎浜嬩欢鐩戝惉
- window.removeEventListener("resize", this.resizePieChart);
- window.removeEventListener("resize", this.resizeBarLineChart);
-
- // 閿�姣佸浘琛ㄥ疄渚�
- if (this.pieChart) {
- this.pieChart.dispose();
- this.pieChart = null;
- }
- if (this.barLineChart) {
- this.barLineChart.dispose();
- this.barLineChart = null;
- }
- },
- },
-};
-</script>
-
-<style lang="scss" scoped>
-::v-deep .el-tabs__header {
- margin-bottom: 20px;
-}
-
-::v-deep .el-tabs__item {
- font-size: 16px;
- padding: 0 20px;
- height: 40px;
- line-height: 40px;
-}
-
-::v-deep .el-tabs__active-bar {
- height: 3px;
-}
-
-/* Tab鍐呭鍖哄煙鏍峰紡 */
-.el-tab-pane {
- .your-table-container {
- margin-top: 10px;
- }
-}
-
-.sidecolumn {
- width: 180px;
- min-height: 100vh;
- text-align: center;
- // display: flex;
- margin-top: 20px;
- 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);
-
- .sidecolumn-top {
- display: flex;
- justify-content: space-between;
-
- .top-wj {
- font-size: 20px;
- }
-
- .top-tj {
- font-size: 18px;
-
- color: rgb(0, 89, 255);
- cursor: pointer;
- }
- }
-
- .center-ss {
- margin-top: 30px;
-
- .input-with-select {
- height: 40px !important;
- }
- }
-
- .bottom-fl {
- margin-top: 30px;
- display: center !important;
- }
-}
-
-.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);
-
- .qrcode-text {
- font-size: 20px;
-
- span {
- margin-left: 20px;
- }
- }
-
- .qrcode-img {
- width: 300px;
- height: 400px;
- }
-}
-
-::v-deep.el-tabs--left,
-.el-tabs--right {
- overflow: hidden;
- align-items: center;
- display: flex;
-}
-
-::v-deep.el-input--medium .el-input__inner {
- height: 40px !important;
-}
-
-::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
- height: 40px;
- width: 5px;
- left: 0;
-}
-
-::v-deep.el-tabs--right .el-tabs__item.is-right {
- display: block;
- text-align: left;
- font-size: 20px;
-}
-
-// 缇庡寲鍚堣琛屾牱寮�
-::v-deep .el-table__footer {
- .el-table__cell {
- background-color: #f5f7fa;
- font-weight: 600;
- color: #409eff;
-
- .cell {
- font-weight: 600;
- color: #409eff;
- }
- }
-}
-
-// 鍐呴儴琛ㄦ牸鍚堣琛屾牱寮�
-::v-deep .inner-table .el-table__footer {
- .el-table__cell {
- background-color: #ecf5ff;
- font-weight: 500;
- color: #67c23a;
-
- .cell {
- font-weight: 500;
- color: #67c23a;
- }
- }
-}
-
-// 鐧惧垎姣斿瓧娈电壒娈婃牱寮�
-.your-table-container
- ::v-deep
- .el-table__footer
- .el-table__cell[data-field="followUpRate"]
- .cell,
-.your-table-container
- ::v-deep
- .el-table__footer
- .el-table__cell[data-field="rate"]
- .cell,
-.your-table-container
- ::v-deep
- .el-table__footer
- .el-table__cell[data-field="followUpRateAgain"]
- .cell {
- color: #e6a23c !important;
- font-weight: 700 !important;
-}
-
-.leftvlue {
- // display: flex;
- // flex: 1;
- // width: 80%;
- // margin-top: 20px;
- margin: 20px;
- padding: 30px;
- background: #ffff;
- 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);
-
- .mulsz {
- font-size: 20px;
- }
-}
-
-/* 浣胯鏈夋墜鍨嬫寚閽� */
-.el-table__row {
- cursor: pointer;
-}
-
-/* 鍐呭眰鍖荤敓琛ㄦ牸鏍峰紡 */
-.inner-table {
- // 琛ㄥご鑳屾櫙鑹�
- ::v-deep .el-table__header-wrapper {
- background-color: #f0f7ff !important;
-
- th {
- background-color: #f0f7ff !important;
- }
- }
-
- // 琛ㄦ牸琛岃儗鏅壊
- ::v-deep .el-table__body-wrapper {
- tr {
- background-color: #f9fbfe !important;
-
- &:hover {
- background-color: #e6f1ff !important;
- }
- }
- }
-
- // 杈规棰滆壊
- ::v-deep .el-table--border {
- border-color: #d9e8ff !important;
-
- td,
- th {
- border-color: #d9e8ff !important;
- }
- }
-
- // 鏂戦┈绾规晥鏋�
- ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
- background-color: #f5f9ff !important;
- }
-}
-
-/* 灞曞紑琛屾牱寮� */
-.el-table__expanded-cell {
- padding: 10px 0 !important;
- background: #f8f8f8;
-}
-
-.document {
- width: 100px;
- height: 50px;
-}
-
-.data-list {
- max-height: 800px;
- overflow-y: auto;
-}
-
-.documentf {
- display: flex;
- justify-content: flex-end;
-}
-
-.button-text {
- color: rgb(70, 204, 238);
-}
-
-.button-textck {
- color: rgb(39, 167, 67);
-}
-
-.button-textxg {
- color: rgb(35, 81, 233);
-}
-
-.button-textsc {
- color: rgb(235, 23, 23);
-}
-</style>
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index 9171a12..9fdb102 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -70,6 +70,25 @@
</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"
@@ -230,7 +249,7 @@
import DetailDialog from "./components/DetailDialog.vue";
import TimelyRateDialog from "./components/TimelyRateDialog.vue";
import CombinedFollowUp from "./components/CombinedFollowUp.vue";
-import { getSfStatisticsHyperlink } from "@/api/AiCentre/index";
+import { getSfStatisticsHyperlink, getTasklist } from "@/api/AiCentre/index";
export default {
name: "Percentage",
@@ -254,8 +273,11 @@
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") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�"
@@ -263,6 +285,7 @@
: 1,
leavehospitaldistrictcodes: ["all"],
deptcodes: ["all"],
+ taskIds: [],
},
pickerOptions: {
shortcuts: [
@@ -297,6 +320,7 @@
},
flatArrayhospit: [],
flatArraydept: [],
+ taskList: [],
allDeptCodes: [],
allWardCodes: [],
showSearch: true,
@@ -332,6 +356,15 @@
},
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: {
@@ -360,6 +393,11 @@
this.flatArraydept.push({ label: "鍏ㄩ儴", value: "all" });
this.flatArrayhospit.push({ label: "鍏ㄩ儴", value: "all" });
+
+ // 浠诲姟鍒楄〃锛堢敤浜庝换鍔$瓫閫夛級
+ getTasklist({ pageNum: 1, pageSize: 100 }).then((response) => {
+ this.taskList = response.rows || [];
+ });
},
// 娣诲姞鑾峰彇鏈�杩戜竴涓湀鏃堕棿鑼冨洿鐨勬柟娉�
getLastMonthRange() {
@@ -432,6 +470,7 @@
resetQuery() {
this.queryParams.dateRange = [];
this.queryParams.leavehospitaldistrictcodes = [];
+ this.queryParams.taskIds = [];
this.handleQuery();
},
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 987b5f7..9c5693e 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -199,14 +199,39 @@
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"
@@ -552,6 +577,7 @@
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";
@@ -572,6 +598,8 @@
multiple: true,
// 鏄剧ず鎼滅储鏉′欢
showSearch: true,
+ // 褰撳墠鏈烘瀯鍚嶇О
+ orgname: localStorage.getItem("orgname") || "",
// 鎬绘潯鏁�
total: 0,
// 鐢ㄦ埛琛ㄦ牸鏁版嵁
@@ -581,6 +609,12 @@
// 閮ㄩ棬鏍戦�夐」
deptOptionsks: undefined,
deptOptionsbq: undefined,
+ // 绉戝缂栫爜 -> 鍚嶇О鏄犲皠
+ deptNameMap: {},
+ // 鐥呭尯缂栫爜 -> 鍚嶇О鏄犲皠
+ wardNameMap: {},
+ // 闄㈠尯缂栫爜 -> 鍚嶇О鏄犲皠
+ campusNameMap: {},
// 鏄惁鏄剧ず寮瑰嚭灞�
open: false,
// 閮ㄩ棬鍚嶇О
@@ -636,10 +670,12 @@
{ 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 },
],
// 琛ㄥ崟鏍¢獙
@@ -689,7 +725,6 @@
},
},
created() {
- this.getList();
this.getDeptTree();
this.getConfigKey("sys.user.initPassword").then((response) => {
this.initPassword = response.msg;
@@ -712,6 +747,7 @@
(response) => {
this.userList = response.rows;
this.total = response.total;
+ this.enrichUserDept();
this.loading = false;
}
);
@@ -719,17 +755,74 @@
/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
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)] || "-";
+ });
+ },
+ /** 瑙f瀽缂栫爜 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) {
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip"
new file mode 100644
index 0000000..3c9172a
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip"
new file mode 100644
index 0000000..9191b66
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip"
new file mode 100644
index 0000000..5b63048
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip"
new file mode 100644
index 0000000..8847582
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip"
Binary files differ
--
Gitblit v1.9.3