From 9903954c85f651dd5cc6d4b538cfe66b17fc5baa Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期三, 28 十月 2026 18:23:45 +0800
Subject: [PATCH] 提交
---
src/views/Satisfaction/sfstatistics/components/DataOverview.vue | 188 +++++++++++++++++++++++++++++++++++++++--------
1 files changed, 156 insertions(+), 32 deletions(-)
diff --git a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
index d221e0f..4539a87 100644
--- a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
+++ b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
@@ -3,6 +3,19 @@
<!-- 椤堕儴绛涢�夛細鏃堕棿鑼冨洿 + 绉戝/鐥呭尯锛屾帶鍒舵湰椤垫墍鏈夋暟鎹� -->
<el-card shadow="never" class="overview-card filter-card">
<el-form inline class="filter-form">
+ <el-form-item label="婊℃剰搴︾被鍨�">
+ <el-select
+ v-model="satisfactionScope"
+ size="small"
+ style="width: 140px"
+ clearable
+ placeholder="榛樿绂婚櫌"
+ @change="fetchData"
+ >
+ <el-option label="绂婚櫌婊℃剰搴�" value="leave" />
+ <el-option label="鍦ㄩ櫌婊℃剰搴�" value="hospital" />
+ </el-select>
+ </el-form-item>
<el-form-item label="鍑洪櫌鏃ユ湡">
<el-date-picker
v-model="queryParams.dateRange"
@@ -101,6 +114,7 @@
<el-card shadow="never" class="overview-card">
<div slot="header" class="card-header">
<span class="card-title">鍚勬湇鍔¢」鐩弧鎰忓害缁熻</span>
+ <span class="card-subtitle">锛堝叚妗h瘎鍒嗛锛氬緢婊℃剰/婊℃剰/涓�鑸�/涓嶆弧鎰�/寰堜笉婊℃剰/鏈粡鍘嗭級</span>
<el-button
type="warning"
size="small"
@@ -161,7 +175,8 @@
<!-- 琛ㄦ牸浜岋細鍗曢�夐/澶氶�夐缁熻锛堝叾浣欓鐩級 -->
<el-card shadow="never" class="overview-card">
<div slot="header" class="card-header">
- <span class="card-title">鍗曢�夐/澶氶�夐缁熻</span>
+ <span class="card-title">鍏朵粬棰樼洰缁熻</span>
+ <span class="card-subtitle">锛堝叚妗f弧鎰忓害棰樺凡鍦ㄤ笂琛紝杩欓噷鍙垪鍏朵綑棰樺瀷锛氭帹鑽愩�佹姳鎬ㄥ洖搴斻�佹剰瑙佺瓑锛�</span>
<div class="header-right">
<el-input
v-model="questionSearch"
@@ -320,6 +335,7 @@
<script>
import { sltdMydTotalByScore,statQuestionOptionByKsOrBq } from "@/api/AiCentre/satisfaction";
+import { deptTreeSelect } from "@/api/system/user";
import XLSX from "xlsx";
// 婊℃剰搴﹂鐨勫浐瀹氶�夐」锛堥『搴忓嵆琛ㄦ牸鍒楅『搴忥級鈥斺�旇繖浜涢�夐」鐨勯鐩繘琛ㄤ竴锛屽叾浣欒繘琛ㄤ簩
@@ -347,9 +363,10 @@
// 鏈嶅姟绫诲瀷榛樿閫変腑椤癸紙鎸� label 鍖归厤锛岄�傞厤涓嶅悓瀛楀吀鐨� value 宸紓锛�
const DEFAULT_SERVICE_LABELS = ["浣忛櫌婊℃剰搴�", "闂ㄨ瘖婊℃剰搴�"];
-// 鍏滃簳锛歴tore 涓棤绉戝/鐥呭尯鏁版嵁鏃朵娇鐢紙琛ㄤ笁瀵规瘮 + 绛涢�変笅鎷夛級
-const DEPTS = ["鍐呭垎娉岀", "鐨偆绉�", "鑲跨槫鍐呯", "娑堝寲鍐呯", "鑲惧唴绉�"];
-const WARDS = ["涓�鐥呭尯", "浜岀梾鍖�", "涓夌梾鍖�", "鍥涚梾鍖�", "浜旂梾鍖�"];
+// 娉ㄦ剰锛氳繖閲屼互鍓嶇敤 DEPTS / WARDS 涓や釜銆屾紨绀虹敤銆嶅悕绉版暟缁勫厹搴曪紝
+// 缁撴灉琚綋鎴愮紪鐮佸杩� leavehospitaldistrictcodes / leaveldeptcodes锛�
+// 鍚庣鎸� leavehospitaldistrictcode IN ('涓�鐥呭尯','浜岀梾鍖�'鈥�) 杩囨护 鈫� 涓�鏉′篃鍖归厤涓嶄笂銆�
+// 绉戝/鐥呭尯涓�寰嬪彧鐢ㄧ湡瀹炵紪鐮侊細鏈夊綊灞炲彇 store锛屾棤褰掑睘锛堝绠$悊鍛橈級鍙� deptTreeSelect 瀛楀吀銆�
/**
* 鎺ュ彛鏁版嵁 鈫� 椤甸潰鍐呴儴棰樼洰缁撴瀯
@@ -497,11 +514,14 @@
name: "DataOverview",
data() {
return {
+ // 婊℃剰搴︾被鍨嬶細leave=绂婚櫌婊℃剰搴︼紙绂婚櫌绉戝/鐥呭尯锛夛紝hospital=鍦ㄩ櫌婊℃剰搴︼紙鍦ㄩ櫌绉戝/鐥呭尯锛�
+ satisfactionScope: "leave",
// 椤堕儴鍏ㄥ眬绛涢��
queryParams: {
dateRange: [],
deptCodes: [], // 绉戝缂栫爜闆嗗悎 => leaveldeptcodes
- wardCodes: [], // 鍑洪櫌鐥呭尯缂栫爜闆嗗悎 => leavehospitaldistrictcodes锛堟帴鍙e繀濉級
+ // 鐥呭尯缂栫爜闆嗗悎锛氫綇闄㈡弧鎰忓害鎸夊湪闄㈢梾鍖�(hospitaldistrictcodes)锛屽叾浣欐寜鍑洪櫌鐥呭尯(leavehospitaldistrictcodes)
+ wardCodes: [],
serviceTypeList: [], // 鏈嶅姟绫诲瀷澶氶�夛紝鎻愪氦鏃剁敤閫楀彿鎷兼帴
deptOrDistrict: "1", // 绉戝/鐥呭尯缁勫悎鏂瑰紡锛岄粯璁� 1锛氱闄㈢梾鍖� and 绂婚櫌绉戝
statMode: "ward", // 缁熻缁村害锛歸ard=鎸夌梾鍖虹粺璁� dept=鎸夌瀹ょ粺璁�
@@ -521,22 +541,27 @@
// 琛ㄤ笁锛氱瀹�/鐥呭尯璇勫垎瀵规瘮锛坮ows=琛屾暟鎹紝questions=鍔ㄦ�佸垪锛�
deptComparison: { rows: [], questions: [] },
wardComparison: { rows: [], questions: [] },
+
+ // 绉戝/鐥呭尯瀛楀吀锛氬綋鍓嶈处鍙锋病鏈夊綊灞炵瀹�/鐥呭尯鏃讹紙濡傜鐞嗗憳锛変粠 deptTreeSelect 鎷夊彇锛�
+ // 淇濊瘉涓嬫媺閲屾斁鐨勬槸鐪熷疄缂栫爜锛坉eptCode / districtCode锛夛紝鑰屼笉鏄悕绉�
+ deptDict: [],
+ wardDict: [],
};
},
computed: {
- // 绉戝閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵瀹わ紝鏃犲垯鍏滃簳
+ // 绉戝閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵瀹わ紱娌℃湁褰掑睘鏃剁敤绉戝瀛楀吀锛堢湡瀹� deptCode锛�
deptOptions() {
- const list = this.$store.getters.belongDepts || [];
- return list.length
- ? list.map((d) => ({ label: d.deptName, value: d.deptCode }))
- : DEPTS.map((d) => ({ label: d, value: d }));
+ const list = (this.$store.getters.belongDepts || [])
+ .map((d) => ({ label: d.deptName, value: d.deptCode }))
+ .filter((d) => d.label && d.value);
+ return list.length ? list : this.deptDict;
},
- // 鐥呭尯閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵梾鍖猴紝鏃犲垯鍏滃簳
+ // 鐥呭尯閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵梾鍖猴紱娌℃湁褰掑睘鏃剁敤鐥呭尯瀛楀吀锛堢湡瀹� districtCode锛�
wardOptions() {
- const list = this.$store.getters.belongWards || [];
- return list.length
- ? list.map((w) => ({ label: w.districtName, value: w.districtCode }))
- : WARDS.map((w) => ({ label: w, value: w }));
+ const list = (this.$store.getters.belongWards || [])
+ .map((w) => ({ label: w.districtName, value: w.districtCode }))
+ .filter((w) => w.label && w.value);
+ return list.length ? list : this.wardDict;
},
// 鏈嶅姟绫诲瀷涓嬫媺锛氬彇 store 鐨勯殢璁跨被鍨嬪瓧鍏� tasktypes锛屽彇涓嶅埌鏃跺厹搴曟湰鍦� SERVICE_TYPES
serviceTypeOptions() {
@@ -550,13 +575,22 @@
const taskTypes = toOptions(this.$store.getters.tasktypes);
return taskTypes.length ? taskTypes : SERVICE_TYPES;
},
- // 鏈�夌梾鍖烘椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴鐥呭尯缂栫爜
+ // 鏈�夌梾鍖烘椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴鐥呭尯缂栫爜锛堢┖鏁扮粍 = 涓嶉檺锛屽悗绔笉鎷艰繃婊ゆ潯浠讹級
defaultWardCodes() {
- return Array.from(new Set(this.wardOptions.map((w) => w.value)));
+ return Array.from(
+ new Set(this.wardOptions.map((w) => w.value).filter(Boolean))
+ );
},
- // 鏈�夌瀹ゆ椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴绉戝缂栫爜
+ // 鏄惁鎸夈�屽湪闄㈡弧鎰忓害銆嶅彛寰勬煡璇細鍦ㄩ櫌婊℃剰搴︾敤 deptcodes/hospitaldistrictcodes锛�
+ // 绂婚櫌婊℃剰搴︼紙浠ュ強娓呯┖涓嬫媺鏃剁殑榛樿鍙e緞锛夌敤 leaveldeptcodes/leavehospitaldistrictcodes
+ isInHospitalSatisfaction() {
+ return this.satisfactionScope === "hospital";
+ },
+ // 鏈�夌瀹ゆ椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴绉戝缂栫爜锛堢┖鏁扮粍 = 涓嶉檺锛�
defaultDeptCodes() {
- return Array.from(new Set(this.deptOptions.map((d) => d.value)));
+ return Array.from(
+ new Set(this.deptOptions.map((d) => d.value).filter(Boolean))
+ );
},
// 鍥哄畾鍏」閫夐」鐨勯鐩� => 琛ㄤ竴
satisfactionQuestions() {
@@ -693,7 +727,9 @@
}
this.queryParams.serviceTypeList = this.defaultServiceTypes();
},
- mounted() {
+ async mounted() {
+ // 鍏堟妸绉戝/鐥呭尯瀛楀吀琛ラ綈锛屼繚璇侀娆℃煡璇㈢敤鐨勫氨鏄湡瀹炵紪鐮�
+ await this.ensureOrgDict();
this.fetchData();
},
methods: {
@@ -704,6 +740,52 @@
return item ? item.value : null;
}).filter((v) => v != null);
return Array.from(new Set(hit));
+ },
+ // 褰掍竴鍖栫瀹�/鐥呭尯缂栫爜锛氶�変腑椤逛紭鍏堬紝鍏舵榛樿鍏ㄩ儴锛涘幓閲嶃�佸幓绌�
+ // 杩斿洖绌烘暟缁勮〃绀恒�屼笉闄愩�嶏紙鍚庣 mapper 鐢� size() > 0 鍒ゆ柇锛岀┖闆嗗悎涓嶆嫾杩囨护鏉′欢锛�
+ codeList(selected, fallback) {
+ const list = (selected && selected.length ? selected : fallback) || [];
+ return Array.from(
+ new Set(
+ list.filter((v) => v !== null && v !== undefined && String(v).trim() !== "")
+ )
+ );
+ },
+ // 琛ュ叏绉戝/鐥呭尯瀛楀吀锛氫粎褰� store 閲屾病鏈夊綊灞炴暟鎹椂锛堝吀鍨嬫槸绠$悊鍛樿处鍙凤級鎵嶈姹�
+ async ensureOrgDict() {
+ const tasks = [];
+ if (!(this.$store.getters.belongDepts || []).length) {
+ tasks.push(this.loadOrgDict(1));
+ }
+ if (!(this.$store.getters.belongWards || []).length) {
+ tasks.push(this.loadOrgDict(2));
+ }
+ if (tasks.length) await Promise.all(tasks);
+ },
+ // deptType锛�1=绉戝锛�2=鐥呭尯锛涚粨鏋滄棦浣滀笅鎷夐�夐」锛屼篃浣溿�屽叏閮ㄣ�嶆椂鐨勭紪鐮佹潵婧�
+ async loadOrgDict(deptType) {
+ let flat = [];
+ try {
+ const res = await deptTreeSelect(deptType);
+ const walk = (nodes) => {
+ (Array.isArray(nodes) ? nodes : []).forEach((n) => {
+ // deptTreeSelect 杩斿洖 TreeSelect锛歿 id, label, deptCode, children }
+ // 鍙 deptCode锛岀己澶卞氨璺宠繃鈥斺�旂敤 deptId 鍐掑厖缂栫爜鍚屾牱鏌ヤ笉鍒版暟鎹�
+ if (n.label && n.deptCode) {
+ flat.push({ label: n.label, value: String(n.deptCode) });
+ }
+ if (n.children && n.children.length) walk(n.children);
+ });
+ };
+ walk(res && res.data);
+ } catch (e) {
+ console.warn("[DataOverview] 鑾峰彇绉戝/鐥呭尯瀛楀吀澶辫触锛屽皢鎸夆�滃叏閮ㄢ�濇煡璇�", e);
+ }
+ if (deptType === 1) {
+ this.deptDict = flat;
+ } else {
+ this.wardDict = flat;
+ }
},
// 琛ㄤ笁鐙珛鏉′欢锛�'inherit' 鏃舵部鐢ㄩ《閮ㄦ墍閫夛紱杩斿洖閫変腑鐨勫悕绉版暟缁勶紙鎺ュ彛鍙洖鍚嶇О锛夛紝绌烘暟缁勮〃绀轰笉闄�
statFilterNames() {
@@ -828,8 +910,10 @@
return;
}
- // 鐥呭尯 => leavehospitaldistrictcodes锛岀瀹� => leaveldeptcodes
- // 绉戝/鐥呭尯浜掓枼锛氭寜鐥呭尯鍙紶 leavehospitaldistrictcodes锛屾寜绉戝鍙紶 leaveldeptcodes
+ // 绉戝/鐥呭尯鏉′欢闅忋�屾弧鎰忓害绫诲瀷銆嶅垏鎹細
+ // 鍦ㄩ櫌婊℃剰搴� => deptcodes / hospitaldistrictcodes锛堝湪闄㈢瀹ゃ�佸湪闄㈢梾鍖猴級
+ // 绂婚櫌婊℃剰搴� => leaveldeptcodes / leavehospitaldistrictcodes锛堢闄㈢瀹ゃ�佺闄㈢梾鍖猴級
+ // 绉戝/鐥呭尯浜掓枼锛氭寜鐥呭尯鍙紶鐥呭尯缂栫爜锛屾寜绉戝鍙紶绉戝缂栫爜
const wards = this.queryParams.wardCodes || [];
const depts = this.queryParams.deptCodes || [];
@@ -839,13 +923,27 @@
endFinishTime: range[1],
};
if (this.queryParams.statMode === "dept") {
- payload.leaveldeptcodes = depts.length
- ? Array.from(new Set(depts))
- : this.defaultDeptCodes;
+ const deptCodes = this.codeList(depts, this.defaultDeptCodes);
+ // 鏈夌紪鐮佹墠浼狅紱绌烘暟缁勭瓑浠蜂簬銆屽叏閮ㄣ�嶏紙鍚庣 mapper 瀵圭┖闆嗗悎涓嶆嫾鏉′欢锛�
+ if (deptCodes.length) {
+ if (this.isInHospitalSatisfaction) {
+ payload.deptcodes = deptCodes;
+ } else {
+ payload.leaveldeptcodes = deptCodes;
+ }
+ }
} else {
- payload.leavehospitaldistrictcodes = wards.length
- ? Array.from(new Set(wards))
- : this.defaultWardCodes;
+ // 鍙紶銆岀敤鎴风湡姝i�変腑鐨勭梾鍖恒�嶏細娌¢�夛紙= 鍏ㄩ儴鐥呭尯锛夊氨涓嶄紶锛屽悗绔寜涓嶉檺澶勭悊銆�
+ // 闂ㄨ瘖婊℃剰搴︾瓑浠诲姟鐨� leavehospitaldistrictcode 涓虹┖锛�
+ // 鍘熸潵鎶娿�屽叏閮ㄧ梾鍖虹紪鐮併�嶄紶涓嬪幓浼氳杩欎簺浠诲姟琚� IN 鏉′欢鏁存杩囨护鎺夛紙25 棰樺彧鍓� 10 棰橈級銆�
+ const wardCodes = this.codeList(wards, []);
+ if (wardCodes.length) {
+ if (this.isInHospitalSatisfaction) {
+ payload.hospitaldistrictcodes = wardCodes;
+ } else {
+ payload.leavehospitaldistrictcodes = wardCodes;
+ }
+ }
}
// 鏈嶅姟绫诲瀷澶氶�夛細閫楀彿鍒嗛殧锛堟帴鍙e瓧娈典负 serviceType 瀛楃涓诧級
const serviceTypes = this.queryParams.serviceTypeList || [];
@@ -892,10 +990,30 @@
endFinishTime: range[1],
};
try {
- // 鎸夌瀹ょ粺璁★紙leaveldeptcodes 浼樺厛锛変笌鎸夌梾鍖虹粺璁★紙leavehospitaldistrictcodes锛夊悇鏌ヤ竴娆�
+ // 鎸夌瀹ょ粺璁°�佹寜鐥呭尯缁熻鍚勬煡涓�娆★紝鏉′欢闅忋�屾弧鎰忓害绫诲瀷銆嶅垏鎹細
+ // 鍦ㄩ櫌婊℃剰搴� => deptcodes / hospitaldistrictcodes锛涚闄㈡弧鎰忓害 => leaveldeptcodes / leavehospitaldistrictcodes
+ // 娌℃湁鐪熷疄缂栫爜鏃朵笉浼犺瀛楁锛�= 鍏ㄩ儴锛夛紝缁濅笉鎶婂悕绉板綋缂栫爜浼�
+ const deptParam = {};
+ const deptCodes = this.codeList([], this.defaultDeptCodes);
+ if (deptCodes.length) {
+ if (this.isInHospitalSatisfaction) {
+ deptParam.deptcodes = deptCodes;
+ } else {
+ deptParam.leaveldeptcodes = deptCodes;
+ }
+ }
+ const wardParam = {};
+ const wardCodes = this.codeList([], this.defaultWardCodes);
+ if (wardCodes.length) {
+ if (this.isInHospitalSatisfaction) {
+ wardParam.hospitaldistrictcodes = wardCodes;
+ } else {
+ wardParam.leavehospitaldistrictcodes = wardCodes;
+ }
+ }
const [deptRes, wardRes] = await Promise.all([
- statQuestionOptionByKsOrBq({ ...base, leaveldeptcodes: this.defaultDeptCodes }),
- statQuestionOptionByKsOrBq({ ...base, leavehospitaldistrictcodes: this.defaultWardCodes }),
+ statQuestionOptionByKsOrBq({ ...base, ...deptParam }),
+ statQuestionOptionByKsOrBq({ ...base, ...wardParam }),
]);
// 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵逛袱绾у祵濂� Map 缁撴瀯锛堢‘璁ゆ棤璇悗鍙垹闄わ級
console.log(
@@ -1013,7 +1131,7 @@
exportTable(tableId) {
const tableNames = {
table1: "鍚勬湇鍔¢」鐩弧鎰忓害缁熻",
- table2: "鍗曢�夐澶氶�夐缁熻",
+ table2: "鍏朵粬棰樼洰缁熻",
table3: "鍚勭瀹ゆ弧鎰忓害璇勫垎瀵规瘮",
};
const name = tableNames[tableId] || "缁熻鏁版嵁";
@@ -1097,6 +1215,12 @@
font-weight: 600;
color: #303133;
}
+.card-subtitle {
+ margin-left: 6px;
+ font-size: 12px;
+ font-weight: 400;
+ color: #909399;
+}
.header-right {
display: flex;
align-items: center;
--
Gitblit v1.9.3